PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Phase correct mode Fragen



manhunt
14.12.2008, 16:16
Hallo

Also ich habe gerade den Quellcode von oberallgeier(siehe ganz unten), und dabei haben sich einige Frage aufgetan.

Nun er schreibt:
TCCR1A |= (1<<COM1A1); //Clear/set OC1A on Compare Match doc S132

Aber müsste er nicht auch noch COM1A0 löschen um wirklich sicher zu gehen das "Clear/set OC1A..." eintritt?

Das nächste wäre das er mit folgendem Code den Phase correct mode Aktiviert.
TCCR1B |= (1<<WGM13);

Nun das leuchtet mir auch ein nur im Daten Blatt steht:

In phase correct PWM mode the counter is incremented until the counter value matches either
one of the fixed values 0x00FF, 0x01FF, or 0x03FF (WGM13:0 = 1, 2, or 3), the value in ICR1
(WGM13:0 = 10), or the value in OCR1A (WGM13:0 = 11).

Nun WIE bringt man WGM13:0 auf "10" damit zB. ICR1 schluss ist? (finde das nicht im Quellcode)

Hoffe ihr könnt mir helfen.

Danke schon mal dafür.

lg Manhunt





/* ================================================== ============================ */
/* == PWM-Routinen zur IRLED-ansteuerung auf OC1A/PB1 ======================= */
void TC1PWM_init(void) //Init Timer/Counter 1, PWM-Signal
{ // PWM aktivieren
TCCR1A |= (1<<COM1A1); //Clear/set OC1A on Compare Match doc S132
// also Port PB3, vgl. auch PWM-routine unten
TCCR1B |= (1<<CS10); // cs10 <=> clk/1 => no prescaling doc S 134
TCCR1B |= (1<<WGM13); // PWM, Phase+Frequency correct doc S 134
ICR1 = 278; // =>PWM-Frequenz 20MHz/(2*278) => 36,0kHz/27,8µs
/* Interrupts deaktivieren. Siehe Registerbelegung :
mega168 Bit7 6 5 4 3 2 1 0
TIMSK1 – – ICIE1 – – OCIE1B OCIE1A TOIE1
im m168 ? ? ? ? ? ? ? ? */
//
TIMSK1 &= ~(1<<OCIE1A); // Tmr/Cntr1 Oput CompA/B Mtch intrrpt disab
TIMSK1 &= ~(1<<OCIE1B); // Tmr/Cntr1 Oput CompA/B Mtch intrrpt disab
TIMSK1 &= ~(1<<TOIE1); // Tmr/Cntr1 Overflow interrupt disabled
}
/* ================================================== ============================ */
void setSRV1(uint16_t speed1) //Relative Pulslänge auf OC1A/PB1
{OCR1A = speed1;} // z.B. für SFH5110
/* ================================================== ============================ */


Ah zu Frage 2 bin ich schon fündig geworden, mit "10" meinen Die modus "10" (Atmega datenblatt 133) und der Quellcode von oberallgeier läuft allso im Modus 8.

So nun bleibt nur mehr Frage 1.

McJenso
15.12.2008, 19:52
Hallo,

ne Angabe zum Controller währe nett. :mrgreen:
Da die Funktion init im Namen trägt, wird sie wohl nur einmal nach einem Reset ausgeführt. Warum willst du ein Register auf Null setzen, dass bei einem ordentlichen Reset eh Null ist? Im Datenblatt findest du bei der Beschreibung der Register immer die Angaben, ob sie lesbar oder schreibbar (r/w) sind und wie sie initialisiert werden.

Gruß

Jens

manhunt
15.12.2008, 20:46
Controller ist Atmega168

Thx is mir jetzt auch klar.

Lg manhunt