WDT con Attiny85

Buongiorno a tutti, sto cercando di caricare il seguente semplice programma su Att85:

/*
  Prova WDT su ATT85
  Funziona su nano
*/

#include <avr/wdt.h>
#include <avr/sleep.h>
#include <avr/power.h>

volatile int f_wdt = 1;
int cicli = 0;       // Contatore per i cicli di sleep da 8 sec.

int led = 0;  // LED x impedire blocco PowerBank

ISR (WDT_vect) {
  if (f_wdt == 0) {
    f_wdt = 1;
  }
}

void enterSleep() {

  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();

  sleep_mode();

  /* Il programma prosegue dopo il WDT timeout*/
  sleep_disable();

  /* riabilito il processore */
  power_all_enable();
}

void setup() {

  Serial.begin(9600);

  pinMode(led, OUTPUT);
  digitalWrite(led, HIGH);
  delay(500);
  digitalWrite(led, LOW);

  // modifico il WDT a 8 sec.
  wdt_reset();
  WDTCSR |= (1 << WDCE) | (1 << WDE);

  WDTCSR = 1 << WDP0 | 1 << WDP3;
  WDTCSR |= _BV(WDIE);
}

void loop() {
  digitalWrite(led, HIGH);
  delay(1500);
  digitalWrite(led, LOW);
  delay(1500);
  if (f_wdt != 1) {
    return;
  }
  f_wdt = 0;
  enterSleep(); // Rientro in modo sleep.
}

che funziona su nano, ma, in fase di compilazione mi si blocca su
WDTCSR |= (1 << WDCE) | (1 << WDE);

Ho cercato inutilmente in internet e sul datasheet sulle possibili cause dell'errore ma non sono riuscito a risolvere.

Qualcuno mi potrebbe indirizzare su come risolvere?

Saluti
Enrico

Il Watchdog Timer su ATTiny è diverso da quello su Nano. Su ATTiny, usiamo il registro WDTCR per configurare il timer, mentre su Nano, usiamo il registro WDTCSR. Le modalità e le impostazioni sono anche diverse tra i due microcontrollori. È importante adattare il codice di conseguenza quando si passa da un modello all'altro.


È possibile semplificare la funzione di interruzione e utilizzare un bool al posto di un int.

volatile bool f_wdt = true;

ISR (WDT_vect) {
  f_wdt = true;
}

E nella loop()

  if (! f_wdt) return;
  f_wdt = false;
1 Like

GRAZIE, ora funziona perfettamente!

Enrico

Mmm ... però sul datasheet NON hai cercato perché, a pag. 45 è chiaramente indicato come si chiama il registro incriminato ed a pag. 44 c'è anche un esempio in 'C ... :roll_eyes:

Guglielmo

Sinceramente non ho notato che i registri venivano indicati con una 'S' in meno. Anche su internet vi sono diversi esempi (che non sempre sono riuscito a capire). In tutti i casi partivo dall'assioma che i registri su Nano e Attiiny avessero lo stesso nome (anche in considerazione della somiglianza! .. se lo avessero chiamato "pippo"....)

Saluti
Enrico

... purtroppo occorre prestare la massima attenzione quando si leggono i datasheet ... altrimenti, appunto, piccole differenze sfuggono e poi, ovviamente, i nomi non corrispondono.

Guglielmo

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.