Autor Tema: ayuda con ds1307 en modo 12 horas psi(pic simulador ide)  (Leído 3872 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado RockLee_89

  • PIC16
  • ***
  • Mensajes: 140
ayuda con ds1307 en modo 12 horas psi(pic simulador ide)
« en: 25 de Marzo de 2013, 21:04:08 »
Hola amigos de todopic tengo varios días tratando de hacer funcionar el reloj ds1307 en modo 12 horas he leído el datashet y lo poco que he entendido tal vez sea una bretes mía que es lo más seguro es que para trabajar el ds1307 en modo 12 horas tengo que colocar a uno el bit6 del registro de horas y el bit 5 es el registro de  AM/PM siendo PM a 1 y AM a 0
B7  B6  B5  B4  B3  B2  B1 B0   
0      1     1    1     0    0     1   0
0X72  en hexadecimal según yo si estoy mal díganme hasta un coscorrón es bien recibido la idea es aprender y anqué sea a golpes.
Bueno al cargar ese valor en el lcd me indica el valor de 32 en la casilla de horas
Y al cambiar el valor  por 0x52 en el lcd me indica bien el valor de 12 y se actualiza a 1 pero en la fecha y días no cambia al pasar de am a pm no se que pueda hacer tal vez mi mal entendimiento de funcionamiento de ds1307 es el problema espero alguien me pueda echar una mano que ya busque mucha información y creo que soy yo y no el chip
Saludos.


Código: [Seleccionar]
AllDigital

'CONFIGURACION DE LCD
'------------------------------------------
Define LCD_BITS = 4
Define LCD_DREG = RB
Define LCD_DBIT = 4
Define LCD_RSREG = RB
Define LCD_RSBIT = 3
Define LCD_EREG = RB
Define LCD_EBIT = 2
Define LCD_COMMANDUS = 2000
Define LCD_DATAUS = 100
Define LCD_INITMS = 100
'------------------------------------------
'-----------------------------------Puerto I2C-----------------------------------------------------
Symbol sda = PORTB.0  'asignamos nombre al pin que hara de SDA del puerto I2C
Symbol scl = PORTB.1  'asignamos nombre al pin que hara de SCL del puerto I2C
'***********************************DEFINICION DE VARIABLES**************************************
'--------------------------------------Variables Programa----------------------------------------
Dim aux_4h As Byte  'contendra el nibble alto del dato leido por el I2C
Dim aux_4l As Byte  'contendra el nibble bajo del dato leido por el I2C
Dim i As Byte  'variable indice
Dim reg(7) As Byte  'contendra los valores finales de fecha y hora en el sistema decimal
'------------------------------------------ASIGNACIONES------------------------------------------
'**************************************DEFINICION DE PUERTOS*************************************
'----------------------ASIGNACION DE I/O y valores de inicio de las salidas---------------------

TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'puerto B como salidas
TRISA.0 = 1  'como entrada (RA6, tecla S1)

'**************************************Inicio Programa*********************************************
Lcdinit  'inicializa el lcd sin cursor
WaitMs 1000  'espera 1Seg
Lcdout "16f877A_RTC/I2C"  'escribe en el lcd
Lcdcmdout LcdLine2Home  'seleciona la linea dos como proxima para escritura
Lcdout "Pruebas con I2C"  'escribe en el lcd
WaitMs 3000  'espera 3Seg
Lcdcmdout LcdClear
'-------------------------------------inicializacion del reloj-------------------------------------
'-------------------Aqui escribimos los valores para cargar al RTC---------------------------------
If RA0 = 1 Then  'si la tecla S1 esta pulsada pasaremos los datos al reloj
I2CWrite sda, scl, 0xd0, 0, 0x50  'segundos, escrito en hex, porque coincide en este caso con BCD del RTC
I2CWrite sda, scl, 0xd0, 1, 0x59  'minutos
I2CWrite sda, scl, 0xd0, 2, 0x72  'horas
I2CWrite sda, scl, 0xd0, 3, 0x02  'dia de la semana
I2CWrite sda, scl, 0xd0, 4, 0x25  'dia del mes
I2CWrite sda, scl, 0xd0, 5, 0x03  'mes
I2CWrite sda, scl, 0xd0, 6, 0x13  'año
I2CWrite sda, scl, 0xd0, 7, 0x10  'salida a 1hz
Endif
'--------------------------------------Main Programa-----------------------------------------------
main:
Gosub print_lcd  'actualiza la hora
WaitMs 100  'pausa de 100mSeg.
Goto main
End                                               
'--------------------------------------FIN DEL MAIN---------------------------------------------
'**************************************Subrrutinas**********************************************
print_lcd:  'lee la hora del RTC, la pasa a decimal y la envia al lcd
i = 0
While i <= 6  'se repite el codigo comprendido entre while y wend, mientras i sea menor o igual a 6
I2CRead sda, scl, 0xd0, i, reg(i)  'lectura de la direccion de memoria indicada del RTC, formato BCD
aux_4l = reg(i) And %00001111  'eliminamos los bit de configuracion del RTC y dejamos solo el nibble bajo
If i = 0 Then aux_4h = reg(i) And %01110000  'segundos, borrado de bit configuracion y almacena nibble alto
If i = 1 Then aux_4h = reg(i) And %11110000  'minutos, almacena nibble alto
If i = 2 Then aux_4h = reg(i) And %10110000  'horas, borrado de bit configuracion y almacena nibble alto
If i = 3 Then aux_4h = reg(i) And %11110000  'dia_semana, almacena nibble alto
If i = 4 Then aux_4h = reg(i) And %11110000  'dia_mes, almacena nibble alto
If i = 5 Then aux_4h = reg(i) And %11110000  'mes, almacena el nibble alto
If i = 6 Then aux_4h = reg(i) And %11110000  'año, almacena el nibble alto
aux_4h = ShiftRight(aux_4h, 4)  'convierte el nibble alto en bajo
reg(i) = (aux_4h * 10) + aux_4l  'fusiona los nibbles alto y bajo en una sola variable en formato decimal
i = i + 1  'incrementa la variable indice con cada repeticion del bucle While/Wend
Wend  'fin del bucle y salta a While
Lcdcmdout LcdLine1Home  'cursor del lcd a la izquierda en la linea 1
If reg(2) < 10 Then Lcdout "0"  'si horas es inferior a 10 escribe el cero delante
Lcdout #reg(2), ":"  'escribe la hora y el separador
If reg(1) < 10 Then Lcdout "0"  'si minutos es inferior a 10 escribe el cero delante
Lcdout #reg(1), ":"  'escribe los minutos y el separador
If reg(0) < 10 Then Lcdout "0"  'si segundos es inferior a 10 escribe el cerodelante
Lcdout #reg(0)  'escribe los segundos
Lcdcmdout LcdLine2Home  'cursor del lcd a la izquierda en la linea 2
If reg(3) = 1 Then Lcdout "Dom"  'asigna el literal al dia de la semana
If reg(3) = 2 Then Lcdout "Lun"
If reg(3) = 3 Then Lcdout "Mar"
If reg(3) = 4 Then Lcdout "Mie"
If reg(3) = 5 Then Lcdout "Jue"
If reg(3) = 6 Then Lcdout "Vie"
If reg(3) = 7 Then Lcdout "Sab"
Lcdout "/"  'escribe separador
If reg(4) < 10 Then Lcdout "0"  'si dia del mes es inferior a 10 escribe cero
Lcdout #reg(4), "/"  'escribe el dia del mes y el separador
If reg(5) < 10 Then Lcdout "0"  'si mes es inferior a 10 escribe cero
Lcdout #reg(5), "/20"  'escribe el mes, separador y los dos primeros digitos del año de 4 digitos
If reg(6) < 10 Then Lcdout "0"  'si año es inferior a 10 escribe primero el cero
Lcdout #reg(6)  'escribe el año
Return                                           
End                                               


el programa es el del amigo dougflog espero y no se moleste por piratearselo el cual ya prove en modo 24 horas y funciona muy bien tengo 3 dias con el y no dio lata
saludos

Desconectado RockLee_89

  • PIC16
  • ***
  • Mensajes: 140
Re: ayuda con ds1307 en modo 12 horas psi(pic simulador ide)
« Respuesta #1 en: 26 de Marzo de 2013, 01:35:59 »
hola amigos ya corregi el problema con las horas ahora tengo otro problema diferente el primer problema de las horas es que no cambie lo que fue la convercion de los valores entregados por el ds1307 hacia el pic que lo  tenia en modo 24 horas y por eso no me funcionaba haci es como lo tengo funcionando ahorita y si pasa de 12 a 1

I2CWrite sda, scl, 0xd0, 2, 0x72  'horas

donde el 72 equibale a el bit 6 y 5 y 10 horas
el bit 6 para decirle en que formato quiere trabajar que son 12 horas
el bit 5 para decirle que sera la hora en AM/PM en mi caso coloque PM
el bit 4 para indicar que son 10 horas las cuales boy a poner mi reloj en 10 horas

esta era mi fallo

If i = 2 Then aux_4h = reg(i) And %10110000  'horas, borrado de bit configuracion y almacena nibble alto

que tenia almacenado tambien los bits que me indicaban en modo 12 horas el bit AM/PM  y las 10 horas solo corregir por esto y funciona bien

If i = 2 Then aux_4h = reg(i) And %00010000  'horas, borrado de bit configuracion y almacena nibble alto

asi solo tomo el valor de la sifra 10 y lo demas no me importa

bueno ahora otro error quise provar el reloj poniendo segun yo las 12 de la noche indicando haci el numero 0x72 que corresponde a modo 12 horas, tambien PM, y el bit4 que son 10 horas mas el bit2 que indicara que son las 12 de la noche entonces despues de llegar ala 1 am que solo faltaria 1 hora me indicaria que seria un dia nuevo para mi pero el reloj no cambia si yo lo programe que fueran las 12 de la noche en dia lunes se supone que al llegar ala 1am ya serian el dia martes  y no cambia la hora si cambia pero la fecha no no se que pasa si alguien save como hacer para que esto funcione no sea malo y hecheme una manita
saludos

igual seguire intentando aver si lo logro andar este chip.

Desconectado RockLee_89

  • PIC16
  • ***
  • Mensajes: 140
Re: ayuda con ds1307 en modo 12 horas psi(pic simulador ide)
« Respuesta #2 en: 26 de Marzo de 2013, 11:44:48 »
hola amigos creo que ya se areglo jjjj   :P :P tal vez necesitaba mas tiempo para actualizar el dia ya que lo deje ayer funcionando desde las 10 de la noche y hoy ya esta la hora y la fecha bien

saludos

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: ayuda con ds1307 en modo 12 horas psi(pic simulador ide)
« Respuesta #3 en: 26 de Marzo de 2013, 22:04:28 »
¡¡¡FELICIDADES POR EL EXITO LOGRADO!!!
Saludos desde Granada, España.

Desconectado RockLee_89

  • PIC16
  • ***
  • Mensajes: 140
Re: ayuda con ds1307 en modo 12 horas psi(pic simulador ide)
« Respuesta #4 en: 26 de Marzo de 2013, 23:47:57 »
na amigo dogflu66 gracias a ti por postiar ejemplos y ayudarnos alos nobatos como yo a entenderlos.

saludos