Hallo an alle. Ich bin gerade dabei eine Lichtsteuerung mit dem ATtiny13 zu programmieren. Ich habe zwei Lichtkreise und einen Taster über den alles laufen soll. Wenn ich den Taster einmal drücke soll Kreis 1 angehen und nach einer gewissen Zeit ausgehen, dafür gibt es einen extra Kreis der das erledigt. Bei zwei mal drücken geht der Kreis 1 an oder alle aus beu drei mal drücken geht Kreis 2 ein oder alle aus und bei vier mal drücken, gehen beide Kreise an oder aus. Das funktioniert auch alles. Nur irgendwann hängt sich alles auf und ich kann drücken wie ich will, aber nichts geschieht. Wenn ich dann eine Zeit warte fängt er sich wieder und die Zeit geht an. Was habe ich falsch gemacht. Anbei der Code in einer Datei. ICh hoffe auf eure Hilfe.
Ein Nachtrag noch, nach 5 Sekunden wird geschaut wie oft gedrückt wurde und dann wird das auch gemacht. Diese 5 sekunden bekomme ich durch die 15 Interrupts die ich zähle. ICh vermute das es irgendwie daran liegt.
Hi >TIM0_OVF: ;Timer Interrupt > ;com A > inc r18 > reti Du solltest SREG sichern. INC beeinflusst die Flags S, V, N und Z. MfG Spess
Okay das werde ich mal ausprobieren benötige ich das com A?
Hi
>benötige ich das com A?
Wozu? Wird doch nur bei der Initialisierung benutzt.
Allerdings scheint dir der Unterschied zwischen rjmp und rcall nicht so
richtig klar sein. Mit einem rjmp kannst du an beliebige Stellen
springen. Geht mit rcall auch. Aber auf ein rcall muss zwingend früher
oder später ein ret folgen. Sonst läuft dir der Stack über. Da sind wir
gleich beim nächsten gravierenden Fehler: dein Stack ist nicht
initialisiert. Wird auch für die Benutzung von Interrupts benötigt.
MfG Spess
Okay danke für die Hilfe das RJMP das hab ich mal geändert aber wie muss ich den Stack ininalisieren? In dem Buch steht darüber nichts aus dem ich mir das mit dem Timer rausgelesen habe.
Hi >Okay danke für die Hilfe das RJMP das hab ich mal geändert In deinem Programm sollten eher die RCALLs geändert werden. Oder hast du passende Stellen für das RET? >...aber wie muss ich den Stack ininalisieren? Entschuldige. Ich habe gerade im Datenblatt gesehen, das der ATTiny13 das schon selbst macht. Ist aber nicht bei allen AVRs so. Dort wird das z.B. so gemacht:
1 | ldi r16,high(RAMEND) |
2 | out SPH,r16 |
3 | ldi r16,Low(RAMEND) |
4 | out SPL,r16 |
Bei AVRs mit <=256 Byte RAM entfällt das Laden von SPH. MfG Spess
Okay alles klar. Ich habe die RCALL durch RJMP ersetzt und jetzt funktioniert es tadellos. Vielen Dank.
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.