OCR2 übernimmt Wert nicht!

Gast #1240211
Hallo zusammen,

Ich programmiere gerade eine PWM und muss feststellen dass das Schreiben 
in OCR2 nicht richtig funktioniert. Mein Timer2 macht in einem Durchlauf 
den PWM HIGH Pegel und wird dann so eingestellt, dass die nächsten 8 
Durchläufe das Signal LOW ist. Dann geht es wieder von vorne los. Das 
Problem ist dass das OCR2 nicht funktioniert wie lange der HIGH Pegel im 
ersten Durchlauf ist soll im OCR2 eingestellt werden ABER der HIGH Pegel 
ist immer so lange wie der Zähler selber: 255 (also maximal). Während 
der Pausenzeit ist das OCR2 auch 255 deshalb mein Verdacht, dass das OCR 
den neuen Wert 77 irgendwie nicht annimmt... WARUM???
1
ISR(TIMER2_OVF_vect)
2
{
3
  if(pwmPeriodeCounter == 0)
4
  {
5
    TCCR2  |= (1<<COM20);        // Polung der PWM: INvertierend für const. Low Pegel
6
    OCR2  =  255;            // Für dauerhaft Low Pegel (-->Pause bis 20ms)
7
    pwmPeriodeCounter += 1;        
8
  }
9
  
10

11
  if((pwmPeriodeCounter > 0) && (pwmPeriodeCounter < 9))
12
  {
13
    pwmPeriodeCounter += 1;
14
  }
15

16

17
  if(pwmPeriodeCounter == 9)
18
  {
19
    OCR2  =  77;                  // Übernahme der gewünschten Signallänge 0,7ms ... 2,3ms  
20
    TCCR2  &= ~(1<<COM20);        // Polung der PWM: NICHT - invertierend für Signalerzeugung      
21
    pwmPeriodeCounter = 0;        // Von vorne beginnen ...
22
  }
23
  
24

25
}
#1240225
Dein Problem dürfte das Zusammenspiel von OCR-Setzen und 
Output-Konfiguration sein. Beim PWM-Modus wird der neue OCR-Wert ja erst 
beim nächsten Überlauf übernommen, bei dem wird dann aber auch schon 
wieder die Output-Konfiguration zurück geändert.
Gast #1240264
Hm das versteh nicht, dann werden die Änderungen jeweils erst beim 
nächsten Interrupt übernommen, funktionieren sollte es eigentlich 
trotzdem!? Ich  hab schon an der Reihenfolge geändert, aber das Resultat 
bleibt immer dasselbe, er übernimmt für die HIGHPhase nicht das 
OCR2......
#1240275
Toellner wrote:
> Hm das versteh nicht, dann werden die Änderungen jeweils erst beim
> nächsten Interrupt übernommen, funktionieren sollte es eigentlich
> trotzdem!?

Nein, die Änderungen laufen nicht synchron. TCCR2 wird sofort geändert, 
der neue OCR-Wert wird aber erst beim nächsten Überlauf übernommen.

Ich würde die Änderung der Output-Konfiguration eh ganz weglassen, und 
den  High-Puls über einen Low-Puls mit der inversen Länge machen, also:
OCR = 255 - 77;
Gast #1240285
Danke Stefan,

Danke Dir funktioniert es jetzt einwandfrei und ich kann zufrieden von 
der uni heim :)

Die Idee das ganze invertierend zu machen und einfach 255-xx einzugeben 
ist auch viel eleganter!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.