Ich habe vor kurzem begonnen, in C Mikrocontroller (den Atmega 8) zu programmieren. In dem Programm im Anhang ist vermutlich ein Fehler. Ich versuche ein LCD mit den LCD-Funktionen des AVR-GCC-Tutorials anzusteuern. Außenbeschaltung: Drei Taster an PortB (PB0 = Zurück, PB1 = OK, PB2 = Vorwärts). Vier LEDs an PortC (PC0 - PC3) Das LCD an PortD. Es wird mit Vor, Zurück, OK eine Dezimalzahl zwischen 1 und 15 auf dem Display ausgewählt, die dann auf den 4 LEDs binär angezeigt wird. Drückt man bei 15 auf Weiter, kann man das Programm mit OK in eine Endlosschleife schicken. Drückt man bei diesem letzten Bildschirm auf Weiter, kommt man wieder zu 1, drückt man bei 1 auf Zurück, kommt man zu diesem letzen Bildschirm. Meine Probleme: - Die Dezimalzahlen werden nicht richtig angezeigt - Das Display flimmert, ich denke die Schleife läuft immer durch und das Display wird immer neu beschrieben. Wie verhindere ich das? Ein Anfänger P.S. bei der Abfrage der Taster, kann sein, dass da was überflüssig ist, weiß nicht genau.
> In dem Programm im Anhang ist vermutlich ein Fehler.
Anhang nicht vorhanden.
1 | while(1) |
2 | {
|
3 | if( PINB & 0x02 ) { |
4 | while(1) |
5 | {
|
6 | if( !( PINB & 0x02 ) ) { |
7 | lcd_clear(); |
8 | while(1) |
9 | ...
|
Du hast mehrere Endlosschleifen ineinander, ohne dass im Sourcecode irgendwo auch nur ein break steht. Das bedeutet, dass irgendwann die innerste Schleife endlos ausgeführt wird, ohne dass die Codeausführung jemals wieder zu einer der äußeren Schleifen zurückkehrt. Ist das Absicht?
ja, am anfang wird gewartet, bis ok gedrückt und wieder losgelassen wird. dann wird die dritte (die Hauptschleife) dauernd ausgeführt. Die Endlosschleife später im Code ist zum "Beenden", des Programms. das am anfang geht vielleicht anders besser, aber ich weiß nicht wie.
> - Das Display flimmert, ich denke die Schleife läuft immer durch und das > Display wird immer neu beschrieben. Richtig, wird es. > Wie verhindere ich das? Du könntest zusätzlich auch noch den alten Inhalt von page in einer Variable festhalten, und das Display nur neu beschreiben, wenn die beiden sich unterscheiden.
die dinger prellen sowieso fast nicht und mit einer kleinen hardware entprellung überhaupt nicht. Es muss am Programm liegen. Meine Probleme: - Die Dezimalzahlen werden nicht richtig angezeigt - Das Display flimmert, ich denke die Schleife läuft immer durch und das Display wird immer neu beschrieben. Wie verhindere ich das? Ein Anfänger
> das am anfang geht vielleicht anders besser, aber ich weiß nicht wie.
1 | while (! PINB & 0x02 ); |
2 | // hier noch ein delay wegen des Prellens
|
3 | while (PINB & 0x02); |
4 | |
5 | while (1) { |
6 | |
7 | ...
|
Wozu sollen denn diese Konstrukte dienen?
1 | zrck = 1; |
2 | while( PINB & 0x01 ) { |
3 | // nix machen
|
4 | }
|
5 | zrck = 0; |
@sternst werd ich morgen beides ausprobieren ich versuche ja mit while( PINB & 0x00 ) { // nix machen } auf einen Tastendruck zu warten
@sternst von 21:34 die warn mal dazu da als die schleife immer durchgelaufen ist (auch während eines Tastendrucks), damit nicht bei jedem Schleifendurchlauf ein neuer Tastendruck erkannt wird oder so. Werd ich morgen ausbauen.
> die dann auf den 4 LEDs binär angezeigt wird. > ... > - Die Dezimalzahlen werden nicht richtig angezeigt > PORTC = page; Kann es vielleicht sein, dass die LEDs gegen VCC angeschlossen sind? Dann musst du page für die Ausgabe invertieren: PORTC = ~page & 0x0f;
nein die sind richtig angeschlossen. bei der auswahl auf dem lcd werden die (seiten-)zahlen nicht richtig angezeigt.
> lcd_data(page);
Wozu dient das?
Falls du den Inhalt von page auf das Display schreiben willst, wird
das so nicht gehen. Du musst den Integerwert erst in einen String
wandeln und dann auf das Display schreiben. Steht sicher auch irgendwo
in dem LCD-Tutorial.
PS: Ach, das meintest du wohl mit "Die Dezimalzahlen werden nicht
richtig angezeigt". ;-)
ok mach ich alles morgen. Danke für die vielen hilfreichen Antworten.
ich glaube, ich habe noch nie ein Programm für einen MC geschrieben, wo nicht min. 1 Timer+Interrupt lief.... Vereinfacht vieles, macht das Programm übersichtlicher und du kannst in einem sinnvollen Zeitraster arbeiten.
Ich selber:
> while (! PINB & 0x02 );
Ups, natürlich: while (!(PINB & 0x02));
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.