Ich habe auf meinem ATMega644 eine PWM programmiert, um einen Servo
anzusteuern, und diese funktioniert auf PD5 (OC1A) einwandfrei.
1 | #include <avr/io.h>
|
2 |
|
3 | #ifndef F_CPU
|
4 | #define F_CPU 16000000
|
5 | #endif
|
6 |
|
7 | #include <util/delay.h>
|
8 | #include <avr/interrupt.h>
|
9 | #include <stdio.h>
|
10 | #include <avr/interrupt.h>
|
11 |
|
12 | int main(void)
|
13 | {
|
14 | DDRD = 0xFF;
|
15 | char value = 0;
|
16 |
|
17 | TCCR1A = 0b10100010;
|
18 | TCCR1B = 0b00011010;
|
19 | ICR1 = 0xFFFF;
|
20 |
|
21 | while(1)
|
22 | {
|
23 | OCR1A = 2500;
|
24 | _delay_ms(500);
|
25 | OCR1A = 4500;
|
26 | _delay_ms(2000);
|
27 | }
|
28 | }
|
Da dieser Pin nun allerdings anderweitig verwendet wird würde ich den
Servo gerne an einen anderen Kanal anschließen, hierfür habe ich den
OC0A gewählt, der an PB3 liegt. Hierfür habe ich den Code nun
folgendermaßen geändert:
1 | #include <avr/io.h>
|
2 |
|
3 | #ifndef F_CPU
|
4 | #define F_CPU 16000000
|
5 | #endif
|
6 |
|
7 | #include <util/delay.h>
|
8 | #include <avr/interrupt.h>
|
9 | #include <stdio.h>
|
10 | #include <avr/interrupt.h>
|
11 |
|
12 | int main(void)
|
13 | {
|
14 | DDRB = 0xFF;
|
15 | char value = 0;
|
16 |
|
17 | TCCR0A = 0b10100010;
|
18 | TCCR0B = 0b00011010;
|
19 | ICR1 = 0xFFFF;
|
20 |
|
21 | while(1)
|
22 | {
|
23 | OCR0A = 2500;
|
24 | _delay_ms(500);
|
25 | OCR0A = 4500;
|
26 | _delay_ms(2000);
|
27 | }
|
28 | }
|
Ich habe also nur DDRD ind DDRB geändert und TCCR1A, TCCR1B und OCR1A zu
TCCR0A, TCCR0B und OCR0A geändert, ICR1 bleibt soweit ich weiß
unverändert bzw. könnte man es nicht sogar einfach weglassen?
Allerdings funktioniert das Programm leider nicht. Es lässt sich zwar
compilieren und proggen, in der Praxis bewegt sich der Servo aber kein
Stück.
Wo liegt das Problem? Habe ich eventuell etwas übersehen oder vergessen?