Savoir l’effet du RESET sur la fonction millis()/micros()
Savoir les 3 techniques d’initialisation
Exemple implémenté sur carte Arduino vers la fin de la vidéo
Importance
Indique une anomalie dans le programme ou le hard
Peut être utilisée pour effacer la mémoire SRAM
Peut être utilisée pour initialiser les compteurs
Etc.
Technique 1: Initialisation interne (voir la page 53 dans le Datasheet)
Induite par une faible alimentation de la carte OU
Surconsommation du courant dans les pins
Technique 2 – Reset matérielle
via l’application du niveau bas dans le pin RESET (appui sur le bouton poussoir de la carte)
ou mise à la masse du pin RESET
Technique 3: Initialisation logicielle – Watchdog
Le Watchdog ou Chien de garde
Mise en marche lorsque le programme prend plus de temps durant l’exécution ou en cas d’une anomalie durant l’exécution du programme => Induit un RESET du µC
Besoin de la bibliothèque : avr/wdt.h
+ Appel de la fonction wdt_enable(TimeOut)
Durée du TimeOut par défaut
15mS WDTO_15MS
30mS WDTO_30MS
…
4S WDTO_4S
8S WDTO_8S
Reset Sources
The Atmel ATmega328P has four sources of reset:
Power-on reset. The MCU is reset when the supply voltage is below the power-on reset threshold (VPOT).
External reset. The MCU is reset when a low level is present on the RESET pin for longer than the minimum pulse length.
Watchdog system reset. The MCU is reset when the watchdog timer period expires and the watchdog system reset mode is enabled.
Brown-out reset. The MCU is reset when the supply voltage VCC is below the brown-out reset threshold (VBOT) and the brown-out detector is enabled.
wdt_enable(WDTO_15MS); // Attente de 15ms avant l'init de la carte
wdt_enable(WDTO_4S); // Attente de 4s avant l'init de la carte
Programme principal
#include <avr/wdt.h>
unsigned long MillisVal = 0;
unsigned long MicrosVal = 0;
unsigned long count=0;
void setup()
{
// Init port série
Serial.begin(9600);
}
void loop()
{
// Lecture de la valseur de millis()
MillisVal=1000*millis();
MicrosVal=micros();
// Affichage des valeurs
Serial.print(MillisVal);Serial.print(",");
Serial.print(MicrosVal);
// Mise à jour du compteur
count++;
count =count %1024; // Init sans faire appel à l'instruction IF