salve, sono alle prime armi nel mondo della programmazione.
Ho comprato un AT Tiny 85 per riuscire a svolgere piccoli azioni riducendo al massimo gli spazi ed i consumi.
Come primo obiettivo ho cercato di far lampeggiare un led per 2 minuti, allo scadere dei due minuti, tenere acceso il secondo led per 1 minuto.
Fin qui, tutto ok, il mio codice funziona.
Ho deciso, quindi, di voler ridurre ancora i consumi e cercando su internet vari esempi di sleep_mode, watchdog e qualsiasi altra cosa sono capitato su un blog italiano che spiega bene come far lampeggiare un LED e limitando i consumi.
Faccio copia incolla del codice, modifico l'uscita del LEd ma il codice non funziona, questo perchè quello che nella guida relativa a ATmega328p viene chiamato WDTCSR sul mio AT Tiny 85 si chiama invece WDTCR, modificato questo il codice funziona.
Il problema sorge quando vorrei fare l'operazione che ho descritto all'inizio.
vi lascio tutti i riferimenti necessari per potermi aiutare:
//varie librerie per lo sleep mode
#include <Arduino.h>
#include <WProgram.h>
#include <avr/sleep.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>
#include <avr/power.h>
//alcune variabili sono state dichiarate in precedenti versioni o sono per fare dei tentativi
int out1 = A2;
int out2 = A3;
byte statouscita1 = 1;
byte statouscita2 = 1;
int t = 0; //primo counter per tenere acceso un led 1 minuto
int s = 0; //secondo counter per tenere acceso l'altro led 5s
volatile unsigned int counter = 0;
volatile byte flag = 0;
void setup()
{
MCUSR = 0; //resetta il registro di stato della MCU
wdt_disable(); //disattiva il watchdog
pinMode(out2, OUTPUT);
pinMode(out2, OUTPUT);
setWdt(); //imposta il watchdog
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
}
void loop()
{
power_all_disable();
sleep_mode(); //cpu a nanna - corrisponde a sleep_enable+sleep_cpu+sleep_disable
power_all_enable();
//qui inizia il punto cruciale che non mi torna, ci sono varie prove ma continua a comportarsi in maniera che non comprendo
if (flag)
{
wdt_disable();
counter = 0;
flag = 0;
statouscita1 ^= 1; //cambio lo stato al led
digitalWrite(out1, statouscita1);
if(t=5)
{
digitalWrite(out1,LOW);
digitalWrite(out2,HIGH);
delay(5000);
digitalWrite(out2,LOW);
}
t=0;
setWdt(); //reimposta il watchdog
}
}
void setWdt() {
SREG &= ~(1<<SREG_I); //disattiva tutti gli interrupt
//imposta il registro del watchdog
WDTCR |= ((1<<WDCE) | (1<<WDE));
//imposta la modalità "interrupt" ed il timeout ad 1 secondo
WDTCR = ((1<<WDIE)| (1<<WDP2) | (1<<WDP1));
SREG |= (1<<SREG_I); //riattiviamo gli interrupt globali
}
// come funziona esattamente questa funzione ?
ISR(WDT_vect) {
t++;
if (++counter >= 1) { //impostare qui il numero di timeout (secondi)
flag = 1;
}
}
Sito riguardo il watchdog: http://www.leonardomiliani.com/2013/impariamo-ad-usare-il-watchdog-2/
Datasheet Atmel ATtiny: http://www.atmel.com/images/atmel-2586-avr-8-bit-microcontroller-attiny25-attiny45-attiny85_datasheet.pdf (a pagina 45 parla del WDTCR )
PS: questo forum è davvero complicato o.o