Outils pour utilisateurs

Outils du site


issue138:greatcowbasic

In FCM#136, I showed you how to use the analog to digital conversion (ADC) with a light-dependent resistor (LDR) to gather information about the ambient brightness and how to communicate to a remote device at distance. The reception with the standard receiver was bad, so I did some research, and ordered another receiver-module to improve the reception, it is called “RXB8 V2.0” and came at a reasonable price. In this issue we will enhance the Radio Frequency (RF) device interface to save some power - to do this I will introduce the Watchdog timer.

Dans le FCM n° 136, je vous ai montré comment utiliser la conversion analogique-numérique (ADC) avec une photorésistance (LDR) pour obtenir des informations sur la luminosité ambiante et comment les transmettre à un dispositif éloigné.

La réception était mauvaise avec le récepteur ordinaire ; aussi, j'ai effectué quelques recherches et commandé un autre module de réception pour l'améliorer. Il s'appelle « RXB8 V2.0 » et se trouve à un prix raisonnable. Dans ce numéro, nous allons améliorer l'interface du dispositif de Radio-Fréquence (RF) pour économiser l'énergie ; pour cela, je présenterai la minuterie du Watchdog (dispositif de surveillance temporelle).

Introducing the Watchdog timer Imagine a situation where you program a microcontroller for a critical system. You would not just rely on the reliability of the software to avoid damage, would you? Software can always contain bugs, or maybe some environmental conditions arise that you did not think of in the first place. So, it would be important to restart the microcontroller to its initial state if something goes wrong. In such situations you surely will use the watchdog timer, which can restart the microcontroller completely. With respect to low ressources, another use case of the watchdog timer would be to implement a power saving mode to save battery life. The device drains as little battery as possible (whilst sleeping) and can then use the watchdog timer to wake up. So how does the watchdog timer (WDT) work internally?

Présentation de la minuterie du watchdog

Imaginez une situation où vous programmez un microcontrôleur pour un système critique. Vous ne compteriez pas uniquement sur la fiabilité du logiciel pour éviter les dégâts, n'est-ce pas ?

Un logiciel peut toujours contenir des défauts, ou, peut-être, certaines conditions environnementales peuvent se produire auxquelles vous n'auriez pas pensé au départ. Aussi, il serait important de redémarrer le microcontrôleur à son état initial si quelque chose se passait mal. Dans de telles situations, vous utiliserez sûrement la minuterie du watchdog, qui peut redémarrer complètement le microcontrôleur. Dans le cas d'une faible consommation des ressources, un autre moyen d'utilisation de la minuterie du watchdog consisterait à implémenter un mode d'économie d'énergie pour economiser la batterie. Le dispositif consomme le moins possible de batterie (en dormant) et peut ensuite utiliser la minuterie du watchdog pour se réveiller. Mais quel est le fonctionnement interne de la minuterie du watchdog (WDT) ?

The watchdog timer has a separate on-chip oscillator working at 128 KHz which works as a overflow timer. Thru a prescaler, you can set the time when the overflow occurs. The WDT can operate in three modes: interrupt, system reset or interrupt and system reset: • The interrupt mode can be used to wake up the device, or to timeout operations that last too long. • The system reset mode is quite self-explanatory, the device is restarted without further notice and all volatile data is erased. • The remaining mode combines the aforementioned ones, the interrupt occurs and you can implement a routine where you save your data or send some debugging information (eg, over the UART), and then the system is reset. The WDT can be activated in two ways: • By setting a hardware fuse (WDTON): in this mode the WDT is set to ‘system reset’ mode and cannot be changed or switched off by software on the fly. Only the overflow of the WDT can be prevented by resetting it. • The WDT can be activated by software: then all three modes can be used. For the ATtiny13a, different timings can be set (to trigger overflow). For this article we need to know only two timing options.

La minuterie du watchdog a un oscillateur séparé, intégré à la puce, tournant à 128 kHz, qui fonctionne comme une minuterie de dépassement. Par l'intermédiaire d'un prédiviseur, vous pouvez régler l'instant auquel aura lieu le dépassement. Le WDT peut agir suivant trois modes : l'interruption, la remise à zéro du système ou l'interruption avec remise à zéro du système : • Le mode par interruption peut être utilisé pour réveiller le dispositif ou pour arrêter des opérations qui durent trop longtemps. • Le mode par remise à zéro du système se comprend de lui-même ; le dispositif est redémarré sans autre avertissement et toutes les données volatiles sont perdues. • Le dernier mode combine les deux précédents ; l'interruption a lieu et vous pouvez implémenter une routine pour sauvegarder vos données ou envoyer une quelconque information de débogage (par ex. par l'UART) et, ensuite, le système est remis à zéro.

Le WDT peut être activé de deux manières : • En installant un fusible matériel (WDTON) : dans ce mode, le WDT est réglé sur « remise à zéro du système » (system reset) et ne peut pas être modifié ou arrêté à la volée par logiciel. Seul le dépassement du WDT peut être empêché en le remettant à zéro. • Le WDT peut être activé par un logiciel : dans ce cas, les trois modes sont disponibles. Pour le ATtiny13a, différentes durées peuvent être réglées (pour déclencher le dépassement). Dans cet article, nous n'avons besoin de connaître que deux des options de durée.

LED flasher with the watchdog timer The WDT needs a timed sequence, without interruptions, to be changed or switched on and off: • First, make sure that Interrupts are off. • Reset the WDT. • The watchdog change register (WDTCR) must be set to logic 1 in the watchdog change enable bit (WDCE). • Enable the watchdog and set the prescaler of the watchdog timer. Compile the code shown right and upload it to the ATtiny13a, connect a LED to PortB.1, and see what happen. The program starts, the LED is turned on and activates the WDT. After 64 ms the microcontroller restarts. The ‘boot time’ by default is about 64 ms according to the factory default. In this setup, the microcontroller is just reset - no power-save mode is used just yet. The LED flashes relatively fast because of the short time the LED is set to on (64 ms).

Un clignotant à LED avec la minuterie du watchdog

Le WDT a besoin d'une séquence minutée, sans interruption, pour être modifié ou arrêté : • D'abord, assurez-vous que les interruptions sont désactivées. • Remettez à zéro le WDT. • Le registre des modifications du watchdog (WDTCR) doit être positionné sur un 1 logique dans le bit d'autorisation des modifications du watchdog (WDCE). • Activez le watchdog et réglez le prédiviseur de la minuterie du watchdog.

Compilez le code présenté à droite et téléversez-le dans le ATtiny13a, connectez une LED sur le PortB.1, et regardez ce qui se passe.

Le programme démarre, la LED s'allume et active le WDT. Après 64 ms, le microcontrôleur redémarre.

Le temps de démarrage (boot time) par défaut est d'environ 64 ms d'après la valeur par défaut d'usine. Dans ce réglage, le microcontrôleur est seulement redémarré, aucun mode d'économie d'énergie n'est encore utilisé. La LED clignote relativement vite à cause du temps court pendant lequel celle-ci est allumée (64 ms).

Powersave modes The ATTiny13a has three different power-save modes, each of them with more or less power consumption. In sequence by power-consumption (from highest to lowest) they are: Idle, ADC Noise Reduction and Power-down. The choice depends on the situation, and what you want to achieve with your device. For now, we’ll use power-down mode. The other sleep modes will be explained in a further article, when they are needed. To get an idea how low the power consumption can be, have a look at the site of Nick Gammon (Ref. No. 5), he did some measures for us.

Modes d'économie d'énergie

Le ATtiny13a a trois modes différents d'économie d'énergie, chacun d'eux ayant une consommation plus ou moins grande de l'alimentation. Par ordre de consommation de courant (de la plus forte à la plus faible), on trouve : Idle (inactif), ADC Noise Reduction (réduction du bruit de l'ADC) et Power-down (coupure de l'alimentation). Le choix dépend du cas et de ce que vous voulez réaliser avec votre dispositif. Pour l'instant, nous utiliserons le mode de coupure de l'alimentation. les autres modes de mise en sommeil seront expliqués dans un prochain article, quand nous en aurons besoin. Pour vous donner une idée du plus bas niveau d'alimentation obtenu, regardez un peu le site de Nick Gammon (Réf. n°5) ; il a fait quelques mesures pour nous.

Energy efficient transmitter Let’s extend the code from the last issue and use the power-save mode, and the watchdog timer to pause the transmission. The microcontroller takes around 64 ms to start, then we set the watchdog timer. After this, the program sends the LDR values over the air. The transmission itself now takes around 48 ms. The former version of the program waits 8 s without doing anything – but still consumes power! Here (next page, shown right) is how we optimize this by using the power-down sleep mode, and the watchdog timer.

Transmetteur économe en énergie

Complétons le code du dernier numéro et utilisons le mode d'économie d'énergie, ainsi que la minuterie du watchdog pour faire une pause dans la transmission. Le microcontrôleur demande environ 64 ms pour démarrer, puis nous réglons la minuterie du watchdog. Ensuite, le programme transmet les valeurs de la photorésistance. La transmission elle-même prend maintenant environ 48 ms. La version précédente du programme attend 8 s sans rien faire, mais continue à tirer sur l'alimentation !

Voici (page suivante, à droite) comment nous optimisons ceci en utilisant le mode de mise en sommeil par coupure de l'alimentation et la minuterie du watchdog.

On the first start after the microcontroller gets power, the microcontroller is initialised. Then the watchdog timer is set to the reset mode, and the main program measures the LDR and sends the data over the transmitter. Then all of the Timer and the ADC get switched off, and the sleep mode power-down is enabled. After that the microcontroller is sent to sleep. After 8 seconds it gets a restart, and so the same procedure gets repeated every 8 second. Here is the logged data from the serial line, with the new receiver in place, and the new software version on the microcontroller. The result (next page, top right) is good (see time 00:13:01 for the first dataset and 00:13:09 for the second dataset, as highlighted in black). Only a minimum of garbage is received, so a data logging program could easily pick up the lines with the wanted data and safely omit the unwanted bytes.

Au premier démarrage après la mise sous tension du microcontrôleur, le microcontrôleur est initialisé. Puis la minuterie du watchdog est positionnée dans le mode de remise à zéro et le programme principal mesure la LDR et envoie les valeurs par l'émetteur. Ensuite, le Timer et l'ADC sont arrêtés, et le mode d'économie d'énergie par mise en sommeil est activé. Après ça, le microcontrôleur est mis en sommeil. Après 8 secondes, il reçoit l'ordre de redémarrer, et cette procédure se répète toutes les 8 secondes.

Voici un enregistrement des données sur la ligne série, avec le nouveau récepteur en activité, et la nouvelle version du programme dans le microcontrôleur. Le résultat (page suivante, en haut à droite) est bon (voir les instants 00:13:01 pour les premières données et 00:13:09 pour les secondes données, surlignées en noir).

Un minimum de déchet est reçu ; ainsi, un programme d'enregistrement des données peut aisément extraire les lignes avec les données voulues et omettre les lignes non désirées.

Breadboard circuitry The transmitter part is exactly the same as in the last issue, so I omit depicting it here again. The transmitter has two extra PINs to connect (than the former device): On the left side, there is a connector for the antenna (a wire ~ 17 cm is sufficient) and GND. On the right side, there are GND, DATA and Vcc (+5V). Both GND can be connected with a Y-wire to the same GND. The DATA pin goes to the Rx-Connector of the serial-to-usb-converter. Due to the shape of the new transmitter, I hooked up jumper wires to the connectors and let it rest on a safe area on my workplace. Maybe not what a serious electrician would do, but it worked just fine.

Circuit sur la plaque d'essai

La partie émetteur est exactement la même que dans le dernier article ; aussi, je me passe de la décrire à nouveau. Deux picots supplémentaires (par rapport au dispositif précédent) sont à connecter sur le récepteur :

Sur la partie gauche, il y a un connecteur pour l'antenne (un fil d'environ 17 cm suffit) et la masse (GND). Sur la droite, se trouvent GND, DATA (données) et Vcc (+5V). Les deux GND doivent être connectés au même GND avec un fil en Y. La borne DATA va vers le connecteur Rx du convertisseur série-vers-USB. Du fait de la forme du nouveau récepteur, j'ai placé des cavaliers jusqu'aux connecteurs et je l'ai mis de côté dans un endroit tranquille de ma zone de travail. Je ne suis peut-être pas un électricien confirmé, mais ça marche bien.

Conclusion The initial simple receiver module I got (without too deep research on the subject) did its job for our first experiments, but the replacement I found is better. So, if you are about to buy the hardware, I recommend the transmitter-modules (FS-1000A) from the last issue and the receiver-module (RXB8, v2) from this one. However, I highly recommend to do your own research; there are maybe better modules for both purposes. The newer program saves power, and, because some lines of code have been saved too, it has a little extra free space on the microcontroller for further optimisation and other ideas. For the next issue, I plan to prepare a little data logger program on the PC side, and expand the transmitter software to send data in larger time frames, and to gather some real life values.

Conclusion

Le module récepteur simple que j'avais trouvé au début (sans grande recherche sur le sujet) avait fait son boulot pendant les premiers essais, mais je trouve que son remplaçant est meilleur. Aussi, si vous vous apprêtez à acheter du matériel, je vous recommande le module émetteur du dernier numéro (FS-1000A) et le module récepteur de celui-ci (RX88, v2). Cependant, je vous recommande vivement de faire vos propres recherches ; il y a peut-être de meilleurs modules pour les deux usages.

Le nouveau programme économise l'énergie et, parce que certaines lignes de code ont aussi été économisées, il reste un peu de place sur le microcontrôleur pour une optimisation plus poussée et d'autres idées. Dans le prochain numéro, je prévois de préparer un petit programme enregistreur de données du côté du PC et d'étendre le logiciel de transmission pour envoyer des données dans des intervalles de temps plus longs et de récupérer des valeurs de la « vraie vie ».

Sources If you want to download the sources instead of copy-pasting it, you can now check it out with git or an SVN client. Have a look at goo.gl/aDvggr for more information.

Sources

Si vous voulez télécharger les sources au lieu de les copier/coller, vous pouvez le faire maintenant avec un client git ou SVN. Jetez un œil sur goo.gl/aDvggr pour plus d'informations.

References The AVR watchdog timer explained http://microchipdeveloper.com/8avr:avrwdt Application Note to the watchdog timer http://ww1.microchip.com/downloads/en/AppNotes/doc2551.pdf Fuses calculator with comprehensive information on the devices factory defaults http://www.engbedded.com/fusecalc/ Inspiration for the simple startcode https://sourceforge.net/p/gcbasic/discussion/579126/thread/f48c95af/ Power saving maths https://www.gammon.com.au/power RXB8 Datasheet https://p.globalsources.com/IMAGES/PDT/SPEC/508/K1045318508.pdf

Références

La minuterie de watchdog AVR expliquée http://microchipdeveloper.com/8avr:avrwdt

Note d'application pour la minuterie du watchdog http://ww1.microchip.com/downloads/en/AppNotes/doc2551.pdf

Calculateur de fusibles avec une information globale sur les valeurs d'usine par défaut des dispositifs http://www.engbedded.com/fusecalc/

Inspiration pour un code initial simple https://sourceforge.net/p/gcbasic/discussion/579126/thread/f48c95af/

Éléments mathématiques pour économiser l'énergie https://www.gammon.com.au/power

Notice technique du RXX88 https://p.globalsources.com/IMAGES/PDT/SPEC/508/K1045318508.pdf

Acknowledgement I wish to thank Evan Venn (Anobium) from the Great Cow BASIC Team for his insights and valuable hints.

Remerciements

Je souhaite remercier Evan Venn (Anobium) de l'équipe de Great Cow BASIC pour ses idées et ses précieuses indications.

issue138/greatcowbasic.txt · Dernière modification : 2018/11/12 12:11 de andre_domenech