skriva en sträng till eeprom
skriva en sträng till eeprom
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
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
Re: skriva en sträng till eeprom
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).
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).
Re: skriva en sträng till eeprom
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.
Re: skriva en sträng till eeprom
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]
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]

Re: skriva en sträng till eeprom
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.
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.
Re: skriva en sträng till eeprom
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!) 

Re: skriva en sträng till eeprom
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.
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.
Re: skriva en sträng till eeprom
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?
Re: skriva en sträng till eeprom
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.
Re: skriva en sträng till eeprom
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
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
Re: skriva en sträng till eeprom
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?