Sida 1 av 2
Spara mer siffror på Arduino
Postat: 15 april 2019, 11:34:55
av fosfor
Jag har en motor med rotary encoder som kan spara en position som den stannar vid.
Det fungerar bra. Men jag kom på att jag skulle vilja kunna spara ytterligare en position med en ny knapp.
Så att den stannar vid Två ställen istället för bara en.
Pulserna i storlek på siffror blir aldrig mer än 2000+ eller 2000-.
Är det något särskilt man bör tänka på här?
Denna "bank" ligger på adress 0, kan man bara skapa en ny på adress 1?
Just det här med minnes-sparning på Arduino är något som får mig extra förvirrad utöver det vanliga.
Kod: Markera allt
#include <EEPROM.h> // ligger längre upp i koden
// -------- SPARAR POSITION TILL EEPROM ----
{
val = digitalRead(PositionSavePin); // Knapp som sparar position
if (val == HIGH) { // Kollar om knappen är tryckt
UserStopPulseCount = PulseCount;
EEPROM.put(0, UserStopPulseCount); // Skriver PulseCount numret till minnet, adressen är 0
EEPROM.put(4, UserStopPulseCount+1); // Was is dat? Minne nr 2?
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");
Serial.println("Saving position to memory");
delay(750);
}
}
// -------- RADERAR positionen från minnet/EEPROM --------
{
val = digitalRead(PositionErasePin); // Knapp som raderar minnet
if (val == HIGH) { // Kollar om knappen är tryckt
UserStopPulseCount = -999; // Sätt denna utanför området som masten kan nå, var tidigare 0
EEPROM.put(0, UserStopPulseCount); //
lcd.setCursor(0, 1); // Dessa två rader skriver till LCD, i detta fall är 0, 1 rad 2 på skärmen
lcd.print("Pos. erased");
Serial.println("Erasing position from memory");
delay(1000);
}
}
Re: Spara mer siffror på Arduino
Postat: 15 april 2019, 11:48:57
av HUGGBÄVERN
Re: Spara mer siffror på Arduino
Postat: 15 april 2019, 11:58:24
av fosfor
Huggbävern:
Hm, ok. Men jag har ju tänkt så att det är bättre att dela upp problemen och göra separata trådar om det.
Problemet tråden handlat om har till slut blivit löst på ett eller annat sätt.
Och så startar jag en ny tråd när jag springer in i ett nytt problem.
Jag tänker att det blir lättare överskådligt så, då problemen hålls separata.
Och även lättare för framtida läsare som har samma/liknande problem dels att hitta tråden (via rubriken) samt att
det då inte blir så fruktansvärt mycket text/sidor för dom att skumma igenom till det dom behöver.
Jag brukar ju lägga in den kod som blivit lösningen i slutet av tråden. Så får det problemet ett ordentligt avslut så att säga.
Om alla mina trådar varit i en och samma hade det ju blivit jättejättemånga sidor.
För att inte tala om att rubriken som jag haft från början inte hade överenstämt alls med vart man är i slutet av tråden.
Bara för att förklara hur jag tänkt.

Re: Spara mer siffror på Arduino
Postat: 15 april 2019, 12:08:45
av sodjan
> För att inte tala om att rubriken som jag haft från början inte hade överenstämt alls med vart man är i slutet av tråden.
Du kan enkelt justera lite i rubriken genom första inlägget.
Behåll en inledande del och lägg till än del som är mer aktuell.
Din fråga handlar väl helt enkelt om att skriva och läsa en 16-bit integer till/från EEPROM?
Se om dessa löser det:
https://www.arduino.cc/en/Reference/EEPROMPut
https://www.arduino.cc/en/Reference/EEPROMGet
https://www.arduino.cc/en/Reference/EEPROM
Re: Spara mer siffror på Arduino
Postat: 15 april 2019, 13:58:01
av svanted
forum är ofta dubbelsriktade, dels att TS vill få hjälp med problem,
och
att forum-medlemmarna vill läsa om intressanta trådar,
och få tips och idéer om egna projekt,
Re: Spara mer siffror på Arduino
Postat: 15 april 2019, 14:16:37
av jesse
EEPROMet har ju en massa bytes.. Jag vet inte vad som sitter i en Arduino, men jag kan gissa kanske 256 bytes. För att adressera en byte så skriver man bara ett nummer mellan 0 och 255. Du har alltså 256 olika 8-bitars "minnen".
Vad har
UserStopPulseCount för format? Det är väl float antar jag? En float tar upp fyra bytes, så när du skriver ett float till adress 0 så kommer du automatiskt att använda fyra positioner i minnet: 0, 1, 2 och 3. Så nästa lediga position blir alltså 4. Det är därför man använder funktionen sizeof() i exemplet för EEPROMPut():
Kod: Markera allt
eeAddress += sizeof(float); //Move address to the next byte after float 'f'.
Om EEPROMET innehåller 256 bytes (jag gissar bara) så innebär det att du skulle kunna lagra 64 tal av typen float.
(Du borde använda typen int när du räknar heltal men det verkar som att de flesta funktioner i Arduino är gjorda för float?)
Re: Spara mer siffror på Arduino
Postat: 15 april 2019, 14:17:23
av adent
Men för att svara på din fråga.
Eeprom är inget konstigt. Ibland är det en separat krets med i2c-interface och ibland finns det inbyggt i processorn.
I fallet med arduino (Atmel ATmega iaf) finns det inbyggt i processorn. Dess lagringsutrymme är helt enkelt ett gäng bytes.
I fallet med ATMega328P har den 1024 bytes eeprom. Detta skrivs och läses på ett visst sätt, men med arduino och annat behöver
man inte bry sig så mycket om hur.
Det enda du behöver ha koll på är var du väljer att skriva vad, det är helt upp till dig själv.
Ta exempel följande:
uint32_t foo;
foo = 42;
EEPROM.put(0, foo);
Detta kommer skriva ner innehållet i variabeln foo på adress 0 i eeprom. Men eftersom foo är en uint32 och därmed tar upp 4 bytes så kommer nu adresserna 0,1,2 samt 3 att vara upptagna.
Vill du skriva något annat i eeprom är det en mycket bra ide att skriva det på adress 4 nästa gång (t.ex. adress 43 funkar ju också förstås, det är ledigt, men kanske lite onödigt att strössla så).
Hur vet man då detta? jo sizeof(foo) ger 4.
Antingen har man koll på detta själv och vet att foo är 4 bytes och skriver t.ex.
eeprom.put(0, foo);
...
eeprom.get(0, foo);
samt:
eeprum.put(4, annan-variabel);
...
eeprum.get(4, annan-variabel);
Eller så gör man nått intrikat med sizeof() och eller #defines. I ditt fall var det int tror jag? De är väl 2 bytes, inte 4 på en ATmega328. men en sizeof(int) ger annars svaret.
MVH: Mikael
Re: Spara mer siffror på Arduino
Postat: 15 april 2019, 14:21:12
av Mr Andersson
Jag förstår tanken att dela upp problemen i flera trådar, men jag tycker tvärt emot att det blir mindre överskådligt.
Nu måste man leta och läsa flera olika trådar bara för att se vad som redan sagts tidigare.
Men ett litet tips kan ju vara att spara antalet positioner på första adressen. Hur vet du annars om positionen du läser verkligen ska vara med eller om det är skräpdata?
Re: Spara mer siffror på Arduino
Postat: 15 april 2019, 16:11:12
av fosfor
Mr Andersson:
Så jag kan spara två positioner på en och samma adress?!

Re: Spara mer siffror på Arduino
Postat: 15 april 2019, 16:16:26
av sodjan
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.
Re: Spara mer siffror på Arduino
Postat: 15 april 2019, 16:21:18
av fosfor
I nuläget så kan jag spara en position med knapp 1, som tidigare & som vanligt, och radera den.
Jag kan även spara en ny position med ny knapp 2.
Men det som händer nu är att denna bara skriver över gamla positionen. Så det blir precis som att jag trycker knapp 1.
Det verkar som att knapp 2 skickar sitt nummer (position) till samma del av minnet som knapp 1 gör.
Så motorn stannar vid den senast trycka position, fast jag skulle vilja att den stannar vid båda positioner som är trycka av knapp 1 och knapp 2.
Trycker jag raderaknappen så raderas det, också precis som vanligt.
Men det verkar alltså som att det inte sparas separat, utan på samma plats i minnet.
Kanske värt att nämna att det är Arduino Mega jag kör med Atmega 2560 som ska ha 4096 bytes.
Här är koden ang. minnet som den ser ut i skrivande stund.
Kod: Markera allt
#include <EEPROM.h> // Denna aktiverar EEPROM minnet
int sensor01; // Integer är din primära datatyp för nummersparning
int sensor02;
int stepOld;
int step;
int okgo = 0;
long PulseCount; // Long är förlängda storleks variabler för sparning av nummer. 32 bits (4 bytes).
long UserStopPulseCount; // Denna ser till att räkningen är stadig
int PositionSavePin = 10; // KNAPP SPARAR POSITION
int PositionErasePin = 11; // KNAPP TAR BORT SPARAD POSITION
// -------- Dessa används för sparning i EEPROM ---------
float f = 0.00f; //Variable to store data read from EEPROM. F är namnet 0.00f är värdet minnet // FUNGERAR
float e = 0.00f; //Variable to store data read from EEPROM. E är namnet 0.00f är värdet minnet // OBS! Denna är experimentiell för minne position 2
int eeAddress = 0; //EEPROM address to start reading from
PulseCount = 0;
EEPROM.get(0, UserStopPulseCount); // Denna håller koll på räkning och radering av pulser. Adressen är 0.
// -------- SPARAR POSITION 1 TILL EEPROM ----
{
val = digitalRead(PositionSavePin); // Knapp som sparar position
if (val == HIGH) { // Kollar om knappen är tryckt
UserStopPulseCount = PulseCount;
EEPROM.put(0, UserStopPulseCount); // Skriver PulseCount numret till minnet, adressen är 0
EEPROM.put(4, UserStopPulseCount+1); // Was is dat? Minne nr 2?
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");
Serial.println("Saving position to memory");
delay(750);
}
}
// -------- SPARA POSITION 2 TILL EEPROM ---- EXPERIMENTIELL!
// OBS - Melodi 2 borta - Function2Pin
{
val = digitalRead(Function2Pin); // Knapp som sparar position
if (val == HIGH) { // Kollar om knappen är tryckt
UserStopPulseCount = PulseCount;
EEPROM.put(8, UserStopPulseCount); // Skriver PulseCount numret till minnet, adressen är 8
EEPROM.put(12, UserStopPulseCount+1); //
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("Pos2. SAVED");
Serial.println("Saving position 2 to memory");
delay(750);
}
}
// -------- RADERAR positionen från minnet/EEPROM --------
{
val = digitalRead(PositionErasePin); // Knapp som raderar minnet
if (val == HIGH) { // Kollar om knappen är tryckt
UserStopPulseCount = -999; // Sätt denna utanför området som masten kan nå, var tidigare 0
EEPROM.put(0, UserStopPulseCount); //
lcd.setCursor(0, 1); // Dessa två rader skriver till LCD, i detta fall är 0, 1 rad 2 på skärmen
lcd.print("Pos. erased");
Serial.println("Erasing position from memory");
delay(1000);
}
}
Re: Spara mer siffror på Arduino
Postat: 15 april 2019, 16:28:44
av sodjan
> Det verkar som att knapp 2 skickar sitt nummer (position) till samma del av minnet som knapp 1 gör.
Vadå "verkar" !?
Det bör ju spara det på exakt den position som din (den är väl din?) kod ber om...
Re: Spara mer siffror på Arduino
Postat: 15 april 2019, 16:33:34
av svanted
eller att du läser av fel?
dessutom ska man alltid ha med "debounce" när man läser av knappar,
annars blir det konstigheter.
om man nu inte gjort det analogt?
Re: Spara mer siffror på Arduino
Postat: 15 april 2019, 16:35:36
av fosfor
sodjan skrev:> Det verkar som att knapp 2 skickar sitt nummer (position) till samma del av minnet som knapp 1 gör.
Vadå "verkar" !?
Det bör ju spara det på exakt den position som din (den är väl din?) kod ber om...
Men sparar den inte över knapp 1 positionen då om jag sparar den på samma plats?
Jag tänker att jag vill spara två positioner på varsin del av minnet.
Det är två olika positioner/nummer som ska sparas.
Re: Spara mer siffror på Arduino
Postat: 15 april 2019, 16:36:32
av fosfor
svanted skrev:eller att du läser av fel?
dessutom ska man alltid ha med "debounce" när man läser av knappar,
annars blir det konstigheter.
om man nu inte gjort det analogt?
Hej!
Debounce är inte ett problem längre. Minns att jag hade det där problemet tidigt i detta lilla projekt.
Någon form av lösning sattes in och sen återkom aldrig problemet. Minns dock inte vad det var som gjordes åt det.