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 0 = WRITE = 208 1101 0 0 0 1 = READ = 209 BEGIN ' Début du programme Définition des variables utilisées ********************************** DECLARE I2CVar1b AS byte ' Adresse du registre dans le composant I2C DECLARE I2CVar2b AS byte ' Valeur lue ou écrite dans le composant I2C DECLARE I2Cdatab 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 I2CadrWRb AS byte ' Adresse d'écriture du DS3231 DECLARE I2CadrRDb AS byte ' Adresse de lecture du DS3231 DECLARE Hsecondeb AS byte ' Secondes DECLARE Hminuteb AS byte ' Minutes DECLARE Hheureb AS byte ' Heure DECLARE Hjourb AS byte ' Jour DECLARE Hdateb AS byte ' Date DECLARE Hmoisb AS byte ' Mois DECLARE Hanneeb AS byte ' Année Définition des constantes ************************* LET I2Csda = PortA.4 ' Liaison "SDA" de l'AtMega16 & 32 LET I2Cscl = PortA.5 ' Liaison "CLK" de l'AtMega16 & 32 LET I2CadrWRb = &B11010000 ' Adresse d'écriture du DS3231 (Dec = 208) LET I2CadrRDb = &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 : I2Cdatab, I2CadrWRb, I2CVar1b, I2CVar2b, Hsecondeb, Hminuteb, Hheureb, Hjourb, Hdateb, Hmoisb, Hanneeb Sous-routines appellées : Writedsh, EcrisHeure, EcrisDate SUB InitDS3231 LET I2CVar1b = I2CadrWRb ' Valeur de l'adresse à écrire LET I2CVar2b = &B00000000 ' Valeur nulle GOSUB Writedsh Exemple -> Time : 14:33:05 Jeudi 18/11/2010 Adresse LET Hsecondeb = &B00000101 ' (0-5)Secondes de la RTC du DS3231 ($00H) LET Hminuteb = &B00110011 ' (3-3)Minutes de la RTC du DS3231 ($01H) LET Hheureb = &B10010100 ' (1-4)Heures de la RTC du DS3231 ($02H) **LET Hjourb = &B00000100 ' (0-4)Jour de la RTC du DS3231 ($03H) LET Hdateb = &B00010010 ' (1-8)Date de la RTC du DS3231 ($04H) LET Hmoisb = &B00001011 ' (1-1)Mois de la RTC du DS3231 ($05H) LET Hanneeb = &B00001010 ' (1-0)Année de la RTC du DS3231 ($06H) GOSUB Ecriheure ' Données en BCD **Le DS3231 calcule le jour de la semaine en interne, donc pas nécessaire. ENDSUB ***************************************************************************** EcrisHeure ---------- Description : Ecriture des valeurs concernant l'heure dans le circuit DS3231 Variables d'entrées : Hsecondeb, Hminuteb, Hheureb Variables de sorties : Aucune Variables de travail : I2CVar1b, I2CVar2b, Sous-routines appellées : Writedsh SUB EcrisHeure LET I2CVar1b = &H00 LET I2CVar2b = Hsecondeb GOSUB Writedsh LET I2CVar1b = &H01 LET I2CVar2b = Hminuteb GOSUB Writedsh LET I2CVar1b = &H02 LET I2CVar2b = Hheureb GOSUB Writedsh ENDSUB ***************************************************************************** EcrisDate --------- Description : Ecriture des valeurs concernant la date dans le circuit DS3231 Variables d'entrées : Hdateb, Hmoisb, Hanneeb Remarque: Hjourb est calculé par le DS3231, donc, pas nécessaire de l'écrire. Variables de sorties : Aucune Variables de travail : I2CVar1b, I2CVar2b, Sous-routines appellées : Writedsh SUB EcrisDate LET I2CVar1b = &H04 LET I2CVar2b = Hdateb GOSUB Writedsh LET I2CVar1b = &H05 LET I2CVar2b = Hmoisb GOSUB Writedsh LET I2CVar1b = &H06 LET I2CVar2b = Hanneeb GOSUB Writedsh ENDSUB ***************************************************************************** Routine d'écriture de I2CVar1b à l'adresse I2CadrWRb sur le bus I2C Writedsh -------- Description : Ecriture dans le DS3231 de l'octet I2CVar1b à l'adresse I2CadrWRb Variables d'entrées : I2CVar1b, I2CadrWRb Variables de sorties : Aucune Variables de travail : I2Cdatab Sous-routines appellées : I2Cstart, I2Ctx, ackrx, I2Crx, I2Cstop SUB Writedsh ' Ecriture des octets I2CVar1b & I2CadrWRb GOSUB I2Cstart ' Mise du bus en condition "START" LET I2Cdatab = I2CVar1b ' Valeur de l'adresse à écrire GOSUB I2Ctx ' Ecriture de l'adresse I2C GOSUB ackrx ' Attente de l'ACK LET I2Cdatab = I2CVar2b ' 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 : Hsecondeb, Hminuteb, Hheureb, Hjourb, Hdateb, Hmoisb, Hanneeb Variables de travail : I2CVar1b, I2CVar2b, Sous-routines appellées : Readdsh SUB Litheure LET I2CVar1b = &H00 LET I2CVar2b = Hsecondeb GOSUB Readdsh LET I2CVar1b = &H01 LET I2CVar2b = Hminuteb GOSUB Readdsh LET I2CVar1b = &H02 LET I2CVar2b = Hheureb GOSUB Readdsh LET I2CVar1b = &H03 LET I2CVar2b = Hjourb GOSUB Readdsh LET I2CVar1b = &H04 LET I2CVar2b = Hdateb GOSUB Readdsh LET I2CVar1b = &H05 LET I2CVar2b = Hmoisb GOSUB Readdsh LET I2CVar1b = &H06 LET I2CVar2b = Hanneeb GOSUB Readdsh ENDSUB ***************************************************************************** Routine de lecture de I2CVar1b à l'adresse I2CadrRDb sur le bus I2C Readdsh ------- Description : Lecture dans le DS3231 de l'octet I2CVar1b à l'adresse I2CadrRDb Variables d'entrées : I2CVar1b, I2CadrRDb Variables de sorties : I2CVar2b Variables de travail : I2Cdatab Sous-routines appellées : I2Cstart, I2Ctx, ackrx, I2Crx, I2Cstop SUB Readdsh GOSUB I2Cstart ' Mise du bus en condition "START" LET I2Cdatab = 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 I2CVar2b = I2Cdatab ' 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, I2Cdatab Sous-routines appellées : Aucune SUB I2CTX LET i = 0 DO WHILE i < 8 LET j = (i)ème bit de I2Cdatab 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, I2Cdatab 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 I2Cdatab = 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 ******************************************************************************