PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Taster als Schalter?



Pollin
29.01.2007, 18:16
Ähm ja wie fragt man das nun......?

Also PORTD wird für AUS und Eingänge genutzt.

Jetzt möchte ich gerne an PIND,PB0 die Positive Flanke abfragen und wenn sie dann kommt einen Merker setzen. Wenn dann wieder eine Positve Flanke kommt den Merker wieder zurück setzten.

In C habe ich was gefunden, nur in Assembler nicht.

linux_80
29.01.2007, 19:48
Hallo,

Du kannnst Dir mal Exclusiv Or (EOR) ansehen,
damit kann man ein Bit sozusagen immer wechseln, mit dem gleichen Befehl.

Dann wäre bei jedem Aufruf, mal das Bit gesetzt, nach der nächsten flanke wieder gelöscht, usw.

Pollin
02.02.2007, 18:58
So hat etwas gedauert, aber nun komme ich mit EOR halbwegs klar und habe mir da auch ein kleines Prog. zusammen gebastelt.

Im Simulator läuft es im Pollinboard ist es gestern auch mal gelaufen, nun habe ich die HEX heute noch mal übertragen aber es läuft nicht mehr.

Die Testtool.hex läuft, also liegt es am Prog. nur ist mir mal wieder nicht klar wieso. Da es ja im Simulator läuft.



.include "m16def.inc"
.def arbeitsregister = r16
.def Tastmerker = r17
.equ Timerwert = 65536 - 100


start:
ldi arbeitsregister, 0b11100000
out DDRd, arbeitsregister
cbi POrtd,pb6
cbi PORTD,PB7

taster: ;Auswahl ob Taster betätigt
sbic PIND,PB2
rjmp reset
sbis PIND,PB2
rjmp taster

reset:
ldi r16,0b00000001
eor r17, r16
cpi r17,0x01
brne lichtaus
breq lichtan

Schleife:
ldi arbeitsregister, (1<<tov1)
out TIFR, arbeitsregister

Timer:
ldi arbeitsregister, HIGH(Timerwert)
out TCNT1H, arbeitsregister
ldi arbeitsregister, LOW(Timerwert)
out TCNT1L, arbeitsregister
ldi arbeitsregister, (1<<CS12)
out TCCR1B, arbeitsregister
loop:
in arbeitsregister, TIFR
sbrs arbeitsregister, TOV1
rjmp loop
rjmp taster

lichtan:
sbi portd,pb6
sbic pind,pb2
rjmp lichtan
rjmp schleife

lichtaus:
cbi portd,pb6
sbic pind,pb2
rjmp lichtaus
rjmp schleife




Wenn der Taster betätigt wird, wird über EOR die LED ein geschaltet.
Ist der Taster wieder 0 springt das Prog in eine Timer Schleife und von dort wieder in die Tasterabfrage.

Wenn der Taster nun betätigt wird, folgt nun der gleiche Ablauf nur das über EOR die LED diesmal Aus statt Ein geschaltet wird.

Pollin
03.02.2007, 09:27
Ich meine das Problem schon etwas eingegrenzt zu haben.

reset:
ldi r16,0x01
eor r17, r16
cpi r17,0x01
brne lichtaus
breq lichtan

Es sollte doch jedesmal beim Aufruf dieses Abschnitts der Wert in r17 gedreht werden und dann mit der Konstanten 0x01 verglichen werden.

Ist der Vergleich i.o. dann gehe zu lichtaus
Ist der Vergleich nicht i.o. dann gehe zu lichtaus

Im Simulator funktioniert das auch, im Prozessor nicht.
Wenn ich lichtaus lichtan tausche, dann geht zwar die LED an.
Aber nicht mehr aus.

?????? 8-[