Bonjour,
Si vous avez suivi cette discussion, je proposais une horloge à base de picaxe. Je pense en faire une.
Voici une page partageant cette réalisation, ce n'est que la début, rien n'est testé.
http://electromag1.wifeo.com/horloge-a-texte.php
Voici le code (non testé) sur ce forum:
MMCode:;Horloge clockword picaxe 14M2 MM 13/02/2020 ;poussoir sur C.3 ;interrupt sur C.0 :comptage pulses 1Hz #picaxe 14M2 setfreq M32 symbol led=pinB.0 symbol ADC=C.4 symbol pous=pinC.3 symbol cpt1Hz=w13 symbol nuit=bit0 ; bascule jour/nuit symbol flaginit=bit1 symbol cptmax=w12 symbol heure=w11 symbol valadc=w10 symbol hh=b1 symbol mm=b2 symbol octet4=b3 symbol octet3=b4 symbol octet2=b5 symbol octet1=b6 symbol mmbcd=b7 symbol hhbcd=b8 symbol exept=b9 symbol memomm=b10 symbol varb=b11 symbol dch=b12 ;dirsB=%1111111 #macro transdectobcd(varb) ;transformation de dec vers bcd dch=varb//10 varb=varb/10*16 'mises au format BCD varb=varb+dch 'pour enregistrement #endmacro #macro transbcdtodec(varb) dch=varb/16*10 varb=varb//16 varb=varb+dch #endmacro setint %1,%1 ;interrupt niveau 1 sur C.0 hi2csetup i2cmaster,%11010000, i2cslow_32, i2cbyte ;init I2C horloge hi2cout 14,(0) ;raz registre de configuration control DS3231(1Hz sur SQW) If pous=0 then gosub initDS gosub synchro ;suite coupure de courant recherche min et heur DS BCD=>DEC cptmax=150 ;compte initiale pour bascule au bout de 2mm30s ;boucle principale do do loop while memomm=mm ;attente increm mm par comptage interruption memomm=mm ;mm a changé =>mise en mémoire cptmax=300 ;compteur 5 mn if mm>55 then ;après 55, on repasse mm=0 ;à 0 inc hh ;et on incrémente l'heure endif heure=hh*100 + mm ;heure en forme hhmm if heure>1130 and nuit=1 then ;on était de nuit, heure=2335 ;passage tronçon "minuit" nuit=not nuit ;en jour au prochain passage endif if heure>=2400 then ; heure=0000 endif if heure> 1230 and nuit=0 then heure=0035 ;de jour, on passe de midi et demi à 1h moins 25 endif gosub codheur gosub codmin loop ;sub codage heure , octets 4 et 3 codheur: select case heure case >=2335 octet4=0: octet3=8 case <= 30 octet4=0: octet3=8 case 35 to 130 octet4=8: octet3=2 case 135 to 230 octet4=128: octet3=3 case 235 to 330 octet4=32:octet3=3 case 335 to 430 octet4=64:octet3=3 case 435 to 530 octet4=0:octet3=131 case 535 to 630 octet4=1:octet3=3 case 635 to 730 octet4=4:octet3=3 case 735 to 830 octet4=2:octet3=3 case 835 to 930 octet4=16:octet3=3 case 935 to 1030 octet4=0:octet3=51 case 1035 to 1130 octet4=0:octet3=7 case 1135 to 1230 octet4=0:octet3=96 end select gosub afficheur return ; sub codage minutes octets 2 et 1 codmin: select case mm case 35 octet2=2 : octet1=28 case 40 octet2=2 : octet1=16 case 45 octet2=3 : octet1=32 case 50 octet2=2 : octet1=128 case 55 octet2=2 : octet1=4 case 00 octet2=0 : octet1=0 case 05 octet2=0 : octet1=4 case 10 octet2=0 : octet1=128 case 15 octet2=0 : octet1=96 case 20 octet2=0 : octet1=16 case 25 octet2=0 : octet1=28 case 30 octet2=0 : octet1=67 if heure=0030 then octet1=66 endif end select gosub affichmin return initDS: ' Initialisation DS3231;'%11010000 est l'adresse i2c do loop while pous=0 do readadc10 ADC,valadc nuit=valadc/600 ;en fait, 0 ou 1 led=nuit loop while pous=1 led=0 do ;réglage heures readadc10 ADC,valadc heure= 12 * valadc /10 ;de 0 à 1200 gosub codheur loop while pous=1 do loop while pous=0 ;on a choisi l'heure do ;réglage minutes readadc10 ADC,valadc mm=valadc * 11 /1023 *5 ;de 0 à 55 mod 5 gosub codmin loop while pous=1 do loop while pous=0 ;on a choisi les minutes memomm=mm mmbcd=mm ;mmbcd est la forme BCD de mm sur 1 octet hhbcd=hh transdectobcd(mmbcd) transdectobcd(hhbcd) led=1 do loop while pous=1 do loop while pous=0 hi2cout 0, ($00,mmbcd,hhbcd) ;mise en mémoire EEPROM format BCD led=0 flaginit=1 return afficheur: hi2csetup i2cmaster,%01001000, i2cslow_32, i2cbyte hi2cout (octet4) hi2csetup i2cmaster,%01001010, i2cslow_32, i2cbyte hi2cout (octet3) return affichmin: hi2csetup i2cmaster,%01001100, i2cslow_32, i2cbyte hi2cout (octet2) hi2csetup i2cmaster,%01001110, i2cslow_32, i2cbyte hi2cout (octet1) return synchro: do hi2cin 0,(varb,mm,hh) loop while varb=0 transbcdtodec(mm) ;passage forme bcd => dec transbcdtodec(hh) return interrupt: ;inc cpt1Hz ;en commentaire pour simu cpt1Hz=cpt1Hz + 10 ;vitesse x 10 pour simu if cpt1Hz>cptmax then cpt1Hz=0 mm=mm+5 endif do loop while pinC.0=1 setint %1,%1 return
-----