Newsgroup: it.hobby.elettronica.digitale
Titolo: Eeprom Atmel atmega8

Aiuto: non riesco a scrivere nella eeprom dell'atmega8, riesco solo a 
leggere.
Il codice che ho usato ï¿œ questo:
void eeprom_write(unsigned int uiAddress, unsigned char ucData) {
	while (EECR & (1<<EEWE)); // wait for completion of previous write
	EEAR = uiAddress;
	EEDR = ucData;
	cli();
	EECR |= (1<<EEMWE); // write logical one to EEMWE
	EECR |= (1<<EEWE); // start eeprom write by setting EEWE
	sei();
}
unsigned char eeprom_read(unsigned int uiAddress) {
	while (EECR & (1<<EEWE)); // wait for completion of previous write
	EEAR = uiAddress;
	EECR |= (1 << EERE); // start eeprom read by writing EERE
	return EEDR;
}
Ora, se faccio una main cosï¿œ:
int main(void)
{
	DDRB = 255;
	PORTB = eeprom_read(0);
	while (1);
}
funziona, cioï¿œ mi trovo sui pin d'uscita di PORTB i valori memorizzati 
nella eeprom (ho provato a modificarli con il software "up" e li legge 
giusti).
Se invece faccio:
int main(void)
{
	DDRB = 255;
	eeprom_write(0, 3);
	PORTB = eeprom_read(0);
	while (1);
}
non va e mi trovo FF in eeprom e 00 in uscita su PORTB.
Provando in debug, mi pare che il problema sia il fatto che la funzione 
eeprom_write() non setta il bit EEWE.
Non va nemmeno se metto
	EECR = 4; // write logical one to EEMWE and zero to EEWE
al posto di EECR |= (1<<EEMWE);
Grazie per la pazienza d'aver letto fin qua e per qualunque suggerimento.

         sei();
cut...
L'ATmega8 ha due registri address: EEARH ed EEARL.
Forse il compiler accetta comunque  EEAR splittandolo in seguito.
Essenziale, invece, è settare EEMWE e EEWE entro i 4 cicli di clock
specificati.
Probabilmente il compilatore genera codice esondante e sfora tale
temporizzazione.
Meglio generare codice inline per tale operazione.
Anche se noto che il listato indicato è esattamente quello
dell'esempio del datasheet...
Piccio.

	PORTB = eeprom_read(0);
Troppo poco.
Metterei, tra i due statement, un
while(EECR & (1<<EEPE));
che, tra l'altro, ho copiato dal manuale dell'ATmega88 (i Mega8 che avevo
li ho sbolognati a un fesso ;-))
Il compilatore che usi non ha una funzione di libreria apposita?
-- 
Saluti

 dell'esempio del datasheet...
Oggi sei fuori forma, eh? :D
-- 
Saluti

 Aiuto: non riesco a scrivere nella eeprom dell'atmega8
Non facevi pi� alla svelta a telefonarmi?
-- 
Saluti

 Meglio generare codice inline per tale operazione.
Buona ipotesi, stasera ci provo (se riesco a combinare qualcosa di 
sensato con il codice inline, mai fatto... sono totalmente niubbo di 
elettronica).

 Il compilatore che usi non ha una funzione di libreria apposita?
Ecco, questo � un buon punto. Non ne ho idea. WinAVR con il gcc.

 Ecco, questo � un buon punto. Non ne ho idea. WinAVR con il gcc.
Allora RTFM.
-- 
Saluti

 sono totalmente niubbo di elettronica).
Eccerto, senn� che ingegnere informatico saresti?
Ti faccio sommessamente notare che stiamo parlando di software. :-p
-- 
Saluti

 Ti faccio sommessamente notare che stiamo parlando di software. :-p
L'ultima volta che ho scritto qualcosa in assembler fu all'esame di 
Elettronica dei Sistemi Digitali 17 anni fa, quindi il mio livello in 
assembler non pu� essere che "niubbo"... e poi hai voglia a RTFM: 
proprio l'esempio copiato dal manuale non funziona (sorvoliamo 
sull'idiozia di un coso che per memorizzare un byte richiede di 
scriverne altri due e pure in fretta) :-))

 scriverne altri due e pure in fretta) :-))
Eh, devi prendere il manuale giusto, deh:
http://www.nongnu.org/avr-libc/user-manual/group__avr__eeprom.html
-- 
  _|/ Francesco Sacchi - Develer S.r.l., R&D dept.
   |\ 
http://www.develer.com/
 - 
http://www.bertos.org/

 scriverne altri due e pure in fretta) :-))
Di solito l� ci vanno parametri che vengono modificati raramente o mai. E'
quindi logico vengano protetti con meccanismi idiot-proof, anzi,
addirittura ingegnereinformatico-proof.

 
http://www.nongnu.org/avr-libc/user-manual/group__avr__eeprom.html
Mitico!
Funzionano perfettamente e hanno anche gi� bella pronta l'update di 16 
bit senza doverli preventivamente dividere in due byte.
Grazie.