Hallo Mikrocontroller-Gemeinde,
ich bin gerade auf der Suche nach einem vermutlich banalen Fehler. GGf.
könnt ihr mir ja weiter helfen. Ich versuche derweil für eine weitere
Funktion einen Timer einzubinden. Hierzu gebe ich zum testen eine LED
zum Blinken am PORTC aus. Der Code sieht aus wie folgt:
1 | #include<avr/io.h>
|
2 | #include<avr/interrupt.h>
|
3 |
|
4 | #define QRGFREQ 8 //Angabe in Mhz
|
5 | #define IRQT 100 // IRQ in t=x sec. (IRQTIME *10ms) (also eig. 1s!)
|
6 |
|
7 |
|
8 | volatile unsigned int get_ADC =1,tenhsec=0;
|
9 |
|
10 | void main(void)
|
11 | {
|
12 |
|
13 | DDRC = 0xFF,
|
14 | PORTC = 0xff;
|
15 | // initialisation of timer and interrupts
|
16 |
|
17 |
|
18 | TCCR1A = 0; //Timer innerhalb des uC, keine externe Hardware
|
19 |
|
20 |
|
21 | TCCR1B =0x01; // Kein Prescaler (Freq/1)
|
22 |
|
23 | //Vergleichswert
|
24 | OCR1AH = (QRGFREQ *1000) >>8; // 10ms
|
25 | OCR1AL = (QRGFREQ *1000) & 0xff; // 10ms
|
26 |
|
27 |
|
28 | // IRQ Enable
|
29 | TIMSK1 = (1<<OCIE1A);//|(1<<TOIE3);
|
30 |
|
31 | //Global freigeben
|
32 | sei();
|
33 | while(1)
|
34 | {
|
35 |
|
36 | }
|
37 | }
|
38 |
|
39 | //-------------------------------------------------------
|
40 | ISR (TIMER1_COMPA_vect)
|
41 | {//Jede 10ms aufgerufen
|
42 |
|
43 | tenhsec++;
|
44 | if (tenhsec ==IRQT)
|
45 | {tenhsec =0;
|
46 | get_ADC ^= 1;
|
47 | PORTC = get_ADC;
|
48 | }
|
49 | }
|
Eigentlich sollte ja nach 1s der CompareValue erreicht sein und die LED
entsprechend blinken. Dies macht sie ja auch! Allerdings ändere ich den
//Vergleichswert
OCR1AH = (QRGFREQ *1000) >>8; // 10ms
OCR1AL = (QRGFREQ *1000) & 0xff; // 10ms
auf andere Werte so ergibt sich die gleiche Geschwindigkeit des Taktes
der LED. Das heißt also, dass der Compare-Wert woandersraus gebildet
wird?
(Forum etc schon nachgestöbert!)
Ggf. banale Lösung ??
Danke schonmal