Forum: Mikrocontroller und Digitale Elektronik Microcontroller hängt sich auf und fängt sich wieder


von Peter (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Peter (Gast)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von Peter (Gast)


Lesenswert?

Okay das werde ich mal ausprobieren benötige ich das com A?

von spess53 (Gast)


Lesenswert?

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

von Peter (Gast)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von Peter (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.