Hallo,
ich möchte mittels Timer 1 zwei PWMs erzeugen.( µc läuft mit externem 8
MHz Quraz).
Sie soll im modus WGM14 laufen.
Wenn ich das Datenblatt richtig verstanden hab funktioniert doch dieser
Modus so, dass der Timer bis erreichen von ICR1 durchläuft. Bei
erreichen von ICR1 wird dann noch ein Overflow flag gesetzt und der
Timer beginnt bei "0". Während des inkrementieren vom Timer wird immer
mit den Werten in
OCR1A bzw. OCR1B verglichen und bei erreichen wird je nach Konfigurtion
entweder der PIN OC1A / OC1B auf low gelegt.
Das stimmt doch so oder?
Zu Testzwecken habe ich einfach eine LED an PIN PB1(OC1A) bzw. PB2(OC1b)
geklemmt. Leider tut sich da garnix.
HIer mein C-Code:
1 | volatile int pwm_period = 20000; // Variable zu Einstellung der PWM Periodenzeit ( in µs)
|
2 |
|
3 |
|
4 |
|
5 | ISR (TIMER1_OVF_vect)
|
6 |
|
7 | {
|
8 | //Update der Compare Register für die PWM Erzeugung
|
9 |
|
10 | OCR1A = servo1_out;
|
11 | OCR1B = servo2_out;
|
12 | }
|
13 |
|
14 |
|
15 |
|
16 | //Hauptschleife
|
17 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++
|
18 |
|
19 | DDRB |=(1<< PB1); //Ausgang Servo Signal 1 ( OC1A)
|
20 | DDRB |=(1<< PB2); //Ausgang Servo Signal 2 ( OC1B)
|
21 |
|
22 |
|
23 | // Konfig Timer1 für PWM
|
24 |
|
25 | TCCR1A &=~((1<<COM1A0)); // PIN OC1A auf low bei erreichen von OCR1A
|
26 | TCCR1A |=(1<<COM1A1);
|
27 |
|
28 | TCCR1A &=~((1<<COM1B0)); // PIN OC1B auf low bei erreichen von OCR1B
|
29 | TCCR1A |=(1<<COM1B1);
|
30 |
|
31 | TCCR1A &=~((1<<WGM10)); //WGM Mode 14 -> FAST PWM, TOP = ICR1
|
32 | TCCR1A |=(1<<WGM11);
|
33 | TCCR1B |=(1<<WGM12);
|
34 | TCCR1B |=(1<<WGM13);
|
35 |
|
36 |
|
37 | ICR1 = pwm_period; // PWM Periodendauer definieren
|
38 |
|
39 |
|
40 | TCCR1B &=~((1<<CS12)); // Prescaler 1/8 CPU Clock
|
41 | TCCR1A |=(1<<CS11);
|
42 | TCCR1B &=~((1<<CS10));
|
43 |
|
44 | TIMSK |= (1<<TOIE1); // Overlfow ISR erlauben
|
45 |
|
46 | OCR1A = servo1_out;
|
47 | OCR1B = servo2_out;
|
48 |
|
49 |
|
50 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++
|
Hoffe ihr könnt mir helfen, denn leider seh ich meinen Fehler nicht.