Hallo,
ich möchte zwei PWM-Signale mit dem ATmega3290p erzeugen. (Sollen zwei
Motoren steuern) Dazu verwende ich den "Phase and Frequency Correct PWM
Mode" und den Counter1.
Wenn ich nur ein Signal Erzeuge (OCR1A), funktionier mein Programm mit
dieser Einstellung super:
1 | // Bit 7:6 - COM1A1:0: Compare Output Mode for Unit A
|
2 | TCCR1A &= ~(1<<COM1A1); // Toggle OC1A on Compare Match
|
3 | TCCR1A |= (1<<COM1A0); // Toggle OC1A on Compare Match
|
Jedoch steht im Datenblatt, dass dann der zweite Counter (OCR1B) nicht
verwendet werden kann.
Ändere ich diese Einstellung nun also um, funktioniert leider gar nichts
mehr:
1 | // Bit 7:6 - COM1A1:0: Compare Output Mode for Unit A
|
2 | TCCR1A |= (1<<COM1A1); // Clear OC1A/OC1B on Compare Match when upcounting
|
3 | TCCR1A &= ~(1<<COM1A0); // Clear OC1A/OC1B on Compare Match when upcounting
|
Kann mir vielleicht jemand sagen was ich falsch mache?
Ich habe mal meinen Code, der für einen Counter funktioniert mit
eingefügt:
1 | // PRR-Power Reduction Register: PRTIM1 = 0
|
2 | // Power Reduction Timer/Counter1 = off
|
3 | PRR &= ~(1<<PRTIM1);
|
4 |
|
5 | // TCCR1A-Timer/Counter1 Control Register A
|
6 | // Bit 7:6 - COM1A1:0: Compare Output Mode for Unit A
|
7 | TCCR1A &= ~(1<<COM1A1); // Toggle OC1A on Compare Match
|
8 | TCCR1A |= (1<<COM1A0); // Toggle OC1A on Compare Match
|
9 |
|
10 | // Bit 1:0 - WGM11:0: Waveform Generation Mode
|
11 | TCCR1A &= ~(1<<WGM11); // PWM, Phase and Frequency Correct
|
12 | TCCR1A |= (1<<WGM10); // PWM, Phase and Frequency Correct
|
13 |
|
14 | // TCCR1B - Timer/Counter1 Control Register B
|
15 | // Bit 4:3 - WGM13:2: Waveform Generation Mode
|
16 | TCCR1B |= (1<<WGM13); // PWM, Phase and Frequency Correct
|
17 | TCCR1B &= ~(1<<WGM12); // PWM, Phase and Frequency Correct
|
18 |
|
19 |
|
20 | // TCNT1H and TCNT1L - Timer/Counter1
|
21 | TCNT1H = 0x00; // set counter to 0
|
22 | TCNT1L = 0x00; // set counter to 0
|
23 |
|
24 | // TCCR1B - Timer/Counter1 Control Register B
|
25 | // Bit 2:0 - CS12:0: Clock Select
|
26 | TCCR1B &= ~07; // clear settings before
|
27 | //---------------------------------------------------------
|
28 | // OCR1AH and OCR1AL - Output Compare Register 1 A
|
29 | OCR1AH = 0xFF; // continuously compared with value TCNT1
|
30 | OCR1AL = 0x00; // continuously compared with value TCNT1
|
31 | //---------------------------------------------------------
|
32 | TCCR1B |= 0x01; // clk_IO/1 (No prescaling)
|
33 | // TCCR1B |= 0x02; // clk_IO/8 (From prescaler)
|
34 | // TCCR1B |= 0x03; // clk_IO/64 (From prescaler)
|
35 | // TCCR1B |= 0x04; // clk_IO/256 (From prescaler)
|
36 | // TCCR1B |= 0x05; // clk_IO/1024 (From prescaler)
|
37 |
|
38 | // TCCR1C-Timer/Counter1 Control Register C
|
39 | // only active when the WGM13:0 bits specifies a non-PWM mode
|
40 | TCCR1C = 0x00; // for compatibility with future devices
|
41 |
|
42 | //Set Bit5 of PortB as output
|
43 | DDRB |= 0x20;
|