Hi zusammen,
folgende Situation:
ich hab auf einem ATTiny24 den 16-bit Timer (Timer/Counter1) im
"Fast-PWM 10-bit"-Modus laufen (TOP = 3FFF). Dabei läuft der Timer mit
clk/8 = 1MHz wobei clk = 8MHz (interner RC-Oszillator).
Im Overflow-interrupt des selben Timers wird ein Counter (static
uint8_t) gezählt, welcher von 0 bis 64 zählt. Ist der Zähler kleiner 32
wird die LED ausgemacht, sonst an.
Wenn ich mich nicht verrechne, sollte sich also eine Blinkfrequenz von
ca. 1Hz ergeben. Ich messe aber 15Hz... Wo kann der Hund begraben sein?
Beim weiteren testen und messen (OC1A-Pin) stelle ich nun fest, dass ich
hier ebenfalls eine Periodendauer von nur ca. 1ms habe?! Der Timer läuft
also irgendwie zu schnell, nur warum?
hat jemand ne Idee?
Den Prescaler hab ich eigentlich auch schon überprüft und schneller als
8MHz kann der interne Oszillator ja nicht!
Ich hänge wirklich fest. Bitte helft mir auf die Sprünge.
lg Martin
PS: Mein Code (minimal gekürzt ums übersichtlicher zu halten):
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 |
|
4 | #define led_aus() PORTB|=1<<PB0
|
5 | #define led_an() PORTB&=~(1<<PB0)
|
6 |
|
7 |
|
8 | int main ( void ) {
|
9 |
|
10 | PORTB = (1<<PB0);
|
11 | DDRB = (1<<PB0);
|
12 |
|
13 |
|
14 | // Timer1 for Servosetting
|
15 | // clk/8 (1MHz), 10-bit Fast-pwm (16,383ms), non-inverting PWM
|
16 | TCCR1A = (1<<COM1A1) | (1<<COM1B1) | (1<<WGM11) | (1<<WGM10);
|
17 | TCCR1B = (1<<ICES1) | (1<<WGM12) | (1<<CS11);
|
18 | OCR1A = 1500;
|
19 | OCR1B = 1500;
|
20 | TIMSK1 = (1<<ICIE1) | (1<<TOIE1);
|
21 |
|
22 | sei();
|
23 |
|
24 | while(1) {
|
25 | ...
|
26 | }
|
27 | }
|
28 |
|
29 | ISR ( TIM1_OVF_vect ) {
|
30 | static uint8_t cnt = 0;
|
31 |
|
32 | if ( cnt < 32 )
|
33 | led_aus();
|
34 | else
|
35 | led_an();
|
36 |
|
37 | cnt++;
|
38 | if ( cnt >= 64 )
|
39 | cnt = 0;
|
40 | }
|