www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PWM Routine macht probleme


Autor: crishy (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Andi K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andi K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: crishy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für deine hilfe andi.

Autor: crishy (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
juhu! die routine funktioniert jetzt. im anhang die letzte version.

Autor: Andi K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: crishy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andi K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: crishy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.