Structurée I2C pour DS3231 -------------------------- Circuit Type Adresse du circuit _______________________________________Fixe_A3_A2_A1_A0__Action__Dec. IC : DS3231 RTC-chip no: 0 1101 0 0 0 1 = WRITE = 208 1101 0 0 0 0 = READ = 209 BEGIN ' Début du programme Définition des variables utilisées ********************************** DECLARE I2CVar1 AS byte ' Adresse du registre dans le composant I2C DECLARE I2CVar2 AS byte ' Valeur lue ou écrite dans le composant I2C DECLARE I2Cdata AS byte ' Octet de valeur lue ou écrite sur le bus I2C DECLARE I2Cack AS bit ' Bit "ACK" du bus I2C DECLARE I2csda AS nibble ' Pin du circuit qui sert de "I2C DATA" DECLARE I2Cscl AS nibble ' Pin du circuit qui sert de "I2C CLOCK" DECLARE I2CadrWR AS byte ' Adresse d'écriture du DS3231 DECLARE I2CadrRD AS byte ' Adresse de lecture du DS3231 Définition des constantes ************************* LET I2Csda = PortC.1 ' Liaison "SDA" de l'AtMega16 & 32 (SDA) Pin23 LET I2Cscl = PortC.0 ' Liaison "CLK" de l'AtMega16 & 32 (SCL) Pin22 LET I2CadrWR = &B11010000 ' Adresse d'écriture du DS3231 (Dec = 208) LET I2CadrRD = &B11010001 ' Adresse de lecture du DS3231 (Dec = 209) ***************************************************************************** InitDS3231 ---------- Description : Initialisation du DS3231 Variables d'entrées : Aucune Variables de sorties : Aucune Variables de travail : I2Cdata, I2cadrWR, I2CVar1, I2CVar2, Hseconde, Hminute, Hheure, Hjour, Hdate, Hmois, Hannee Sous-routines appellées : Writedsh, Ecriheure SUB InitDS3231 LET I2CVar1 = I2cadrWR ' Valeur de l'adresse à écrire LET I2CVar2 = &B00000000 ' Valeur nulle GOSUB Writedsh Time : 14:33:05 Jeudi 18/11/2010 Adresse LET Hseconde = &B00000101 ' (0-5)Secondes de la RTC du DS3231 ($00H) LET Hminute = &B00110011 ' (3-3)Minutes de la RTC du DS3231 ($01H) LET Hheure = &B10010100 ' (1-4)Heures de la RTC du DS3231 ($02H) LET Hjour = &B00000100 ' (0-4)Jour de la RTC du DS3231 ($03H) LET Hdate = &B00010010 ' (1-8)Date de la RTC du DS3231 ($04H) LET Hmois = &B00001011 ' (1-1)Mois de la RTC du DS3231 ($05H) LET Hannee = &B00001010 ' (1-0)Année de la RTC du DS3231 ($06H) GOSUB Ecriheure ' Données en BCD ENDSUB ***************************************************************************** Ecriheure --------- Description : Ecriture des valeurs concernant la date et l'heure dans le circuit DS3231 Variables d'entrées : Hseconde, Hminute, Hjour, Hheure, Hdate, Hmois, Hannee Variables de sorties : Aucune Variables de travail : I2CVar1, I2CVar2, Sous-routines appellées : Writedsh SUB Ecriheure LET I2CVar1 = &H00 LET I2CVar2 = Hseconde GOSUB Writedsh LET I2CVar1 = &H01 LET I2CVar2 = Hminute GOSUB Writedsh LET I2CVar1 = &H02 LET I2CVar2 = Hheure GOSUB Writedsh LET I2CVar1 = &H03 LET I2CVar2 = Hjour GOSUB Writedsh LET I2CVar1 = &H04 LET I2CVar2 = Hdate GOSUB Writedsh LET I2CVar1 = &H05 LET I2CVar2 = Hmois GOSUB Writedsh LET I2CVar1 = &H06 LET I2CVar2 = Hannee GOSUB Writedsh ENDSUB ***************************************************************************** Routine d'écriture de I2CVar1 à l'adresse i2cadrWR sur le bus I2C Writedsh -------- Description : Ecriture dans le DS3231 de l'octet I2CVar1 à l'adresse I2cadrWR Variables d'entrées : I2CVar1, I2cadrWR Variables de sorties : Aucune Variables de travail : I2Cdata Sous-routines appellées : I2Cstart, I2Ctx, ackrx, I2Crx, I2Cstop SUB Writedsh ' Ecriture des octets I2CVar1 & I2cadrWR GOSUB I2Cstart ' Mise du bus en condition "START" LET I2Cdata = I2CVar1 ' Valeur de l'adresse à écrire GOSUB I2Ctx ' Ecriture de l'adresse I2C GOSUB ackrx ' Attente de l'ACK LET I2Cdata = I2CVar2 ' Valeur de la donnée à écrire GOSUB I2Ctx ' Ecriture de la donnée I2C GOSUB ackrx ' Attente de l'ACK GOSUB I2Cstop ' Mise du bus en condition "STOP" ENDSUB ***************************************************************************** Litheure --------- Description : Lecture des valeurs concernant la date et l'heure dans le circuit DS3231 Variables d'entrées : Aucune Variables de sorties : Hseconde, Hminute, Hheure, Hjour, Hdate, Hmois, Hannee Variables de travail : I2CVar1, I2CVar2, Sous-routines appellées : Readdsh SUB Litheure LET I2CVar1 = &H00 LET I2CVar2 = Hseconde GOSUB Readdsh LET I2CVar1 = &H01 LET I2CVar2 = Hminute GOSUB Readdsh LET I2CVar1 = &H02 LET I2CVar2 = Hheure GOSUB Readdsh LET I2CVar1 = &H03 LET I2CVar2 = Hjour GOSUB Readdsh LET I2CVar1 = &H04 LET I2CVar2 = Hdate GOSUB Readdsh LET I2CVar1 = &H05 LET I2CVar2 = Hmois GOSUB Readdsh LET I2CVar1 = &H06 LET I2CVar2 = Hannee GOSUB Readdsh ENDSUB ***************************************************************************** Routine de lecture de I2CVar1 à l'adresse i2cadrRD sur le bus I2C Readdsh ------- Description : Lecture dans le DS3231 de l'octet I2CVar1 à l'adresse I2cadrRD Variables d'entrées : I2CVar1, I2cadrRD Variables de sorties : I2CVar2 Variables de travail : I2Cdata Sous-routines appellées : I2Cstart, I2Ctx, ackrx, I2Crx, I2Cstop SUB Readdsh GOSUB I2Cstart ' Mise du bus en condition "START" LET I2Cdata = IC2Var1 ' Valeur de l'adresse à écrire GOSUB I2Ctx ' Ecriture de l'adresse I2C GOSUB ackrx ' Attente de l'ACK GOSUB I2Crx ' Lecture de la donnée I2C GOSUB acktx ' ACK du "master" LET I2CVar2 = I2Cdata ' Mise a jour de la valeur lue GOSUB I2Cstop ' Mise du bus en condition "STOP" ENDSUB ***************************************************************************** Définitions des subroutines I2C ******************************* I2CSTART -------- Description : Mise du bus I2C dans la condition "START" Variables d'entrées : Aucune Variables de sorties : Aucune Variables de travail : I2Csda, I2Cscl Sous-routines appellées : Aucune SUB I2CSTART Mise à 1 de la pin définie par I2Csda ' I2C data line Mise à 1 de la pin définie par I2Cscl ' I2C clock line Mise à 0 de la pin définie par I2Csda ' I2C data line Mise à 0 de la pin définie par I2Cscl ' I2C clock line ENDSUB --------------------------------------- I2CSTOP ------- Description : Mise du bus I2C dans la condition "STOP" Variables d'entrées : Aucune Variables de sorties : Aucune Variables de travail : I2Csda, I2Cscl Sous-routines appellées : Aucune SUB I2CSTOP Mise à 0 de la pin définie par I2Csda ' I2C data line Mise à 1 de la pin définie par I2Cscl ' I2C clock line Mise à 1 de la pin définie par I2Csda ' I2C data line ENDSUB --------------------------------------- I2CTX ----- Description : Emission d'un octet sur le bus I2C Variables d'entrées : Aucune Variables de sorties : Aucune Variables de travail : I2Csda, I2Cscl, I2Cdata Sous-routines appellées : Aucune SUB I2CTX LET i = 0 DO WHILE i < 8 LET j = (i)ème bit de I2Cdata Mise à la valeur j de la pin définie par I2Csda Mise à 1 de la pin définie par I2Cscl PAUSE 1ms Mise à 0 de la pin définie par I2Cscl Mise à 0 de la pin définie par I2Csda ENDDO ENDSUB --------------------------------------- I2CRX ----- Description : Réception d'un octet sur le bus I2C Variables d'entrées : Aucune Variables de sorties : Aucune Variables de travail : I2Csda, I2Cscl, I2Cdata Sous-routines appellées : Aucune SUB I2CRX LET i = 0 DO WHILE i < 8 Mise à 1 de la pin définie par I2Cscl LET j = valeur lue sur la pin définie par I2Csda LET (i)ème bit de I2Cdata = j PAUSE 1ms Mise à 0 de la pin définie par I2Cscl ENDDO ENDSUB --------------------------------------- ACKTX ----- Description : Emission d'un "ACK" sur le bus I2C Variables d'entrées : Aucune Variables de sorties : Aucune Variables de travail : I2Csda, I2Cscl Sous-routines appellées : Aucune SUB ACKTX Mise à 1 de la pin définie par I2Cscl Mise "haute-impédance" de la pin définie par I2Csda PAUSE 1ms Mise à 0 de la pin définie par I2Csda PAUSE 1ms Mise à 0 de la pin définie par I2Cscl ENDSUB --------------------------------------- ACKRX ----- Description : Réception d'un "ACK" sur le bus I2C Variables d'entrées : Aucune Variables de sorties : Aucune Variables de travail : I2Csda, I2Cscl Sous-routines appellées : Aucune SUB ACKRX Mise à 1 de la pin définie par I2Cscl Mise "haute-impédance" de la pin définie par I2Csda PAUSE 1ms Attente d'un 0 sur la pin définie par I2Csda PAUSE 1ms Mise à 0 de la pin définie par I2Cscl ENDSUB ******************************************************************************