Go Down

Topic: Problema EEPROM.write (Read 321 times) previous topic - next topic

Muccio

Mar 01, 2012, 11:50 pm Last Edit: Mar 02, 2012, 12:22 am by Muccio Reason: 1
Ho quasi finito il codice di una semplice scheda, che tramite 7 piccoli pulsanti controlla 7 carichi da 10Ampere ciascuno.
Come base sono partito dalla modifica di un semplice sketch per far accendere un led tramite pulsante con debouncing.
Con l'aiuto del forum ho risolto diversi problemi riguardo vari aspetti http://arduino.cc/forum/index.php/topic,93482.0.html e poi ho aggiunto un buzzer che, solo al variare dello stato, mi avvisa tramite 2 suoni distinti, uno per l'ON e l'altro per l'OFF.
Per brevità vi riporto uno stralcio della parte riguardante il primo pulsante (in realtà è tutto moltiplicato per 7) e senza la parte "void buzz":
Code: [Select]
#define LED1 2
#define BUTTON1 14

int val1 = 0;
int vecchio_val1 = 0;
int stato1 = 1;

void setup() {  
 pinMode(LED1, OUTPUT);  
 pinMode(BUTTON1, INPUT);
 pinMode(9, OUTPUT);
}  
 
void loop() {  
 val1 = digitalRead(BUTTON1);
   if ((val1 == HIGH) && (vecchio_val1 == LOW)){  
   stato1 = 1 - stato1;
    if (stato1 == 1) {
     buzz(9, 3000, 20);
     buzz(9, 3500, 25);
     buzz(9, 4000, 5);
    }
    else {
     buzz(9, 3000, 5);
     buzz(9, 2500, 25);
     buzz(9, 2000, 20);
    }
   delay(20);
 }  
 
 vecchio_val1 = val1;  
   if (stato1 == 1) {  
   digitalWrite(LED1, HIGH);
   delay(20);
 }  
 else {  
   digitalWrite(LED1, LOW);
   delay(20);
 }
delay(100);
}


Adesso per evitare che ad ogni spegnimento debba reimpostare ogni pulsante, vorrei aggiungere la funzione EEPROM.write per memorizzare sulla eeprom interna l'ultimo stato di ogni pulsante.
Ho modificato lo sketch così:
Code: [Select]
#define LED1 2
#define BUTTON1 14
#include <EEPROM.h>

int val1 = 0;
int vecchio_val1 = 0;
int stato1;        // ho eliminato lo stato1=1
int addr1 = 1;   // ho definito l'indirizzo dell'eeprom

void setup() {  
 pinMode(LED1, OUTPUT);  
 pinMode(BUTTON1, INPUT);
 pinMode(9, OUTPUT);
}  
 
void loop() {
 stato1 = EEPROM.read(addr1);   //vorrei che leggesse l'ultimo stato memorizzato
 val1 = digitalRead(BUTTON1);
   if ((val1 == HIGH) && (vecchio_val1 == LOW)){
     stato1 = 1 - stato1;
    if (stato1 == 1) {
     buzz(9, 3000, 20);
     buzz(9, 3500, 25);
     buzz(9, 4000, 5);
     EEPROM.write(addr1, stato1);   // solo in caso di modifica di stato, aggiorna la memorizzazione sull'eeprom
    }
    else {
     buzz(9, 3000, 5);
     buzz(9, 2500, 25);
     buzz(9, 2000, 20);
     EEPROM.write(addr1, stato1);   // solo in caso di modifica di stato, aggiorna la memorizzazione sull'eeprom
    }
   delay(20);
 }  
 
 vecchio_val1 = val1;  
   if (stato1 == 1) {  
   digitalWrite(LED1, HIGH);
   delay(20);
 }  
 else {  
   digitalWrite(LED1, LOW);
   delay(20);
 }
delay(100);
}


Purtroppo mi funziona esattamente al contrario, ad ogni riaccensione mi ritrovo nello stato inverso a quello lasciato.
Ho provato a modificare diverse volte il codice ma senza risultato...

leo72

Ho dato una scorsa veloce e non ho capito la logica di funzionamento del tuo codice, sarà l'ora tarda...  :~
Cmq per invertire lo stato di una variabile usa l'operatore XOR cioè "^"
stato=1
stato^=1
stato->0

stato=0
stato^=1
stato->1

Ho paura che col tuo codice stato1 assuma valori negativi, può farlo dato che la dichiari di tipo int, quindi un signed. Però ricordati che EEPROM.write/read lavorano su singoli byte, memorizzando un int non so se viene scritto solo il byte alto oppure i byte basso.

Insomma, intanto dichiara le variabili di stato di tipo byte, poi usa lo xor come ti ho detto e dopo riprova

Muccio


Ho dato una scorsa veloce e non ho capito la logica di funzionamento del tuo codice, sarà l'ora tarda...  :~
Cmq per invertire lo stato di una variabile usa l'operatore XOR cioè "^"
stato=1
stato^=1
stato->0

stato=0
stato^=1
stato->1

Ho paura che col tuo codice stato1 assuma valori negativi, può farlo dato che la dichiari di tipo int, quindi un signed. Però ricordati che EEPROM.write/read lavorano su singoli byte, memorizzando un int non so se viene scritto solo il byte alto oppure i byte basso.

Insomma, intanto dichiara le variabili di stato di tipo byte, poi usa lo xor come ti ho detto e dopo riprova


Stasera mi ci rimetto sotto e provo a venirne a capo... Grazie!

Go Up