Forum: Mikrocontroller und Digitale Elektronik Softstarter und TIMER0


von Herb B. (s-stoerung)


Lesenswert?

Hallo,

ich habe folgendes Problem.
Ich realisiere zurzeit einen Softstarter für Motoren und die Hardware 
funktioniert prima und ist auch nicht das Prob.
Sondern die Software... Genauergesagt der Timer0.
Daten:
Prozessor: ATMEGA168
11,0592 Mhz
Phasenanschnitt
Der Nulldurchgang kommt über ne fallende Flanke jede Periode rein und 
löst den Interrupt0 aus.
Die Triacs hängen an OC0A und OC0B bzw. PD5 und PD6.
Ich synchronisiere jeden Nulldurchgang den Timer0 im Interrupt und lade 
dann die Zündvariable OCR0B ins Compare Register um den ersten triac bei 
Compare in der ISR zu zünden, durch setzen der Ausgänge oder toggeln des 
timers.
 Bei diesem CompareB ISR lade ich dann auch den nächsten Wert ins OCR0B 
um beim 2. Compare wieder abzuschalten.

Jetzt sieht es aber so aus als ob ich wärend des laufenden Timers keinen 
neuen Wert in OCR0B oder A schreiben kann.
Zumindest habe ich nur ein Compare wärend einer Periode... Das ist 
merkwürdig. Weiß da einer genau über den compare bescheid???
Mir ist schon klar das die Werte größer sein müssen da sonst der timer 
schon vorbei is ;)

TNX

von Hc Z. (mizch)


Lesenswert?

Ja, das ist so.  Du bekommst pro Durchlauf nur einen Interrupt / eine 
Flanke, da die Änderung erst beim Überlauf übernommen wird:
1
The OCR0x Registers are double buffered when using any of the Pulse Width Modulation
2
(PWM) modes. [..] The double buffering synchronizes the update of the OCR0x Compare
3
Registers to either top or bottom of the counting sequence.

von Hc Z. (mizch)


Lesenswert?

Wenn Du den PWM-Ausgang abschaltest, kannst Du das Compare-Register so 
oft setzen, wie Du lustig bist und bekommst jedes Mal (bei jedem Match) 
einen Interrupt.  Vielleicht ist es also eine Lösung, den OC0x nicht von 
der PWM-Logik aus setzen zu lassen, sondern „von Hand“ im 
OC0x-Interrupt.  Der Jitter ist dann natürlich größer.

von Herb B. (s-stoerung)


Lesenswert?

ok, hab aber vergessen zu sagen das ich im normal mode bin.
Dort kann pro Timer durchlauf und CompareA oder B auch nur ein Interrupt 
ausgelöst werden? Ich hab nur gelesen das im normal mode die register 
nicht double buffered sind.

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.