Hallo,
ich versuche mit einem Attiny85 und FastPWM ein Servo anzusteuern. Der
Timer wird mit machen Werten wie gewollt resettet, aber OC0B liefert
völlig absurde Werte, die komplett zufällig gewählt wirken. Das ist mein
Code:
1 | #define F_CPU 8000000UL
|
2 |
|
3 | #include <avr/io.h>
|
4 | #include <util/delay.h>
|
5 |
|
6 | void initTimer() {
|
7 | GTCCR = (1 << TSM) | (1 << PSR0); // Timer anhalten und Prescaler reset
|
8 |
|
9 | OCR0A = 10011100; // 8MHz / (1024 * 50Hz) = 156; 20ms
|
10 | OCR0B = 00001000; // 8Mhz / (1024 * 1000Hz) = 8; 1ms
|
11 |
|
12 | TCCR0A =
|
13 | (0 << COM0A1) |
|
14 | (0 << COM0A0) |
|
15 | (1 << COM0B1) |
|
16 | (0 << COM0B0) |
|
17 | (1 << WGM01) |
|
18 | (1 << WGM00);
|
19 | TCCR0B = (1 << WGM02) | (1 << CS02) | (0 << CS01) | (1 << CS00); // prescaler = 1024
|
20 | GTCCR = (0 << TSM); // Timer starten
|
21 |
|
22 | }
|
23 |
|
24 | int main(void)
|
25 | {
|
26 | DDRB |= (1 << PB1);
|
27 | PORTB &= ~(1 << PB1);
|
28 |
|
29 | initTimer();
|
30 |
|
31 | for(;;) {
|
32 | }
|
33 | return 0;
|
34 | }
|
Mit dem Code ist beträgt die Periodendauer 27,5ms und der Puls 0,1ms.
Mit andern Werten funktioniert es auch nicht wie gewollt.
Ich hoffe irgendjemand findet meinen Fehler,
LG.