News:

Let's find out together what makes a PIC Tick!

Main Menu

DS3231 code

Started by RGV250, Oct 27, 2021, 10:55 PM

Previous topic - Next topic

RGV250

Hi,
Does anyone have code for DS3231 for 8bit device where it writes the time & date.
I have it working fine on a PIC24 but when I compile the code on an 18F25K20 I get ERROR [Line 175]:Item '_CPROC_' not found! (DS3231.INC)

If you comment out the 2 lines in the test file it works but obviously I cannot set the time or date.
    DS3231_WriteDate(2, 28, 12, 20)                             ' Write an initial date (W/Day, D, M, Y)
    DS3231_WriteTime(10, 36, 00)                                ' Write an initial time (H, M, S)

This is the INC code and a test file.
DS3231.zip

The other question I have regarding this is how you would actually go about solving the issue as there is no ASM as it has not compiled.

Regards,
Bob

RGV250

#1
Another problem seems to be when writing to the control register.
    DS3231_WriteControl(0) gives a Result not found error. This happens for both 8 bit and 16 bit.

Bob

Gamboa

RGV250,

A very well written library. Congratulations.

A few years ago I used the DS3231. Those were the times before there were procedures at Proton. I have extracted the necessary parts of the application in the program that I made. I have compiled the complete program with the current version of Positron 8 and it compiles without errors.
I don't know if this compilation works on the hardware I made since I don't have the hardware.

'*****************************
'*        DECLARE            *
'*****************************
  DEVICE = 18F85K22

  DECLARE SDA_PIN PORTC.4   'Defino I2C software. Se añade una EEprom externa conectada a estos pines
  DECLARE SCL_PIN PORTC.3
  DECLARE SLOW_BUS ON


  SYMBOL CONTROL_LECTURA_DS   %11010001  'byte de control del reloj ds3231 para leer
  SYMBOL CONTROL_ESCRITURA_DS %11010000  'byte de control del reloj DS3231 para escribir
  SYMBOL DIRECCION_DS %00000000          'byte que apunta al registro cero del reloj DS


'************************************************
'*       DEFINICION DE VARIABLES                *
'************************************************

  DIM Comunicacion[256]      AS BYTE 'Array que recibe los datos de un paquete de comunicaciones de Usart 1
  DIM SMensaje[3]            AS BYTE
  DIM FechayHora[7]          AS BYTE 'Array que guarda la fecha y hora ss:mm:hh ds DD/MM/AA
  DIM DatosEeprom[16]        AS BYTE 'Array para manejar los datos de entrada y salida de la EEPROM externa


'*************************************************************************
'** SUBRUTINA: Leer_DS3231
'** lee la hora del reloj en tiempo real
'**
'** Parametros de entrada: control_escritura_ds, CONTROL_LECTURA_DS
'** Parametros de salida: FechayHora
'*************************************************************************

Leer_DS3231:
    'Posiciono el puntero de lectura del reloj en el registro número cero
    'para leer desde esa posición en adelante siete registros  de la hora y fecha
    'reg0-> ss  segundos 00 a 59
    'reg1-> mm  minutos  00 a 59
    'reg2-> hh  horas    00 a 23 (o 0 a 12 AM PM)
    'reg3-> ds  día de la semana 1 a 7 (1 domingo, 2 lunes ...)
    'reg4-> DD  fecha día 1 a 31
    'reg5-> MM  mes de 1 a 12
    'reg6-> AA  año de 00 a 99
    'La posicion de los datos en la matriz es:
    'fechayhora[ss,mm,hh,ds,DD,MM,AA]
   
   
    BSTART                    ' envío Start
    BUSOUT CONTROL_ESCRITURA_DS ' Envío direccion del esclavo
    BUSOUT 0                    ' Envío direccion del primer registro
    BSTOP                       'envio Stop
'    'leo siete registros y los cargo en la matriz de hora y fecha
    BUSIN CONTROL_LECTURA_DS, [STR FechayHora]

  RETURN

'** FIN SUBRUTINA: Leer_DS3231

'*************************************************************************
'** SUBRUTINA: escribir_ds3231
'** escribe en el reloj de tiempo real DS3231 la fecha y hora para actualizarlo
'**
'** Parametros de entrada: control_escritura_ds, direccion_ds, fechayhora
'** Parametros de salida:
'*************************************************************************

Escribir_DS3231:
 
 BUSOUT CONTROL_ESCRITURA_DS,DIRECCION_DS,[STR FechayHora]   
 DELAYMS 6 'Tiempo de grabación de la informacion en EEPROM
 RETURN

'** FIN SUBRUTINA: escribir_ds3231



'*************************************************************************
'** SUBRUTINA: BCDaBIN
'** Convierte un byte codificado en BCD en un byte codificado en binario
'**
'** Variables de entrada: Tempo2
'** Variables de salida: Tempo2
'*************************************************************************

BCDaBIN:

    Tempo1 = Tempo2 & $0F
    Tempo3 = Tempo2 & $F0
    Tempo3 = Tempo3>>4
    Tempo3 = Tempo3 * 10
    Tempo2 = Tempo1 + Tempo3
   

  RETURN

'** FIN SUBRUTINA: BCDaBIN

'*************************************************************************
'** SUBRUTINA: BINaBCD
'** Convierte un byte codificado en binario en un byte codificado en BCD
'**
'** Variables de entrada: Tempo2
'** Variables de salida: Tempo2
'*************************************************************************

BINaBCD:

    Tempo1 = DIG Tempo2,0
    Tempo3 = DIG Tempo2,1
    Tempo3 = Tempo3<<4
    Tempo2 = Tempo1 ^ Tempo3
   

  RETURN

'** FIN SUBRUTINA: BINaBCD

'*************************************************************************
'** SUBRUTINA: AjustarHora
'** rutina temporal para ajustar la hora  en el reloj DS3231
'**
'** Parametro de entrada: Comunicacion[] se recibe por la puerta serie la información de la hora
'**
'*************************************************************************

AjustarHora:

    Tempo2 = Comunicacion[6]    'seg
    GOSUB BINaBCD
    FechayHora[0] = Tempo2
   
    Tempo2 = Comunicacion[5]    'min
    GOSUB BINaBCD
    FechayHora[1] = Tempo2
   
    Tempo2 = Comunicacion[4]    'hora
    GOSUB BINaBCD
    FechayHora[2] = Tempo2
   
    Tempo2 = 3            'Dia de la semana esto se ajusta fijo, no importa
    GOSUB BINaBCD
    FechayHora[3] = Tempo2
   
    Tempo2 = Comunicacion[7]    'Dia
    GOSUB BINaBCD
    FechayHora[4] = Tempo2
   
    Tempo2 = Comunicacion[8]    'Mes
    GOSUB BINaBCD
    FechayHora[5] = Tempo2
   
    Tempo2 = Comunicacion[9]    'Año
    GOSUB BINaBCD
    FechayHora[6] = Tempo2
   
    GOSUB Escribir_DS3231
   
  RETURN
'FIN DE SUBRUTINA: AjustarHora


'*************************************************************************
'** SUBRUTINA: ConvertirAFechaHumana
'** rutina temporal para convertir hora BCD a hora humana
'**
'** Parametro de entrada: DatosEeprom[]
'** Parametro de salida: DatosEeprom[]
'*************************************************************************

ConvertirAFechaHumana:
   Tempo2 = DatosEeprom[8] 'Día
   GOSUB BCDaBIN
   DatosEeprom[8] = Tempo2
   Tempo2 = DatosEeprom[9] 'Mes
   GOSUB BCDaBIN
   DatosEeprom[9] = Tempo2
   Tempo2 = DatosEeprom[10] 'Año
   GOSUB BCDaBIN
   DatosEeprom[10] = Tempo2
   Tempo2 = DatosEeprom[11] 'Hora
   GOSUB BCDaBIN
   DatosEeprom[11] = Tempo2
   Tempo2 = DatosEeprom[12] 'Minutos
   GOSUB BCDaBIN
   DatosEeprom[12] = Tempo2
   Tempo2 = DatosEeprom[13] 'Segundos
   GOSUB BCDaBIN
   DatosEeprom[13] = Tempo2
   
  RETURN
'FIN DE SUBRUTINA: ConvertirAFechaHumana


Regards,
Gamboa



Long live for you

atomix

#3
temporary solution

Proc DS3231_WriteTime(pHour As Byte, pMinute As Byte, pSecond As Byte)
    pSecond = DS3231_DecToBCD(pSecond)
    pMinute = DS3231_DecToBCD(pMinute)
    pHour = DS3231_DecToBCD(pHour)
    I2COut SDA, SCL, cRTC_DEV_ADDR, cRTC_TIME, [pSecond, pMinute, pHour]                               
EndProc


you missed return type
Proc DS3231_WriteRegister(pAddress As Byte, pData As Byte), Byte

RGV250

#4
Thanks,
I have not had time to try out the "WriteTime" but adding the return parameter solved the other issue. I wonder if the compiler should show a parameter missing error?
On the other hand I will have to look and see if the "Result" is needed as it is just writing to the register.

A very well written library. Congratulations.
I would love to take credit for it but is is a port from Les's DS1307 example so I had a very good basis to start from.
Quote' Modified from the DS1307 sample written by Les Johnson.

Regards,
Bob

top204

The return parameter from a procedure is purely optional, so if it is present, it can be used to return a value, but it can also be ignored if not required, but present.

If a "Result = X" line of code is used and the procedure does not have a return parameter, the compiler will give an error that the "Result" variable is not present.

RGV250

Hi Atomix,
That solution works, strange that it compiled and worked fine for the PIC24 device.

Regards,
Bob