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 :)
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
Ach ja, unter Codesammlung würde ich so eine Frage eher nicht starten. Stefan
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.