padbol
Joined: 25 Apr 2011 Posts: 11 Location: Belgium
|
|
Posted: Mon Apr 25, 2011 3:51 pm |
|
|
Only oscillator without any "options" ; No alarm ; ...
Simplest driver based on DS1307:
Code: |
/* SUJET : Driver de la RTC "DS3232" */
/* librement inspiré dehttp://www.cursomicros.com/control_i2c/c03_07_ds3232_prog.html et */
/* porté vers CCS */
/* */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* * * Définition des adresses * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*** Définition des adresses sur la RTC ***/
#define DS3232receive 11010000 // Adresse pour écriture du µC vers la RTC
#define DS3232transmit 11010001 // Adresse pour lecture sur la RTC depuis le µC
/*** Configuration et initialisation du bus I²C ***/
//Considéré comme déjà connu, enlever le commentaire si nécessaire
//#define I2C_SDA PIN_B0
//#define I2C_SCL PIN_B1
//#use i2c(master,sda=I2CdataPin,scl=I2CclockPin)
/* * * Déclaration des procédures et fonctions * * * * * * * * * * * * * * * * * * * * * * */
void DS3232init (); // Initalisation de la RTC
void DS3232setTime(BYTE h, BYTE min, BYTE s); // Configuration de l'heure
void DS3232setDate(BYTE day, BYTE month, BYTE year); // Configuration de la date
void DS3232getTime(BYTE &h, BYTE &min, BYTE &s); // Lecture de l'heure
void DS3232getDate(BYTE &dow, BYTE &day, BYTE &month, BYTE &year);// Lecture de la date
BYTE bin2bcd(BYTE binary_value); // Convertion BIN --> BCD
BYTE bcd2bin(BYTE bcd_value); // Convertion BCD --> BIN (plage d'entrée 0 -> 99)
/* * * Code source des procédures et fonctions * * * * * * * * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* BYTE BIN2bcd(BYTE binary_value) */
/* Converti la "Binary Value" en BCD */
/* Source : http://www.ccsinfo.com/forum/viewtopic.php?t=23255 */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
BYTE bin2bcd(BYTE binary_value)
{
BYTE temp;
BYTE retval;
temp = binary_value;
retval = 0;
while(1)
{
if(temp >= 10)
{
temp -= 10;
retval += 0x10;
}
else
{
retval += temp;
break;
}
}
return(retval);
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* BYTE BIN2bcd(BYTE binary_value) */
/* Converti la "Binary Value" en BCD */
/* Source : http://www.ccsinfo.com/forum/viewtopic.php?t=23255 */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
BYTE bcd2bin(BYTE bcd_value) // Input range - 00 to 99.
{
BYTE temp;
temp = bcd_value;
temp >>= 1;
temp &= 0x78;
return(temp + (temp >> 2) + (bcd_value & 0x0f));
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* DAYOFTHEWEEK(day, month, year) */
/* Retourne le jour de la semaine sous la forme d'un numéro. 0 est le dimanche. */
/* Informations sur la Congruence de Zeller: http://c-faq.com/misc/zeller.html */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int DayOfTheWeek(int Day, int Month, int16 Year) {
static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
year=year+2000;
year -= month < 3;
return (year + year/4 - year/100 + year/400 + t[month-1] + day) % 7;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* DS3232INIT() */
/* Initialisation de la RTC : Remise de tous les flags à 0 ; Activation de l'oscillateur ; */
/* Pas de compensation en température manuelle ; Compensation automatique toutes les 64s. */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void DS3232init () {
// Initialisation de l'I²C
output_float (I2C_SDA);
output_float (I2C_SCL);
// Initialisation du registre CONTROL
i2c_start();
i2c_write(DS3232receive); // Transmission vers la RTC
delay_us(10);
i2c_write(0x0E); // Adresse du registre CONTROL
delay_us(10);
i2c_write(00000100); // Data : Activation de l'oscillateur seulement
delay_us(10);
i2c_stop();
// Initialisation du registre CONTROL/STATUS
i2c_start();
i2c_write(DS3232receive); // Transmission vers la RTC
delay_us(10);
i2c_write(0x0F); // Adresse du registre CONTROL/STATUS
delay_us(10);
i2c_write(00000000); // Data : Aucune activation + remise des flags à 0
delay_us(10);
i2c_stop();
// Initialisation du registre AGING OFFSET
i2c_start();
i2c_write(DS3232receive); // Transmission vers la RTC
delay_us(10);
i2c_write(0x10); // Adresse du registre AGNIG OFFSET
delay_us(10);
i2c_write(00000000); // Data : Aucune compensation en température manuelle
delay_us(10);
i2c_stop();
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* DS3232setTime(h, min, s) */
/* Règle l'heure (h), les minutes (min) et les secondes (s) de l'horlge */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void DS3232setTime(BYTE h, BYTE min, BYTE s) {
i2c_start();
i2c_write(DS3232receive); // Transmission vers la RTC
i2c_write(0x00); // 0x00 Adresse du registre des secondes
i2c_write(bin2bcd(s & 0x7F)); // 0x00 Data : Secondes
i2c_write(bin2bcd(min & 0x7F)); // 0x01 Data : Minutes
i2c_write(bin2bcd(h & 0x3F)); // 0x02 Data : Heures - Mode "24h"
i2c_stop();
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* DS3232setDate(day, month, year) */
/* Règle la date : jour, mois, année. Le jour de la semaine est calculé par la */
/* Congruence de Zeller */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void DS3232setDate(BYTE day, BYTE month, BYTE year) {
i2c_start();
i2c_write(DS3232receive); // Transmission vers la RTC
i2c_write(0x03); // 0x03 Adresse du registre du jour de la semaine
i2c_write(bin2bcd(DayOfTheWeek(day,month,year) & 0x07)); // 0x03 Data : Nom du jour
i2c_write(bin2bcd(day)); // 0x04 Data : Jour
i2c_write(bin2bcd(month)); // 0x05 Data : Mois
i2c_write(bin2bcd(year)); // 0x06 Data : Année
i2c_stop();
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* DS3232setAlarmA() */
/* */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* DS3232setAlarmB() */
/* */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* DS3232getTime(&h, &min, &s) */
/* Récupère l'heure au format Heure : Minutes : Secondes */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void DS3232getTime(BYTE &h, BYTE &min, BYTE &s) {
i2c_start();
i2c_write(DS3232receive);
i2c_write(0x00); // Positionnement sur le registre des secondes
i2c_start();
i2c_write(DS3232transmit); // Transmission depuis la RTC vers le µC
s=bcd2bin(i2c_read() & 0x7F); // 0x00 Data : Secondes
min=bcd2bin(i2c_read() & 0x7F); // 0x01 Data : Minutes
h=bcd2bin(i2c_read(0) & 0x3F); // 0x02 Data : Heures
i2c_stop();
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* DS3232getDate(&dow, &day, &month, &year) */
/* Récupère le jour de la semaine et la date au format jour / mois / année */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void DS3232getDate(BYTE &dow, BYTE &day, BYTE &month, BYTE &year) {
i2c_start();
i2c_write(DS3232receive);
i2c_write(0x03); // Positionnement sur le registre des secondes
i2c_start();
i2c_write(DS3232transmit); // Transmission depuis la RTC vers le µC
dow=bcd2bin(i2c_read() & 0x07); // 0x03 Data : Jour de la semaine
day=bcd2bin(i2c_read() & 0x3F); // 0x04 Data : Jour
month=bcd2bin(i2c_read() & 0x1F); // 0x05 Data : Mois
year=bcd2bin(i2c_read(0)); // 0x06 Data : Année
i2c_stop();
} |
_________________ - Be the change you want to see in the world (Gandhi) - |
|