mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Einfaches Programm ATtiny2313


Autor: AVR Neuling (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
.include "tn2313def.inc"         ; Definitionsdatei für den Prozessortyp einbinden
 
         ldi r16, 0b01100000       ; lade Arbeitsregister r16 mit der Konstanten 0xFF
         out DDRd, r16       ; Inhalt von r16 ins IO-Register DDRB ausgeben
 
         ldi r16, 0b01100000 ; 0b11111100 in r16 laden
         out PORTd, r16      ; r16 ins IO-Register PORTB ausgeben
 

loop:
         in r16, PIND      ; an Port D anliegende Werte (Taster) nach r16 einlesen
  rol r16
  rol r16
         out PORTd, r16    ; Inhalt von r16 an Port B ausgeben
         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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: AVR Neuling (Gast)
Datum:

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

Autor: AVR Neuling (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Andreas W. (geier99)
Datum:

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

Autor: Holger P. (holg_i)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: AVR Neuling (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Mark Leyer (m2k10) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: AVR Neuling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Interessant ^^.
.include "tn2313def.inc"         ; Definitionsdatei für den Prozessortyp einbinden
 
         ldi r16, 0b01100000       ; lade Arbeitsregister r16 mit der Konstanten 0xFF
         out DDRd, r16       ; Inhalt von r16 ins IO-Register DDRB ausgeben
 
         ldi r16, 0b01100000 ; 0b11111100 in r16 laden
         out PORTd, r16      ; r16 ins IO-Register PORTB ausgeben
 

loop:
         in r16, PIND      ; an Port D anliegende Werte (Taster) nach r16 einlesen
     rol r16
     rol r16
         out PORTd, r16    ; Inhalt von r16 an Port B ausgeben
     ldi r16, 0b00011000
     out PORTD, r16
         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.

Autor: AVR Neuling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es funktioniert .. werde ich mich mal angucken was das genau bewirkt hat 
^^.
.include "tn2313def.inc"         ; Definitionsdatei für den Prozessortyp einbinden
 
         ldi r16, 0b01100000       ; lade Arbeitsregister r16 mit der Konstanten 0xFF
         out DDRd, r16       ; Inhalt von r16 ins IO-Register DDRB ausgeben
 
         ldi r16, 0b01100000 ; 0b11111100 in r16 laden
         out PORTd, r16      ; r16 ins IO-Register PORTB ausgeben
 

loop:
         in r16, PIND      ; an Port D anliegende Werte (Taster) nach r16 einlesen
     andi r16, 0b00011000
     lsl r16
     lsl r16
         out PORTd, r16    ; Inhalt von r16 an Port B ausgeben
         rjmp loop         ; Sprung zu "loop:" -> Endlosschleife


Vielen Dank, ich werde wiederkommen.

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.