Forum: Projekte & Code Atmega161 für Menü auf LCD (Vorschläge?)


von Jan (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!
Ich habe in näherer Zukunft vor über meinen ATmega161 und einige
Solid-State-Relais ein paar Geräte im Haushalt zu schalten. Dafür
schreibe ich im Moment ein Menü. Leider habe ich noch nicht so
sonderlich viel erfahrung und wollte erstmal meinen Code posten und
nach verbesserungen fragen. Testen konnte ich das Programm bisher noch
nicht weil mein neues LCD noch nicht da ist.
Erstmal zur Umgebung: µC: Atmega161, LCD Standartkontroller 16x4
Zeilen, Compiler: AVR-GCC, Programmer: PonyProg2000 mit einem ISP
Dongle.

Den Quellcode habe ich angehängt. Meine größte Sorge bei dem Programm
ist eigentlich das Timing.(Entprellen der Tasten). Als Taster benutze
ich einen Drehimpulsgeber. Wenn der Taster gedreht wird soll das
Nächste bzw. vorherige Geräte gewählt werden. Beim Drücken soll es
eingeschaltet oder ausgeschaltet werden. Es wäre nicht schlecht wenn
ich die Interrupts vermeiden könnte. (Vor allem weil der
Drehimpulsgeber zwei Drehrichtungen und einen Taster hat und der µC nur
2 externe Interrupts.) Ich weiß jedoch nicht wie ich verhindern kann
das der µC mehrere Impulse bei einer Drehung erkennt und Schritte
überspringt.
Ich hab mir dazu schon ein paar Gedanken gemacht aber ob die so toll
sind :/
if (PORTA && 0x01 == 0x01)
{
  while (PORTA && 0x01 == 0x01);
  i++;
}

Ist das eine saubere Lösung einen Pin abzufragen?

Für Kritik bin ich immer offen :)

von Stefan Kleinwort (Gast)


Lesenswert?

Eines der Probleme, die Dir demnächst begegnen werden, ist
Speichermangel, da Deine Strings alle im RAM angelegt werden. Schau mal
dazu hier nach:

http://www.mikrocontroller.net/forum/read-2-78266.html

Um ein Menu im Display zu erzeugen, gab es in letzter Zeit ein paar
ganz gute Diskussionen bzw. Ansätze, such mal hier im Forum danach.

Mit Deiner Methode, globale Variablen im IR zu ändern, die dann überall
in Main benutzt werden, solltest Du sehr vorsichtig sein. Immer daran
denken: ein IR kann immer auftreten. Z.B.:

  for(;;)
  {
    if(gI>2)        //Wenn das Menüende erreicht ist
      gI=0;        //zum ersten Menüpunkt springen

// Wenn hier ein IR auftritt, gibts Du den String geraet[3] aus,
// welcher ungueltig ist!

    LCDSHOW(geraet[gI],0x40);    //Das gewählte Gerät ausgeben
    if(status[gI]==48)


Besser ist es, nur Ereignisse an das Hauptprogramm zu liefern, z.B. ein
Flag (oder Zähler) keypressed und einen Buffer für die Tasten. Dann
machst Du eine Funktion getkey(), die Dir das Zeichen (oder Aktion,
usw.) holt. Dabei IR ggf. sperren.

Das hat auch den Vorteil, dass Dein main nicht ständig das Menu neu
aufbaut, sondern nur nach einer User-Aktion aktiv wird (Tastendruck
..).

Gruß, Stefan

von Stefan Kleinwort (Gast)


Lesenswert?

Ach ja, unter Codesammlung würde ich so eine Frage eher nicht starten.

Stefan

von Jan (Gast)


Angehängte Dateien:

Lesenswert?

Danke für deinen reply!
Bin wohl irgendwie im falschen Unterforum gelandet, sorry! :(

An den Speicher habe ich noch garnicht gedacht. Werd mir wohl mal einen
Zusatzspeicher zulegen. Zumal es wohl später auch noch einige Strings
mehr werden, die zu speichern sind.

Das mit den Flags habe ich mal umgesetzt. Bin mir aber nicht sicher ob
ich es richtig verstanden habe.

von Stefan Kleinwort (Gast)


Lesenswert?

Nix mit Zusatzspeicher!

Schau Dir den anderen Thread an, da ist erklärt, wie Du konstante
Strings ins Flash bekommst. Da ist ja genügend Platz drin (solange Du
keine Menu-Romane schreiben willst).

Stefan

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.