La solution d'Artouste est sans doute la première à venir à l'esprit, mais comme le laisse supposer son expression « sur le papier c'est assez simple », elle comporte de nombreuses chausse-trapes qui ne sont pas toujours faciles à éviter.
Par exemple lors du passage à l'heure d'hiver il sera deux fois de suite 3 heure du matin, donc pour éviter d'entrer dans une boucle infinie qui ferait reculer d'une heure à chaque fois qu'il est 3 heure, il faut que le microcontrôlleur se souvienne qu'il a déjà fait la manœuvre.
Mais il est aussi possible que (comme pas hasard ) le microcontrôlleur ne soit pas allumé au moment du changement d'heure (maintenance, panne d'électricité, etc.). Il est donc nécessaire que lorsqu'il se réveille, par exemple deux jours plus tard, il soit capable de se dire « ah bah zut, on est passé en période d'hiver mais je vois dans mon EEPROM que le flag passage_heure_hiver_2013
n'est pas à 1, je m'en vais régler cet oubli sans attendre un seul cycle de plus ».
Ce qui fait qu'a chaque fois que tu va lire le contenu de la RTC, tu es obligé de faire un petit calcul pour savoir si tu est en période d'été/hiver et d'aller vérifier quelque part le contenu d'une variable. J'abrège parce que sinon ça va être trop long, mais il y a encore bien d'autres cas à traiter qui pourraient faire que ça parte en sucette.
Du coup, puisqu'on en est arrivé à la conclusion qu'à chaque lecture de la RTC il est nécessaire de faire un traitement pour vérifier leur validité, la solution « à l'épreuve des balles » et qui est presque toujours utilisée, est de renverser le problème : ne pas stocker dans la DS1307 l'heure civile locale, mais l'heure UTC. Ensuite, a chaque lecture tu vérifie simplement si l'heure/date renvoyée correspond à l'hiver, auquel cas tu ajoutes 1 heure, et sinon tu en ajoute 2. Ça fonctionne à tous les coups.
En effet l'UTC présente l'avantage d'avancer de manière continue et homogène*, toujours dans le même sens, contrairement à cette garce d'heure civile qui s'amuse à faire des bonds en avant ou en arrière.
Voilà, en espérant avoir été clair (j'ai comme un doute en fait)...
- ceci ne tient pas compte des secondes intercalaires, mais celles-ci sont ajoutées de manière imprévisibles et ne peuvent donc pas être « programmées »