Forum: Mikrocontroller und Digitale Elektronik Programmierfehler? C Anfänger Atmega8


von µc-Anfänger (Gast)


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.

von Stefan E. (sternst)


Lesenswert?

> In dem Programm im Anhang ist vermutlich ein Fehler.

Anhang nicht vorhanden.

von µc-Anfänger (Gast)


Angehängte Dateien:

Lesenswert?

jetz aber

von Stefan E. (sternst)


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?

von µc-Anfänger (Gast)


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.

von Stefan E. (sternst)


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.

von fubu1000 (Gast)


Lesenswert?

Entprellen

von µc-Anfänger (Gast)


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

von µc-Anfänger (Gast)


Lesenswert?

ach ja, falls es was bringt: 16MHz

von Stefan E. (sternst)


Lesenswert?

> 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
    ...

von Stefan E. (sternst)


Lesenswert?

Wozu sollen denn diese Konstrukte dienen?
1
                zrck = 1;
2
                while( PINB & 0x01 ) {
3
                  // nix machen
4
                }
5
                zrck = 0;

von µc-Anfänger (Gast)


Lesenswert?

@sternst
werd ich morgen beides ausprobieren

ich versuche ja mit

while( PINB & 0x00 ) {
 // nix machen
}

auf einen Tastendruck zu warten

von µc-Anfänger (Gast)


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.

von Stefan E. (sternst)


Lesenswert?

> 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;

von µc-Anfänger (Gast)


Lesenswert?

nein die sind richtig angeschlossen.
bei der auswahl auf dem lcd werden die (seiten-)zahlen nicht richtig 
angezeigt.

von Stefan E. (sternst)


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". ;-)

von µc-Anfänger (Gast)


Lesenswert?

ok mach ich alles morgen.
Danke für die vielen hilfreichen Antworten.

von crazy horse (Gast)


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.

von Stefan E. (sternst)


Lesenswert?

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
Noch kein Account? Hier anmelden.