Horloge fille IBM
avec RTC DS3231
L'horloge fille IBM cadencée par les alternances secteur n'a pas donné les résultats espérés.
Le choix s'est ensuite tourné vers la RTC DS3231. On la trouve à partir de 50cts en Chine ou 5 euros en France avec sa batterie (pile). Dans cette application, la sauvegarde (la pile) est inutile, seules nous intéressent les impulsions 1Hz sur la sortie SQW.
Le schéma:
Avec cette solution, la précision est celle de la RTC, déclarée "de haute précision".
Programme:
En pseudo multitâches pour séparer le comptage de l'envoi des pulses IBM
Il reste une patte libre qui pourrait être utilisée pour régler la largeur des pulses ou la vitesse de l'avance rapide
Particularité: le "hi2csetup" ne sert que pour l'initialisation de la RTC, après cela, le "hi2csetup off" rend aux broches C.1 et C.2 leur fonction initiale.
Les tâches commencent par une étiquette :start0:, start1:,etc . Il y a 4 tâhes possibles sur le 08M2
start0: initialisation RTC et envoi dun pulse sur l'horloge
start1: comptage des secondes RTC
start2: avance coup par coup
start3: avance rapide
code:
;Horloge IBM avec RTC DS3231
;MM 01/04/23
start0: ;initialisation et pulses IBM
#picaxe 08M2
#no_data
symbol coup=pinC.1 ;I2C scl
symbol rapid=pinC.2 ;I2C sda
symbol DS=pinC.3
symbol IBM=C.0
symbol sec=b1
symbol minut=bit0
dirsC=%0001
pullup %11110
hi2csetup i2cmaster, %11010000, i2cslow, i2cbyte
hi2cout 0, (0,0,0,0,0,0,0,%00010000) ;mise en mémoire EEPROM
hi2cout 14,(0) ;registre control DS3231
pause 300
hi2csetup off ;C.1 et C.2 ne sont plus I2C
do
do loop while minut=0 ;on attend 0
high IBM : pause 200 : low IBM
minut=0 ;reset min 0
loop
start1: ;comptage secondes RTC
do
do loop while DS=0 ;on est à 0
do loop while DS=1 ;on est passé à 1
inc sec ;on est à 0,
if sec>=60 then
minut=1
sec=0 ;reset sec
endif
loop
start2: ;avance coup par coup
do
do loop while coup=1 ;attente coup=0
pulsout IBM,20000 ;on est à 1
do loop while coup=0
sec=0 ;RAZ compteur
loop
start3: ;avance rapide
do
do loop while rapid=1 ;attente rapid=0
do
pulsout IBM,20000 ;on est à 1
pause 300 ;temps entre 2 pulses (à confirmer)
loop while rapid=0
sec=0
loop