Arduino - Spara en position i minnet

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Arduino - Spara en position i minnet

Inlägg av fosfor »

Det låter som en bra idé. Det är så jag också måste göra det för att det ska fungera rent mentalt.
Bryta ner varje sak i flera delar. Särskilt med detta som är så nytt för mig.
Det har fungerat hittils, men nu är väl "problemet" att jag ska göra en slags dubbelfunktion eller hur jag ska beskriva det.

Spara en position (och jag måste ju veta på nåt sätt att den Gör det).
Sen att programmet kommer ihåg positionen och stannar när den passerar denna.
Blir någon av dom fel är det svårt att veta vilken, blir det ena fel så blir den andra fel också så att säga.

Några förslag om placering av koden? Och vilka kommandon spontant man bör hålla sig till och eventuellt akta sig för?

Om jag gör en funktion som ska spara en position/siffra/nummer från min rotary encoder.
Hur tusan kan jag bekräfta/veta att den är sparad? Och se vad siffran är??
SeniorLemuren
Inlägg: 7779
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Arduino - Spara en position i minnet

Inlägg av SeniorLemuren »

Hur tusan kan jag bekräfta/veta att den är sparad? Och se vad siffran är??
Om du hade besvärat dig att läsa igenom det som jag tidigare länkade till och kollat exemplen så hade du inte behövt ställa frågan.
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Arduino - Spara en position i minnet

Inlägg av fosfor »

SeniorLemuren:
Mmm, det ser ut som att det finns en del att hämta i den koden.
Men för ett nybörjaröga som mig så är det för långt bort att greppa då det där ju rör sig om en temperatursensor.
Och att funktionen är annorlunda.
Jag ska ju inte heller ha något som kollar sensorn konstant, och inte spara konstant.
Jag ska ju bara spara vid knapptryckning, vilket kanske bara blir någongång ibland.
Användarvisningsbild
orvar-e
EF Sponsor
Inlägg: 5957
Blev medlem: 9 mars 2007, 09:01:32
Ort: Borlänge

Re: Arduino - Spara en position i minnet

Inlägg av orvar-e »

Spara vid knapptryckning:
I mitt senaste projekt som sväller och blir bara mer och mer intressant vartefter min fantasi flödar iväg, så använder jag mig av EEPROM för att spara aktuell tid.
Jag håller (fortfarande) på med en motorvärmartimer till bilarna hemma. Man vill ju gärna enkelt kunna ställa in avresetid med minimalt insats, alltid bråttom.

Säg när knappen är 'LOW' så är även en räknare noll, när knappen/funktionen sedan är 'HIGH' räknar en räknare till något bestämt värd och stannar där ex 4 eller nått.
Vid värde 1, 2 och 3 skriver den till 3 olika positioner/adresser, EEPROM.write(addr, val);. Dvs den skriver till bestämd EEPROM adress endast engång, ett cykelvarv per knapptryckning.
Då finns ingen risk att EEPROM blir utslitet.

Så i mitt fall med motorvärmartimern, om jag vill justera avresetiden till framtiden (imorgon) så trycker jag bara på en knapp så läses aktuell tid in.

I ditt fall kanske du har en separat knapp för att spara önskad position, en knapp för att åka dit.
peolah
EF Sponsor
Inlägg: 502
Blev medlem: 22 mars 2010, 02:10:47

Re: Arduino - Spara en position i minnet

Inlägg av peolah »

Precis som man nämnt tidigare i tråden så klarar eeprom bara ett antal skrivningar per cell.

Om man nu skall använda eeprom'et för att skriva kontinuerligt så är iaf en metod jag skulle använda att använda gray-kod/hamming för skrivningar, på det sättet kan du utöka livslängden på eeprom-cellerna betydligt. Denna metod(Gray) används tex i centrallås-fjärrkontroller från tex MicroChip (Keeloq) med skrivningar varenda knapptryckning. Dessutom viktigt att sätta brownout för processorn, vet inte hur man gör i Arduino C++!? Använder själv assembler till ATMega.
Med checksumma i kombination med ovanstående kan man flytta skrivningar till andra celler när de tidigare börjat bli korrupta!

Ett par länkar med information:

https://sv.wikipedia.org/wiki/Graykod
http://ww1.microchip.com/downloads/en/A ... 01449A.pdf
https://gist.github.com/shirish47/d21b896570a8fccbd9c3

Edit : uppdaterat med arduinolänk
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Arduino - Spara en position i minnet

Inlägg av fosfor »

Jag vill verkligen poängtera att jag sannolikt inte kommer slita ut EEPROM minnet i förtid.
Därav att åtgärder för att inte slita på minnet som många i all välmening nämner inte är aktuella, och inte behöver tas upp.
Det rör sig om att spara ETT enda nummer, kanske EN gång i veckan eller mindre, och låta det ligga permanent
i minnet, för att någongång ibland hämtas och tittas på/användas till något. :humm: :shock: :lol:
Tydligen ska minnet klar ca 100.000 skrivningar, så det bör inte vara någon fara alls i detta fall.

Jag har en siffra, låt säga typ 849 (via pulsecount på motorn), som jag vill spara i EEPROM, med en knapptryckning.
Sen vill jag trycka på en annan knapp och se detta nummer på min display.

Någon som har nåt bra tips?
Användarvisningsbild
orvar-e
EF Sponsor
Inlägg: 5957
Blev medlem: 9 mars 2007, 09:01:32
Ort: Borlänge

Re: Arduino - Spara en position i minnet

Inlägg av orvar-e »

Vill du har kod eller, tipset jag gav dig funkar hur bra som helst, och är väldans okomplicerat.

Exempel ur min kod. .... teach_b är en knapp för programmera EEPROM med aktuellt tid.

Kod: Markera allt

  valF_h = EEPROM.read(aF_h);
  valF_m = EEPROM.read(aF_m);
  valF_s = EEPROM.read(aF_s); 

Kod: Markera allt

if (teach_b == HIGH) {
if (teach_b == HIGH) { var_1++; }
if (var_1 >= 1000) { var_1 = 1000; }

if ((hour > 3 & hour < 6 ) & skift == 1) {
if (var_1 == 501) { EEPROM.write(aF_h, hour); }
if (var_1 == 502) { EEPROM.write(aF_m, minute); } 
if (var_1 == 503) { EEPROM.write(aF_s, second); }}

delay(100); }
if (teach_b == LOW) {var_1 = 0; }
Man kan använda en for loop också för att göra samma sak.
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Arduino - Spara en position i minnet

Inlägg av fosfor »

Hej!
Tackar, men denna kod gjorde precis vad jag var ute efter och det fungerar perfekt,
att plocka från minnet siffran/positionen jag sparat.

Kod: Markera allt

{
 {
  val = digitalRead(intest3Pin);         // Knapp 3 - Denna ska spara position i minnet
  if (val == HIGH) {                     // Kollar om knappen är tryckt

EEPROM.put(0,PulseCount);                // Skriver PulseCount numret till minnet, adressen är 0
    lcd.setCursor(0, 1);                 // Dessa två rader skriver till LCD, i detta fall är 0,1 rad 2
    lcd.print(PulseCount);
        delay(750);
            lcd.setCursor(0, 1);           
    lcd.print("Pos Saved!");
        delay(750);
  }     
}
peolah
EF Sponsor
Inlägg: 502
Blev medlem: 22 mars 2010, 02:10:47

Re: Arduino - Spara en position i minnet

Inlägg av peolah »

fosfor skrev:Jag vill verkligen poängtera att jag sannolikt inte kommer slita ut EEPROM minnet i förtid.
Därav att åtgärder för att inte slita på minnet som många i all välmening nämner inte är aktuella, och inte behöver tas upp.
Det rör sig om att spara ETT enda nummer, kanske EN gång i veckan eller mindre, och låta det ligga permanent
i minnet, för att någongång ibland hämtas och tittas på/användas till något. :humm: :shock: :lol:
Tydligen ska minnet klar ca 100.000 skrivningar, så det bör inte vara någon fara alls i detta fall.

Meningen med informationen var inte enbart för dig och ditt projekt som jag inte satt mig in i, ledsen för too much info då..
Användarvisningsbild
jesse
Inlägg: 9233
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Arduino - Spara en position i minnet

Inlägg av jesse »

Men är det inte så att i AVR så sker först radering av en byte i EEPROM innan den skrivs över med ett nytt värde.
I så fall spelar det kanske ingen roll om du räknar från 0 till 255 eller om du kör gray-kod: alla bitar sätts till FF och sedan programmeras nya in.

i AVR-biblioteket avr/eeprom.h finns därför två (sorters) funktioner för att skriva i eeprom med som heter eeprom_write_byte() / eeprom_write_word() och en annan som heter eeprom_update_byte() / eeprom_update_word()..... De senare fungerar så att de först läser en byte från eeprom för att jämföra med det som ska skrivas - är det samma så görs inget mer, vilket är ett sätt att spara tid och inte slita så mycket på eepromet. Hade det varit så att minnet raderades och skrevs bitvis och att man manuellt behövde radera eepromet innan skrivning så kanske metoden med gray-kod kunnat appliceras och fungera bättre.
peolah skrev:Precis som man nämnt tidigare i tråden så klarar eeprom bara ett antal skrivningar per cell.

Om man nu skall använda eeprom'et för att skriva kontinuerligt så är iaf en metod jag skulle använda att använda gray-kod/hamming för skrivningar, på det sättet kan du utöka livslängden på eeprom-cellerna betydligt. Denna metod(Gray) används tex i centrallås-fjärrkontroller från tex MicroChip (Keeloq) med skrivningar varenda knapptryckning. Dessutom viktigt att sätta brownout för processorn, vet inte hur man gör i Arduino C++!? Använder själv assembler till ATMega.
Med checksumma i kombination med ovanstående kan man flytta skrivningar till andra celler när de tidigare börjat bli korrupta!

Ett par länkar med information:

https://sv.wikipedia.org/wiki/Graykod
http://ww1.microchip.com/downloads/en/A ... 01449A.pdf
https://gist.github.com/shirish47/d21b896570a8fccbd9c3

Edit : uppdaterat med arduinolänk
Skriv svar