Hallo,
ich arbeite zur Zeit an Code zu einer Ansteuerung einer
Treiber-Schaltung. Dabei hängen an den beiden OC1A und OC1B ein Treiber
bei dem je nach Typ kein, ein oder beide Eingänge invertiert sind.
Zur Ansteuerung verwendete ich den PWM Mode 8. Die Register sind so
gesetzt:
1 | TCNT1 = 0;
|
2 | // Duty-Cycle
|
3 | OCR1A = 0x10;
|
4 | OCR1B = 0x10;
|
5 | // Periodendauer
|
6 | ICR1 = 0xFF;
|
7 | // keine Ausgabe
|
8 | TCCR1A = 0;
|
9 | // Phase and Freq. Correct PWM, Prescaler = 1
|
10 | TCCR1B = (1 << WGM13) | (1 << CS10);
|
11 | TCCR1C = 0;
|
Das Problem ist, dass im Datenblatt steht, wenn COM1A0 oder COM1B0
gesetzt ist (dies soll in einer boot-sequenz geschehen, die den
treiber-typ erkennt), eigentlich der PORT normal funktionieren soll,
aber er da nicht tut.
Was passiert ist, dass beim Debuggen der Port beim nachträglichen setzen
des COM1A0 Bits invertiert wird. (Das erste was komsich ist)
Wenn das Programm läuft wird zwischendrin die Richtung umgeschalten
(durch setzen und löschen der COM1x1 Bits).
1 | TCCR1A = (TCCR1A & ~(1 << COM1A1)) | (1 << COM1B1);
|
irgendwann gibt es aber einen Kurzschluß, weil der Timer nicht macht was
er soll und der Port nicht den Wert vorgibt, sondern der Timer.
Ist das Problem bekannt?
Wie kann es umgangen (also der Initiale Wert festgelegt werden)?
Gibt es vllt. eine Lösung, die so funktioniert, wie das im Datenblatt
steht?