PWM Routine macht probleme

Gast #206389
Lesenswert?
• ▲
▼
hallo ich habe eine routine für den avr 8515 geschrieben. die
interuptroutine wird bei erreichen des timer1 overflow angesprungen.

leider macht die routine nicht das was sie soll.

in der routine wird ein register(count) hochgezählt welches bei
erreichen gewisser werte den port b ein und ausschaltet. bei erreichen
des maxwertes wird das register wieder auf 0 gesetzt und die schleife
beginnt von vorne.

dir routine funktioniert in einem testprogramm innerhalb einer
endlosschleife wunderbar nur im interrupthandler nicht.

kann mir jemand helfen?

kann man interruptroutinen direkt debuggen?


danke für eure hilfe


crishy
Angehängte Dateien:
Gast #206390
Lesenswert?
• ▲
▼
Kann Dir sagen (schreiben), warum es "Grundsätzlich" nicht geht!
Zum einen machst Du in der Timer-ISR ein "rcall löschebit" und bei
"löschebit" machst Du statt einem "ret" ein "rjmp sb_z".
Das schreit direkt nach Stapelüberlauf bzw. ungewollte Rekursion.
Ersetze die 2 rcall in der Timer-ISR durch "RJMP", dann kommst Du
Deinem Ziel ein bißchen näher.
Gast #206391
Lesenswert?
• ▲
▼
Habe gerade noch mal drübergeschaut und da ist mir aufgefallen, das Du
innerhalb der Timer-ISR mit "rjmp WEITER1" und "rjmp WEITER2"
Rückschritte bzw. Schleifen innerhalb der Timer-ISR machst.
Glaube nicht, dass das einwandfrei funxioniert.
Innerhalb eines Frequenzschrittes des Timers sollte doch nur 1 mal die
LED Ein- oder Ausgeschaltet werden und nicht X-mal, oder?
Versuche das mal so umzuformen, das innerhalb eines Timer-Aufrufes nur
eine Aktion ausgeführt wird, ansonsten hängt der AVR "ewig" in der
Timer-ISR fest.

MfG
Andi
Gast #206395
Lesenswert?
• ▲
▼
Ja stimmt.

In dieser Version wird die Variable impuls erst mit dem aufruf
led_reset verändert.

Vorher hatte ich das problem, dass sich die variable wärend des
abzählens verändert und daduch plötzlich der zustand impuls=count nicht
mehr eintraf.
Um nicht einen Durchgang zu verpassen wollte ich auch die prüfung
impuls>=impulsbreite durchführen.

mfg

crishy
Gast #206396
Lesenswert?
• ▲
▼
So wie ich das verstanden habe, willst Du nur EINE LED verschieden hell
leuchten lassen.
Hier eine kleine Version die das selbe macht:

TIM1_OVF:
 push TEMP        ; Sichern von "TEMP" im Stack
 in   TEMP,SREG    ; Einlesen des SREG
 push TEMP        ; Schreiben von  SREG  im Stack (KOPIE)

 ;Timer Startwert
 ldi temp,timerwertHIGH  ;HIGH
 out tcnt1H,temp
 ldi temp,timerwertLOW   ;LOW
 out tcnt1L,temp

 inc count               ;PWM-Counter erhöhen
 cpi count,Pulsenbreite  ;Ist PWM-Counter auf maximum?
 brne CountNoClr         ;Dann von vorne
 clr count               ;...
CountNoClr:
 cp count,Impuls         ;Ist der Counter >= Einschaltzeit?
 brsh LEDaus             ;Dann LED aus
 cbi PortB,7             ;Ansonsten an
 rjmp Weiter
LEDaus:
 sbi PortB,7
Weiter:

 pop  TEMP      ; LESEN von SREG vom STACK (KOPIE)
 out  SREG,TEMP    ; Wiederherstellen von SREG
 pop  TEMP      ; Wiederherstellen von "TEMP"
 reti

Das eigentlich Ein- oder Ausschalten der LED dauert max. 10 Takte.

MfG
Andi

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren