Agstu.se Buggfix Plus
Aktuellt datum och tid: 11.33 2018-06-24

Alla tidsangivelser är UTC + 1 timme




Svara på tråd  [ 30 inlägg ]  Gå till sida 1, 2  Nästa
Författare Meddelande
InläggPostat: 11.58 2018-04-20 
Användarvisningsbild

Blev medlem: 05.43 2013-02-13
Inlägg: 194
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: [Expandera/Minimera] [Hämta] (Untitled.txt)
//  ---- 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 09.06 2018-04-23, redigerad totalt 1 gång.

Upp
 Profil  
 
InläggPostat: 12.28 2018-04-20 
EF Sponsor

Blev medlem: 07.47 2008-12-03
Inlägg: 6927
Ort: Hallstahammar
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.


Upp
 Profil  
 
InläggPostat: 16.34 2018-04-20 
Användarvisningsbild

Blev medlem: 18.06 2010-05-17
Inlägg: 8380
Ort: Växjö/Alvesta
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.


Upp
 Profil  
 
InläggPostat: 18.14 2018-04-20 
Co Admin
Användarvisningsbild

Blev medlem: 16.04 2006-04-16
Inlägg: 8570
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.


Upp
 Profil  
 
InläggPostat: 18.28 2018-04-20 
EF Sponsor

Blev medlem: 02.10 2010-03-22
Inlägg: 397
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..


Upp
 Profil  
 
InläggPostat: 18.52 2018-04-20 
Användarvisningsbild

Blev medlem: 13.58 2016-04-05
Inlägg: 1335
Ort: Helsingfors
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.


Upp
 Profil  
 
InläggPostat: 18.57 2018-04-20 
EF Sponsor

Blev medlem: 02.10 2010-03-22
Inlägg: 397
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


Upp
 Profil  
 
InläggPostat: 19.04 2018-04-20 
Användarvisningsbild

Blev medlem: 07.13 2008-07-03
Inlägg: 12353
Ort: Norrköping
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.


Upp
 Profil  
 
InläggPostat: 22.14 2018-04-20 
Co Admin
Användarvisningsbild

Blev medlem: 16.04 2006-04-16
Inlägg: 8570
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.


Upp
 Profil  
 
InläggPostat: 22.47 2018-04-20 
Användarvisningsbild

Blev medlem: 07.13 2008-07-03
Inlägg: 12353
Ort: Norrköping
Databladet? Vad är det?


Upp
 Profil  
 
InläggPostat: 09.32 2018-04-21 
EF Sponsor

Blev medlem: 02.10 2010-03-22
Inlägg: 397
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å.. :)


Upp
 Profil  
 
InläggPostat: 10.16 2018-04-21 
Användarvisningsbild

Blev medlem: 07.13 2008-07-03
Inlägg: 12353
Ort: Norrköping
peolah: Det är bra. Men en rätt stor andel av användarna här gör nog aldrig det. :)


Upp
 Profil  
 
InläggPostat: 12.22 2018-04-21 
EF Sponsor

Blev medlem: 02.10 2010-03-22
Inlägg: 397
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: [Expandera/Minimera] [Hämta] (Untitled.txt)
  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: [Expandera/Minimera] [Hämta] (Untitled.txt)
#include <avr/sleep.h>
..
while (MCUSR & _BV(BORF)){
 sleep_mode();
 }


Upp
 Profil  
 
InläggPostat: 12.31 2018-04-21 
Co Admin
Användarvisningsbild

Blev medlem: 16.04 2006-04-16
Inlägg: 8570
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.


Upp
 Profil  
 
InläggPostat: 12.46 2018-04-21 
EF Sponsor

Blev medlem: 02.10 2010-03-22
Inlägg: 397
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!


Upp
 Profil  
 
Visa inlägg nyare än:  Sortera efter  
Svara på tråd  [ 30 inlägg ]  Gå till sida 1, 2  Nästa

Alla tidsangivelser är UTC + 1 timme


Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 4 gäster


Du kan inte skapa nya trådar i denna kategori
Du kan inte svara på trådar i denna kategori
Du kan inte redigera dina inlägg i denna kategori
Du kan inte ta bort dina inlägg i denna kategori
Du kan inte bifoga filer i denna kategori

Sök efter:
Hoppa till:  
    Agstu.se
Drivs av phpBB® Forum Software © phpBB Group
Swedish translation by Peetra & phpBB Sweden © 2006-2010