Sida 1 av 1
AVR: skriva, läsa till eeprom trubbel
Postat: 27 maj 2009, 20:52:16
av exos
Tjenare, jag håller på med ett menysytem på en lcd,
jag skulle vilja skriva in lite värden i eepromet, samt läsa av det men vet inte hur ja skall bära mig åt,
är ute efter typ.
eeprom_write(addr,data)
eeprom_read(addr)
jag använder mig av CodeVision.
Jag har läst manualen och hjälpen, men förstår fortfarande inte riktigt,
Det står bla:
Kod: Markera allt
/* Write directly the value 0x55 to the EEPROM */
alfa=0x55;
/* or indirectly by using a pointer */
ptr_to_eeprom=&alfa;
*ptr_to_eeprom=0x55;
men var i eepromet hamnar då 0x55?
Re: AVR: skriva, läsa till eeprom trubbel
Postat: 27 maj 2009, 21:22:25
av thepirateboy
Verkar som dom har nåt eget halvmysko sätt att göra det på.
Står nåt på sid 95 som jag aldrig sett förut.
eeprom char alfa @0x01
för att ange adressen till alfa kanske kan funka?
Re: AVR: skriva, läsa till eeprom trubbel
Postat: 27 maj 2009, 21:54:31
av Stinrew
Jag har aldrig använt mig av "CodeVision", bara editor och gcc. När jag pratar med det interna eepromet använder jag mig av kodexemplen i databladet för respektive AVR-krets, där finns färdigskrivna funktioner för det.
Re: AVR: skriva, läsa till eeprom trubbel
Postat: 27 maj 2009, 23:20:07
av exos
Kollade lite nogare i bladet för min ATMega16 och hittade detta:
Kod: Markera allt
void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
/* Wait for completion of previous write */
while(EECR & (1<<EEWE))
;
/* Set up address and data registers */
EEAR = uiAddress;
EEDR = ucData;
/* Write logical one to EEMWE */
EECR |= (1<<EEMWE);
/* Start eeprom write by setting EEWE */
EECR |= (1<<EEWE);
}
Verkar ju lovande.
men frågan är om jag skrivet rätt:
EEPROM_write(0x01,1) // enligt mig så skriver den en etta i 0x01
EEPROM_read(0x01) // läser ut svaret, i detta fall "1" eller?
stämmer detta?
alltså EEPROM_read(0x01) == 1
hoppas ni förstår vad jag menar..
Re: AVR: skriva, läsa till eeprom trubbel
Postat: 28 maj 2009, 00:05:32
av Stinrew
Det stämmer. Kul att du verkar få det att fungera. Älskar när det är lätt att ge hjälp

Re: AVR: skriva, läsa till eeprom trubbel
Postat: 28 maj 2009, 00:25:37
av jesse
Sitter och bläddrar i boken
"Embedded C Programming and the Atmel AVR" av Barnett,Cox & O'Cull. De använder sig av CodeVision i boken, men ingenstans på de 495 sidorna kan jag hitta något som liknar de koder du nämner (
ptr_to_eeprom) ... ptr kan ju stå för t.ex. "put register"? Men nu kör du ju "standardkoden" enligt databladet så det kanske inte har nån betydelse längre vad
ptr_to_eeprom är för något.
Boken ovan verkar vara bra för nybörjare.
EDIT: har hittat detta i
CodeVisionAVR - User Manual
Kod: Markera allt
CodeVisionAVR - 3.14 Accessing the EEPROM
Accessing the AVR internal EEPROM is accomplished using global variables, preceded by the
keyword eeprom.
Example:
/* The value 1 is stored in the EEPROM during chip programming */
eeprom int alfa=1;
eeprom char beta;
eeprom long array1[5];
/* The string is stored in the EEPROM during chip programming */
eeprom char string[]=”Hello”;
void main(void) {
int i;
/* Pointer to EEPROM */
int eeprom *ptr_to_eeprom;
/* Write directly the value 0x55 to the EEPROM */
alfa=0x55;
/* or indirectly by using a pointer */
ptr_to_eeprom=&alfa;
*ptr_to_eeprom=0x55;
/* Read directly the value from the EEPROM */
i=alfa;
/* or indirectly by using a pointer */
i=*ptr_to_eeprom;
}
Pointers to the EEPROM always use 16 bits.
Lösningen ligger alltså i att det finns olika variabeltyper som man kan se i deklarationerna.
eeprom int alfa=1; // här definieras variabeln "alfa" som ligger i EEPROM-utrymmet.
// adress tilldelas automatiskt av kompilatorn
eeprom char string[]=”Hello”; // och man kan lagra långa texter utan krångel i EEPROM
och så deklarerar man en pekare till en eeprom-adress (även denna vald av kompilatorn):
int eeprom *ptr_to_eeprom;
Man använder alltså inte egna adresser alls i EEPROM:et utan man definierar datautrymme i form av variabler precis som i sram. smidigt faktiskt.
Re: AVR: skriva, läsa till eeprom trubbel
Postat: 28 maj 2009, 07:47:33
av Nerre
ptr = pointer, pekare alltså.
Som du har listat ut så behöver du inte bry dig om adresser utan talar bara om för kompilatorn att du vill ha din variabel i EEPROM, sen använder du den precis som en vanlig variabel och kompilatorn tar hand om det som behövs för att läsa/skriva EEPROM.
Re: AVR: skriva, läsa till eeprom trubbel
Postat: 28 maj 2009, 11:21:33
av exos
bummer!
Tror min ATMega gav upp.
Progamerade om den allt va frid och fröjd, texten kom upp på lcd´n o allt som det skulle...
gjorde ändringar, texten på lcd´n bara, programerade om den igen, pang!
nu visas bara LCD´n sin standard... ja ni vet, 2 rader med kontrast 2 rader utan (4x20 lcd)
och nu kan jag inte äns programera den igen, kan inte läsa signaturen...! va trött ja blir.
hoppas bara det är kretsen så att inte det är min Dragon som har lagt av.
har en ATtiny26 som ja kan testa iof... skall kolla detta.
-------------
iaf, innan allt detta hände så lyckades ja skriva till Eeprom.
jag skrev in:
eeprom int alfa=1;
i global variables.
sen läste av eepromet med programeraren och såg att på första adressen stod en "etta".
sen läste jag av detta i koden, inga problem.
Men Det verkar inte som att det går att skriva till eppromet i koden utan bara om man deklaarerar en variabel i global variables?
Nån som vet hur detta kommer sig?
Re: AVR: skriva, läsa till eeprom trubbel
Postat: 28 maj 2009, 11:40:56
av exos
jag testade på min ATTiny26 och det fungerade som valigt. så min ATMega16 e kört verkar det som? hur kommer detta sig? kan det bli så bara helt plötsligt?
Re: AVR: skriva, läsa till eeprom trubbel
Postat: 28 maj 2009, 11:55:11
av jesse
Visst kan du skriva och läsa från eepromet i koden.
Du skriver och läser ju som när du skriver en vanlig variabel:
/* Write directly the value 0x55 to the EEPROM */
alfa=0x55;
/* Read directly the value from the EEPROM */
i=alfa;
bara du inte skrivar allt för ofta... eepromet har ju en gräns på max 10000 eller 100000 skrivningar. sen slutar det fungera. undvik att skriva i eepromet annat än när det verkligen behövs. (dvs inte i varje varv i "huvudloopen" i programmet)
ATmega ska inte bara gå sönder sådär. Med största sannolikhet har du råkat programmera en "fuse" som hindrar fortsatt programmering. Eller så har du programmerat några olämpliga utgångar som kortslutits. Det kan ju vara ESD också men det är väl mindre troligt då Dragon borde vara en ganska skyddande miljö.
Re: AVR: skriva, läsa till eeprom trubbel
Postat: 28 maj 2009, 12:00:24
av Nerre
Sen verkar det rätt logiskt att EEPROM-variabler bara går att deklarera globalt, annars blir väl inte koden reentrant (eller vad det heter)?
Re: AVR: skriva, läsa till eeprom trubbel
Postat: 28 maj 2009, 12:27:40
av Stinrew
Du kan inte tänka dig att publicera hela koden, som den såg ut sista gången du lyckades programmera AVRen!??
Re: AVR: skriva, läsa till eeprom trubbel
Postat: 28 maj 2009, 12:52:29
av exos
Går det att skriva såhär då?
först deklarera...
eeprom int cursorpos=1;
sen då i en IF sats t.ex.
cursorpos=cursorpos+1;
Re: AVR: skriva, läsa till eeprom trubbel
Postat: 28 maj 2009, 14:33:57
av Nerre
Självklart går det att skriva så, varför skulle det INTE gå?
Sen exakt vad det genererar för kod beror ju på hur resten ser ut. Man ska inte underskatta C-kompilatorers förmåga att optimera.