Corrigido !... as maneiras que tentei estavam certas, era uma escrita no registro Write Protec, depois de fazer o burst na RAM do DS1302 ...eheheheheh eu coloquei o microcosmo corrigido lá embaixo...mas depois tem um codigo do write protect que omiti, aqui, mas ficou joinha eheheheh
Duvidazinhas que tao me tirando o sono.
ipc
- Código: Selecionar todos
typedef union
{
struct stb {
u08 h;
u08 l;
} nb;
u08 b;
u16 w;
void *p;
} un_ipc;
Um dos construtores que to testando....
- Código: Selecionar todos
typedef union
{
struct st_ds1302 {
u08 e; // error state
u08 s; // second
u08 n; // minute
u08 h; // hour
u08 d; // day
u08 m; // month
u08 w; // day of week
u08 y; // year
} resource;
u08 buffer[DS1302_DATA_SIZE];
} un_ds1302;
E a funcao....
- Código: Selecionar todos
void
ds1302(u08 task, un_ipc *msg)
{
static un_ds1302 device;
u08 count;
u08 frame;
u08 value;
switch (task)
{
....
}
}
Vejamos duas funcoes
un_ipc *msg;
ds1302(DS1302_CLK_INIT, msg);nessa ae acima ....
eu inicializo device e depois retorno
msg->p = &device;
ok ? foi que eu fiz...atribui o endereco de device ao ponteiro p
da mensagem.
ds1302(DS1302_CLK_WRITE, msg);bom como msg->p ja aponta para device la dentro
uma solucao de pegar o valor via ponteiro eh fazer o que ?
value = ((u08 *)msg->p)[count];
por exemplo, se count = 5, eu estaria em tese fazendo value = device.buffer[5], ou device.resource.m ok ?
Pois eh ......essa xit num ta virando...e olhe que ja mandei printar valor na serial (e ta printando certo) eheheheheheh tem alguma coisa errada ae ?
veja o snipe code no microcosmo do codigo
- Código: Selecionar todos
((u08 *)msg->p)++; // increment to point to first byte (ignoring device.resource.e)
for (frame = DS1302_CLK_SIZE_RTC;frame;frame--)
{
// bin2bcd
value = *((u08 *)msg->p);
value = ((value/10)<<4) + (value%10);
((u08 *)msg->p)++;
for (count = DS1302_BITS_BLOCK;count;count--)
{
DS1302_SCL_OFF;
DS1302_SDA_PIN = value & 0x01;
DS1302_SCL_ON;
value >>=1;
}
}