Este es un ejemplo utilizaremos el microcontrolador PIC24FJ32GB002 y el compilador XC16. Las páginas referenciadas en el código son de la datasheet del GB002. Usaremos la librería de consola serial de Chan de la que hablado en esta entrada en mi blog. Para escribir la librería para utilizar el módulo RTCC me basé en los códigos de ejempo que se pueden encontrar en http://www.microchip.com/codeexamples . Para utilizar el módulo RTCC es necesario tener un cristal de 32.768 kHz como oscilador secundario. En este programa he agregado una interrupción de un segundo con SOSC para verificar el funcionamiento del oscilador secundario (que he descrito en esta entrada, a las interrupciones por temporizador las trato en el repo en lo que llevo hecho de mi curso de PIC24). Es importante tener los capacitores correctos para el SOSC (entre 5 y 15 pF):
Para la documentación del módulo se hará referencia al documento DS39696B que la referencia general del módulo para la familia PIC24F. La parte que hace falta estudiar primero es el metodo de lectura escritura del registro RTCVAL en la página 15 ya que no es directo como en la mayoria de los SFR's sino que requiere del campo RTCPTR del registro RCFGCAL (pag. 4) para establecer puntero de inicio hacia los campos de valor (día, mes, año, etc). Este programa no implementa calibración (auto-ajustes contra los errores de pulsos de reloj), se debe consultar página 16.
Para la famila GB:
OSCCONbits.SOSCEN = 1; // SOSC habilitado
En el caso de la familia GA la escritura a OSCCON está protegida por lo que se debe usar:
__builtin_write_OSCCONL(OSCCON | 0x02); // SOSC habilitado
La estructura que almacena la infromación del tiempo tiene la siguiente forma:
typedef struct tm // Estructura de tiempo
{
unsigned char sec;
unsigned char min;
unsigned char hr;
unsigned char wkd;
unsigned char day;
unsigned char mth;
unsigned char yr;
} TMS;
IMPORTANTE: Las funciones de rtcc.h llenan la estructura con valores en formato BCD. Para realizar conversiones se tienen los iguientes macros:
#define mRTCCDec2Bin(Dec) (10*(Dec>>4)+(Dec&0x0f))
#define mRTCCBin2Dec(Bin) (((Bin/10)<<4)|(Bin%10))
Si están utilizando baterías para alimentar al PIC o van a estar realizando depuración es una buena práctica utilizar opto-acopladores. Esto también permite utilizar módulos de conversión USB-Serial que no tengan salida de 3.3v:
$ sudo apt install putty
Después de instalar:
$ sudo adduser <usuario> dialout
Buscamos puertos seriales disponibles con:
$ ls /dev/tty*