www.mikrocontroller.net

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


Autor: µc-Anfänger (Gast)
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> In dem Programm im Anhang ist vermutlich ein Fehler.

Anhang nicht vorhanden.

Autor: µc-Anfänger (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
jetz aber

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
  while(1)
    {
    if( PINB & 0x02 ) {
      while(1)
      {
        if( !( PINB & 0x02 ) ) {
          lcd_clear();
          while(1)
...

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?

Autor: µc-Anfänger (Gast)
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: fubu1000 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Entprellen

Autor: µc-Anfänger (Gast)
Datum:

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

Autor: µc-Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach ja, falls es was bringt: 16MHz

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> das am anfang geht vielleicht anders besser, aber ich weiß nicht wie.

while (! PINB & 0x02 );
// hier noch ein delay wegen des Prellens
while (PINB & 0x02);

while (1) {

    ...

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wozu sollen denn diese Konstrukte dienen?
                zrck = 1;
                while( PINB & 0x01 ) {
                  // nix machen
                }
                zrck = 0;

Autor: µc-Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@sternst
werd ich morgen beides ausprobieren

ich versuche ja mit

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

auf einen Tastendruck zu warten

Autor: µc-Anfänger (Gast)
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: µc-Anfänger (Gast)
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: µc-Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok mach ich alles morgen.
Danke für die vielen hilfreichen Antworten.

Autor: crazy horse (Gast)
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich selber:
> while (! PINB & 0x02 );

Ups, natürlich: while (!(PINB & 0x02));

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.