UNO att minnas vad siffran var senast?

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:

UNO att minnas vad siffran var senast?

Inlägg av fosfor »

Hej!

Har med mycket möda, besvär, trial n error och med hjälp från Er här på forumet fått ihop en kod som fungerar som planerat. Mycket trevligt!
Kom dock i glädjeruset på att en viktig funktion har helt förbisetts, nämligen att maskinen måste kunna minnas vilken position
den var på när den stängdes av.

Jag har alltså en lift som kan åka upp, och ner. Man kan spara en egen nivå-position och radera den nivå-positionen. Den har LCD som visar lite
kul meddelanden och den har lite sensorer som gör att den stannar i båda ändlägena, för att inte åka för långt. Plus H-brygga till motorn.
Problemet är ju nu att eftersom att maskinen inte "minns" sin senaste position som den stod på vid avstängning så börjar alltid pulsräknaren om på noll när man slår av och på den. Så att den sparade positionen riskerar hamna någon helt annanstans i sitt läge.

Så det jag undrar är hur jag ska kunna spara dess pulsräkning/position, så att den varje gång den står still på en position sparas, och att denna
position sedan är den som maskinen startar med när man sätter på den igen.
Jag vill alltså att den automatiskt ska spara vart motorn är någonstans, så att den sen minns detta vid påslag igen, och inte som nu börja om på
noll oavsett vart den är någonstans.

Jag har den programmerbara nivå-positionen sparad i float f = 00.0f. Så om jag skapar en ny float med bokstaven e,
och lägger in kommandorad vid varje åka upp och åka ner funktion att den ska spara positionen den stannar på, är jag något på spåren då?
Kan det eventuellt bli någon krock med nivå-positionsminnet?

Update 2018-04-23:
Vill poängtera att maskinen används väldigt lite, så att minnet kommer slitas ut pga skrivningar ser jag som väldigt osannolikt.
Så att den skriver till en intern eeprom är helt ok :tumupp:

Här är koden som den är just nu:

Kod: Markera allt

//  ---- MOTOR CONST INTARNA  - DESSA GÅR TILL H-BRYGGAN ----
const int controlPin1 = 7;
const int controlPin2 = 6;
const int enablePin = 9;


#include <Wire.h>                   // Tillåter I2C kommunikation - Pins A4 (SDA), A5 (SCL)
#include <LiquidCrystal_I2C.h>      // Denna aktiverar LCD
#include <EEPROM.h>                 // Denna aktiverar EEPROM minnet



// ---- Dessa används för sparning i EEPROM - 2018-04-16 ---------------------
struct MyObject{
  float field1;
  byte field2;
  char name[10];
};


// DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN
char lineText[] = "  Hoy! Denna text syns ingenstans.  ";

// ---- VARIABLER
// exempel:   int pin = 13      int är typ av variabeln ~ pin är namnet ~ namnets värde är 13
// Senare i programmet kan man hänvisa till denna variabel med namnet, då kommer dess värde letas upp och användas


int sensor01;
int sensor02;
int stepOld;
int step;
long PulseCount;
long UserStopPulseCount;    // --- Denna ser till att räkningen är stadig


// ---- MOTOR TEST INT - VARIABLER ---------------------------------------------------------------------------------
int intest1Pin = 4;        // KNAPP 1   -  Kabel GRÅ    - Går åt plus hållet    - UPP
int intest2Pin = 5;        // KNAPP 2   -  Kabel GRÖN   - Går åt minus hållet   - NER
int intest3Pin = 10;       // KNAPP 3   -  Kabel SVART  - SPARA POSITION        - Minnet SPARA
int intest4Pin = 11;       // KNAPP 4   -  Kabel BLÅ    - VISA SPARAD POSITION  - Minnet RADERA
int stopsensor1Pin = 12;   // SENSOR 1  -  Kabel GRÖN   - Enskild sensor - STOPPAR NER
int stopsensor2Pin = 8;    // SENSOR 2  -  Kabel GRÅ    - Enskild sensor - STOPPAR UPP
int stopsensor3Pin = 15;   // SENSOR 3  -  Kabel ROSA   - Enskild sensor - TOTALSTOPP
int val = 0;
int tonePin = 13;          // --- BEEPER ---


// ---- Dessa används för sparning i EEPROM - 2018-04-16 ---------------------
  float f = 0.00f;        //Variable to store data read from EEPROM.
  int eeAddress = 0;      //EEPROM address to start reading from


// I2C - DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN - initialize the library with the numbers of the interface pins
// 0x27 adressen hittades via I2C scanner på den med svart tejp - De andra hade 0x3F
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
// Aktivera denna rad, och av-avaktivera den ovanför, om någon av de andra I2C displayerna ska användas
// LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);


// DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN
#define SENSOR_A 3
#define SENSOR_B 2

void checkState()
{
  sensor01 = digitalRead(SENSOR_A);
  sensor02 = digitalRead(SENSOR_B);

  if (sensor01 == 1 && sensor02 == 1) {
    step = 0;
    if (stepOld == 1) {
      PulseCount--;
    }
    if (stepOld == 3) {
      PulseCount++;
    }
    stepOld = 0;
  }

  if (sensor01 == 0 && sensor02 == 1) {
    step = 1;
    if (stepOld == 2) {
      PulseCount--;
    }
    if (stepOld == 0) {
      PulseCount++;
    }
    stepOld = 1;
  }

  if (sensor01 == 0 && sensor02 == 0) {
    step = 2;
    if (stepOld == 3) {
      PulseCount--;
    }
    if (stepOld == 1) {
      PulseCount++;
    }
    stepOld = 2;
  }

  if (sensor01 == 1 && sensor02 == 0) {
    step = 3;
    if (stepOld == 0) {
      PulseCount--;
    }
    if (stepOld == 2) {
      PulseCount++;
    }
    stepOld = 3;
  }
}


// VOID SETUP - KÖRS BARA EN GÅNG I BÖRJAN, EN FÖRBEREDELSE, LOOP ÄR EXEKVERING OCH GÖR DET MESTA JOBBET
// DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN

void setup()
{
  Serial.begin(9600);
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.setCursor(0, 0);
  lcd.print("                ");
  lcd.setCursor(0, 1);
  lcd.print("                ");

  attachInterrupt(0, checkState, CHANGE);
  attachInterrupt(1, checkState, CHANGE);

  PulseCount = 0;

  EEPROM.get(0, UserStopPulseCount);    // Denna håller koll på räkning och radering av pulser


  // TEST MOTOR  - VOID SETUP ---------------------------------------------------------------------------------
  pinMode(intest1Pin, INPUT);         //Declarar denna som input  UNO input är 4    Knapp 1   Grå     UPP
  pinMode(intest2Pin, INPUT);         //Declarar denna som input  UNO input är 5    Knapp 2   Grön    NER
  pinMode(intest3Pin, INPUT);         //Declarar denna som input  UNO input är 10   Knapp 3   Svart   SPARA POSITION
  pinMode(intest4Pin, INPUT);         //Declarar denna som input  UNO input är 11   Knapp 4   Blå     TA BORT POSITION

  pinMode(stopsensor1Pin, INPUT);     //Declarar denna som input  UNO input är 12             Grön
  pinMode(stopsensor2Pin, INPUT);     //Declarar denna som input  UNO input är 8              Grå
  pinMode(stopsensor3Pin, INPUT);     //Declarar denna som input  UNO input är 15 (A1)        Rosa
  
  pinMode(tonePin, OUTPUT);           // Högtalare


  //  ---- LCD start presentationen
  {

    lcd.setCursor(2, 0);
    lcd.print("PROTOTYPE");
    Serial.println("Boot initialized");
    delay(500);
    // lcd.clear();

    lcd.setCursor(11, 1);
    lcd.print("9");
    delay(100);

    lcd.setCursor(11, 1);
    lcd.print("90");
    delay(100);

    lcd.setCursor(11, 1);
    lcd.print("90E");
    delay(900);
    lcd.clear();

    lcd.setCursor(2, 0);
    lcd.print("Prototype 1.0");
    delay(200);

    lcd.setCursor(0, 1);
    lcd.print("www.");
    delay(100);

    lcd.setCursor(12, 1);
    lcd.print(".se");
    delay(100);

    lcd.setCursor(0, 1);
    lcd.print("www.PROTOTYPE.se");
    delay(250);

    lcd.setCursor(0, 1);
    lcd.print("www.PROTOTYPE.se");
    Serial.println("Unit is active");

    delay(800);
    lcd.clear();

  }
}



void loop()

{
  // DESSA TILLHÖR GRAFIK O PULSRÄKNINGEN
  // LCD set the cursor to column 0, line 1 (note: line 1 is the second row, since counting begins with 0):

  lcd.setCursor(0, 0);

  lcd.print("Pulses:");
  if (PulseCount > -1) {
    lcd.print(" ");
  }

  if (PulseCount < 10 && PulseCount > -10) {
    lcd.print(" ");
  }

  if (PulseCount < 100 && PulseCount > -100) {
    lcd.print(" ");
  }

  lcd.print(PulseCount);
  if (sensor01 == 1) {
    lcd.print(" HIGH");
  }
  else {
    lcd.print(" LOW ");
  }

  lcd.setCursor(0, 1);

  if (sensor02 == 1) {
    lcd.print("            HIGH");
  }
  else {
    lcd.print("            LOW ");
  }


  // -- INTEST PIN 3 - SPARAR
  // -- SPARAR POSITION TILL EEPROM - FUNGERAR! -----------
  // -- Denna använder knapp 3 på breadboard
  
  {
    val = digitalRead(intest3Pin);         // Knapp 3 - Denna ska spara position i minnet
    if (val == HIGH) {                     // Kollar om knappen är tryckt
      UserStopPulseCount = PulseCount;
      EEPROM.put(0, UserStopPulseCount);           // 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");
      Serial.println("Saving liftposition to memory");
      delay(750);
    }
  }


  // -- INTEST PIN 4 - RADERAR
  // -- Denna ska radera positionen som finns i EEPROM minnet
  // -- Den fungerar inte riktigt - Den tar bort nuvarande position, men det hamnar en ny position lite random i närheten istället
    {
      val = digitalRead(intest4Pin);         // Knapp 4 - Ska radera minnet
      if (val == HIGH) {                     // Kollar om knappen är tryckt
        UserStopPulseCount = 0;
        EEPROM.put(0, UserStopPulseCount);          // 
        lcd.setCursor(0, 1);                 // Dessa två rader skriver till LCD, i detta fall är 0,1 rad 2
        lcd.print("Pos. erased");
        Serial.println("Erasing position from memory");
        delay(1000);
      }
    }



      // -- FUNGERAR! Dessa rader stoppar motorn 1 sek när den är inom värdet, gäller både UPP och NED
{ 
          if( UserStopPulseCount!=0 && PulseCount >= UserStopPulseCount-15 && PulseCount <= UserStopPulseCount+15 )
          {
          digitalWrite(controlPin1, LOW);
          digitalWrite(controlPin2, LOW);
          lcd.setCursor(0, 1);
          lcd.print("Users Stop");
          Serial.println("Users programmed STOP activated");
          delay(1500); 
          
          // -- Dessa tre rader nedanför gör pipljudet när användarens programmerade stopp aktiveras
          // tone(tonePin, 600);
          // delay(50);
          // tone(tonePin, 950);
          // delay(70);
          // tone(tonePin, 800, 125);
          // delay(800);
          // noTone(tonePin);
          // delay(1500);
        }
      }       //Går till raderna ovan



  //  ---- MOTORNS VOID LOOP - KNAPPSTYRNINGEN TILL MOTORERNA ----

  // intest 1 ÅKER UPP
  // intest 2 ÅKER NER
  // stopsensor1Pin heter stoppsensorn som hindrar UPP
  // stopsensor2Pin heter stoppsensorn som hindrar NED
  // stopsensor3Pin heter stoppsensorn som ska hindra UPP eller NED

  {

    // ---- ÅKER UPP ----
    val = digitalRead(intest1Pin);         // UPP - Läser input värde
    if (val == HIGH)                       // Checkar om knappen trycks
    {
      digitalWrite(controlPin1, HIGH);
      digitalWrite(controlPin2, LOW);




      // -- DESSA TRE TILLHÖR SENSORN SOM SKA STOPPA BÅDE UPP OCH NER
      {
        val = digitalRead(stopsensor3Pin);
        if (val == HIGH) {
          digitalWrite(controlPin1, LOW);

          // -- Dessa 3 rader visar USER STOP när sensorn stoppar nedgång - delay ställer flimret men slöar också ner visningen av pulsräkningen ------
          lcd.setCursor(0, 1);
          lcd.print("User Stop");
          Serial.println("User removeable module defined stop 1");
          delay(50);

          // -- Dessa tre rader nedanför gör pipljudet när UPP & NER stopsensorn (ovan) täcks
          tone(tonePin, 600);
          delay(50);
          tone(tonePin, 950);
          delay(70);
          tone(tonePin, 800, 125);
          delay(800);
          noTone(tonePin);
        }
      }

      // -- Detta är sensorn som, om täcks, hindrar motorn från att åka upp
      {
        val = digitalRead(stopsensor2Pin);         // Sensor 2 som stoppar motorn, likaså sensor 3 vars uppgift är att stoppa både upp och ner
        if (val == HIGH) {
          digitalWrite(controlPin1, LOW);

          // -- Dessa 3 rader visar UPSTOP när sensorn stoppar nedgång - delay ställer flimret men slöar också ner visningen av pulsräkningen ------
          lcd.setCursor(0, 1);
          lcd.print("Up Stop");
          Serial.println("Upper security sensor reached Can only go down");
          delay(50);

          // -- Dessa tre rader nedanför gör pipljudet när stopsensorn (ovan) täcks påvägen UPP
          tone(tonePin, 880);
          delay(125);
          tone(tonePin, 400, 125);
          delay(650);
          noTone(tonePin);
        }


        // -- Dessa 3 rader visar UP när nedåtknapp trycks NED - delay ställer flimret men slöar också ner visningen av pulsräkningen ------
        lcd.setCursor(0, 1);
        lcd.print("Up");
        Serial.println("Lift going up at full speed");
        delay(50);


      }
    }


    // ---- ÅKER NER ----
    else {
      val = digitalRead(intest2Pin);         // NER - Läser input värde
      if (val == HIGH) {                     // Checkar om knappen trycks
        digitalWrite(controlPin1, LOW);
        digitalWrite(controlPin2, HIGH);


        // -- DESSA TRE TILLHÖR SENSORN SOM SKA STOPPA BÅDE UPP OCH NER
        {
          val = digitalRead(stopsensor3Pin);         // TEST
          if (val == HIGH) {
            digitalWrite(controlPin2, LOW);

            // -- Dessa 3 rader visar STOP när sensorn stoppar nedgång - delay ställer flimret men slöar också ner visningen av pulsräkningen ------
            lcd.setCursor(0, 1);
            lcd.print("User Stop");
            Serial.println("User removeable module defined stop 2");
            delay(50);

            // -- Dessa tre rader nedanför gör pipljudet när UPP & NER stopsensorn (ovan) täcks
            tone(tonePin, 600);
            delay(50);
            tone(tonePin, 950);
            delay(70);
            tone(tonePin, 800, 125);
            delay(800);
            noTone(tonePin);
          }
        }


        // -- Detta är sensorn som, om täcks, hindrar motorn från att åka ner
        {
          val = digitalRead(stopsensor1Pin);         // Sensorn 1 som stoppar motorn, likaså sensor 3 vars uppgift är att stoppa både upp och ner
          if (val == HIGH) {
            digitalWrite(controlPin2, LOW);


            // -- Dessa 3 rader visar DOWN STOP när sensorn stoppar nedgång - delay ställer flimret men slöar också ner visningen av pulsräkningen ------
            lcd.setCursor(0, 1);
            lcd.print("Down Stop");
            Serial.println("Lower security sensor reached Can only go up");
            delay(50);

            // -- Dessa tre rader nedanför gör pipljudet när stopsensorn (ovan) täcks påvägen ner
            tone(tonePin, 880);
            delay(125);
            tone(tonePin, 400, 125);
            delay(650);
            noTone(tonePin);
          }

          // -- Dessa 3 rader visar DOWN när nedåtknapp trycks NED - delay ställer flimret men slöar också ner visningen av pulsräkningen ------
          lcd.setCursor(0, 1);
          lcd.print("Down");
          Serial.println("Lift going down at full speed");
          delay(50);
        }

        // -- Dessa två rader stoppar motorn när man släpper knappen
      }  else
      {
        digitalWrite(controlPin1, LOW);
        digitalWrite(controlPin2, LOW);
      }

      
    } // Går till Åker ner
  } // Går till Åker upp
} // Går till puls o grafikräkning - Högst upp





Senast redigerad av fosfor 23 april 2018, 10:06:09, redigerad totalt 1 gång.
X-IL
EF Sponsor
Inlägg: 8261
Blev medlem: 3 december 2008, 07:47:20
Ort: Hallstahammar

Re: UNO att minnas vad siffran var senast?

Inlägg av X-IL »

Först och främst, det hade nog varit mycket bättre att fortsätta i den andra tråden, mycket enklare att förstå helheten som läsare då.

Nu har jag bara skummat koden, men borde du inte bara i varje loopvarv spara pulsräknaren (positionen), eller börjar denna alltid på noll(alltså inte en absoutenkoder)? Då blir det svårare. I såna fall bör du ha någon form av "home", kanske vid nedre brytaren? Då nollar du pulsen vid nedre brytaren en gång, sen i varje varv av loopen skriver du position till eeprom, och har en funktion som bara körs en gång vid power on som läser ut pulsvärdet och kör från det. MEN, detta kräver att maskinen inte rör på sig när strömmen är av, för då måste du nolla varje gång du slår på strömmen.
Användarvisningsbild
Klas-Kenny
Inlägg: 11291
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: UNO att minnas vad siffran var senast?

Inlägg av Klas-Kenny »

Att tänka på är att man bara kan göra ett begränsat antal skrivningar till EEPROM, så sparar du position för ofta kan du få kort livslängd på grejerna.

Går ju fint att räkna på, står i databladet hur många skrivningar det tål sen får du uppskatta hur ofta du ska köra och hur länge du vill att det ska överleva.

Annars får man ta till någon slags säker nedstängning eller liknande.
Användarvisningsbild
mrfrenzy
Co Admin
Inlägg: 14818
Blev medlem: 16 april 2006, 17:04:10

Re: UNO att minnas vad siffran var senast?

Inlägg av mrfrenzy »

Här är ett exempel som sparar en variabel till eeprom automatiskt när matningsspänningen bryts.
https://forum.arduino.cc/index.php?topic=121654.0

Under dom få millisekunder som behövs tas energi från en kondensator för att driva processorn.
peolah
EF Sponsor
Inlägg: 502
Blev medlem: 22 mars 2010, 02:10:47

Re: UNO att minnas vad siffran var senast?

Inlägg av peolah »

Låter verkligen som ett RedNeck hack, *jag* tror att om man belastar ett antal IO med en del ström kommer ju detta inte att fungera så bra..
Användarvisningsbild
rvl
Inlägg: 5719
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: UNO att minnas vad siffran var senast?

Inlägg av rvl »

Räkna på det hellre än att "tro". Millisekunder är ganska korta och det går ju att välja en större kondensator om uträkningen visar att det blir kritiskt. Eventuellt kan man också inaktivera alla utgångar i shut down rutinen.
peolah
EF Sponsor
Inlägg: 502
Blev medlem: 22 mars 2010, 02:10:47

Re: UNO att minnas vad siffran var senast?

Inlägg av peolah »

Jag tänker inte räkna på det, eftersom *jag* tycker det är en dålig id'e. Gör du en simulering i LT-Spcie om du vill.
Men du får respektera att jag sa "jag". Ledsen om du tog illa upp, använd du gärna den metoden.

Skall inte posta mer i trådarna om EEProm .. :P
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: UNO att minnas vad siffran var senast?

Inlägg av lillahuset »

rvl: I det här forumet är det gissa, tro och hoppas eftersom det är så fruktansvärt jobbigt att räkna och att läsa datablad.
Användarvisningsbild
mrfrenzy
Co Admin
Inlägg: 14818
Blev medlem: 16 april 2006, 17:04:10

Re: UNO att minnas vad siffran var senast?

Inlägg av mrfrenzy »

peolah: Hur menar du att det är en dålig idé? Såhär gör man i massor av utrustning som ska spara ner volatil data före brown-out.

Dom flesta processorer har rutiner för detekteringen inbyggt och instruktioner i databladet.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: UNO att minnas vad siffran var senast?

Inlägg av lillahuset »

Databladet? Vad är det?
peolah
EF Sponsor
Inlägg: 502
Blev medlem: 22 mars 2010, 02:10:47

Re: UNO att minnas vad siffran var senast?

Inlägg av peolah »

lillahuset:
Jag läser ALLTID datablad och räknar på mina konstruktioner för information!

mrfrency:

Jo, man gör på *liknande* sätt i annan utrustning, men då använder man en lite seriösare konstruktion(enligt mig) än denna i länken du gav. Som tex ett litiumbatteri/mosfet som då även förser en eventuell RTC med Power Off ström. Men vad har det med Arduino ATMega328P och hårdvaran som den är byggd i en UNO att göra? Det enda som händer vid brownout på en AVR är en Reset (om Brownout är konfigurerad). Men är den satt till rätt nivå?, då jag inte använder C++ till AVR vet jag inget om detta!

Sedan vet vi ju inte vad TS har kopplat på +5V i övrigt eller om han ens kan bygga om sin Arduino UNO som länken visar!

ovanstående är min åsikt, felaktig eller ej så kommer den att kvarstå.. :)
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: UNO att minnas vad siffran var senast?

Inlägg av lillahuset »

peolah: Det är bra. Men en rätt stor andel av användarna här gör nog aldrig det. :)
peolah
EF Sponsor
Inlägg: 502
Blev medlem: 22 mars 2010, 02:10:47

Re: UNO att minnas vad siffran var senast?

Inlägg av peolah »

Bara ett tips om man skall använda ovanstående metod:

Att infoga nedanstående innan en EEProm-skrivning vore nog en idé tycker jag..

Dvs om en brownout reset redan har skett, så borde en skrivning redan ha skett eller vara olämplig..

Kod: Markera allt

  int unsaved 
unsaved är en variabel som sparas i SRAM som nollställs vid reset oavsett typ. Även MCUSR ändrar state efter nästa reset.

Så nedanstående test innan skrivning vore nog bra.

Kod: Markera allt

#include <avr/sleep.h> 
..
while (MCUSR & _BV(BORF)){
 sleep_mode();
 }
Användarvisningsbild
mrfrenzy
Co Admin
Inlägg: 14818
Blev medlem: 16 april 2006, 17:04:10

Re: UNO att minnas vad siffran var senast?

Inlägg av mrfrenzy »

Ja nu börjar vi komma in på lite konstruktiva förslag :tumupp:

Ungefär såhär hade jag lagt upp det:
12V nätagg - diod - kondensator på xxxx µF - 3.3V switchregulator - processor
en analog ingång mäter 12V spänningen via en spänningsdelare.
När 12V spänningen sjunkit till 11V startar funktionen "spara position till eeprom"

Självklart är också brown out reset aktiverat. Det vill säga att när 3.3V spänningen sjunkit till 3.0V stoppas ALLT som processorn håller på med.

Pseudokod för "spara position till eeprom"
* Stäng av alla utgångar
* Spara aktuellt värde i eeprom på plats A
* Spara aktuellt värde i eeprom på plats B
* Gå till sleep mode

Räkna ut eller mät hur lång tid nersparandet tar, och dimensionera kondensatorn därefter. Se till att endast processorn drivs från kondingen efter dioden.

Vid varje boot kolla om värdet i eeprom på plats A och B är lika och inom rimliga spann, annars nollställ och kräv en home-körning.
peolah
EF Sponsor
Inlägg: 502
Blev medlem: 22 mars 2010, 02:10:47

Re: UNO att minnas vad siffran var senast?

Inlägg av peolah »

MrFrency:

Ja det låter som en helt perfekt(seriös) och fungerande lösning.. :tumupp:

Jag skriver ju i assembler som sagt, och jag lägger allt som inte används som timers, uart, spi i powersave redan vid varje reset.

Sedan har jag allokerat lite ram för flaggor som "persistent" , dvs som inte nollställs av reset-rutinen.

Det finns en del lediga io-positioner man kan använda även under 0x0200 som SRAM-Start efter IO.
Men nu känns det som vi är väldigt offtopic i TS tråd, men jag tycker vi kan start en separat tråd om en sådan här lösning.

Ledsen för offtopic Fosfor!
Skriv svar