Hallo zusammen, ich würde gerne per int0 einen Zähler von 0 bis 3 zählen lassen, beim vierten in0 soll er wieder von vorne anfangen usw. Das Hochzählen selbst per in0 klappt schon mal, aber das zurückspringen auf 0 will nicht. Wenn ich die beiden auskommentierten Zeilen aktiviere, dann zählt er überhaupt nicht mehr. Assembliert wird aber einwandfrei Hat vielleicht irgendjemand eine Idee, woran das liegen könnte? Viele Grüsse Karl
inc Lauflichtstatus
cpi Lauflichtstatus, 3 ; Lauflichtstatus wird mit 3
verglichen
;breq nichtstun ; Falls das der Fall ist, soll nächste
Zeile
; also das zurücksetzen des Lauflichtstatus
; übersprungen werden
ldi Lauflichtstatus, 0x00
nichtstun:
reti
Hallo Jens, klappt innerhalb der Interrupt-Routine komischerweise nicht. Im normalen Programm ablauf dagegen schon. Oder darf man vielleicht innerhalb Interrupt-Routinen keine Labels setzen? Danke Karl
Hi doch, das kannst du...
ich habs mal bei einer Uhr gemacht...
schnipp
TIM2_OVF:
inc sekunden ;Durchlaufzaehler (Grundtakt) 1 hoch
cpi sekunden, 60 ;Grundtakt -> Teiler auf 60s)
brne weiter ;Wenn nicht -> jump zu weiter
ldi sekunden, 0x00
inc minuten ; Sekunden -> Minuten hochzaehlen
ldi temp, 0b11111101
sbis PINB, 1
ldi temp, 0b11111111
ldi r19, 0b11111110
and temp, r19
out PORTB, temp
ldi hightime, 0
weiter:
cpi minuten, 60 ;Max Minuten wenn 60 dann inc stunden
brne weiter_minuten
ldi minuten, 0x00
inc stunden
weiter_minuten:
cpi stunden, 24 ;Max Stunden wenn 24 dann inc stunden
brne weiter1
ldi stunden, 0x00
weiter1:
sbic PINB, 0
rjmp ende
inc hightime
cpi hightime, 0x02 ;Zeit des Highsignals fuer den Takt
brne ende
schnapp***
PS: muss dein Controller irgendwie eien record im potschreiben
brechen??
loop:
out PORTB, Lauflichtstatus ;r16 ins IO-Register PORTB
ausgeben
rjmp loop
setz das in deine interupt schleife rein
Vielleicht mit brne anstelle von breq? Besser noch auf größer bzw. kleiner testen und nicht auf gleich. Volkmar
Ich gehe jetzt einfach mal davon aus, daß es nicht daran liegt, daß das Zurücksetzen im Code oben auskommentiert ist (obwohl, auch solche Fehler kann es geben). Auf jeden Fall zählt das Beispiel nicht von 0-3, sondern von 0-2, denn bei drei machst Du ja schon wieder eine null draus. Mit inc Register andi Register, 3 reti wäre die Sache übrigens übersichtlich gelöst.
Hallo, sind Deine Tasten richtig entprellt? Sonst könnte es sein, das der Interrupt mehrfach ausgelöst wird, obwohl Du nur einen haben willst. Gruss Andreas
Von 0 bis 3 zählen und dann wieder von vorn kann man ganz leicht ohne "branch", indem man sich immer die oberen 6 bits herausmaskiert. also: inc Lauflichtstatus andi Lauflichtstatus, 0b00000011 Wenn Lauflichtstatus direkt nach dem Inkrementieren dann nämlich gleich 4 ist (binär 0b00000100), dann werden wie gesagt die oberen 6 bits "gelöscht" und es bleibt 0b00000000 über.
Hallo Jens, habe das breq noch durch ein brne ersetzt und jetzt klappts. Danke Karl
Im diesem Fall könnte man auch ohne Conditionals auskommen, in dem der Wert einfach mit 00000011b ver'und'et wird. Das löscht die höheren Bits und nach der drei kommt wieder die null...
@Jens <quote> PS: muss dein Controller irgendwie eien record im potschreiben brechen?? </quote> Gute Frage. Aber bei mir muss in der entgültigen Fassung ein Lauflicht laufen, bei dem auch die ausgeschalteten Lampen noch leicht glimmen. Das mache ich mit Software-PWM innerhalb einer Riesen-Lauflichtschleife. Nun habe ich aber 3 verschiedene Lauflichtarten und zwischen diesen will ich mit meinem Taster umschalten können. D.h. wenn ich auf meinen Taster drücke, wird über den Interrupt mein Lauflichtstatus hochgezählt. Und nun wird je nach Inhalt des Lauflichtes eine der drei Lauflichtloops laufen gelassen. Als nächstes kommt dann noch eine Helligkeitserkennung hinein. Damit wäre das Ding aber auch schon fertig. @Christoph geniale Idee. Darauf würde ich bei meinem momentanen Kenntnisstand nie kommen. Aber wird genauso eingebaut. @Andreas, nein, ich habe die Tasten noch nicht entprellt. Die Taster am STK500 sind aber so gut, dass ich es zu 90% schaffe, mit einem Druck nur einen Interrupt auszulösen. Wenn ich die verschiedenen Lauflichtarten durchsteppe (und das sind ja nur 3) und ich dabei versehentlich doppelt triggere, muss ich halt nochmal durch ;-) Aber du hast natürlich Recht: Ganz sauber ist mein Progrämmchen so noch nicht. Wird wohl der übernächste Schritt. Danke nochmal an euch Alle Karl
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.