www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bitmanipulation bei Flanke durch Tastendruck, Anfänger braucht einen Tip..


Autor: Christoph D. (00-diddi-00)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin gerade dabei, eine Art "Kostenzähler" für unseren Stromzähler 
mit SO-Schnittstelle zu prorammieren. Leider bin ich noch Anfänger in 
Sachen Microcontroller, aber jeder hat ja mal irgendwie angefangen.

Mi Hilfe des hervorragenden Assembler Tutorials für den Atmega8 bin ich 
auch schon ziemlich weit gekommen, aber nun verzweifle ich an einer 
scheinbar einfachen Aufgabe. Die Situation ist folgend:

Ich verwende einen Atmega8 in Verbindung mit einem 2*16 LCD Display. Ich 
möchte gerne zwei Anzeigemodi realisieren. Im ersten Modus wird die 
Uhrzeit und das Datum angezeigt, im zweiten Modus de Zählerstand und die 
daraus berechneten Stromkosten. Über ein Bit in einem "Flag"-Register 
wird esteuert, welcher "Modus" angezeigt werden soll. Beide Modi für 
sich funktionieren bereits sehr gut (derzeit stelle ich um durch 
manuelles manipulieren am entsprechenden Flag-Bit im Source-Code)

Ich möchte nun das entsprechende Bit durch eine positive Flanke am Pin 0 
des PORTD umschalten. Hierzu mein leider nicht funktionsfähiger 
Source-Code:
Tastensteuerung: 
   in    temp2, PIND
   andi  temp2, 0b00000011
   lds   temp1, stellung_alt        ; Tastenstellung vom letzten Durchlauf
   mov   temp3, temp1
   eor   temp1, temp2
   sts   stellung_alt, temp2        ; alte Tastenstellung mit Status Quo überschreiben

Taste_1:
    sbrs temp1, 0 
  rjmp Taste_1_keinflankenwechsel ; sprung, tastendruck hat sich nicht geändert!!
 Taste_1_flankenwechsel:
    cp    temp1, temp3
    breq  Tastendruck               ; sprung, taste wurde gedrückt
    rcall delay5ms                  ; anweisungen, taste wurde losgelassen -> entprellen durch warten
    rcall delay5ms
    rjmp  main     
  Tastendruck:
    rjmp Bit_aendern
                          
 Taste_1_keinflankenwechsel:
    rcall delay5ms
  rcall delay5ms
  rjmp  main

 Bit_aendern:
   ldi   temp2, 0b00000001
   eor   flag, temp2
   rcall delay5ms
   rcall delay5ms
   rjmp  main

Leider reagiert das Display nicht auf Tastendruck, ich habe keine Ahnung 
wo der Fehler in meinem Code liegt. Zum Test habe ich mal einen 
primitiven Code eingefügt, der nur auf Tastendruck und nicht auf Flanke 
reagiert. Das hat auch gut funktioniert, allerdings wurde ein 
Tastendruck gerne mehrmals gewertet,...

Bitte entschuldigt meinen sicherlich miserablen Programmierstil, aber 
wie gesagt, ich bin noch Anfänger und gerne bereit zu lernen.
Es würde mich sehr freuen, wenn mir jemand einen Hinweis zu meinem 
Problem geben könnte.

Autor: Ben ___ (burning_silicon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
in dem code blick ich nicht durch... was sollen die ganzen EORs da.

check doch einfach ob die taste gedrückt ist, wenn ja wartest du solange 
bis sie wieder losgelassen wurde und zählst danach einen hoch. das sind 
doch nur kurze impulse wenn ich mich nicht irre.

Autor: Christoph D. (00-diddi-00)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

das erste eor benutze ich um zu erkennen, ob ein Zustandswechsel am 
entsprechenden Pin aufgetreten ist. Ist dies der Fall, müsste das 
Ergebnis des eor's 1 sein. Danach überprüfe ich durch Vergleich mit dem 
"alten Zustand", ob die Taste gedrückt oder losgelassen wurde.

Das zweite eor soll gerade das zu manipulierende Bit ändern. Hochzählen 
würde weitere Bits des flag Registers ändern, diese haben in meinem 
restlichen Code allerdings andere Aufgaben (werden auch als Flags 
verwendet)

Ich gebe zu, dass mein Code sicherlich nicht die elleganteste Lösung 
darstellt. Falls ich ihn funktionstüchtig bekomme, würde ich ihn aber 
gerne für die Verwendung mehrerer Tasten ausbauen. Aber im Moment stehe 
ich bzgl. Fehlerfindung echt auf dem Schlauch :-(

Gruß
Diddi

Autor: Naja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Christoph D. (00-diddi-00)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank fur Eure Antwoten, Anregungen.

Ich habe das Problem inzwischen selbst lösen könnn. Hatte vergessen vor 
dem Vergleich die entsprechenden Bits zu maskieren. Dementsprechend war 
das Ergebnis des Vergleichs stets negativ...

Gruß
Diddi

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.