Spara mer siffror på Arduino

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:

Spara mer siffror på Arduino

Inlägg 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);
    }
  }
Användarvisningsbild
HUGGBÄVERN
Tidigare soundbrigade
Inlägg: 32627
Blev medlem: 23 augusti 2006, 22:44:11
Ort: Lilla Paris
Kontakt:

Re: Spara mer siffror på Arduino

Inlägg av HUGGBÄVERN »

Du har nog fått ganska mycket hjälp med ditt problem (din Arduino+encoder+motor), för det är ju ett projekt som i sig skapar flera problem. Men jag tror att du skulle bemötts med oändligt mer respekt och tålamod om du hållit dig till EN tråd och inte skapat nya trådar för varje nytt problem i ditt projekt, du stöter på.
Du är väl upp i 15 trådar drygt som beskriver detta enda projekt, och det kan man ju delvis se som lite respektlöst mot forumets medlemmar som plötsligt har att knyta ihop alla trådar för att se helheten och hitta lösningar till ditt problem.

Så här ser det ut igår:
https://elektronikforumet.com/forum/vie ... =7&t=94708
https://elektronikforumet.com/forum/vie ... 43&t=94647
https://elektronikforumet.com/forum/vie ... 43&t=94582
https://elektronikforumet.com/forum/vie ... =2&t=94432
https://elektronikforumet.com/forum/vie ... =6&t=94383
https://elektronikforumet.com/forum/vie ... =7&t=94340
https://elektronikforumet.com/forum/vie ... =6&t=94273
https://elektronikforumet.com/forum/vie ... =6&t=94068
https://elektronikforumet.com/forum/vie ... =5&t=93966
https://elektronikforumet.com/forum/vie ... =7&t=93893
https://elektronikforumet.com/forum/vie ... =7&t=93838
https://elektronikforumet.com/forum/vie ... =5&t=93516
https://elektronikforumet.com/forum/vie ... =5&t=92921
https://elektronikforumet.com/forum/vie ... 43&t=91547
https://elektronikforumet.com/forum/vie ... 43&t=91487


I all välmening
HUGGBÄVERN
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Spara mer siffror på Arduino

Inlägg 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. :roll:
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43148
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Spara mer siffror på Arduino

Inlägg 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
svanted
Inlägg: 5082
Blev medlem: 30 augusti 2010, 21:20:38
Ort: Umeå

Re: Spara mer siffror på Arduino

Inlägg 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,
Användarvisningsbild
jesse
Inlägg: 9233
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Spara mer siffror på Arduino

Inlägg 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?)
Senast redigerad av jesse 15 april 2019, 14:19:18, redigerad totalt 1 gång.
Användarvisningsbild
adent
Inlägg: 4094
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

Re: Spara mer siffror på Arduino

Inlägg 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
Mr Andersson
Inlägg: 1394
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Spara mer siffror på Arduino

Inlägg 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?
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Spara mer siffror på Arduino

Inlägg av fosfor »

Mr Andersson:
Så jag kan spara två positioner på en och samma adress?! :shock:
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43148
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Spara mer siffror på Arduino

Inlägg 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.
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Spara mer siffror på Arduino

Inlägg 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.
:humm:

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);
    }
  }

Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43148
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Spara mer siffror på Arduino

Inlägg 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...
svanted
Inlägg: 5082
Blev medlem: 30 augusti 2010, 21:20:38
Ort: Umeå

Re: Spara mer siffror på Arduino

Inlägg 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?
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Spara mer siffror på Arduino

Inlägg 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.
Användarvisningsbild
fosfor
Inlägg: 453
Blev medlem: 13 februari 2013, 05:43:15
Kontakt:

Re: Spara mer siffror på Arduino

Inlägg 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.
Skriv svar