Buggfix Plus
Aktuellt datum och tid: 20.12 2018-07-17

Alla tidsangivelser är UTC + 1 timme




Svara på tråd  [ 25 inlägg ]  Gå till sida Föregående  1, 2
Författare Meddelande
InläggPostat: 13.55 2018-03-12 
Användarvisningsbild

Blev medlem: 05.43 2013-02-13
Inlägg: 194
Det låter som en bra idé. Det är så jag också måste göra det för att det ska fungera rent mentalt.
Bryta ner varje sak i flera delar. Särskilt med detta som är så nytt för mig.
Det har fungerat hittils, men nu är väl "problemet" att jag ska göra en slags dubbelfunktion eller hur jag ska beskriva det.

Spara en position (och jag måste ju veta på nåt sätt att den Gör det).
Sen att programmet kommer ihåg positionen och stannar när den passerar denna.
Blir någon av dom fel är det svårt att veta vilken, blir det ena fel så blir den andra fel också så att säga.

Några förslag om placering av koden? Och vilka kommandon spontant man bör hålla sig till och eventuellt akta sig för?

Om jag gör en funktion som ska spara en position/siffra/nummer från min rotary encoder.
Hur tusan kan jag bekräfta/veta att den är sparad? Och se vad siffran är??


Upp
 Profil  
 
InläggPostat: 16.13 2018-03-12 

Blev medlem: 11.20 2009-05-26
Inlägg: 5162
Ort: Kristinehamn
Citera:
Hur tusan kan jag bekräfta/veta att den är sparad? Och se vad siffran är??

Om du hade besvärat dig att läsa igenom det som jag tidigare länkade till och kollat exemplen så hade du inte behövt ställa frågan.


Upp
 Profil  
 
InläggPostat: 16.53 2018-03-12 
Användarvisningsbild

Blev medlem: 05.43 2013-02-13
Inlägg: 194
SeniorLemuren:
Mmm, det ser ut som att det finns en del att hämta i den koden.
Men för ett nybörjaröga som mig så är det för långt bort att greppa då det där ju rör sig om en temperatursensor.
Och att funktionen är annorlunda.
Jag ska ju inte heller ha något som kollar sensorn konstant, och inte spara konstant.
Jag ska ju bara spara vid knapptryckning, vilket kanske bara blir någongång ibland.


Upp
 Profil  
 
InläggPostat: 11.54 2018-03-16 
EF Sponsor
Användarvisningsbild

Blev medlem: 09.01 2007-03-09
Inlägg: 5865
Ort: Borlänge
Spara vid knapptryckning:
I mitt senaste projekt som sväller och blir bara mer och mer intressant vartefter min fantasi flödar iväg, så använder jag mig av EEPROM för att spara aktuell tid.
Jag håller (fortfarande) på med en motorvärmartimer till bilarna hemma. Man vill ju gärna enkelt kunna ställa in avresetid med minimalt insats, alltid bråttom.

Säg när knappen är 'LOW' så är även en räknare noll, när knappen/funktionen sedan är 'HIGH' räknar en räknare till något bestämt värd och stannar där ex 4 eller nått.
Vid värde 1, 2 och 3 skriver den till 3 olika positioner/adresser, EEPROM.write(addr, val);. Dvs den skriver till bestämd EEPROM adress endast engång, ett cykelvarv per knapptryckning.
Då finns ingen risk att EEPROM blir utslitet.

Så i mitt fall med motorvärmartimern, om jag vill justera avresetiden till framtiden (imorgon) så trycker jag bara på en knapp så läses aktuell tid in.

I ditt fall kanske du har en separat knapp för att spara önskad position, en knapp för att åka dit.


Upp
 Profil  
 
InläggPostat: 18.06 2018-03-30 
EF Sponsor

Blev medlem: 02.10 2010-03-22
Inlägg: 400
Precis som man nämnt tidigare i tråden så klarar eeprom bara ett antal skrivningar per cell.

Om man nu skall använda eeprom'et för att skriva kontinuerligt så är iaf en metod jag skulle använda att använda gray-kod/hamming för skrivningar, på det sättet kan du utöka livslängden på eeprom-cellerna betydligt. Denna metod(Gray) används tex i centrallås-fjärrkontroller från tex MicroChip (Keeloq) med skrivningar varenda knapptryckning. Dessutom viktigt att sätta brownout för processorn, vet inte hur man gör i Arduino C++!? Använder själv assembler till ATMega.
Med checksumma i kombination med ovanstående kan man flytta skrivningar till andra celler när de tidigare börjat bli korrupta!

Ett par länkar med information:

https://sv.wikipedia.org/wiki/Graykod
http://ww1.microchip.com/downloads/en/AppNotes/01449A.pdf
https://gist.github.com/shirish47/d21b896570a8fccbd9c3

Edit : uppdaterat med arduinolänk


Upp
 Profil  
 
InläggPostat: 10.23 2018-04-03 
Användarvisningsbild

Blev medlem: 05.43 2013-02-13
Inlägg: 194
Jag vill verkligen poängtera att jag sannolikt inte kommer slita ut EEPROM minnet i förtid.
Därav att åtgärder för att inte slita på minnet som många i all välmening nämner inte är aktuella, och inte behöver tas upp.
Det rör sig om att spara ETT enda nummer, kanske EN gång i veckan eller mindre, och låta det ligga permanent
i minnet, för att någongång ibland hämtas och tittas på/användas till något. :humm: :shock: :lol:
Tydligen ska minnet klar ca 100.000 skrivningar, så det bör inte vara någon fara alls i detta fall.

Jag har en siffra, låt säga typ 849 (via pulsecount på motorn), som jag vill spara i EEPROM, med en knapptryckning.
Sen vill jag trycka på en annan knapp och se detta nummer på min display.

Någon som har nåt bra tips?


Upp
 Profil  
 
InläggPostat: 12.13 2018-04-03 
EF Sponsor
Användarvisningsbild

Blev medlem: 09.01 2007-03-09
Inlägg: 5865
Ort: Borlänge
Vill du har kod eller, tipset jag gav dig funkar hur bra som helst, och är väldans okomplicerat.

Exempel ur min kod. .... teach_b är en knapp för programmera EEPROM med aktuellt tid.

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
  valF_h = EEPROM.read(aF_h);
  valF_m = EEPROM.read(aF_m);
  valF_s = EEPROM.read(aF_s);


Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
if (teach_b == HIGH) {
if (teach_b == HIGH) { var_1++; }
if (var_1 >= 1000) { var_1 = 1000; }

if ((hour > 3 & hour < 6 ) & skift == 1) {
if (var_1 == 501) { EEPROM.write(aF_h, hour); }
if (var_1 == 502) { EEPROM.write(aF_m, minute); }
if (var_1 == 503) { EEPROM.write(aF_s, second); }}

delay(100); }
if (teach_b == LOW) {var_1 = 0; }


Man kan använda en for loop också för att göra samma sak.


Upp
 Profil  
 
InläggPostat: 15.36 2018-04-03 
Användarvisningsbild

Blev medlem: 05.43 2013-02-13
Inlägg: 194
Hej!
Tackar, men denna kod gjorde precis vad jag var ute efter och det fungerar perfekt,
att plocka från minnet siffran/positionen jag sparat.

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
{
 {
  val = digitalRead(intest3Pin);         // Knapp 3 - Denna ska spara position i minnet
  if (val == HIGH) {                     // Kollar om knappen är tryckt

EEPROM.put(0,PulseCount);                // 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!");
        delay(750);
  }     
}


Upp
 Profil  
 
InläggPostat: 22.07 2018-04-06 
EF Sponsor

Blev medlem: 02.10 2010-03-22
Inlägg: 400
fosfor skrev:
Jag vill verkligen poängtera att jag sannolikt inte kommer slita ut EEPROM minnet i förtid.
Därav att åtgärder för att inte slita på minnet som många i all välmening nämner inte är aktuella, och inte behöver tas upp.
Det rör sig om att spara ETT enda nummer, kanske EN gång i veckan eller mindre, och låta det ligga permanent
i minnet, för att någongång ibland hämtas och tittas på/användas till något. :humm: :shock: :lol:
Tydligen ska minnet klar ca 100.000 skrivningar, så det bör inte vara någon fara alls i detta fall.



Meningen med informationen var inte enbart för dig och ditt projekt som jag inte satt mig in i, ledsen för too much info då..


Upp
 Profil  
 
InläggPostat: 18.21 2018-04-16 
Användarvisningsbild

Blev medlem: 11.03 2007-09-10
Inlägg: 9071
Ort: Alingsås
Men är det inte så att i AVR så sker först radering av en byte i EEPROM innan den skrivs över med ett nytt värde.
I så fall spelar det kanske ingen roll om du räknar från 0 till 255 eller om du kör gray-kod: alla bitar sätts till FF och sedan programmeras nya in.

i AVR-biblioteket avr/eeprom.h finns därför två (sorters) funktioner för att skriva i eeprom med som heter eeprom_write_byte() / eeprom_write_word() och en annan som heter eeprom_update_byte() / eeprom_update_word()..... De senare fungerar så att de först läser en byte från eeprom för att jämföra med det som ska skrivas - är det samma så görs inget mer, vilket är ett sätt att spara tid och inte slita så mycket på eepromet. Hade det varit så att minnet raderades och skrevs bitvis och att man manuellt behövde radera eepromet innan skrivning så kanske metoden med gray-kod kunnat appliceras och fungera bättre.

peolah skrev:
Precis som man nämnt tidigare i tråden så klarar eeprom bara ett antal skrivningar per cell.

Om man nu skall använda eeprom'et för att skriva kontinuerligt så är iaf en metod jag skulle använda att använda gray-kod/hamming för skrivningar, på det sättet kan du utöka livslängden på eeprom-cellerna betydligt. Denna metod(Gray) används tex i centrallås-fjärrkontroller från tex MicroChip (Keeloq) med skrivningar varenda knapptryckning. Dessutom viktigt att sätta brownout för processorn, vet inte hur man gör i Arduino C++!? Använder själv assembler till ATMega.
Med checksumma i kombination med ovanstående kan man flytta skrivningar till andra celler när de tidigare börjat bli korrupta!

Ett par länkar med information:

https://sv.wikipedia.org/wiki/Graykod
http://ww1.microchip.com/downloads/en/AppNotes/01449A.pdf
https://gist.github.com/shirish47/d21b896570a8fccbd9c3

Edit : uppdaterat med arduinolänk


Upp
 Profil  
 
Visa inlägg nyare än:  Sortera efter  
Svara på tråd  [ 25 inlägg ]  Gå till sida Föregående  1, 2

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:  
    Electrokit
Drivs av phpBB® Forum Software © phpBB Group
Swedish translation by Peetra & phpBB Sweden © 2006-2010