Forum: Mikrocontroller und Digitale Elektronik OCR2 übernimmt Wert nicht!


von Toellner (Gast)


Lesenswert?

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
}

von spess53 (Gast)


Lesenswert?

Hi

Controller? Simulation/ICE?

MfG Spess

von Toellner (Gast)


Lesenswert?

Hi!

Ich messe direkt mit dem Oszi, Controller ist der ATMEGA16 !

von Stefan E. (sternst)


Lesenswert?

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.

von Toellner (Gast)


Lesenswert?

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......

von Stefan E. (sternst)


Lesenswert?

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;

von Toellner (Gast)


Lesenswert?

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!

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.