TODOPIC

Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: gesteva en 26 de Diciembre de 2004, 17:28:00

Título: DS1307... NO LOGRO ENTENDERLO.
Publicado por: gesteva en 26 de Diciembre de 2004, 17:28:00
Ya he revisado todos los hilos que hablan al respecto de este Reloj en este foro, pero ninguno me ha dado resultado. No logro entender que debo hacer para sacar la hora y fecha por la LCD. Lo mas cercano a algún código entendible para mi es el propuesto en Rentron, pero...  utilizan una LCD serial por lo cual, como es de esperarse todo llega hasta ahí, es decir, algo completamente inalcansable para mi ya que no dispongo de una LCD serial.

Lo cierto es que he tratado de entender el Datasheet de DS1307, sin resultados.

Mi proposito es hacer un sistema para el carro, que lee la temperatura del motor, de la cabina, la gasolina, que además es corta corriente y que mientras voy en viaje a cualquier lugar éste me de la hora y la fecha. Bueno ya logre hacer todo menos lo de la hora y la fecha, esto hace que el ánimo se caiga duro y como siempre deje inconcluso otro proyecto mas...

Bien, la dirección del ejemplo de rentron es:

http://www.rentron.com/PicBasic/SERLED.htm

pero yo no he podido adaptarlo a mi circuito, en él tengo un PIC16F877A, una LCD conectada las lineas RD4 a RD7 y las líneas de control a RE0 y RE1.  Los pines SCL y SDA del DS1307 van a los pines RB0 y RB1 y eso es todo.

Bueno Gracias por la ayuda.

Gesteva.
Título: RE: DS1307... NO LOGRO ENTENDERLO.
Publicado por: Lager. en 26 de Diciembre de 2004, 19:53:00
Que onda pana Gesteva,
Ya revizaste este codigo?:
http://users.picbasic.org//Howto/RTC/Set_RTC.htm
Viene muy bien explicado (yo diria que demasiado expllicado ya que detalla sobre cosas que son muy explicitas)
Es para LCD y ahi vine su conexionado, otra es que si ya estas usando el codigo de pbpro, solo imprimas la informacion con el comando lcdwrite ..... solo es una pequeña adaptacion.
Si eres mas especifico en tu duda te podemos ayudar mas facilmente.
Un abrazo pana
Título: RE: DS1307... NO LOGRO ENTENDERLO.
Publicado por: gesteva en 26 de Diciembre de 2004, 20:12:00
GRACIAS Lager... el asunto es que se me hizo muy aburrido el circuito en el auto, que siempre tiene un menu estatico, a menos que le pulse uno de los botones, no me mostrará la información que le solicito. Es por esto que decidi poner un reloj y ya que trae la opcion de la fecha, pues mejor. Pero la verdad no entiendo nada como hacer funcionar este chip que ya compré.

Como buen principiante, hice a un lado lo que ya tenía, y empecé a experimentar desde cero, sin nada de códido adicional, es decir sólo el codigo referente a este fin. Bueno, esta es la cara con la que me acuesto a diario desquiciado ...

No consigo en ninguna parte algún texto que expique bien paso a paso como  se hace funcionar este chip, su datasheet a mi no me dice mucho, asi que supongo que tendre que darme de cabezasos y de madrugonadas para ver que sale. Ahora voy a ver el Link que muy gentilmente me has dado...

Saludos.
Título: RE: DS1307... NO LOGRO ENTENDERLO.
Publicado por: Lager. en 26 de Diciembre de 2004, 20:31:00
Realmente este funciona como la mayoria de los I2C, necesita una señalizacion de control de lectura y de escritura:
busin %11010001,ds1307_DIR,[num_conv]
        gosub CONVERSION1
En la linea anterior LEO el dispositivo, su señalizacion de control es %11010001, la direccion a LEER es la DS1307_DIR y donde lo guarda? en num_conv, despues de haber leido el dato, entra a una subrutina de CONVERSION  de el dato que me dio esta en BCD para pasarlo a  BINARIO, ESO es todo lo que tienes quehacer con ese dato... posteriormente lo imprimes, ojo que el DS1307 toma valores que van de 0 a 7 para recojer cada una de la info (segundos,minutos,hora,fech,etc...)
Para hechar a andar el RELOJ (ds13..), se envia un CERO a la direccion cero del dispositivo(igual que el acceso E/L de una eeprom):
busout %11010000,0,[0]
con esta linea anterior inicializo el reloj(dispositivo) con CERO inicializo el reloj, con 1 logico  DETENGO el reloj(esto viene en el DS me parece)
En fin, el ejemplo del link que te di tiene EXESO de codigo y esta pesimamente la sintaxis, pero por lo mismo lo entenderas mejor, ademas que tiene basura(muchas variables no necesarias, al gual que los alias, son totalmente inecesrios). siento que la informacion que viene incluida es mas que suficiente, pero por favor no dudes en decirme o hacerme saber sobre cualquier duda , ya sea a mi o a los demas panas del foro, con gusto te ayudamos a sacar adelante tu proyecto.
Reviza modulo por modulo detenidamente y te daras cuenta que es muy sencillo..(extenso pero sencillo) En proton usamos el comando BUSIN y BUSOUT para conexionado entre I2C"s , en pbpro pudes usar el I2Cwrite, etc.. pero es mas o menos lo mismo, sobre todo si piensas reescribirlo nuevamente a tu manera(lo cual me poarece muy inteligente de tu parte) .

Un abrazo pana

Título: RE: DS1307... NO LOGRO ENTENDERLO.
Publicado por: Lager. en 26 de Diciembre de 2004, 22:46:00
Aqui te pongo tu ejemplo para pbpro, no se si este bien, pero le agrge lo del lcd, tendras que probarlo y chekar que errores saltan y demas, aun asi, este ejmplo para pbpro de la pagina que pusiste es mucho mas sencillo de entender que el que te comente, y solo tienes que agregarle la impresion de los datos:
" PIC16F876A @ 20MHz w/boot-loader
DEFINE OSC 20
"DEFINE LOADER_USED 1 " Comment out if not using boot-loader{POR AHORA SIN BOOT}
DEFINE LCD_DREG    PORTB              " PUERTO DE DATOS
DEFINE LCD_DBIT      4                   " BIT INICIAL(0 O 4)
DEFINE LCD_RSREG   PORTB            "PUERTO DEL BIT DEL REGISTER SELECT DEL LCD
DEFINE LCD_RSBIT    1                   "BIT DEL REGISTER SELECT DEL LCD
DEFINE LCD_EREG     PORTB            "PUERTO DEL BIT DE ENABLE DEL LCD
DEFINE LCD_EBIT      0                   "BIT DE ENABLE DEL LCD
DEFINE LCD_BITS      4                   "TAMAÑO DE BUS 4 O 8  
DEFINE LCD_LINES     2                   "NUMERO DE LINEAS
DEFINE LCD_COMMANDS  2000         "RETARDO EN COAMNDOS(EN US)
DEFINE LCD_DATAUS    50               " RETARDO EN DATOS(EN US)
"EL LCD ESTA PARA:LCD DE 2 LINEAS PUERTOB.0 CONECTADO A E(ENABLE) DEL LCD,
"PUERTOB.1 A RS DEL LCD ,BUFFER DE 4 BITS QUE VAN DE PORTB.4-7 AL D4-D7 DEL LCD

" Shiftin Modes
Symbol MSBPRE = 0       " MSB first, sample before clock
Symbol LSBPRE = 1       " LSB first, sample before clock
Symbol MSBPOST = 2      " MSB first, sample after clock
Symbol LSBPOST = 3      " LSB first, sample after clock
" Shiftout Modes
Symbol LSBFIRST = 0     " LSB first
Symbol MSBFIRST = 1     " MSB first


" NotA: USAR RESISTENCIAS DE 10K DE pull-up  EN LAS LINEAS SDA Y SCL
" DS1307 control pins
SDA     VAR PORTB.0 " DS1307 SDA pin #5
SCL     VAR PORTB.1 " DS1307 SCL pin #6

" DS1620 TEMPERATURA
DQ      VAR PORTB.2 " DS1620 DQ pin #1
CLK0    VAR PORTB.3 " DS1620 CLK pin #2
RST     VAR PORTB.4 " DS1620 RST pin #3

Temp    VAR WORD    " variable para temperatura
DB0     VAR BYTE[8] " array de datos PARA HORA Y FECHA

TRISB   =   0
TRISA   =   0
CMCON   =   7 " Deshabilitamos comparadores
PAUSE 1000 " //ESPERAMOS A ESTABILIZAR TODO!!
    " RELOJ DS1307 RTC PARA LCD
Main:
    " CARGAMOS EL DSXXXX CON ESTOS VALORES DE INICIO:MARTES 15:30:00 27 DE DIC DE 2004
    I2CWRITE SDA,SCL,$D0,$00,[$00,$30,$15,$01,$1B,$0C,$04,$90] " MAS CLARO NO SE PUEDE!!
                            " SeG  Min HOr DIA  D  MES AÑO Control
Read_1307:
    " LEEMOS SEGUNDOS,MINUTOS,HORAS,DIAS,FECHA,MES,AÑO,CONTROL
    I2CREAD SDA,SCL,$D0,$00,[STR DB08]  " LEEMOS 8 bytes DEL DS1307   
   LCDOUT $FE,1, "<----------------CLS
   LCDOUT STR DB08 "ENVIAMOS LOS DATOS DE HORA Y FECHA!!
    PAUSE 2000       " PAUSA DE 2 sEG.
    GOSUB Read_1620  " LEEMOS TEMP
    GOTO Read_1307   " LEEMOS TIEMPO E IMPRIMIMOS
       
Read_1620:    
    RST = 1
    SHIFTOUT DQ,CLK0,LSBFIRST,[$0C,$02] " Continuous convert, CPU mode
    RST = 0
    PAUSE 10                            " Minimum wait time after write
    RST = 1                             " Enable 1620
    SHIFTOUT DQ, CLK0, LSBFIRST, [$EE]  " Send start temp convert command
    RST = 0                             " Disable 1620
    PAUSE 1000                          " Wait for conversion to complete
    RST = 1                             " Enable 1620
    SHIFTOUT DQ, CLK0, LSBFIRST, [$AA]  " Send read temp command
    SHIFTIN DQ, CLK0, LSBPRE, [Temp9]  " Read 9 bit temperature
    RST = 0                             " Disable 1620
    Temp = Temp/2                       " Scale reading to whole degrees C.
    Temp = (Temp */ $01CC)              " Multiply by 1.8.
    Temp = Temp + 32                    " Complete C to F conversion.
    IF Temp > 99 THEN Ouch              " Is Temp > 99 deg F..?
    HSEROUT [DEC Temp DIG 1,".",DEC Temp DIG 0,13,10]
    Temp = (Temp DIG 1*16)+Temp DIG 0   " No. Convert to BCD
    LCDOUT $FE,1, "<----------------CLS
   LCDOUT #TEMP, "IMPRIMIMOS TEMPERATURA!!
    PAUSE 2000      
    RETURN

Ouch:
   LCDOUT $FE,1, "<----------------CLS
   LCDOUT "OUCH" "ENVIAMOS LOS DATOS!!
     PAUSE 200       " Set display blink rate here
    GOTO Read_1307   " Start over              
    END

Revizalo por favor, ya que tiene bastante tiempo que no uso pbpro y es muy probable que tenga errores.
Un abrazo pana
Título: RE: DS1307... NO LOGRO ENTENDERLO.
Publicado por: gesteva en 27 de Diciembre de 2004, 21:51:00
Saludos Lager... te comento lo que he hecho:

En base al código que has puesto trate de quitarle la parte de temperatura y adaptarlo a mi circuito el cual tiene un PIC16F877, y esto fue lo que me quedo:

DEFINE OSC 4
DEFINE LCD_DREG PORTD   "PUERTO DE DATOS
DEFINE LCD_DBIT 4   "BIT INICIAL(0 O 4)
DEFINE LCD_RSREG PORTE  "PUERTO DEL BIT DEL REGISTER SELECT DEL LCD
DEFINE LCD_RSBIT 0   "BIT DEL REGISTER SELECT DEL LCD
DEFINE LCD_EREG PORTE   "PUERTO DEL BIT DE ENABLE DEL LCD
DEFINE LCD_EBIT 1   "BIT DE ENABLE DEL LCD
DEFINE LCD_BITS 4   "TAMAÑO DE BUS 4 O 8
DEFINE LCD_LINES 1   "NUMERO DE LINEAS
DEFINE LCD_COMMANDS 2000  "RETARDO EN COMANDOS(EN US)
DEFINE LCD_DATAUS 50   "RETARDO EN DATOS(EN US)


SDA VAR PORTB.0    " DS1307 SDA pin #5
SCL VAR PORTB.1   " DS1307 SCL pin #6

DB0 VAR BYTE[8]   " array de datos PARA HORA Y FECHA

TRISB = %00000000
TRISD = %00000000
TRISE = %00000000

 PAUSE 1000   " //ESPERAMOS A ESTABILIZAR TODO!!

" RELOJ DS1307 RTC PARA LCD

Main:


I2CWRITE SDA,SCL,$D0,$00,[$00,$30,$15,$01,$1B,$0C,$04,$90]

" SeG Min HOr DIA D MES AÑO Control

Read_1307:

I2CREAD SDA,SCL,$D0,$00,[STR DB08]

 LCDOUT $FE,1  "<----------------CLS
 LCDOUT STR DB08  "ENVIAMOS LOS DATOS DE HORA Y FECHA!!
 PAUSE 2000   " PAUSA DE 2 sEG.
 
GOTO Read_1307   " LEEMOS TIEMPO E IMPRIMIMOS

 END


Bueno el resultado no fue bueno, ya que en la pantalla sale un cursor parpadeando y cambiando de posición, pero no sale nada. Como cosa curiosa quiero preguntarte algo... como obtenemos los datos solicitados al DS1307 si en el programa o en el PIC todas las líneas son salida, no hay ninguna entrada. Disculpa mi ignorancia... RollEyes

Bien, si tienes alguna otra idea dime...

Saludos y gracias!
Título: RE: DS1307... NO LOGRO ENTENDERLO.
Publicado por: Lager. en 28 de Diciembre de 2004, 00:07:00
Pana Gestava,
OJO con esto:
TRISB = %00000000
TRISD = %00000000
TRISE = %00000000
 yo solo puse esto:
TRISB = 0
TRISA = 0 , que es lo mismo que viene en el original
otra, cosa los datos son obtenidos por el comando I2CREAD... que anda por ahi en una subrutina del codigo, cabe señalar que el codigo que puse es el mismo que tu me señalaste de la pagina de renton, solo agrege las lineas de escritura de lcd en lugar de las de envio de datos SHIFOUT..etc...Las lineas que agrege supongo deben funcionar( no lo e probado,ya que no tengo ese compilador) debes tratar de ajustarlas para tu necesidad, aunque no  veo razon, a exepcion de lo que te señale para que no te trabaje, una forma de saber si esta o no imprimiendo lo que necesitas, es poner un comando de escritura al inicio del programa... el comando  d escritura para lcd tambien setea lo necesario como salidas..., aun asi el codigo original necesita pulirse  bastante ya que deja muchas cosas por defaul y sobre entendidas y no definidas como se debe.
REviza con calma el codigo original, para ver que no haya tenido un error yo y quita lo que no necesitas de el, probando modulo por modulo, y sobre todo haciendo la prueba que te indique de imprimir en el lcd un ON por ejemplo al iniciarse el codigo,, para ver que el lcd este operando bien, puede ser problema tambien de estabilizacion, añade un delay al inicio de tu programa para que arranque sin problemas el lcd.
Revizalo y me comentas tus resultados, si aun asi no anda, lo revizamos a conciencia y de que te funciona te funciona pana. Sonrisa

Salu2 pana
Título: RE: DS1307... NO LOGRO ENTENDERLO.
Publicado por: Lager. en 28 de Diciembre de 2004, 15:10:00
Aqui te pongo el codigo completo ,sin alteraciones, solo quite(en forma de comentario) lo que se supone no necesitas.
-------------------------------------------------------------------------------------------------------------
"****************************************************************
"*  Name    : SLED_1307.BAS                                     *
"*  Author  : Bruce Reynolds                                    *
"*  Notice  : Copyright (c) 2004 Reynolds Electronics           *
"*          : All Rights Reserved                               *
"*  Date    : 7/02/2004                                         *
"*  Version : 1.0  Digital Clock w/ Time & Temp                 *
"*  Notes   : Test code for the SLED4C 4-digit serial           *
"*          : LED/clock display module, DS1620 & DS1307 RTC     *
"****************************************************************
" PIC16F876A @ 20MHz w/boot-loader
DEFINE OSC 20
"DEFINE LOADER_USED 1 " Comment out if not using boot-loader
"INCLUDE "modedefs.bas"<<<<<<<<<<<<<<YA QUE NO VAS AUSAR SHIFS
" Note: use 10K pull-up resistors on both SDA and SCL i2C lines
" DS1307 control pins
" DEFINICIONES DE LOS REGISTROS DEL LCD<<<<<<<<<<<<<<AJUSTALOS A TU CONFIG
"DEFINE  LCD_DREG        PORTD         "<<<<PORTD.4,5,6,7 A D4,D5,D6,D7 DEL LCD
"DEFINE  LCD_DBIT        4
"DEFINE  LCD_RSREG       PORTE         "<<<<PORTE.0 A RS DEL LCD
"DEFINE  LCD_RSBIT       0
"DEFINE  LCD_EREG        PORTE         "<<<<PORTE.1 A E DEL LCD
"DEFINE  LCD_EBIT        1
"DEFINE LCD_BITS        4             "<<<<BUS A 4 BITS
"DEFINE LCD_LINES        2             "<<<< LCD DE 2 LINEAS??

SDA     VAR PORTB.0 " DS1307 SDA pin #5
SCL     VAR PORTB.1 " DS1307 SCL pin #6

" DS1620 control pins
DQ      VAR PORTB.2 " DS1620 DQ pin #1
CLK0    VAR PORTB.3 " DS1620 CLK pin #2
RST     VAR PORTB.4 " DS1620 RST pin #3

" SLED4C display control pins
"EN      VAR PORTB.5 " SLED enable pin #5
"CLK     VAR PORTB.6 " SLED clock pin #4
"DOUT    VAR PORTB.7 " SLED data pin #3

" Variables
X       VAR WORD    " GP var
Y       VAR BYTE    " GP var
"CFG     VAR BYTE    " Holds display bank & digit config value
Temp    VAR WORD    " 1620 temperature result register
DB0     VAR BYTE[8] " Data byte array

" Port configuration
TRISB   =   0
TRISA   =   0
CMCON   =   %00000111 " Comparators = off

    PAUSE 1000 " Allow power to stabilize on power-up
   
    " 24-hour clock routine for the DS1307 RTC w/SLED4C clock display
Main:
    GOSUB Write_1307 " Write time & date on entry
   
Read_1307:
    "CFG = %11000011  " Banks 5,4,3,2 HEX decode, bank 1 (colon) special decode
    "GOSUB Config     " Configure display
   I2CREAD SDA,SCL,$D0,$00,[STR DB08]  " Read 8 bytes from DS1307
    "EN = 0           " Enable data input
    "*********** AQUI TU ESCRITURA A LCD!!!!!!!!!!!!!!!!>>>>>>>>>>>>>
   "*********** Lcdout $fe,1,STR DB08 "CLS Y ENVIA!!!!>>>>>>>>>>>>>
    " Read time Secs,Mins,Hours,Day,Date,Month,Year,Control
    "                           DIM      5/4     3/2     :=ON
    "SHIFTOUT DOUT,CLK,MSBFIRST,[%00004, DB0[2], DB0[1], $84]
    "EN = 1           " Transfer data into display registers
    PAUSE 2000       " Display time for 2 seconds
    "GOSUB Read_1620  " Read & display Temp<<<<<<<<<<<<<<<<<<<TEMPERATURA DESHABILITADA
    GOTO Read_1307   " Read & display Time
         
Write_1307:
    " Set time & date to 15:30:00 Tuesday 6th of July 2004
    I2CWRITE SDA,SCL,$D0,$00,[$00,$30,$15,$02,$06,$07,$04,$90] " Write to DS1307
    RETURN                  " Sec Min  Hr  Day D   M   Y  Control

"Read_1620:    
"    RST = 1
"    SHIFTOUT DQ,CLK0,LSBFIRST,[$0C,$02] " Continuous convert, CPU mode
"    RST = 0
"    PAUSE 10                            " Minimum wait time after write
"    RST = 1                             " Enable 1620
"    SHIFTOUT DQ, CLK0, LSBFIRST, [$EE]  " Send start temp convert command
"    RST = 0                             " Disable 1620
"    PAUSE 1000                          " Wait for conversion to complete
   
"    RST = 1                             " Enable 1620
"    SHIFTOUT DQ, CLK0, LSBFIRST, [$AA]  " Send read temp command
"    SHIFTIN DQ, CLK0, LSBPRE, [Temp9]  " Read 9 bit temperature
"    RST = 0                             " Disable 1620
"    Temp = Temp/2                       " Scale reading to whole degrees C.
"    Temp = (Temp */ $01CC)              " Multiply by 1.8.
"    Temp = Temp + 32                    " Complete C to F conversion.
"    IF Temp > 99 THEN Ouch              " Is Temp > 99 deg F..?
"    HSEROUT [DEC Temp DIG 1,".",DEC Temp DIG 0,13,10]
"    Temp = (Temp DIG 1*16)+Temp DIG 0   " No. Convert to BCD
   
    " Configure display
"    CFG = %11001011  " 5,4,2 HEX decode. 3,1 special decode
"    GOSUB Config     " Write config value to display
   
    " Display temp in deg F
"    EN = 0           " Enable data input     5/4    deg   F    :=OFF
"    SHIFTOUT DOUT, CLK, MSBFIRST, [%00004, Temp, $F4, $F4, $04]
"    EN = 1           " Transfer data into display registers
"    PAUSE 2000       " Display Temp for 2 seconds
"    RETURN

"Ouch:
"    CFG = %11010111  " 5,3 hex decode. 4,2,1 special decode, display ON
"    GOSUB Config     " Write config value to display
"    
"    " Write OUCH to the display when the temperature is > 99 deg F
"    Y = %00001000    " Set bit 3 for toggling display brightness
"    FOR X = 0 TO 4   " This loop causes OUCH to blink
"     EN = 0          " Enable data input
"     Y.0[3] = Y.0[3] ^ 1" Toggle Y.bit.3 by XOR-ing with 1 [ 0=DIM, 1=BRIGHT ]
"     "                                   5=O   4=U   3=C   2=H   :=OFF
"     SHIFTOUT DOUT, CLK, MSBFIRST, [Y4, $04, $A4, $C4, $24, $04]
"     "                              ^--- bit 3 of 4-bit value toggles brightness
"     EN = 1          " Transfer data into display registers
"     PAUSE 200       " Set display blink rate here
"    NEXT X           " Close the loop
"    GOTO Read_1307   " Start over
                     
"Config:              " This routine writes the config byte to the display
    "EN = 0           " Enable data input
    "SHIFTOUT DOUT, CLK, MSBFIRST, [CFG] " Write config data to display
    "EN = 1           " Transfer data into display register
    "RETURN
           
    END
---------------------------------------------------------------------------------------------------------

Pruebalo y me dices, ojo que no removi absolutamente nada ,solo agrege en calidad de comentario lo que se supone debes agregar para usar el lcd(tienes que configurarlo a tus necesidades) asi como donde debe de imprimir.

Salu2 pana
Título: RE: DS1307... NO LOGRO ENTENDERLO.
Publicado por: Tigre en 28 de Diciembre de 2004, 15:43:00
Hola
Pongo un parte de un mensaje que he puesto anteriormente que tambien creo aplica aqui, solo que esta con Proton y como yo ocupo solo segundos, minutos y hora asi es como esta.


La dirección de lectura debe ser D1 y escritura D0 según yo.

El data dice:
The address byte is the first byte received after the start condition is generated by the
master. The address byte contains the 7-bit DS1307 address, which is 1101000, followed by the
*direction bit (R/W ) which, for a read, is a 1.

pongo un ejemplo de lo que utilice para ver si funcionaba primero y solo pone la hora por default y se ve en el LCD.

algo muy importante es que debes grabar algo como default de lo contrario no podras manipularlo.

deberias de simularlo para que estes seguro que funciona y no sea algo que este mal conectado

Yo no se muy bien como es esto de los puertos pero yo acomode el SDA y SCL de la siguiente forma ya que en el data del 16F877A asi esta etiquetado si se puede cambiar sinceramente no lo se pero asi esta funcionando.




****************************************
DEVICE=16F877
XTAL = 4
LCD_DTPIN = PORTD.4
LCD_RSPIN = PORTD.2
LCD_ENPIN = PORTD.3
LCD_INTERFACE = 4 " 4-bit Interface
LCD_LINES = 2
LCD_TYPE = 0


pause 1000


SCL_PIN = PORTC.3
SDA_PIN = PORTC.4

DIM SEGUNDOS AS BYTE
DIM MINUTOS AS BYTE
DIM HORA AS BYTE

" ++++++++++ Grabar la hora

SEGUNDOS = $00
MINUTOS = $00
HORA=$12

" para simular con el PCF8583 utilizo la direccion %10100000,2,

BUSOUT $D0,$00,[SEGUNDOS,MINUTOS,HORA] "GRABA LA HORA PRE ESTABLECIDA
CLS



Leer_Hora:

BUSIN $D1,$00,[ SEGUNDOS,MINUTOS,HORA]

PRINT AT 1,1, HEX2 HORA,":", HEX2 MINUTOS, ":", HEX2 SEGUNDOS



GOTO Leer_Hora

END
*******************************
Espero te sirva de algo esto ya que como te comento no tengo mucha experiencia y yo solo ocupo la hora, minutos y segundos.

Saludos

Luis
Título: RE: DS1307... NO LOGRO ENTENDERLO.
Publicado por: gesteva en 29 de Diciembre de 2004, 07:12:00
Gracias Lager y Luis, he pasado algunas horas mas en esto sin resultados aún.  

Buscando encontre otro ejemplo pero con otro chip, no se si funciona igual pero almenos se ve igualito:

La fuente es:

http://www.oshonsoft.com/picexamples.html

No lo he puesto a prueba pues estoy en la oficina, algo distraido con este asunto. Abrá que adaptarlo al PicBasic Pro, pero si funciona quizá sirva de inspiración.


EXAMPLE 4: Connection with PCF8583 real time clock
 
- Basic source program:
Define LCD_BITS = 8
Define LCD_DREG = PORTB
Define LCD_DBIT = 0
Define LCD_RSREG = PORTD
Define LCD_RSBIT = 1
Define LCD_EREG = PORTD
Define LCD_EBIT = 3
Define LCD_RWREG = PORTD
Define LCD_RWBIT = 2
 
Symbol sda = PORTC.2
Symbol scl = PORTC.3
 
Dim addr As Byte
Dim data As Byte
Dim sec As Byte
Dim min As Byte
Dim hour As Byte
Dim day As Byte
Dim month As Byte
Dim year As Byte
Dim d_hi As Byte
Dim d_lo As Byte
 
Lcdinit
WaitMs 1000
 
addr = 2
I2CWrite sda, scl, 0xa2, addr, 0
addr = 3
I2CWrite sda, scl, 0xa2, addr, 0x55
addr = 4
I2CWrite sda, scl, 0xa2, addr, 0x23
addr = 5
I2CWrite sda, scl, 0xa2, addr, 0xb1
addr = 6
I2CWrite sda, scl, 0xa2, addr, 0x12
 
loop:
 
addr = 2
I2CRead sda, scl, 0xa2, addr, sec
addr = 3
I2CRead sda, scl, 0xa2, addr, min
addr = 4
I2CRead sda, scl, 0xa2, addr, hour
addr = 5
I2CRead sda, scl, 0xa2, addr, day
year = 0
year.0 = day.6
year.1 = day.7
day.6 = 0
day.7 = 0
addr = 6
I2CRead sda, scl, 0xa2, addr, month
month.5 = 0
month.6 = 0
month.7 = 0
 
Lcdcmdout LcdClear
Lcdout "Time: "
data = hour
Gosub print
Lcdout ":"
data = min
Gosub print
Lcdout ":"
data = sec
Gosub print
Lcdcmdout LcdLine2Home
Lcdout "Date: "
data = day
Gosub print
Lcdout "/"
data = month
Gosub print
Lcdout "/200", #year
 
WaitMs 200
Goto loop
End
 
print:
d_hi = data / 16
d_lo = data Mod 16
If d_hi < 10 Then
   Lcdout #d_hi
Else
   Lcdout "X"
Endif
If d_lo < 10 Then
   Lcdout #d_lo
Else
   Lcdout "X"
Endif
Return


Espero me den su opinión pues haciendo las modificaciones a los programas que hemos venido estudiando, el resultado es siempre el cursor parpadeando en la LCD cambiando de posición aprox. cada 1 segundo. Es decir, se ve que el micro se comunica con el DS1307, pero hasta ahí llega.

Por cierto... he aqui un buen manual de PBP... para los que no lo tenían a mano:

http://www.microengineeringlabs.com/resources/pbpmanual/


Seguiremos Investigando...

Saludos...
Título: RE: DS1307... NO LOGRO ENTENDERLO.
Publicado por: Tigre en 29 de Diciembre de 2004, 10:02:00
Hola
Mira yo se realmente muy poco y lo que te puedo decir que sin el DS1307 puesto en el LCD aparecia 88:88:88, tambien con uno que tenia mal puesto creo que deberias checar primero solo mandando horas y minutos por ejemplo y sin hacer tan extenso el programa. Como te comente anteriormente yo lo simule primero en Proteus con el PCF8583 utilizando la direccion %10100000,2, y solamente con minutos, segundos y hora de hecho si no le pones las resistencias de 5V a SDA y SCL marca tambien el 88:88:88 nunca manda en blanco si requieres el PCF8583 para simularlo yo lo tengo y te lo puedo enviar.


el DS1307 fue un dolor de cabeza para mi tambien el primero que puse estaba dañado loco y tarde en darme cuenta.

Saludos

Luis
Título: RE: DS1307... NO LOGRO ENTENDERLO.
Publicado por: Lager. en 29 de Diciembre de 2004, 10:59:00
Haber pana gesteva, parece que tienes varios problemas, los cuales no vas a resolver cambiando de codigos y compiladores, si solo tienes pbpro, el codigo resumido es el siguiente:
---------------------------------------------------------------------------------------------------------
" PIC16F876A @ 20MHz w/boot-loader
DEFINE OSC 20
"DEFINE LOADER_USED 1 " Comment out if not using boot-loader
INCLUDE "modedefs.bas""<<<<<<<<<<<<<<YA QUE NO VAS AUSAR SHIFS
" DEFINICIONES DE LOS REGISTROS DEL LCD<<<<<<<<<<<<<<AJUSTALOS A TU CONFIG
"DEFINE  LCD_DREG        PORTA         "<<<<PORTD.4,5,6,7 A D4,D5,D6,D7 DEL LCD
"DEFINE  LCD_DBIT        0
"DEFINE  LCD_RSREG       PORTB         "<<<<PORTE.0 A RS DEL LCD
"DEFINE  LCD_RSBIT       0
"DEFINE  LCD_EREG        PORTB         "<<<<PORTE.1 A E DEL LCD
"DEFINE  LCD_EBIT        1
"DEFINE LCD_BITS       4             "<<<<BUS A 4 BITS
"DEFINE LCD_LINES       2             "<<<< LCD DE 2 LINEAS??
" LCD should be connected as follows:
"       LCD     PIC
"       DB4     PortA.0
"       DB5     PortA.1
"       DB6     PortA.2
"       DB7     PortA.3
"       RS      PortB.0 (add 4.7K pullup resistor to 5 volts)
"       E       PortB.1
"       RW      Ground
"       Vdd     5 volts
"       Vss     Ground
"       Vo      20K potentiometer (or ground)
"       DB0-3   No connect
" Port configuration
TRISB=0
TRISA=0
CMCON=%00000111 " Comparators = off

    PAUSE 1000 " Allow power to stabilize on power-up
    LCDOUT $FE, 1,"Hello"
   PAUSE 3000 " Allow power to stabilize on power-up
 END
    " 24-hour clock routine for the DS1307 RTC w/SLED4C clock display
---------------------------------------------------------------------------------------------------------

Te e deshabilitado todo, solo te deje una impresion de prueba(para que revizes si efectivemente esta funcionando en primer lugar el LCD), Te pregunte y te comente ya hace varios dias que si habias probado el lcd y que probaras el lcd....(aun no me has dicho nada de nada , si no revizas modulo por modulo no vas a resolver tu problema) cuando te dije que probaras cada modulo debes probarlo via hardware y via software, ya que  tienes un problema con uno(o todos), si no lo haces JAMAS vas a enterarte de cual es si no separas y revizas cada uno y por tanto no vas  adarte cuenta de tu error o de la limitacion (en caso de que asi sea)
Cuando hayas revizado que el lcd te funciona con la configuracion de pines que uses(repito nuevamente eso lo haces tu en los defines), continuamos la revizion, pero la solucion no es abandonar codigos ni trabajos, es RESOLVER el problema con las herramientas que tengas. Para la segunda prueba hay que revizar que ESCRIBA y LEA, esto tambien lo puedes simular con una I2C EEPROM (24XXX), una ves hecha esta prueba,(cambia el codigo se señalizacion ACK) y que TODO funcione correctamente, lo montas, pero creo que debes ir por pasos
Hechale el 500%

Salu2 pana
Título: RE: DS1307... NO LOGRO ENTENDERLO.
Publicado por: gesteva en 08 de Enero de 2005, 08:05:00
Me rindo... la LCD está perfecta, pues puedo ver cualquier mensaje que ponga antes de la rutina del reloj. Ya cambié el Microcontrolador, desmonté el circuito, lo volvi a montar, le recé... y esto ya me cansó...

Saludos...
Título: RE: DS1307... NO LOGRO ENTENDERLO.
Publicado por: Lager. en 08 de Enero de 2005, 23:42:00
Ahora solo hay que probar que este escribiendo pana, con paciencia lo vas a lograr.
Simulalo con proteus como si escribieras en una eeprom(solo cambiaria la señalizacion de control.....)
A seguirle pana!!! , estas cerca Sonrisa

Un abraso
Título: Re: RE: DS1307... NO LOGRO ENTENDERLO.
Publicado por: brechero en 02 de Abril de 2007, 01:15:36
hola tigre me podrias pasar la libreria del PCF8583 para protel ??
Título: Re: DS1307... NO LOGRO ENTENDERLO.
Publicado por: dogflu66 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.
Título: Re: DS1307... NO LOGRO ENTENDERLO.
Publicado por: Jmedina 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
Título: Re: DS1307... NO LOGRO ENTENDERLO.
Publicado por: KALLITOS 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 :(