AVR assembler: Menysystem

Berätta om dina pågående projekt.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

AVR assembler: Menysystem

Inlägg av jesse »

Jag har byggt ett enkelt menysystem för AVR Atmega48 med 2x16-teckens LCD och tre knappar. Jag hittade inget liknande någonstans, så det var bara att börja programmera. Tänkte att den är såpass allmän att den kan vara intressant här. Kom gärna med feedback och frågor.

Bild
klicka på bilden för att se en kort film...

Jag utvecklade det först för mitt kyl/frys då jag ville kunna bläddra mellan menyer, läsa av max/min temp och kunna nollställa dessa, samt ändra "önskad temperatur" för både kyl och frys.

Tyvärr hade jag lite bråttom och slarvade ihop koden fort och jag fick med ett par buggar som jag inte orkat fixa. Det mesta fungerar dock. Mitt projekt nu är att dokumentera menysystemet, göra om koden så den blir lite mer flexibel och lättläst så det går lätt att anpassa den till andra byggen i framtiden med kanske lite mer avancerade menyer. Den ska även fungera med upp till 8 knappar hade jag tänkt (vad man nu ska ned så mycket till).

Beskrivning av funktionen:

Man kan ha visning av data i olika "mode" på displayen vilka kan bläddras mellan med hjälp av "meny" knappen. Vissa av dessa moden presenterar enbart uppgifter på LCD:n medans andra också kan mata in eller modifiera presenterad data.

Detta ska vara så flexibelt som möjligt, så att data som modifieras kan vara vad som helst, t.ex. toggla mellan "ON/OFF/AUTO" eller höja/sänka ett numeriskt värde med +/- knapparna.

Uppdatering av bilden sker antingen automatiskt med visst tidsintervall (t.ex. varannan sekund) eller direkt efter att man tryckt ner en knapp.

Att bara visa data på displayen är ganska enkelt:

När displayen ska uppdateras kollar man viken "mode" man befinner sig i för tillfället och man hoppar till motsvarande utskriftsrutin. Flera "mode" kan ju vara mycket likartade - de ska presentera data i samma format fast från olika källor. Andra "mode" kan presentera samma data på annat vis eller bara visa t.ex. programversion etc.

Vissa "mode" som är inmatningsmode sätter också en blinkande markör på lämplig plats.

Hur processorn sedan reagerar på knapptryckningar blir lite mer komplicerat så jag har ritat ett flödesschema för det:

Bild

Knappavkänningen har flera funktioner:

1) vid nedtryckning av knapp utförs motsvarande funktion i den mode man befinner sig i. Detta kontrolleras av en array (mode,knapp) som innehåller adresser till funktioner. En knapp har alltså olika funktion beroende på mode.
2) repetitionsfunktion : aktiveras efter viss tid om knapp hålls nedtryckt. Eftersom repetitionsfunktionen ska vara på/av beroende på mode och dessutom kanske ha en annan funktion än när man bara trycker kort tid så fiss en egen array (mode,key) för dessa funktioner.
3) inaktivitetstimer. kan sättas till t.ex. 60 sekunder. Sätts till 60 sek så fort man rör en knapp. räknar sedan ner. Om eller när den når 0 så utförs "inaktivitetsfunktionen". Det kan t.ex. vara att displayen återgår till default visning (mode0) och / eller att ändrade värden sparas i EEPROM.

exempel 1:
trycker man på "meny" så ökar "mode" med 1, dvs man går vidare i menyn, förutom i sista menyn då man återgår till default-mode (0). Men håller man ner mode-knappen länge så kommer man direkt till default (mode0).

exempel 2: I mode0 visas bara aktuell temperatur. knapparna "plus" och "minus" har ingen funktion här. Men i "mode1" ska man ändra ett numeriskt värde. knapparna "plus" och "minus" ökar /miskar värdet. Repetitionsfunktionen är densamma, dvs. man kan öka/minska värdet snabbt geno att hålla in en knapp.

exempel 3: i mode3 visas max / min temperaturer. Här har "minus" knappen ingen funktion vid nedtryckning, men hålls den nedtryckt i 2 sek (repetirionsfunktionen går igång) så nollställs värdet.

Bild
aktuell temperatur visas i mode0

Bild
"MENY"-knappen trycks ner och jag kommer till mode1 där jag kan ändra inställd temp på första raden. I mode2 blinkar cursorn istället på nedre raden.

Nån gång i framtiden när jag snyggat till koden och hittat buggarna så kommer jag att presentera den här.

---------------------------------------------------------------------------------------------------------

Så här ser knapptabellerna ut med mitt kyl/frys som exempel:

Bild
Användarvisningsbild
JimmyAndersson
Inlägg: 26568
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: AVR assembler: Menysystem

Inlägg av JimmyAndersson »

Mycket bra projektbeskrivning! (Både bilder, film och text) :tumupp: :tumupp: :tumupp: :tumupp:

Intressant projekt som är riktigt användbart.
Jag är väldigt nyfiken på koden. :)


Grattis till dina 1000 inlägg förresten. :D
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: AVR assembler: Menysystem

Inlägg av stekern »

Mycket föredömligt dokumenterat måste jag säga, om man bara orkade dokumentera sina egna projekt sådär bra :vissla:
Just menysystem är rätt trist att koda också, så det är säkert nån annan som kommer ha nytta av detta.
Jag gjorde också ett meny-system till R/C monitor projektet. Koden som är skriven i C finns här http://www.sk-electronics.com/sk-monito ... r-v0.2.zip
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: AVR assembler: Menysystem

Inlägg av v-g »

Har också gjort ett menysystem till PIC en gång i tiden tyvärr var det avancerat och blev aldrig riktigt klart. Problemet där var att det var en massa olika värden som skulle in typ dagar/månader/år/tal osv så varje menypunkt blev väldigt avancerad. Sen var jag kassare då än vad jag är nu. Dock var menyuppbyggnaden enkel och man skrev bara in antal punkter och vad de skulle heta.

Jag hade även acceleration på värdessättningen då jag körde med en ALPS joystick som har 5 lägen plus tryck.

Egentligen så minns jag inte varför jag aldrig gjorde klart :humm:

Kanske man skulle dokumenterat lika snyggt så hade man fått lusten lite högre, vet att det bara var någon månad sen jag rensade ovanstående av ett labbdäck.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: AVR assembler: Menysystem

Inlägg av jesse »

tack för responsen.

som sagt så är koden inte särskilt snygg just nu, så det kommer kod när jag gjort om det mesta (och testat den)... och det kan ju dröja ett tag.

En idé vore ju att bygga ett PC-program där man bara matar in vilka menyer man vill ha och vilka värden man ska manipulera (och hur de ska representeras) och så spottar den ut en färdig kod! Men det blir ännu senare om det blir av alls.

Min kod använder sig dessutom av en egentillverkad LCD-drivrutin (HD44780) så det lär ju bli mycket anpassning om man inte ska överta även den (vilken säkert har sina brister). Men bara man definierar funktionerna så går de väl att översätta även om det kan innebära visst bökande.
Skriv svar