diff options
-rw-r--r-- | sw/README.rst | 18 | ||||
-rw-r--r-- | sw/main.cpp | 13 |
2 files changed, 23 insertions, 8 deletions
diff --git a/sw/README.rst b/sw/README.rst index 3125cbb..7b890a4 100644 --- a/sw/README.rst +++ b/sw/README.rst @@ -1,22 +1,24 @@ Description logiciel ==================== +Au démarrage, avant de passer à la mesure régulière, le code doit: + +- Initialiser les GPIO +- Mettre en place un timer 100Hz pour pouvoir faire dormir le CPU +- Lire l'EEPROM pour charger le compteur mAh + - Attention au risque de problemes après 100000 écritures + - Faire une vérification lecture après écriture et communiquer le problème +- Mettre en place un watchdog + TODO ---- -- Initialiser GPIO - - Ecire des fonctions pour contrôler les relais - - Definir le comportement par defaut au démarrage, pas de glitch! -- Mettre en place un timer 100Hz pour pouvoir faire dormir le CPU +- Definir le comportement par defaut au démarrage, pas de glitch! - Configurer SPI pour LTC2400 - Initialiser entrées analogiques - Initialiser DS18B20 - Initialiser UART (uniquement TX, on verra si on a besoin du RX plus tard) - Décider quel protocole utiliser sur le port série -- Mettre en place un watchdog -- Utiliser l'EEPROM pour stocker le compteur - - Risque de problemes après 10000 écritures (Estimation) - - Faire une vérification lecture après écriture et communiquer le problème Reglages eFuse diff --git a/sw/main.cpp b/sw/main.cpp index b364b92..48871ec 100644 --- a/sw/main.cpp +++ b/sw/main.cpp @@ -30,6 +30,7 @@ #include <avr/interrupt.h> #include <avr/sleep.h> #include <avr/eeprom.h> +#include <avr/wdt.h> // Definitions allocation pin #define PIN(x) (1 << x) @@ -97,6 +98,10 @@ uint32_t current_capacity; volatile uint8_t timer_counter; /* Timer in 100ms steps */ volatile uint32_t timer_seconds; /* Timer in seconds */ +/* At reset, save the mcusr register to find out why we got reset. + * Datasheet 11.9.1, example code from wdt.h */ +uint8_t mcusr_mirror __attribute__ ((section (".noinit"))); + ISR(TIMER0_COMPA_vect) { timer_counter++; @@ -162,6 +167,14 @@ static void store_capacity_to_eeprom() int main() { + /* Save the reset source for debugging, then enable the watchdog. + * Attention: WDT may be already enabled if it triggered a reset! + * Datasheet 11.8.2 */ + mcusr_mirror = MCUSR; + MCUSR = 0; + wdt_reset(); + wdt_enable(WDTO_4S); + /* Setup GPIO */ // Active-low outputs must be high PORTB = PINB_STATUSn | PINB_SPI_LTC_CSn; |