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.