come si evince dal titolo, ho la necessità di scrivere dei dati sulla eeprom interna di un microcontrollore attiny 84, utilizzando come programmatore l’arduino uno.
Premesso che non ho nessuna difficoltà a programmare l’attiny, per quanto riguarda la scrittura della sua eeprom ho delle difficoltà.
Ho creato due sketch, uno per scrivere ed uno per leggere.
#include <avr/eeprom.h>
uint8_t value = 0;
const int LEDROSSO = 0;
const int LEDVERDE = 1;
void setup(){
pinMode(LEDROSSO, OUTPUT);
pinMode(LEDVERDE, OUTPUT);
}
void loop()
{
uint8_t value;
value =eeprom_read_byte ((uint8_t *) 0);
if (value == 10 ) {
digitalWrite(LEDVERDE, HIGH);
digitalWrite(LEDROSSO, LOW);
}
if (value != 10 ) {
digitalWrite(LEDVERDE, LOW);
digitalWrite(LEDROSSO, HIGH);
}
}
Nel primo listato, scrivo nella posizione “0” il valore di value.
Nel secondo listato, leggo il valore della posizione “0” e poi lo utilizzo per accendere uno dei due led. Dovrebbe accendersi il led verde, ma non accade. Si accende il rosso
A questo punto non so dov’è l’errore, per cui spero che qualcuno più esperto di me, mi possa delucidare.
Un saluto e un ringraziamento a tutti gli amici di questo forum.
Essendo il tuo primo post Ti invitiamo a presentarti QUI (dicci quali conoscenze hai di elettronica e di programmazione) e a leggere il regolamento QUI se non lo hai già fatto.
chiedo scusa per non essermi presentato, provvedo subito.
Comunque a beneficio di tutti credo di aver risolto il problema.
In pratica l'errore stava nel fatto che utilizzavo due sketch separati. Evidentemente quando si riprogramma il microcontrollore, la eeprom si cancella.
Sotto posto il codice unificato che funziona correttamente:
#include <avr/eeprom.h>
// start reading from the first byte (address 0) of the EEPROM
uint8_t value = 0;
const int LEDROSSO = 0;
const int LEDVERDE = 1;
void setup(){
pinMode(LEDROSSO, OUTPUT);
pinMode(LEDVERDE, OUTPUT);
uint8_t value = 10;
eeprom_write_byte(( uint8_t * )0,value);
}
void loop()
{
value =eeprom_read_byte ((uint8_t *) 0);
if (value == 10 ) {
digitalWrite(LEDVERDE, HIGH);
digitalWrite(LEDROSSO, LOW);
}
if (value != 10 ) {
digitalWrite(LEDVERDE, LOW);
digitalWrite(LEDROSSO, HIGH);
}
}
Comunque grazie a tutti lo stesso. Spero che questo post sia di aiuto a qualcun altro.
Fendar:
Comunque a beneficio di tutti credo di aver risolto il problema.
In pratica l'errore stava nel fatto che utilizzavo due sketch separati. Evidentemente quando si riprogramma il microcontrollore, la eeprom si cancella.
Quando programmi con avrdude via ISP uno dei parametri -e è quello che comanda proprio la cancellazione della EEPROM:
-e : Causes a chip erase to be executed. This will reset the contents of the ash ROM and EEPROM to the value ‘0x ’, and clear all lock bits. Except for ATxmega devices which can use page erase, it is basically a prerequisite command before the ash ROM can be reprogrammed again. The only exception would be if the new contents would exclusively cause bits to be programmed from the value ‘1’ to ‘0’. Note that in order to reprogram EERPOM cells, no explicit prior chip erase is required since the MCU provides an auto-erase cycle in that case before programming the cell.
In realtà il -e non cancella sempre la EEPROM, dipende dal valore del fuse EESAVE. Programmandolo è possibile preservarla tra una riprogrammazione e l'altra.
PS: Notare che il -e non è opzionale, come dice anche la descrizione menzionata sopra, di fatto è un requisito per la riprogrammazine della Flash, mentre la EEPROM può essere conservata come appena detto.
SukkoPera:
In realtà il -e non cancella sempre la EEPROM, dipende dal valore del fuse EESAVE. Programmandolo è possibile preservarla tra una riprogrammazione e l'altra.
Aiutatemi a capire se ho capito!!
Grazie alla "Menniti's guide" ho avuto un'infarinata sui fuse dei micro Atmel, guardando il data sheet dell'Attiny 84 mi sembra di capire che quel determinato bit è impostato a "1". "1" dovrebbe significare che la funzione di quel bit è disabilitata, perciò la EEPROM viene "cancellata" ad ogni scrittura del programma, è così?!
Occhio però che si riferisce alla programmazione tramite ICSP. Ora, è difficile che tu abbia un bootloader sull'ATtiny, ma ad esempio su un Arduino "normale", sebbene quel bit sia a 1, la EEPROM viene preservata durante la programmazione "solita", in quanto avviene tramite SERIALE passando dal bootloader, non tramite ICSP.
Grazie SukkoPera, magnifico come al solito!
Sai il perché della mia domanda? Ho fatto un circuito che salvava dei parametri su EEPROM ed ero stra-sicuro che ogni volta che caricavo un nuovo sketch quei parametri rimanevano! Cosi guardando i fuse di arduino UNO, quel bit era incongruente con le mie convinzioni. Solo dopo mi sono accorto che come hai giustamente detto tu si stava parlando di programmazione ICSP!
A questo punto dato che quel circuito è prossimo a diventare una pcb con 328 in standalone e programmabile solo in ICSP è opportuno impostarlo a "0"?!