Gast
#5000821
Hallo alle zusammen,
folgendes Problem hat mich eben einige Zeit an Nachdenken gekostet! Und
ich frage mich, ob man das auch intelligenter lösen kann.
Es geht um den Befehl "brsh check_weiter". Es funktioniert soweit, dass
alle 1 s zu "check_weiter" gesprungen wird. Allerdings wird jedes 2. Mal
bereits nach 0,2 Sekunden zu "check_weiter" gesprungen. Nach viel Zeit
mit dem Debugger habe ich herausgefunden, dass es vorkommt, dass der
Timer0 Interrupt genauf auf den Befehl "brsh check_weiter" fällt.
Während des Interrupts scheint u.a. das Z-Flag gecleared zu werden und
deshalb springt der uC dann direkt zu "check_weiter", obwohl die
entsprechende Zeit noch nicht erreicht ist. Ich habe das jetzt so
gelöst, dass ich bei "check_weiter" erneut "cpi timer0cs, 10" frage
gefolgt von "brlo loop_Eingabe"
Kennt jemand eine elegantere Möglichkeit dieses Problem zu lösen? Wie
kann ich verhindern, dass ein Timer Interrupt direkt auf einen Befehl
wie brsh fällt und diesen durch die Flags beeinflusst?
Für die, die etwas mehr Hintergrundinfo möchten:
Es handelt sich um einen Zähler für einen Prüfstand. Bei jedem Zyklus
wird ein Kontakt geschlossen ("ZZaehler"). Dieses schließen findet aber
äußerst geprellt statt. Deshalb warte ich nach einem Kontakt 0,1 s und
inkrementiere dann den Zähler. Wird der Kontakt innerhalb dieser 0,1 s
erneut geschlossen, wird der Zähler resettet.
Anbei ein leicht geänderter Ausschnitt aus dem Code:
> loop_Eingabe:
> sbis PINB, ZZaehler
> rjmp check
> cpi timer0cs, 10
> brsh check_weiter
> sbis PINB, Auswahl
> rjmp Nullstellen
> sbis PINB, nachlinks
> rjmp links
> sbis PINB, nachrechts
> rjmp rechts
> rjmp loop_Eingabe
>check:
> sbr Flagreg, 2
> clr timer0
> clr timer0cs
> rjmp loop_Eingabe
>check_weiter:
> cpi timer0cs, 10
> brlo loop_Eingabe
> sbrs Flagreg, 1
> rjmp check_Ende
> inc Zyklus
>Check_Ende:
> clr timer0
> clr timer0cs
> rjmp loop_Eingabe
>;###################################################################### #
>Timer0_overflow: >;Timer0 zählt in Centi- und Sekundenschritten
> push temp1
> inc timer0
> cpi timer0, 50
> brne Timer0_overflow_Ende
> clr timer0
> inc timer0cs
>Timer0_overflow_Ende:
> pop temp1
> reti