skriva en sträng till eeprom

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
uma
Inlägg: 1
Blev medlem: 9 juli 2009, 15:10:11

skriva en sträng till eeprom

Inlägg av uma »

Hej!
Som en övningsuppgift i en kurs i c programmering i atmel avr med winavr och atmega88 står följande:

"Deklarera en 20 tecken lång array eestring i EEPROM och skriv en funktion int put_string_on_EEPROM(char *string) som skriver string's värde till eestring. Lägg till felkontroll som kontrollerar att inte string är för lång. Returnera 0 vid ok och -1 om strängen var för lång."

Kursen slutade i början av juni så jag har inga lärare eller kurskamrater att fråga. Jag har läst atmegans datablad samt avr-libc men fattar inte hur jag ska göra. En komplikation är att i en tidigare uppgift när jag skulle räkna antalet interrupt och skriva det värdet till eeprom så stod det så här:

"I vårt program måste vi först reservera,"lägga undan", minnesutrymme på EEPROM och skapa en pekare mot detta område. denna pekare använder vi oss av för att kunna skriva och läsa till detta område.
För att reservera en int i EEPROM ser det ut så här:
uint16_t eevalue __attribute__((section(".eeprom")));"

De få programkoder som jag har hittat på nätet använder sig inte av något reserverat minnesutrymme så jag fattar alltså ingenting. Jag har en hel del inlämningsuppgifter kvar att göra och ber inte om hjälp med att göra dessa utan ber "endast" om hjälp med att komma vidare så att jag kan ta itu med dessa.

MVH Uma
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: skriva en sträng till eeprom

Inlägg av Icecap »

Nu håller jag inte på med AVR men det exempel du anger deklarerar en uint16_t typ variabel som heter eevalue.

Om du alltså deklarerar:
char eestring[20] __attribute__((section(".eeprom")));
borde det bli rätt.
OBS att den reserverar plats till 20 tecken, inte till något EOL-märke (som tar en extra byte).
eqlazer
Inlägg: 923
Blev medlem: 22 september 2007, 13:53:45
Ort: Göteborg

Re: skriva en sträng till eeprom

Inlägg av eqlazer »

Och det finns väl färdiga eeprom-libbar i winavr/avr-lib, eller vad nu den stora kodblobben kallas, som man kan titta på och använda.
eAk
Inlägg: 74
Blev medlem: 10 september 2008, 22:50:23
Ort: Kungälv

Re: skriva en sträng till eeprom

Inlägg av eAk »

en liten tanke bara.
om man deklarerar en array med 20 får man väl 21.
då har man ju en 20tecken med '\0' att placera i
array[20] ;)
Användarvisningsbild
AndLi
Inlägg: 18308
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: skriva en sträng till eeprom

Inlägg av AndLi »

Nä, i C ger array{20] dig 20 positioner, numrerade 0-19.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: skriva en sträng till eeprom

Inlägg av Icecap »

eAK: Fel!!!
Deklarerar du 20 tecken är det 20 st som gäller! Deklarerar du däremot en sträng-konstant på 20 tecken "följer det med" en EOL-byte (0x00) varför den fyller 20 tecken.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: skriva en sträng till eeprom

Inlägg av jesse »

aha.. det här var ju intressant... jag trodde att man skulle gå direkt på portarna mot EEPROMET och skriva i dem (EEAR, EEDR, EECR) så som man gör i assembler, men att skriva i och läsa från EEPROMet är alltså inbyggt i C-kompilatorn. (man lär sig något nytt varje dag!) :)
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: skriva en sträng till eeprom

Inlägg av Icecap »

Nej, det är inte "inbyggd" men vissa kompilatorer har tilläggsrutiner som medger detta. Dessa rutiner ska oftast inkluderas i projektet på något vis då de inte ingår i C.

Det är ung. som de delay, LCD, pulsmätning osv som en del kompilatorer "stoltserar med", det ingår inte i C men någon har skrivit en rutin som ger dessa funktioner.
Nu är det nog en ganska enkel rutin som tar hand om att skriva/läsa från det inbyggda EEPROM så den kan man nog använda utan att ha funderingar på optimeringen medan jag inte skulle använda de andra då det är alldeles för osäkert vad de gör.

Jag har sett ett skräckexempel: en kille hade köpt en PIC med USART just för att använda den till kommunikation med annat, han hade gjort ett program som satte upp serieporten till rätt baudrate osv och frågade egentligen efter något annat men i beskrivningen var han så nöjd med att det gick att ange vilken pinne som helst som UART in/ut, han tyckte att PIC var smidigt på det vis!

Kontentan av det hela var alltså att han använde en soft-UART på en PIC med en EUSART i och ursprungsproblemet var delvist relaterat till detta.

Så de rutiner är enkla... och totalt värdelösa i en del fall, inte för att de inte fungerar men för att användaren inte förstår vad som händer.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: skriva en sträng till eeprom

Inlägg av jesse »

Nu har jag inte fördjupat mig så mycket i detta, har precis testat att skriva ett litet AVR-program i GCC (som inte gör någonting!) men i GCC verkar det i alla fall finnas en funktion för att definiera konstanter som ligger i flashminnet. Det fungerar väl på något liknande sätt som "variabler i eeprom" antar jag... man definierar en pekare har jag för mig, och så måste den anropas på ett speciellt sätt?
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: skriva en sträng till eeprom

Inlägg av Icecap »

Det samma finns till PIC och det som sker är att HEX-filen innehåller dessa data som sedan hamnar på EEPROM'ets adress under programmeringen.
eAk
Inlägg: 74
Blev medlem: 10 september 2008, 22:50:23
Ort: Kungälv

Re: skriva en sträng till eeprom

Inlägg av eAk »

ojj då jag har alltid räknat med att jag får en extra på varje array jag skapar.
eftersom att jag räknar dom från 0
Det kan ju rädda mig från framtida buggar :)
Men jag tycker det är rätt skumt att den får 1position mindre om man deklarerar 20 och får 0-19
Aja dätta är way off topic sorry
eAk
Inlägg: 74
Blev medlem: 10 september 2008, 22:50:23
Ort: Kungälv

Re: skriva en sträng till eeprom

Inlägg av eAk »

men by the way jag har för mig att det finns funktioner i chalmers robot förenings kod till deras introbot 07 just för att skriva till eeprom. (sparar inställningar) Du kanske kan använda deras funktioner?
reine
Inlägg: 33
Blev medlem: 25 augusti 2009, 11:52:30
Ort: Stenungsund

Re: skriva en sträng till eeprom

Inlägg av reine »

eAk: 0-19 är ju 20 positioner... :wink:

Mvh
Reine
Skriv svar