Programmierfehler? C Anfänger Atmega8

Gast #969437
Lesenswert?

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.
#969493
Lesenswert?

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?
Gast #969503
Lesenswert?

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.
#969507
Lesenswert?

> - 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.
Gast #969513
Lesenswert?

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
Gast #969527
Lesenswert?

@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.
#969542
Lesenswert?

> 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". ;-)
Gast #969549
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren