Daniel M. wrote:
> Ich möchte per Taster der an PORTD 5 liegt eine LED anschalten die an
> PORTD 6 liegt anschalten.
Wie sind die Taster angeschlossen?
Wie ist die LED angeschlossen?
Wenn der Taster nichtgedrückt ist, was bekommst du? Eine 1 oder eine 0?
Brauchst du Pullup Widerstanände für die Taster oder sind die extern
verbaut?
Wie muss der LED Ausgabepin gesetzt werden, damit die LED leuchtet? Auf
0 oder auf 1?
> init:
> ;Stackpointer setzen
> ldi tmp, LOW(RAMEND)
> out SPL, tmp
> ldi tmp, HIGH(RAMEND)
> out SPH, tmp
An dieser Stelle solltest du die DDR Register richtig stellen, und ab da
dann in Ruhe lassen. Für den Anfang ist es sicherer, die
Port-Einstellungen als Initialisierung anzusehen: einmal einstellen und
dann bleibt der komplette Port so eingestellt.
> ldi tmp,0b11101111
> out DDRD, tmp
Schreib das besser als:
ldi tmp, 1 << PD7 | 1 << PD6 | 1 << PD5 |
1 << PD3 | 1 << PD2 | 1 << PD1 | 1 << PD0
dann muss man nicht lange Bits zählen um zu wissen, welcher Pin denn nun
auf Ausgang geschaltet ist. BTW. Warum schaltest du so viele Pins auf
Ausgang, wenn doch eh nur an einem eine LED hängt?
> loop:
> ;Port auslesen
> in r16,PIND
Dir ist schon klar, dass du hier nicht nur den Zustand von PD4 bekommst,
sondern vom kompletten Eingabe Port. Die restlichen Pins, an denen kein
Taster hängt, haben auch irgendeinen Wert.
> ldi r17, 0b00010000
schreib das besser als:
ldi r17, 1 << PD4
Macht genau dasselbe aber man braucht nicht lange Bits zählen um zu
wissen, welches Bit gemeint ist.
> cp r16,r17
Wie gesagt: in r16 stehen die Zustände aller 8 Eingapepins dieses Ports.
Nicht nur der von PD4. Wenn r16 gleich r17 ist (in dem nur PD4 gesetzt
ist), dann ist das Zufall, da du dich nicht um die restlichen Bits in
r16 gekümmert hast (zb. mittels einem ANDI definiert auf 0 gesetzt hast)
> brne loop
> ;Port auf Ausgabestellen und LED an
> ldi tmp,0b00100000
ldi tmp, 1 << PD5
> out DDRD,tmp
Dir ist hoffentlich auch klar, dass du hier auch deinen Eingabpin auf
PD4 ebenfalls beeinflusst. In dem Fall ist das egal, weil PD4 auch
vorher schon auf Eingang war. Im Grunde ist das hier überflüssig, da
auch PD5 vorher schon auf Ausgang war.
-> Gewöhn dir an: In der Initialisierungsphase werden die DDR Register
richtig eingestellt, und dann lässt man sie in Ruhe. Es sei denn, man
muss dezidiert einen Pin in der Richtung umschalten. Aber dann muss man
besondere Vorsicht walten lassen, damit man die Konfiguration der
anderen Pins nicht verändert.
> out PORTD,tmp
>
> end:
> rjmp end