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

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado gesteva

  • PIC12
  • **
  • Mensajes: 52
DS1307... NO LOGRO ENTENDERLO.
« 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.

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: DS1307... NO LOGRO ENTENDERLO.
« Respuesta #1 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

Desconectado gesteva

  • PIC12
  • **
  • Mensajes: 52
RE: DS1307... NO LOGRO ENTENDERLO.
« Respuesta #2 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.

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: DS1307... NO LOGRO ENTENDERLO.
« Respuesta #3 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


Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: DS1307... NO LOGRO ENTENDERLO.
« Respuesta #4 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

Desconectado gesteva

  • PIC12
  • **
  • Mensajes: 52
RE: DS1307... NO LOGRO ENTENDERLO.
« Respuesta #5 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!

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: DS1307... NO LOGRO ENTENDERLO.
« Respuesta #6 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

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: DS1307... NO LOGRO ENTENDERLO.
« Respuesta #7 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

Desconectado Tigre

  • Colaborador
  • PIC10
  • *****
  • Mensajes: 34
RE: DS1307... NO LOGRO ENTENDERLO.
« Respuesta #8 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

Desconectado gesteva

  • PIC12
  • **
  • Mensajes: 52
RE: DS1307... NO LOGRO ENTENDERLO.
« Respuesta #9 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...

Desconectado Tigre

  • Colaborador
  • PIC10
  • *****
  • Mensajes: 34
RE: DS1307... NO LOGRO ENTENDERLO.
« Respuesta #10 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

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: DS1307... NO LOGRO ENTENDERLO.
« Respuesta #11 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

Desconectado gesteva

  • PIC12
  • **
  • Mensajes: 52
RE: DS1307... NO LOGRO ENTENDERLO.
« Respuesta #12 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...

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: DS1307... NO LOGRO ENTENDERLO.
« Respuesta #13 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

Desconectado brechero

  • PIC10
  • *
  • Mensajes: 24
Re: RE: DS1307... NO LOGRO ENTENDERLO.
« Respuesta #14 en: 02 de Abril de 2007, 01:15:36 »
hola tigre me podrias pasar la libreria del PCF8583 para protel ??
.
SaludoS
.


 

anything