Hallo,
hab grad mal eine kleine Übung gemacht und hab hier ein eigentümliches
Verhalten das eine Led so halb leuchtete obwohl sie von de logic
eigentlich aus angehen soll wenn ein Taster nicht gedrückt ist.
Kann mir das mal jemand erklären?
Unser Lehrer auf der VHS hat uns das als aufgabe mitgegeben mal
irgendwas neben dem Interrupt zu machen, aber er wusste anscheinend das
das Probleme gibt.
Hier der Code:
Fritz Bie schrieb:> hab grad mal eine kleine Übung gemacht und hab hier ein eigentümliches> Verhalten das eine Led so halb leuchtete obwohl sie von de logic> eigentlich aus angehen soll wenn ein Taster nicht gedrückt ist.> Kann mir das mal jemand erklären?
Nö, eigentlich sollte das so funktionieren, wie du es gepostet hast.
Ansonsten gäbe es aber trotzdem eine Menge an dem Programm zu bemeckern.
> mainloop:> sbis ioPIND,2 ;Taster offen
Der Kommentar ist schonmal Mist, bei einer Verzweigung sollte man
insbesondere so kommentieren, daß nachvollziehbar ist, welcher der
beiden möglichen Wege unter welcher Bedingung genommen wird
> rjmp end> cbi ioPORTC,0 ;Led aus> rjmp raus> end: sbi ioPORTC,0 ;Led an> raus: rjmp mainloop
Zwei der drei Sprünge sind völlig überflüssig und wenn schon
überflüssige Sprünge (für ein Lernprogramm ist sowas durchaus
akzeptabel), dann sollte man aber wenigstens sinnvolle Namen für die
Labels der Sprungziele vergeben.
Also die langsame Variante mit den überflüssigen Sprüngen sollte
ungefähr so aussehen:
mainloop:
sbis ioPIND,2 ;Taster offen?
rjmp led_an ;ja
cbi ioPORTC,0 ;nein: LED aus
rjmp mainloop_end
led_an:
sbi ioPORTC,0
mainloop_end:
rjmp mainloop
> ; Takt : 3,6864 MHz> .equ F_CPU, 1000000
Das widerspricht sich fürchterlich, das ist aber im Rahmen dieses
Programms irrelevant. Allerdings würde die zweite Zeile überhaupt nicht
assembliert werden können. Diese Tatsache läßt mich stark vermuten, daß
das gepostete Programm mal wieder nicht mit dem identisch ist, was du
tatsächlich auf deinem Controller laufen lassen hast...
> onTC0:> cli ;Interrupts sperren
Unnötig, beim Eintritt in eine ISR sind die Interrupts ohnehin gesperrt.
> sei ;Interrupt freigeben
Das ist genauso unnötig (wird sowieso vom nachfolgenden reti erledigt)
Hallo, danke für die Hinweise!!!!
werd ich gleich mal umsetzen.
Fehler gefunden!
es war tatsachlich der fehlende PUll-UP Befehl. Mit funktioniert es wie
es soll!
Danke an alle!!!
MfG Fritz