Hallo, ich bin mal wieder am Verzwifeln mit den Timern vom avr. Der Controller ist ein atmega328 und ich will mit Timer 1(16bit) ein ppm signal mit 50Hz Wiederholfrequenz ausgeben. Soweit mein code. Ich hoff er ist ausreichend kommentiert
1 | #include <avr/io.h> |
2 | |
3 | #ifndef F_CPU
|
4 | #define F_CPU 16000000UL
|
5 | #endif
|
6 | |
7 | uint16_t ppm1, ppm2; |
8 | |
9 | int main (void) { |
10 | |
11 | DDRB = 0xFF; |
12 | |
13 | PRR &= ~(1<<PRTIM1); //enable timer/cunter 1 |
14 | |
15 | // PB1 and PB2 is now an output
|
16 | |
17 | ICR1 = 0x9C40; |
18 | // set TOP to 40 000 equals 50Hz with prescaler of 8
|
19 | |
20 | OCR1A = 0x9C4; //1250ppm (*2) |
21 | // set PPM1
|
22 | |
23 | OCR1B = 0xDAC; //1750ppm (*2) |
24 | // set PPM2
|
25 | |
26 | TCCR1A |= (1 << COM1A1)|(1 << COM1B1); |
27 | // set none-inverting mode
|
28 | |
29 | TCCR1A |= (1 << WGM11); |
30 | TCCR1B |= (1 << WGM12)|(1 << WGM13); |
31 | // set Fast PWM mode using ICR1 as TOP
|
32 | |
33 | TCCR1B |= (1<<CS11); |
34 | // START the timer with 8 prescaler -> increments twice a us
|
35 | |
36 | while(1) { |
37 | asm volatile ("nop"); |
38 | }
|
39 | return 0; |
40 | }
|
Das Problem ist, dass PB1 und 2 (OC1A/B) einfach nicht schalten wollen. Wo/Was ist mein Fehler? Ich hoffe ihr könnt mir helfen. Danke, Andreas