Como comienza a contabilizar el tiempo un reloj de tiempo real ds1302

hola que tal, he estado realizando algunas pruebas con el rtc ds1302, resulta que ya le puedo mandar codigos correspondientes a sus registros segundos, minutos, horas etc. etc... pero aun no puedo entender cuando es que comienza a trabajar el solito automaticamente..... revise el data sheet y no encontre ese dato....

en que momento el reloj comienza a contantabilizar el tiempo?, debo indicarle en algun bit o mediante algun comando? o con solo cargarle los valores de minutos, segundos, horas etc etc...

alguien sabe esto que parerece tan logico pero si es un problema real?

saluods.
 
amigo mabauti! gracias a tu pregunta ya descubri un posible error... cuando escribo un 0x00 en el registro segundos y lo mando a leer y a imprimir en el portd contiene este numero: 1000 0000, es decir el bit 7 del registro segundos si esta en 1... por eso mi ds1302 no trabaja... como apago esa bandera si se supone que cuando envio un 0x00 a ese registro la estoy apagando? saludos
 
primero habilita la escritura y despues enviale un 00 en la localidad de segundos, algo como esto :

Código:
;Deshabilita Write Protect 
 
  movlw  0X8E  
  call  COM   ;rutina que envía el comando 
  movlw  0X00    ;deshabilita Write Protect
  call  ENVIA   ;rutina que envía el dato
 
 
;*************************************************** 
;ESCRIBE el numero 0x00 a al registro  segundos
 
  movlw  0X80     ; posiciona los segundos 
  call  COM  ; rutina que envia comando 
  movlw  0X00     ; envia 00 a segundos 
  call  ENVIA  ; rutina que envía el dato
 
mabauti dijo:
primero habilita la escritura y despues enviale un 00 en la localidad de segundos, algo como esto :

Código:
;Deshabilita Write Protect 
 
  movlw  0X8E  
  call  COM   ;rutina que envía el comando 
  movlw  0X00    ;deshabilita Write Protect
  call  ENVIA   ;rutina que envía el dato
 
 
;*************************************************** 
;ESCRIBE el numero 0x00 a al registro  segundos
 
  movlw  0X80     ; posiciona los segundos 
  call  COM  ; rutina que envia comando 
  movlw  0X00     ; envia 00 a segundos 
  call  ENVIA  ; rutina que envía el dato
  call  COM   ; Llama la rutina que envía el comando [b]esta linea no esta mal??????[/b] :evil: 
  movlw  0X00  ;
  call  ENVIA   ; rutina que envía dato
b][/b]

creo que een donde pongo un simbolo evil esta mal! para que enviar nuevamente 00 al registro segundos? ya lo hiceste arriba no?, disculpa pero no entiendo muy bien, direccionas segundos con 80 y le esxribes 00... para que lo haces otra vez? y para que call envia seguido de call com?

gracias.
 
es verdad (use ctrl+v) dos veces; ya lo edité.

podrías tambien enviar los minutos y/o las horas, aunque esto es segun tu conveniencia.


una cosa aparte :supongo que la señal para CE ya la tienes adecuada.
 
he aqui el codigo, espero me podais ayudar:



int escribe_ds1302(int numero1);//FUNCION
int lee_ds1302(int );//FUNCION
int DATO=0;
int cont=0;
int resultado,numero1,numero2,temp=0;
int local=0;
void main() {
ADCON1=0X07;
TRISB=0;
TRISD=0;
TRISE=0;
TRISC=0;

cont=8;
PORTB=0;
PORTD=0;
PORTE=0;
PORTC=0;

//PORTE BIT0=SCLK
//PORTE BIT1=IO
//PORTE BIT2=RST

numero1=0x8E; //direcciona el registro de control
escribe_ds1302(numero1);
numero1=0x00; //permite futuras escrituras
escribe_ds1302(numero1);

numero1=0x80; //direcciona el registro de escritura segundos
escribe_ds1302(numero1);
numero1=0x35; //direcciona el registro de escritura segundos
escribe_ds1302(numero1);


PORTE.F2=0;//DESABILITA COMUNICACIONES

numero1=0x81; //direcciona el registro de escritura segundos
escribe_ds1302(numero1);


cont=7;
temp=lee_ds1302(numero2);//da lectura al registro de segundos
temp=local;

PORTD=temp;//imprime el registro segundos en portd

fin:
PORTC.F6=1;//CUALQUIER LED PARA VER QUE TODO FUNCIONA OK

goto fin;

}


///////////RUTINA ENVIAR DATO AL DS1302////////
int escribe_ds1302(int valor1)//FUNCION
{
DATO=numero1; //Carga en dato el valor a escribir
asm {
bsf STATUS,RP0 //;Setear IO como salida
bcf TRISE,1 //CONFIGURA COMO SALIDA
bcf STATUS,RP0

bsf PORTE,2 //;Entablar comunicación
ENVIANDO:
bcf PORTE,1 //;Apagar IO
btfsc DATO,0 //;Si DATO,0 es 1, entonces
bsf PORTE,1 //;poner IO en 1
bsf PORTE,0 //;Un Clock
bcf PORTE,0
rrf DATO,F //;Rotar DATO hacia la derecha
decfsz CONT,F //;Decrementa CONT y salta si es 0
goto ENVIANDO ////;Volver si CONT no era 0
movlw 8 //;Redefinir contador
movwf CONT
//;No olvidar resetear comunicación manualmente.

}
return;
} /////////////FIN DE LA FUNCIÓN


///////////RUTINA RECIBIR DATO DEL DS1302////////
int lee_ds1302(int valor2)
{
asm {
bsf STATUS,RP0 // ;Setear IO como entrada
bsf TRISE,1
bcf STATUS,RP0
bsf PORTE,2 //;Entablar comunicación
RECIBIENDO:
bcf DATO,0 // ;Resetear DATO,0
btfsc PORTE,1 // ;Si IO es 1, entonces
bsf DATO,0 // ;poner DATO,0 en 1
bsf PORTE,0 // ;Un Clock
bcf PORTE,0
rlf DATO,F // ;Rotar DATO a la izquierda
decfsz CONT,F // ;Decrementa CONT y salta si es 0
goto RECIBIENDO //;Volver si CONT no era 0
bcf PORTE,2 // ;Terminar comunicación
movlw 7 //;Redefinir contador
movwf CONT
movf DATO,W // ;Enviar DATO recibido a W
movwf local
}
return local;
} /////////////FIN DE LA FUNCIÓN

cual es la diferencia entre mandar un comando o un dato? es decir lo puedo enviar por la misma rutina?
 
he realizado varias muchas mas pruebas y les coemnto lo siguiente:

aun no he logrado escribir un dato y leerlo en el ds1302, he intentado bastante, asi como tambien cambiado de chip y de todo aun no lo logro... he notado lo siguiente:

cuando envio un numero al registro de segundos, minutos horas etc, siempre en el bit 0 de ese registro leo un 1, aun cuando yo alla escrito un 00 a todos... estoy seguro y sospechop que aun mi comunicacion i2c no funciona del todo bien y me preocupa mucho pues ya me he demorado mucho tiempo en algo q deberia ser tan facil.... agradezco su ayuda...
 
Atrás
Arriba