PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Einfach nur mit Taster eine LED ein und aus schalten ?



Ferdinand
09.06.2008, 21:57
Hallo

Ich möcht ein Programm schreiben das mit "Taster" "LED's" Ein und mit selber Taste Aus zu schalten ist.

Mein bis bisheriger versuch.





.include "m8def.inc"


;------------------------------------------------------
; Initialisierungen
;------------------------------------------------------
ldi r16, 0xFF ; lade Arbeitsregister r16 mit der Konstanten 0xFF
out DDRB, r16

ldi r16, 0x00
out DDRD, r16

ldi r19, 0x00 ; Lade register r19 mit der Konstanten 0x00

ldi r20, 0x00 ; Lade register r20 mit der Konstanten 0x00

ldi r17, 0x00 ; LED Wert

;------------------------------------------------------
; HAUPTSCHLEIFE
;------------------------------------------------------

Hauptschleife:


in r20, PIND ; an Port D anliegende Werte (Taster) nach r20 einlesen

cpse r20, r19 ; wen beide register gleich sind dan ueber springe den nechsten schrit

rjmp s ;Sprung nach s

rjmp Hauptschleife ;Sprung nach Hauptschleife
s:
eor r17, r20

out PORTB, r17

SprungXY1:

in r17, PIND ; an Port D anliegende Werte (Taster) nach r11 einlesen

cpse r20, r17 ; wen beide register gleich sind dan ueber springe den nechsten schrit

rjmp s2

rjmp Hauptschleife ;Sprung nach Hauptschleife
s2:
eor r20, r17

out PORTB, r20

rjmp Hauptschleife

;end



Ich weis nicht mehr weiter und habe noch keine Erfahrung in Assembler.

Ich Benutze ein STK500 und ein ATMega8.

Mit freundlichen Grüßen Ferdinand.

Besserwessi
10.06.2008, 17:26
Es macht relativ wenig Sinn am Anfang erst den Port als Ausgang und dann gleich wieder als Eingang zu Schalten.

Bei einlasen des Tasters sollte man nur ein Bit Testen. Das macht man z.B. ANDI r12, #0x10. Der vergleich über CPSE ist zwar möglich, aber gerade für den Anfang eher unüblich. Ich benutzte den Befehl eher selten, gängiger sidn da die bedingten Sprünge über BREQ und BRNE. Das Programm sollte man mal im Simulator als einzelschritt durchlaufen lassen, dann sieht man eigentlich ganz gut was passiert. Zum lernen ist der Simulator wirklich gut. Man vergisßt sonst leich das das Programm mit rasender Geschwindigkeit läuft. Es fehlt hier z.b. ein Entprellen der Taste, wenn das Prgramm mit mehr als etwa 1 kHz laufen soll.

JonnyP
13.06.2008, 09:08
Als erstes gewöhn dir an den Stackpointer zu initialisieren (ob du ihn in diesem Programm brauchst oder nicht).


INIT: LDI r16 LOW (RAMEND) ;Initiate Stackpointer
OUT SPL, r16
LDI r16, HIGH(RAMEND)
OUT SPH, r16


Hauptschleife:

in r20, PIND ; an Port D anliegende Werte (Taster) nach r20 einlesen
out portB, r20 ;..und an port B (LEDs) wieder ausgeben

rjmp Hauptschleife ;Sprung nach Hauptschleife

Taster einlesen und Ausgabe an LEDs in Endlosschleife mal als Anfang.