Bonjour,
je suis en plein projet de seconde année est mon rôle est d'afficher l'heure sur écran LCD. Donc j'utilise le PCF8563 avec un PIC16F876A, via le bus I2C donc ma première question est de savoir si je peut envoyer directement les données de depart en BCD, moi j'ai crée un programme qui envoie les donnée en Binaire, avec une procédure d'écriture et lecture utilisant I2c_start(); , i2c_write(); ....
ensuite je convertie en BCD pour le renvoyer dans l'horloge car elle n'accepte que le BCD. Cependant je ne suis pas sur de mon programme ecris e langage C avec le compilateur CCS. Je vous mes le programme n'hésiter pas a me laisser vos remarque sur le prog merci d’avance.
Code:#include <16f877A.h> // utilisation du pic 16f877a.h #use delay(clock=8000000) // fréquence du quartz #use I2C (master, SDA=PIN_C4, SCL=PIN_C3) // valide le dialogue I2C pour un maître #byte PortC = 0x07 // On défini l'adresse du port C #byte TribC = 0X87 // On défini l'adresse du registre de direction du port C #bit SCLK = PortC.3 // SCLK est le bit 3 du portC #bit SDA = PortC.4 // SDA est le bit 4 du portC #ifndef PCF8563_WRITE_ADDRESS #define PCF8563_WRITE_ADDRESS 0xA3; #define PCF8563_READ_ADDRESS 0xA2; #endif // registre d'adresse #define CONTROL_STATUS_1 0x00; #define CONTROL_STATUS_ 0x01; #define CLKOUT_CONTROL 0x0D #define AddSeconde 0x02 #define AddMinute 0x03; #define AddHeure 0x04; #define AddJour 0x05; #define AddJourSemaine 0x06; #define AddMois 0x07; #define AddAnnee 0x08; #define AddTimer_Controle 0x0E; // variable d'adresse int seconde = 0b00000000; int minute = 0b00000000; int heure = 0b00001001; int jour = 0b00000010; int mois = 0b00000110; int annee = 0b00101001; int binvalue; int bcd; int temp; int bcd_seconde; int bcd_minute; int bcd_heure; int bcd_jour; int bcd_mois; int bcd_annee; void initialisation_RTC() { i2c_start(); i2c_write(0xA2); //write address of the RTC. i2c_write(0x00); //control status 1. i2c_write(0); //normal operation mode. i2c_stop(); i2c_start(); i2c_write(0xA2); i2c_write(0x01); //control status 2. i2c_write(0); // désactive les fonctions de minuterie et d'alarme. i2c_stop(); i2c_start(); i2c_write(0xA2); i2c_write(0x0D); //address of the clock frequency. i2c_write(0); //sets it to 32768Hz. i2c_stop(); i2c_start(); i2c_write(0xA2); i2c_write(0x0E); //address of the alarms. i2c_write(0); //disable them i2c_stop(); } output_fload(PIN_C4); output_fload(PIN_C3); void PCF8563_ecriture_bit (int adresse, int data) { i2c_start(); // signal start i2c_write(0xA3); // addresse PCF8563 dans le cas d'une écriture i2c_write(0x02); // adresse registre seconde que le vont lire i2c_write(seconde); // donnée secondes en binaire i2c_write(minute); i2c_write(heure); i2c_write(jour); i2c_write(mois); i2c_write(annee); i2c_stop(); } void PCF8563_lecture_bit (int adresse) { i2c_start(); // signal start i2c_write(0xA3); // addresse PCF8563 dans le cas d'une écriture i2c_write(0x02); // adresse registre seconde que le vont lire i2c_start(); i2c_write(0xA4); // adresse lecture seconde = i2c_read(); minute = i2c_read(); heure = i2c_read(); jour = i2c_read(); mois = i2c_read(); annee = i2c_read(0); i2c_stop(); } // fonction conversion binaire à bcd int bin2bcd(int binvalue) { int bcd; bcd = 0; while(1) { if(binvalue >= 10) { binvalue = binvalue - 10; bcd = bcd + 0x10; } else { bcd = bcd + binvalue; break; } } return(bcd); } //apelle de fonction int bin2bcd (int binvalue); void PCF8563_conversion_datetime() { bcd_seconde = bin2bcd(seconde); bcd_minute = bin2bcd(minute); bcd_heure = bin2bcd(heure); bcd_jour = bin2bcd(jour); bcd_mois = bin2bcd(mois); bcd_annee = bin2bcd(annee); } void PCF8563_arret_comptage() { i2c_start(); i2c_write(0xA2); i2c_write(0x00); i2c_write(0x20); // Arret de compter i2c_stop(); } void main (void) // programme principale { i2c_start(); i2c_write(0xA3); i2c_write(bcd_seconde); i2c_write(bcd_minute); i2c_write(bcd_heure); i2c_write(bcd_jour); i2c_write(bcd_mois); i2c_write(bcd_annee); i2c_stop(); while (1) // tant que { i2c_start(); i2c_write(0xA3); i2c_write(0x02); i2c_start(); i2c_write(0xA2); bcd_seconde = i2c_read(); bcd_minute = i2c_read(); bcd_heure = i2c_read(); bcd_jour = i2c_read(); bcd_mois = i2c_read(); bcd_annee = i2c_read(0); i2c_stop(); i2c_start(); initialisation_RTC(); } } // fonctione conversion bcd à binaire int bcd2bin(int bcd) { int temp; temp = bcd; temp >>= 1; temp &= 0x78; return(temp + (temp >> 2) + (bcd & 0x0f)); } //apelle de fonction int bcd2bin (int bcd); // utilité de la conversion pour LCD void pcf8563_conv () { seconde = bcd2bin(bcd_seconde & 0x7F); minute = bcd2bin(bcd_minute & 0x7F); heure = bcd2bin(bcd_heure & 0x3F); jour = bcd2bin(bcd_jour & 0x3F); mois = bcd2bin(bcd_mois & 0x1F); annee = bcd2bin(bcd_annee); }
-----