Buongiorno,
vorrei eseguire un lampeggio del led quando il software riconosce la mancanza di microSD.
Ho quindi inizialmente simulato la mancanza di microSD cosi:
EDIT: CODICI CORRETTI
#include <avr/sleep.h>
#include <avr/wdt.h>
#include <SPI.h>
#include <SD.h>
const byte PinChipSelect = 10;
bool statoLed;
File dataLogger;
void setup()
{
MCUSR = 0; //resetta il registro di stato della MCU
wdt_disable();
Serial.begin(9600);
pinMode(PinChipSelect, OUTPUT);
analogReference(EXTERNAL);
pinMode(13, OUTPUT);
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
setWdt();
}
void loop()
{
while (1)
{
Serial.println("microSD non inserita");
digitalWrite(13, HIGH);
delay(30);
digitalWrite(13, LOW);
ACSR |= (1 << ACD); //spegne il comparatore analogico
ADCSRA &= ~(1 << ADEN); //spegne l'ADC
MCUCR |= ((1 << BODS) | (1 << BODSE)); //spegne il BOD
DIDR0 = 0; //disattivo i buffer digitali sui pin analogici
//seguenza di sleep
sleep_enable();
sei();
sleep_cpu();
sleep_disable();
}
Serial.println("microSD presente.");
}
void setWdt()
{
SREG &= ~(1 << SREG_I); //disattiva tutti gli interrupt
//imposta il registro del watchdog
WDTCSR |= ((1 << WDCE) | (1 << WDE));
//imposta la modalità "interrupt" ed il timeout a 4 secondi
WDTCSR = ((1 << WDIE) | (1 << WDP3));
SREG |= (1 << SREG_I); //riattiviamo gli interrupt globali
}
ISR (WDT_vect)
{
//reimposta la modalità interrupt+reset
WDTCSR |= ((1 << WDCE) | (1 << WDIE));
}
ed il lampeggio funziona perfettamente spegnendo il led immediatamente prima di "addormentarsi". La frequenza del lampeggio è data dall'overflow del watchdog che è impostato a 4 secondi.
Quindi, preso coscienza del funzionamento, adatto al mio codice reale:
#include <avr/sleep.h>
#include <avr/wdt.h>
#include <SPI.h>
#include <SD.h>
const byte PinChipSelect = 10;
bool statoLed;
File dataLogger;
void setup()
{
MCUSR = 0; //resetta il registro di stato della MCU
wdt_disable();
Serial.begin(9600);
pinMode(PinChipSelect, OUTPUT);
analogReference(EXTERNAL);
pinMode(13, OUTPUT);
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
setWdt();
}
void loop()
{
while (!SD.begin(PinChipSelect))
{
Serial.println("microSD non inserita");
digitalWrite(13, HIGH);
Serial.print("Dovrebbe accendersi il LED: ");
statoLed = digitalRead(13);
if (statoLed == HIGH) Serial.println("ACCESO");
else Serial.println("SPENTO");
delay(30);
digitalWrite(13, LOW);
Serial.print("Dovrebbe spegnersi il LED: ");
statoLed = digitalRead(13);
if (statoLed == HIGH) Serial.println("ACCESO");
else Serial.println("SPENTO");
delay(50);
ACSR |= (1 << ACD); //spegne il comparatore analogico
ADCSRA &= ~(1 << ADEN); //spegne l'ADC
MCUCR |= ((1 << BODS) | (1 << BODSE)); //spegne il BOD
DIDR0 = 0; //disattivo i buffer digitali sui pin analogici
//seguenza di sleep
sleep_enable();
sei();
sleep_cpu();
sleep_disable();
}
Serial.println("microSD presente.");
}
void setWdt()
{
SREG &= ~(1 << SREG_I); //disattiva tutti gli interrupt
//imposta il registro del watchdog
WDTCSR |= ((1 << WDCE) | (1 << WDE));
//imposta la modalità "interrupt" ed il timeout a 4 secondi
WDTCSR = ((1 << WDIE) | (1 << WDP3));
SREG |= (1 << SREG_I); //riattiviamo gli interrupt globali
}
ISR (WDT_vect)
{
//reimposta la modalità interrupt+reset
WDTCSR |= ((1 << WDCE) | (1 << WDIE));
}
l'overflow del watchdog funziona ma non il lampeggio del LED13 difatti in seriale trovo:
Dovrebbe accendersi il LED: SPENTO
Dovrebbe spegnersi il LED: SPENTO
P.S: ho utilizzato il led interno di arduino per vedere velocemente il funzionamento..