Forum: Mikrocontroller und Digitale Elektronik Einfaches Programm ATtiny2313


von AVR Neuling (Gast)


Lesenswert?

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

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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.

von AVR Neuling (Gast)


Lesenswert?

Da ist noch das Kommentar vom Copy and Paste Falsch ^^. (LED`s sind 
gegen Masse geschaltet und Taster ziehen auf +)

von AVR Neuling (Gast)


Lesenswert?

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).

von Andreas W. (geier99)


Lesenswert?

das schieben ist schon richtig, bloss solltest du vor dem schieben das 
Register R16  mit 0b00011000 maskieren.

von Holger P. (Gast)


Lesenswert?

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

von AVR Neuling (Gast)


Lesenswert?

Warum muss ich das mit 0b00011000 beschreiben? Das wird doch sobald er 
die Taster ausließt wieder überschrieben oder irre ich mich? (Test it)

von Mark L. (m2k10) Benutzerseite


Lesenswert?

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.

von AVR Neuling (Gast)


Lesenswert?

Interessant ^^.
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
     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.

von AVR Neuling (Gast)


Lesenswert?

Es funktioniert .. werde ich mich mal angucken was das genau bewirkt hat 
^^.
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
     andi r16, 0b00011000
13
     lsl r16
14
     lsl r16
15
         out PORTd, r16    ; Inhalt von r16 an Port B ausgeben
16
         rjmp loop         ; Sprung zu "loop:" -> Endlosschleife

Vielen Dank, ich werde wiederkommen.

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.