Forum: Mikrocontroller und Digitale Elektronik PWM Routine macht probleme


von crishy (Gast)


Angehängte Dateien:

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

von Andi K. (Gast)


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.

von Andi K. (Gast)


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

von crishy (Gast)


Lesenswert?

danke für deine hilfe andi.

von crishy (Gast)


Angehängte Dateien:

Lesenswert?

juhu! die routine funktioniert jetzt. im anhang die letzte version.

von Andi K. (Gast)


Lesenswert?

Schön, das es nun funtzt.
Aber das mit dem "rjmp WEITER1" und "rjmp WEITER2, muß das sein?
Kostet doch nur unnötig Zeit in der Timer-ISR, oder nicht?

MfG
Andi

von crishy (Gast)


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

von Andi K. (Gast)


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

von crishy (Gast)


Lesenswert?

hallo andi deine routine funktioniert wunderbarbar, wärend ich meine
vergessen kann... und ich komm nicht drauf wo der hund begraben liegt.

danke nochmals.

crishy

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.