www.mikrocontroller.net

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


Autor: Jan (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Stefan Kleinwort (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Kleinwort (Gast)
Datum:

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

Stefan

Autor: Jan (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan Kleinwort (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.