www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit Verlgeichen/Sprüngen


Autor: Stefan Friedrich (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe ein Problem bei einem Mehrfachvergleich.

Hardware: ATMEGA 32
          PORTA0..7 Taster (gegen GND geschalten)
          PORTB0..7 LEDS
          (die includes von LCD und Menues im Code sind derzeit 
irrelevant)

Meine Idee war den gesamten Port A (also die Taster) abzufragen und dann 
das Register in dem die eingaben gespeichert werden mit BRNE Befehlen zu 
überprüfen und dann dementsprechen zu reagieren.

Konkret: Taster1 gedrückt Led1 an
         Taster2 gedrückt Led2 an
         Taster3 gedrückt Led3 an

         wenn nichts der Fall ist weiter den Tasterport abfragen...

In der Simulation macht das Prog auch das was es soll.

Im "echten Leben" leuchtet die Led 3 immer beim einschalten, und NUR 
wenn ich den jeweiligen Taster schon beim RESET des µC gedrückt halte 
leuchtet die richtige Led ansonsten bleibts bei Led3 ....

Kann mir vielleicht jemand sagen was ich beim Source falsch gemacht hab 
?


Viele Grüße

Stefan

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du Pusht nur 1-mal, Pops aber 2-mal.
Die Anzahl muss übereinstimmen!

Gut, du brauchst gar nicht zu pushen oder popen. Ein cpi zerstört das 
Register nicht. Wenn du dann noch die BRNE gegen BREQ austauscht und die 
Logik rumdrehst, vereinfacht sich der Code weiter
loop:   
      in temp1, PINA        ; Tasterwerte an Port A einlesen und in Temp1 speichern
      com temp1          ; Temp1 invertieren (da Taster gegen GND schalten und Pullups aktiv)
  
      cpi temp1, 1        ; Temp1 mit Wert 1 Vergleichen
      breq Main1          ; Wenn Taster1 gedrückt Sprung zu Main1

      cpi temp1, 2        ; Temp1 mit Wert 2 Vergleichen
      breq Main2          ; Wenn Taster2 gedrückt Sprung zu Main2

      cpi temp1, 4        ; Temp1 mit Wert 4 Vergleichen
      breq Main3          ; Wenn Taster3 gedrückt Sprung zu Main3

      rjmp loop           ; und wieder von vorne

die cpi sind momentan auch noch insofrn gefährlich, weil da natürlich 
all die anderen Bits vom PINA mit in den Vergleich einfliessen. Du 
solltest zumindest sicherstellen, dass die gezielt auf 0 gesetzt werden, 
egal welchen Zustand sie am physischen Port haben. Einfach mit einem 
ANDI wegmaskieren.
loop:   
      in temp1, PINA        ; Tasterwerte an Port A einlesen und in Temp1 speichern
      com temp1          ; Temp1 invertieren (da Taster gegen GND schalten und Pullups aktiv)

      andi temp1, 7       ; nur die 3 Bits für die Tasten sollen übrig bleiben
                          ; alle anderen auf 0 zwingen
  
      cpi temp1, 1        ; Temp1 mit Wert 1 Vergleichen
      breq Main1          ; Wenn Taster1 gedrückt Sprung zu Main1

      cpi temp1, 2        ; Temp1 mit Wert 2 Vergleichen
      breq Main2          ; Wenn Taster2 gedrückt Sprung zu Main2

      cpi temp1, 4        ; Temp1 mit Wert 4 Vergleichen
      breq Main3          ; Wenn Taster3 gedrückt Sprung zu Main3

      rjmp loop           ; und wieder von vorne

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.