.. ich stehe auf dem Schlauch .. F_CPU = 20 MHz .. Timer 1: PWM Mode 14 (Fast PWM, TOP ICR1, Prescaler 8 ) ..
Hmmm, zuerst mal nur so: die Nullen werden üblicherweise nicht geschrieben; zum Start sind die Register genullt und meist schaltet man zur Laufzeit nicht dauernd um . . . WENN Du etwas explizit löschen möchtest dann ist dies üblich:
Code:
TCCR1A &= ~(1<<COM1A1)|(1<<COM1B1); // Clear/set OC1A/OC1B on Cmp Match S132
So. Deine Timer1-initialisierung, modifiziert (und jedenfalls für MICH übersichtlicher und informativer - NUR Befehle machen selbst Profis nicht oft)
Code:
TCCR1A |= (1<<COM1A1)|(1<<COM1B1); // Clear/set OC1A/OC1B on Cmp Match
TCCR1A |= (1<<WGM11); // Mode Fast PWM, TOP ICRn, 1. Teil
TCCR1B |= (1<<WGM13)|(1<<WGM12); // Mode Fast PWM, TOP ICRn, 2. Teil
TCCR1B |= (1<<CS11); // clkI/O/8 (From prescaler)
// => 20e6/8 = 2 500 000
TCCR1C = 0; // Wo in Deinem Code wird denn
// IRGENDEIN Bit auf 1 gesetzt ??
// Würde ich nicht coden
ICR1 = 249; // 10kHz (F_CPU / (Prescaler * (ICR1 + 1)))
// Die 10k sind ein netter Wunsch aber ..
// .. das Timing Diagramm auf S 121 des
// ATmega164A-PA_bis_1284-P_8272G_01-15
// erklärt, dass es doch 20 kHz sind.
// Daher der Name "FAST"-PWM
Anmerkung: Fehler vorbehalten, ich habs ja nicht getestet
)
Bei mir wird z.B. so initialisiert
Code:
// ===== s. Dokument ATmega164A-PA_bis_1284-P_8272G_01-15
// ============================================================================= =
// == PWM-Routinen zur Motoransteuerung
void TC1PWM_init(void) //Init Timer/Counter1 f Erzeugung des PWM-Signals
{ //
TCCR1A &= ~(1<<COM1A1)|(1<<COM1B1); // Clear/set OC1A/OC1B on Cmp Match S132
// DISABLED OC1A/OC1B bzw Port PB1/B2, ERST mit Motorstart enablen
TCCR1A |= (1<<WGM10); // Dazu noch
TCCR1B |= (1<<WGM12); // Fast PWM, 8 Bit TOP=0xFF=dez255 133
TCCR1B |= (1<<CS11); // Prescaler ist clk/8 => 9,8 kHz 135
// theoretisch: 20 MHz / 8 / 255 => 9,803922 kHz, DMM-Messung 9,78 kHz
TIMSK1 &= ~(1<<OCIE1A)|(1<<OCIE1B); // T/C1 Oput CmpA+B Match intrrpt dsabld
TIMSK1 &= ~(1<<TOIE1); // T/C1 Ovrflw intrrpt dsabled ~S137
OCPWM1 = 0; // PWM auf Null setzen
OCPWM4 = 0; // PWM auf Null setzen
isum12 = isum34 = 0;
ie_mot12 = ie_mot34 = 0;
ie_alt12 = ie_alt34 = 0;
} // Ende void TC1PWM_init(void)
// ============================================================================= =
PS: Kleine Erkläuterung zum Nullen eines Bits
Code:
TCCR1A &= ~(1<<COM1A1);
TCCR1A ... Ziel
& ... UND-Operator
&= ... das UND als Zuweisungsoperator,
=> weist das Ziel als Parameter zu
~ ... der unäre Operator bildet das
Bit-Komplement => "1" (in 1<<COM1A1)
wird zur "0"
Lesezeichen