Spara mer siffror på Arduino
Re: Spara mer siffror på Arduino
Jag tolkar "position" som den plats i eeprom där du vill lagra dina värden. Eller är "position" något annat? Det kanske är just "position" som är dina värden?
Re: Spara mer siffror på Arduino
Och då får jag upprepa vad hur jag alltid gör:
Spara först en struct, jag kallar den oftast Config då jag använder den för att spara en massa inställningar i.
Nu ska detta sparas:
Och vad gör den då? Jo, den läser alla bytes som ingår i Config och sparar dom i EEPROM, byte för byte. Ändrar Config storlek är det lugnt, rutinen kör konsekvent med storleken som referens.
Men det ska ju hämtas också:
Samma sak men med get istället.
Omedelbart anser jag att raden egentligen sk vara:
(u_int8_t)*((u_int8_t*)&Config + Ctr) = EEPROM.get(Ctr + CONFIG_START, u_int8_t);
eller något liknande. En get-funktion svarar ju med värdet.
Men nåväl, när båda Config_Save() och Config_Load() fungerar är det bara att lägga in rät värde i Config.Position[0] och Config.Position[1] och anropa Config_Save().
Vid uppstart laddas Config in som första steg via Config_Load().
Spara först en struct, jag kallar den oftast Config då jag använder den för att spara en massa inställningar i.
Kod: Markera allt
struct
{
float Position[2]; // Sådär, plats för 2 positioner
} Config;
#define CONFIG_START 0
Kod: Markera allt
void Config_Save(void)
{
u_int16_t Ctr;
for(Ctr = 0; Ctr < sizeof(Config); Ctr++)
{
EEPROM.put(Ctr + CONFIG_START, (u_int8_t)*((u_int8_t*)&Config + Ctr);
}
}
Men det ska ju hämtas också:
Kod: Markera allt
void Config_Load(void)
{
u_int16_t Ctr;
for(Ctr = 0; Ctr < sizeof(Config); Ctr++)
{
EEPROM.get(Ctr + CONFIG_START, (u_int8_t)*((u_int8_t*)&Config + Ctr);
}
}
Omedelbart anser jag att raden egentligen sk vara:
(u_int8_t)*((u_int8_t*)&Config + Ctr) = EEPROM.get(Ctr + CONFIG_START, u_int8_t);
eller något liknande. En get-funktion svarar ju med värdet.
Men nåväl, när båda Config_Save() och Config_Load() fungerar är det bara att lägga in rät värde i Config.Position[0] och Config.Position[1] och anropa Config_Save().
Vid uppstart laddas Config in som första steg via Config_Load().
-
- Inlägg: 1397
- Blev medlem: 29 januari 2011, 21:06:30
- Ort: Lapplandet
Re: Spara mer siffror på Arduino
Nej jag menar antal värden/positioner, inte antal bytes.sodjan skrev:Jag tror att han menar att, om du ska spara en 32-bit integer (4 bytes) så
sparar men just värdet 4 först, sedan integern i de följande fyra positionerna.
D.v.s. totalt fem positioner i EEPROM. Storlek och värde. Då kan man läsa
tillbaka den första positionen och veta hur mycket mer som ska läsas.
Men get/put i Arduino sköter ju det automatiskt eftersom dessa vet hur stor
plats de olika data typerna tar och skriver/läser rätt antal bytes.
Som jag tolkar problembeskrivningen så kan det antingen vara 1 eller flera motorpositioner. Då måste man ju veta om man ska läsa en, två eller n ints.
Re: Spara mer siffror på Arduino
Problemet löst!
Jag la till ett nytt namn för minne nr 2 och dessa rader kod:
Då kunde jag använda mig av en ny positionssparning på precis samma sätt som första positionen vid namn UserStopPulseCount.
Har testat nu fram och tillbaka och det fungerar strålande.
Jag la till ett nytt namn för minne nr 2 och dessa rader kod:
Kod: Markera allt
long UserStopPulseCount2;
EEPROM.get(8, UserStopPulseCount2);
Har testat nu fram och tillbaka och det fungerar strålande.
Re: Spara mer siffror på Arduino
Precis, just nu ligger det en position som är döpt till UserStopPulseCount och en annan döpt till UserStopPulseCount2sodjan skrev:Jag tolkar "position" som den plats i eeprom där du vill lagra dina värden. Eller är "position" något annat? Det kanske är just "position" som är dina värden?
Re: Spara mer siffror på Arduino
Icecap skrev:Och då får jag upprepa vad hur jag alltid gör:
Spara först en struct, jag kallar den oftast Config då jag använder den för att spara en massa inställningar i.Nu ska detta sparas:Kod: Markera allt
struct { float Position[2]; // Sådär, plats för 2 positioner } Config; #define CONFIG_START 0
Och vad gör den då? Jo, den läser alla bytes som ingår i Config och sparar dom i EEPROM, byte för byte. Ändrar Config storlek är det lugnt, rutinen kör konsekvent med storleken som referens.Kod: Markera allt
void Config_Save(void) { u_int16_t Ctr; for(Ctr = 0; Ctr < sizeof(Config); Ctr++) { EEPROM.put(Ctr + CONFIG_START, (u_int8_t)*((u_int8_t*)&Config + Ctr); } }
Men det ska ju hämtas också:Samma sak men med get istället.Kod: Markera allt
void Config_Load(void) { u_int16_t Ctr; for(Ctr = 0; Ctr < sizeof(Config); Ctr++) { EEPROM.get(Ctr + CONFIG_START, (u_int8_t)*((u_int8_t*)&Config + Ctr); } }
Omedelbart anser jag att raden egentligen sk vara:
(u_int8_t)*((u_int8_t*)&Config + Ctr) = EEPROM.get(Ctr + CONFIG_START, u_int8_t);
eller något liknande. En get-funktion svarar ju med värdet.
Men nåväl, när båda Config_Save() och Config_Load() fungerar är det bara att lägga in rät värde i Config.Position[0] och Config.Position[1] och anropa Config_Save().
Vid uppstart laddas Config in som första steg via Config_Load().
Tjusigt! Tackar. Nu löste det sig endå med jättelite kod.
Men vad finns det för fördelar att lägga det i en "struct"?
Och lagrar denna kod positionerna permanent i minnet så att de är kvar även när man stängt av och satt på maskinen?
Re: Spara mer siffror på Arduino
Fördelen är dels att man i programmet kan se vilka data som hör till en viss block/funktion.
Dels att man - i det exempel jag angav - kan lägga till saker i struct'en/ändra befintliga i variabeltyp och/eller antal osv. och funktionerna jag ritade upp fungera lika bra för det utan manuell justering. Vill du ha 3 stopp på vägen är det bara att ändra antalet - och Config-blocket sparas likaväl utan vidare trim i den delen.
Med sizeof() får man antal bytes en datastorlek använder och vid att kapsla in en given datamängd i en struct{} ger sizeof() hela blockets storlek. Och gäller det om att spara inställningsdata är det bara att uppdatera data i blocket och spara blocket i sin helhet.
Funktionen kan även vara att stycka ihop en kommunikationsblock och skicka den. Blir det ändringar i definitionen av kommunikationsblocket ändras alla viktiga saker automatisk vid kompileringen - och du har ingen aning om hur många trubbel det har räddad mig ifrån under årens lopp.
Gör jag t.ex. en typedef av ett kommunikationsblock och inkluderar samma fil i t.ex. ett µC-program samt ett PC-program (båda C) är definitionen alltid identisk. Ändrar jag blocket är det bara att kompilera om och saken är biff.
Dels att man - i det exempel jag angav - kan lägga till saker i struct'en/ändra befintliga i variabeltyp och/eller antal osv. och funktionerna jag ritade upp fungera lika bra för det utan manuell justering. Vill du ha 3 stopp på vägen är det bara att ändra antalet - och Config-blocket sparas likaväl utan vidare trim i den delen.
Med sizeof() får man antal bytes en datastorlek använder och vid att kapsla in en given datamängd i en struct{} ger sizeof() hela blockets storlek. Och gäller det om att spara inställningsdata är det bara att uppdatera data i blocket och spara blocket i sin helhet.
Funktionen kan även vara att stycka ihop en kommunikationsblock och skicka den. Blir det ändringar i definitionen av kommunikationsblocket ändras alla viktiga saker automatisk vid kompileringen - och du har ingen aning om hur många trubbel det har räddad mig ifrån under årens lopp.
Gör jag t.ex. en typedef av ett kommunikationsblock och inkluderar samma fil i t.ex. ett µC-program samt ett PC-program (båda C) är definitionen alltid identisk. Ändrar jag blocket är det bara att kompilera om och saken är biff.
Re: Spara mer siffror på Arduino
Bara påminner om att det är begränsad livslängd på eeprommet. Men om du slitit ut plats 0 och 1 finns ju resten kvar.
Nåt 100000-tal skrivningar är vad det inbyggda eepromet klarar.
Nåt 100000-tal skrivningar är vad det inbyggda eepromet klarar.
Re: Spara mer siffror på Arduino
Kod: Markera allt
val = digitalRead(PositionSavePin); // Knapp som sparar position
if (val == HIGH) { // Kollar om knappen är tryckt
Så istället för att kolla om en ingång är HIGH så bör du leta efter förändringar istället - från låg till hög. Då kommer inte koden att köras igen förrän du släppt upp knappen och sedan trycker ner den igen (om debouncingen fungerar).
Kod: Markera allt
val = digitalRead(PositionSavePin);
if (oldval == LOW && val == HIGH) { ... do something ... }
oldval = val;
Kod: Markera allt
button1val = digitalRead(BUTTON1);
if (oldButton1val == LOW && button1val == HIGH) { ... do something ... }
oldButton1val = button1val ;
Re: Spara mer siffror på Arduino
Den här operationen kan göras bitvis också. Så om du har många knappar som ska läsas av och varje knapp är en bit på en port kan koden se ut så här:
Kod: Markera allt
uint8_t buttons, old_buttons, buttons_pressed;
buttons = PINB; //läs in värden från åtta knappar från port B
buttons_pressed = !old_buttons & buttons; // bitvis kontroll om knapp blivit nedtryckt
old_buttons = buttons;
for (uint8_t i = 0; i<8; i++)
{
if (buttons_pressed & (1<<i)) { ... do something ... } // button i is pressed?
}