Hallo, ich brauche ein wenig Hilfe. Mein Programm soll folgendes machen: Die Eingangsfrequenz (INT1) bewegt sich im Bereich von ca. 30-300 Hz. Die Ausgangsfrequenz (wackeln an beliebigem Pin) bis ca. 20-30% +/- . Das Problem ist, es kommen immer wieder Aussetzer in unregelmäßigen Abständen (mit Osci kontr.). Vermutlich Timereinstellungen. Wer hat einen Tip?
1 | // Atmega8
|
2 | // Timer1 Timer2 16Mhz Clock
|
3 | |
4 | |
5 | #include <avr/io.h> |
6 | #include <avr/interrupt.h> |
7 | #include <math.h> |
8 | |
9 | volatile int Takt; |
10 | int T2; |
11 | volatile double Eingang; |
12 | volatile double x = (-0.9916); |
13 | int main(void) |
14 | {
|
15 | TCCR2 |= (1 << WGM21); //CTC Timer2 |
16 | |
17 | GICR |= (1<<INT1); |
18 | MCUCR |= (1<<ISC10) | (0<<ISC11); //Any logical change on INT1 generates |
19 | // an interrupt request.
|
20 | |
21 | TIMSK |= (1 << OCIE2) | (1<<OCIE1A); //Interrupt compare match Timer1+2 |
22 | |
23 | |
24 | |
25 | TCCR2 |= (1 << CS22) | (1 << CS21) | (1 << CS20); //Priscaler 1024 Timer2 |
26 | |
27 | |
28 | TCCR1B |= (1 << WGM12); //CTC Timer1 |
29 | TCCR1B |= (1 << CS11) | (1 << CS10); // Prescaler 64 |
30 | sei(); // enable interrupts |
31 | |
32 | |
33 | DDRB |= (1 << PB1); |
34 | |
35 | while (1); |
36 | {
|
37 | ; // Die Berechnung hier bringt nur Hausnummern ????? |
38 | }
|
39 | }
|
40 | |
41 | ISR(INT1_vect) |
42 | {
|
43 | Takt++; |
44 | |
45 | }
|
46 | |
47 | ISR (TIMER2_COMP_vect) |
48 | {
|
49 | T2++; |
50 | if (T2 == 30) //~61 = 1 Sekunde |
51 | {
|
52 | Eingang = Takt; |
53 | Takt = 0; |
54 | T2 = 0; |
55 | OCR1A = (pow( Eingang, x )*120221); //y = 120221x-0,9916 |
56 | }
|
57 | |
58 | }
|
59 | |
60 | |
61 | ISR(TIMER1_COMPA_vect) |
62 | {
|
63 | PORTB ^= (1 << PB1); |
64 | }
|