Autor Tema: DS1307... NO LOGRO ENTENDERLO.  (Leído 6663 veces)

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

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: DS1307... NO LOGRO ENTENDERLO.
« Respuesta #15 en: 02 de Abril de 2007, 10:18:27 »
Código: [Seleccionar]
'********************************** PIC Entrenadora BASIC (PicEBasic)******************************
'NOMBRE: 16F88_LCD_RTC
'VERSION: 1.0
'MICRO: PIC16f88A
'FECHA/AUTOR: 12/06 - By COS
'DESCRIPCION: MUESTRA EN EL DISPLAY LA FECHA Y LA HORA
'para transferir la hora al reloj dejar pulsada la tecla S1
'***************************************************************************************************
'-------------------------------------Puertos del LCD-----------------------------------------------
Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'el bit de nrol RS sera del puerto B
Define LCD_RSBIT = 7  'se usara el RB7 como RS
Define LCD_EREG = PORTB  'el bit de nrol E sera del puerto B
Define LCD_EBIT = 6  'se usara el RB6 como E
'Define LCD_RWREG = PORTx  'el bit de nrol RW sera del puerto x(no se usa)
'Define LCD_RWBIT = n  'se usara el Rxn como RW (no se usa)
Define LCD_COMMANDUS = 2000 'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
Define LCD_DATAUS = 50 'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50  'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
'-----------------------------------Puerto I2C-----------------------------------------------------
Symbol sda = PORTB.1  'asignamos nombre al pin que hara de SDA del puerto I2C
Symbol scl = PORTB.4  '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---------------------
ANSEL = %00000000 'los pin I/O digitales
CMCON = 0x07 'comparador a off
OSCCON = 0x7e 'set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00 'Puerto A como salidas
TRISB = 0x00 'puerto B como salidas
TRISA.4 = 1 'como entrada (RA4, adc)
TRISA.6 = 1 'como entrada (RA6, tecla S1)
TRISA.5 = 1 'como entrada (RA5, tecla S2)
PORTB.3 = 1 'luz lcd a on (RB3)
PORTA.7 = 1 'led amarillo a off
PORTB.0 = 1 'led verde a off
'**************************************Inicio Programa*********************************************
Lcdinit  'inicializa el lcd sin cursor
WaitMs 1000  'espera 1Seg
Lcdout "16f88LCD_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 RA6 = 0 Then  'si la tecla S1 esta pulsada pasaremos los datos al reloj
  I2CWrite sda, scl, 0xd0, 0, 0x00  '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, 0x23  'horas
  I2CWrite sda, scl, 0xd0, 3, 0x01  'dia de la semana
  I2CWrite sda, scl, 0xd0, 4, 0x31  'dia del mes
  I2CWrite sda, scl, 0xd0, 5, 0x12  'mes
  I2CWrite sda, scl, 0xd0, 6, 0x06  '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

Este ejemplo no esta en PBP, solo tienes que quitarle lo del lcd y cambiar algun comando por el equivalente que de seguro hasta se llaman parecidos. Suerte.
Saludos desde Granada, España.

Desconectado Jmedina

  • PIC10
  • *
  • Mensajes: 30
Re: DS1307... NO LOGRO ENTENDERLO.
« Respuesta #16 en: 04 de Abril de 2007, 10:09:29 »
Aqui le dejo este ejemplo en pbp que tengo por ahi para los que lo necesiten. Esta sencillo y entendible.


;Programa para escribir y leer un RTC DS1307
Define   I2C_SCLOUT   1   ;No es necesario resistencia pull-up en SCL

CPIN  Var Portb.7                 ;pin señal de reloj I2C
DPIN  Var Portb.6                 ;pin de datos I2C

segu    var byte   ;definir tamaño de variable segundos 1 a 255
minu    var byte                    ;variable para los minutos
hora    var byte                    ;variable para las horas
diaS    var byte                    ;variable día de la semana
diaF    var byte                    ;variable día fecha del mes
mes     var byte                    ;variable mes
anio    var byte                    ;variable año de 2 dígitos

actualizado VAR BIT              ;variable para almacenar un 1 o 0

EEPROM 0,[0]        ;memoria 0 con el valor inicial 0 , sirve para
                        ;indicar que nunca ha corrido este programa
READ 0,actualizado    ;carga el valor de la memoria EEPROM dirección 0

IF actualizado =0 THEN grabarRTC   ;si es la 1ra vez que corre ir a grabar RTC
                                   ;caso contrario solo leer el RTC
INICIO:   
    I2CREAD DPIN,CPIN,%11010000,0,[segu]   ;leer los datos de mem. 0,           
    I2CREAD DPIN,CPIN,%11010000,1,[minu]   ;1,2,..y guardarlos en sus
    I2CREAD DPIN,CPIN,%11010000,2,[hora]   ;respectivas variables
    I2CREAD DPIN,CPIN,%11010000,3,[diaS]
    I2CREAD DPIN,CPIN,%11010000,4,[diaF]             
    I2CREAD DPIN,CPIN,%11010000,5,[mes]
    I2CREAD DPIN,CPIN,%11010000,6,[anio]
         
    lcdout $fe,1,hex2 hora,":",hex2 minu,":",hex2 segu   ;mostrar la
                          ;hora minuto y segundos en 2 dígitos (HEX2)
lcdout $fe,$c0                      ; saltar a la 2da línea del LCD
    if diaS=$1 then lcdout "Dom."    ;mostrar día de la semana
    if diaS=$2 then lcdout "Lun."
    if diaS=$3 then lcdout "Mar."
    if diaS=$4 then lcdout "Mie."
    if diaS=$5 then lcdout "Jue."
    if diaS=$6 then lcdout "Vie."
    if diaS=$7 then lcdout "Sab."

lcdout $fe,$c5,hex2 diaF,"/"          ;mostrar el día del mes /
lcdout $fe,$cB,"/20",hex2 anio        ; mostrar año /20 + 04

lcdout $fe,$c8                       ;pasar a la casilla 8
    if mes=$1 then lcdout "ene"       ;mostrar el mes
    if mes=$2 then lcdout "feb"
    if mes=$3 then lcdout "mar"
    if mes=$4 then lcdout "abr"
    if mes=$5 then lcdout "may"
    if mes=$6 then lcdout "jun"
    if mes=$7 then lcdout "jul"
    if mes=$8 then lcdout "ago"
    if mes=$9 then lcdout "sep"
    if mes=$10 then lcdout "oct"
    if mes=$11 then lcdout "nov"
    if mes=$12 then lcdout "dic"
PAUSE 500                            ;esperar 0,5 segundo
   
goto inicio                         ;volver a leer los datos

; ************************ subrutina grabar *********************
grabarRTC:
     
I2CWRITE DPIN,CPIN,%11010000,0,[$00]   ;setear 00 segundos
    Pause 10                     ;retardo para finalizar grabación
I2CWRITE DPIN,CPIN,%11010000,1,[$30]   ;setear 30 minutos
    Pause 10 
I2CWRITE DPIN,CPIN,%11010000,2,[$13]    ;setear las 13 horas
    Pause 10 
I2CWRITE DPIN,CPIN,%11010000,3,[$2]    ;setear día lunes ,D=1,L=2
    Pause 10                              ;M=3 , M=4, J=5, V=6, S=7
I2CWRITE DPIN,CPIN,%11010000,4,[$27]    ;setear día 27 del mes
    Pause 10 
I2CWRITE DPIN,CPIN,%11010000,5,[$9]    ;setear mes septiembre
    Pause 50 
I2CWRITE DPIN,CPIN,%11010000,6,[$04]    ;setear año  04
    Pause 10
I2CWRITE DPIN,CPIN,%11010000,7,[$10]   ;control %00010000 para
    Pause 10                           ;encender el led cada 1 seg.


WRITE 0,1       ;escribe en la memoria 0 el valor de 1 para que no   
                ;se vuelva a grabar otra vez estos datos en el RTC

goto inicio                 ;ir a presentar los datos en el LCD

end

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: DS1307... NO LOGRO ENTENDERLO.
« Respuesta #17 en: 04 de Abril de 2007, 22:44:19 »
seee con el ultimo codigo aprendí...andaa gesteva que si no sale alli revisa si las conexiones estan bien: pullup,cristal, cheka si no te has confundido y hallas invertido SCL y SDA pero si sigue = mejor cambia de DS1307 :(
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.


 

anything