Spara nr/position innan Arduino stänger ner

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Spara nr/position innan Arduino stänger ner

Inlägg av fosfor »

Hej!

Jag har en simpel liten anordning/typ hiss som kan spara ett par positioner som den kan stanna vid.
Rotaryencoder på motorn, en typ H-brygga med lite intelligens och Arduino MEGA.

Tidigare har pulsräkningen alltid börjat om på Noll när man startat om maskinen, då den inte haft något
som sparar positionen den är i för tillfället. Man vill ej heller ha i koden att den alltid sparar sin ursprungsposition
då ju det kommer slita onödigt på minnet. Den behöver bara spara detta varje gång den stängs av eller går i viloläge.
Om den alltid startar på noll, så tappar den bort alla sina sparade positioner, eller de hamnar fel. :humm:

I nuläget så har jag en knapp inkopplad, så strax innan jag slår av strömmen trycker jag på den knappen, och
då sparas positionen den är i så att den vaknar på samma position när jag slår på maskinen igen.
Då hamnar alla mina olika (3 st) sparade planpositioner rätt :bravo:

Frågan är hur skulle ni rekommendera att jag löser detta?
Jag har haft lite olika idéer, alltifrån att något sitter på onoff knappen, så när man vrider den så håller ett par kondingar igång Arduinon en kort stund
så den hinner spara sin position. Men tanken är framöver att jag ska slippa använda on off knapp/ratt, utan istället maskinen bara ska gå ner i viloläge efter en stund. Så då kanske man kan ha något som slår på i koden innan den går in i vilolägeskod (efter en viss tid) så att den sparar sin position på så vis?

Vad tror ni? :shock:
Senast redigerad av fosfor 2 maj 2019, 17:00:58, redigerad totalt 3 gånger.
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Spara nr/position innan Arduino stänger ner

Inlägg av johano »

Hur ofta körs bordet upp/ner?
Om det inte är *så* ofta så kan du väl skriva positionen varje gång motorn stannar?
EEPROM ska ju tåla 100.000 skrivningar, så kör du 10gånger om dagen (varje dag) så räcker det i 27år...

Om du sen inte utnyttjar hela EEPROM-arean så skulle du ju kunna lagra minnesplatsen (initialt till 1) på position 0 i EEPROM,
och sen när du skrivit nära 100.000 gånger så byter du positionen till 2 osv.

Då Arduino MEGA har 512bytes EEPROM och om det är en 4-byte's long du lagrar så har du då 512/4 - 2 (för själva "minnesplats-minnet") = 126 x 100.000 = 12,6 miljoner skrivningar på dig innan det är slut...
Och kör du då bordet 1000gånger om dagen, varje dag, så räcker det i 34år

Edit: Ah, du måste ju också lagra _antalet_ skrivningar också så då går det åt 4-bytes till, så det räcker bara i 17år med 1000körningar per dag...

Finns många trix att ta till... :)

/johan
Nerre
Inlägg: 26700
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Spara nr/position innan Arduino stänger ner

Inlägg av Nerre »

Jag har inte så bra koll på hur Arduino funkar, men det normala är väl en "ganska stor" ellyt på matningen och sen en brown out interrupt som sparar ner vid strömavbrott.

Men det går kanske inte att få till det på Arduinon?
SeniorLemuren
Inlägg: 7805
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Spara nr/position innan Arduino stänger ner

Inlägg av SeniorLemuren »

Detta verkar vara precis det som du höll på med för ungefär ett år sedan i denna tråd. Ursäkta om jag har fel.
Precis som johano skriver så behöver du nog inte bekymra dig om att slita ut minnet de närmaste åren, eller vad är det som ändrat sig sen senast där du ju själv konstaterar att minnet inte kommer att slitas ut eftersom maskinen inte kommer att användas så mycket? Försök att undvika att hela tiden skapa nya trådar som rör samma projekt. Det blir enklare att svara på dina frågor om man kan få hela bakgrunden i samma tråd. Tror någon har informerat dig om detta tidigare.
snigelen
Inlägg: 815
Blev medlem: 8 maj 2009, 11:02:14
Ort: Lund

Re: Spara nr/position innan Arduino stänger ner

Inlägg av snigelen »

- Med en hemlägesbrytare behöver du inte spara något, kör en "homing sequence" vid uppstart bara. (Så vet du var den är, men inte var den var förståss. Eller jo, det går nog att räkna ut).

- Låt AVR'en slå på och av maskinen med någon slags relä, så kan den rulla vidare, eventuellt i strömsparläge, och vänta på nästa uppstart. Kräver förståss att spänningen till AVR'en inte bryts.

- Använde ett "NVSRAM", dvs SRAM som automatiskt slår över till batteribackup om matningsspänningen blir för låg. Skriv hur ofta du vill. T.ex med Microchip 23LCV512 får du 64 kilobyte för 16 spänn från Mouser. Drar en mikro-ampere vid batterimatning.

- Behöver du RTC som rullar vidare på batteri när matningen är avstängd så finns en del som har något hekto-byte sram.

...
Mr Andersson
Inlägg: 1397
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Spara nr/position innan Arduino stänger ner

Inlägg av Mr Andersson »

Använd en absolutencoder med lämplig upplösning istället. Även om du sparar position vid avstängning är du ju rökt om någon flyttar på hissen när arduinon är av.
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Spara nr/position innan Arduino stänger ner

Inlägg av fosfor »

En ny tanke slog mig.
Jag tänkte ju senare lägga in kod så att Arduinon går ner i ett energisparläge efter en stund, när den inte används.
Senare väckas upp via någon av interrupt i/o.
Om då hyllan ligger på en viss position, så "minns" den väl denna när den startar upp igen? Eftersom den aldrig var helt död tänker jag.
Eller körs sketchen om och Arduinon "bootar" om från början när man väcker upp den? Så att den endå börjar om på position noll?
Någon som vet? :)

Om inte annat så tror jag att en kodsnutt som spar vart-den-är-positionen som körs i samband med
att den går ner i viloläge. På så vis så kommer den bara spara ibland och definitivt aldrig kunna slita ut minnet.
I nuläget KAN jag lägga in en kodsnutt som spar positionen varje gång den kör upp eller ner, men detta kan komma att slita
ut minnet efter bara ett par år. :shock:

Vidare. Är det 100k skrivningar per minnescell även för udda Arduino varianter såsom min?
Dvs Arduino Mega (senare kallad Arduino 2560)?
Är dessa 100k lågt räknad? Ibland är det ju så att de håller mycket längre än vad de är specade till.
:humm:


Mr Andersson: Det skulle kunna hända, men jag tror det är osannolikt. Och att det händer så sällan att det inte kommer vara ett problem. Alltså att hyllan flyttas när maskinen är avstängd. Hyllan sitter dessutom fast rätt hårt och är svår att flytta på för hand.

snigelen: Hemlägesbrytare har övervägts, men då måste en sådan byggas in, samt att man måste åka till den varje gång man startar upp maskinen.
Undviks gärna om jag kan det. Men ja ett batteristöttat minne kanske vore något! Då skulle man ju kunna spara och spara utan att bry sig om skrivningar.

SeniorLemuren: Ja herregud, att det gått så mycket tid redan, och hade helt glömt att jag skapat ett snarlikt inlägg tidigare :-O

Nerre: Hur menar du?

Johano: Kan man få den att växla mellan fler banker än en? Så att den sparar på t.ex. tre olika platser? För att sprida ut minnesslitaget.
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Spara nr/position innan Arduino stänger ner

Inlägg av johano »

ja typ.
du kan tex använda de första två byten i eeprom för att lagra vilken "plats" som används för tillfället.
Tillsammans med ditt sparade värde i "platsen" spar du också en räknare som håller reda på hur många skrivningar du gjort. När du sen når ett tröskelvärde, säg 100000, så byter du helt enkelt plats till nästkommande och skriver ner den nya platsen i de första två byten av minnet. ( så du vet vilken plats som är aktuell vid nästa läsning/skrivning).
SeniorLemuren
Inlägg: 7805
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Spara nr/position innan Arduino stänger ner

Inlägg av SeniorLemuren »

fosfor skrev: Johano: Kan man få den att växla mellan fler banker än en? Så att den sparar på t.ex. tre olika platser? För att sprida ut minnesslitaget.
Läser du inte igenom de svar du får? Denna fråga har johano redan besvarat några inlägg tidigare. Han räknade även ut att:
Och kör du då bordet 1000gånger om dagen, varje dag, så räcker det i 34år
Användarvisningsbild
Icecap
Inlägg: 26139
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Spara nr/position innan Arduino stänger ner

Inlägg av Icecap »

Att spara vilken position man sparar i kostar en skrivning i indexeringen varje gång - alltså är det helt onödigt att göra så, indexeringen kommer alltså att paja först.

En lösning kan vara att koppla in ett FRAM minne (som en extern EEPROM), det kan skrivas i all evighet.
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Spara nr/position innan Arduino stänger ner

Inlägg av johano »

Du behöver ju bara skriva "plats-indexet" var 100000:e gång (då du byter till en ny plats).
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Re: Spara nr/position innan Arduino stänger ner

Inlägg av Micke_s »

Alternativ till det interna eeprom:et kan vara fram-minne. De brukar ha 10^12 skrivningar eller mer..
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4694
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: Spara nr/position innan Arduino stänger ner

Inlägg av Swech »

Det som sliter är att ändra fram och tillbaks från 0 och 1 på varje position.
En minnscell är fylld med "1" då den är raderad.
Man kan därför bränna in en och en "0"a i minnet utan att slita mer på den
Cellen får då 8x livslängd men kan å andra sidan endast innehålla index 0-7 (räkna antal 0 i byten)

Swech
Användarvisningsbild
Icecap
Inlägg: 26139
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Spara nr/position innan Arduino stänger ner

Inlägg av Icecap »

johano: hur vet man då hur många skrivningar det var?
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Spara nr/position innan Arduino stänger ner

Inlägg av johano »

_Antalet_ skrivningar sparas tillsammans med det värde man vill spara och flyttas till en ny plats var 100000:e skrivning (och nollställs naturligtvis då).
_Indexet_ över vilken plats som för tillfället gäller skrivs alltid till samma plats (2bytes, förslagsvis på första och andra plats) och behöver bara skrivas var 100000:e gång.

En läjjaut skulle kunna se ut såhär:
layout.png
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Skriv svar