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


von Christoph D. (00-diddi-00)


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:
1
Tastensteuerung: 
2
   in    temp2, PIND
3
   andi  temp2, 0b00000011
4
   lds   temp1, stellung_alt        ; Tastenstellung vom letzten Durchlauf
5
   mov   temp3, temp1
6
   eor   temp1, temp2
7
   sts   stellung_alt, temp2        ; alte Tastenstellung mit Status Quo überschreiben
8
9
Taste_1:
10
    sbrs temp1, 0 
11
  rjmp Taste_1_keinflankenwechsel ; sprung, tastendruck hat sich nicht geändert!!
12
 Taste_1_flankenwechsel:
13
    cp    temp1, temp3
14
    breq  Tastendruck               ; sprung, taste wurde gedrückt
15
    rcall delay5ms                  ; anweisungen, taste wurde losgelassen -> entprellen durch warten
16
    rcall delay5ms
17
    rjmp  main     
18
  Tastendruck:
19
    rjmp Bit_aendern
20
                          
21
 Taste_1_keinflankenwechsel:
22
    rcall delay5ms
23
  rcall delay5ms
24
  rjmp  main
25
26
 Bit_aendern:
27
   ldi   temp2, 0b00000001
28
   eor   flag, temp2
29
   rcall delay5ms
30
   rcall delay5ms
31
   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.

von Ben _. (burning_silicon)


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.

von Christoph D. (00-diddi-00)


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

von Naja (Gast)


Lesenswert?


von Christoph D. (00-diddi-00)


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

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.