Guten Tag.
Mache gerade die ersten Gehversuche zum Thema AVR mit einem ATtiny2313.
Habe angeschlossen zwei LED`s und zwei Taster.
LED1: PD5
LED2: PD6
Taster2: PD3
Taster3: PD4
Mein Code lauet:
1
.include "tn2313def.inc" ; Definitionsdatei für den Prozessortyp einbinden
2
3
ldi r16, 0b01100000 ; lade Arbeitsregister r16 mit der Konstanten 0xFF
4
out DDRd, r16 ; Inhalt von r16 ins IO-Register DDRB ausgeben
5
6
ldi r16, 0b01100000 ; 0b11111100 in r16 laden
7
out PORTd, r16 ; r16 ins IO-Register PORTB ausgeben
8
9
10
loop:
11
in r16, PIND ; an Port D anliegende Werte (Taster) nach r16 einlesen
12
rol r16
13
rol r16
14
out PORTd, r16 ; Inhalt von r16 an Port B ausgeben
15
rjmp loop ; Sprung zu "loop:" -> Endlosschleife
(bissle Copy and Paste)
Ich will das beim Drücken des einen Tasters die eine LED und beim
Drücken des anderen Tasters die andere Leuchtet.
Momentan ist es so das beim Drücken des Taster3 die LED2 über die Zeit
des Drückens aufleuchtet (so wie es sein soll). Wenn ich Taster2 drück
Leuchtet die LED1 auf und geht nicht wieder aus. Wenn ich nun auf
irgendeinen Taster drücke (selbst wenn er an PD2 angeschlossen ist)
nachdem Taster2 gedrückt wurde leuchtet auch die LED2 auf und geht nicht
aus. Einzige Abhilfe hier ist den Reset zu drücken.
Wie schon gesagt hab ich nochnicht ganz so viel Ahnung und wollte mal
nachfragen woran das liegt.
Hoffe das mir wie sonst gut geholfen wird.
Danke im Vorraus
AVR Neuling schrieb im Beitrag #2049301:
> ldi r16, 0b01100000 ; lade Arbeitsregister r16 mit der> Konstanten 0xFF
Die erste Anweisung im ersten Programm und eins von beiden ist bereits
falsch: Die Konstante oder der Kommentar.
Ich bin mir recht sicher das der Faher darin liegt die von den Tastern
ausgelesenen Informationen zur Seite zu schieben sodass sie auf den
LED`s liegen und dann auszugeben.
Zunot währe es auch super wenn jemand ein solches Programm "kurz"
schreiben könnte (dürfte ja nicht so schwer sein ^^, welches ich mir
dann anschauen wie das gemacht wurde. (Wer weiß .. nachher sind meine
AVR hinüber).
Sltte das so aussehen?
PD0 PD1 PD2 PD3 PD4 PD5 PD6 PD7
xx xx xx TA1 TA2 LED1 LED2 xx
R16 = xx xx xx TA1 TA2 LED1 LED2 XX
PD0 PD1 PD2 PD3 PD4 PD5 PD6 PD7
rol R16= xx xx xx xx Ta1 TA2 LED1 LED2
rol R16= LED2 xx xx xx xx TA1 TA2 LED1
PD5=TA1
PD6=Ta2
Du liest mit PIND auch die Ausgänge mit ein, also den LED-Status. bei
ROL schiebst du die irgendwann ins Carry-Flag und verschiebst die
weiter, da selbiges nicht gelöscht wird, damit aktivierst du die
Pull-ups an den Tastern (sind dann dauerhaft gedrückt) und gibt's dann
diesen Wert wieder aus.
Spendier nach 'in r16, PIND', ein 'andi r16, 0b00011000', und/oder nimm
statt den ROL LSL.
Ist vielleicht auch gar nicht verkehrt, erstmal mit dem Tutorial hier
anzufangen, die Demo-programme dort laufen und man kann sehen, wie's
richtig gemacht wird.
.include "tn2313def.inc" ; Definitionsdatei für den Prozessortyp einbinden
2
3
ldi r16, 0b01100000 ; lade Arbeitsregister r16 mit der Konstanten 0xFF
4
out DDRd, r16 ; Inhalt von r16 ins IO-Register DDRB ausgeben
5
6
ldi r16, 0b01100000 ; 0b11111100 in r16 laden
7
out PORTd, r16 ; r16 ins IO-Register PORTB ausgeben
8
9
10
loop:
11
in r16, PIND ; an Port D anliegende Werte (Taster) nach r16 einlesen
12
rol r16
13
rol r16
14
out PORTd, r16 ; Inhalt von r16 an Port B ausgeben
15
ldi r16, 0b00011000
16
out PORTD, r16
17
rjmp loop ; Sprung zu "loop:" -> Endlosschleife
Nun ist es so:
Wenn man den Taster3 drückt leuchten LED1 und LED2 auf. Wenn man ihn
loslässt geht die LED2 wieder aus aber die LED1 leuchtet weiter. Wenn
man weiter Taster3 drückt Leuchtet die LED2 während des Tastendrucks,
LED1 leuchtet dauerhaft.
Wenn man Taster1 betätigt währen die LED1 leuchtet so erlischt sie, wenn
nichts leuchtet geht auch nichts an beim drücken von Taster1.
Durch Taster2 geht die LED1 an und bleicht leuchten bis sie z.B. durch
Taster1 deaktiviert wird ^^.
Irgendwas ist da nochnicht richtig.