Hallo, ich habe das USB-162 aus dem Shop und möchte alle 30ms einen Interrupt erzeugen. Hierzu benutze ich den 16bit-Counter1. Näheres zum TIC-Projekt: http://vouswelt.com/index.php?title=TIC Aber irgendwie ist er 8mal langsamer als erwartet. Programmauszug TIC_V0.7:
1 | /* Wird vom 16 Bit Timer ausgelöst, wenn dieser den Vergleichwert erreicht
|
2 | Wird in TIC fuer incremental_value verwendet (Gerhard)
|
3 | */
|
4 | ISR (TIMER1_COMPA_vect) |
5 | {
|
6 | /*Die Incremental_value wird durch den 16bit-counter1 erzeugt
|
7 | */
|
8 | ...
|
9 | time_number++; // nächste LEDx der Bargraphanzeige auswählen |
10 | ...
|
11 | }
|
12 | |
13 | int main(void) |
14 | {
|
15 | ...
|
16 | uint16_t increment_value = 3000; // Wert kann 1 bis 60000 sein |
17 | // entspricht 1 - 60000µs, wenn Vorteiler auf 8
|
18 | // in Wirklichkeit ergibt 3000 nicht 3ms sondern ca. 24ms
|
19 | // WARUM?????
|
20 | ...
|
21 | // Init 16 bit Counter und Freigabe timerinterrupt
|
22 | OCR1A = (uint16_t)(increment_value);// Vergleichwert mit |
23 | //increment_value laden
|
24 | // Takt= 8MHz/8
|
25 | TIMSK1 |= (1<<OCIE1A); |
26 | // Interrupt wenn Timer Vergleichswert erreicht
|
27 | |
28 | TCNT1=0; // Timer1 zurücksetzen |
29 | TCCR1B = 0; //zusätzlich TCCR1B reseten |
30 | |
31 | TCCR1B |= (1<<CS11) | (1<<WGM12);//Timer1 mit Div8 starten (CS11) |
32 | //Clear Counter on Compare Match
|
33 | sei(); // IRQ Behandlung ein |
Ende Programm_Auszug++++++++++++++++++ Ich vertehe nicht, warum nicht alle 3ms (sondern 24ms) der Interrupt kommt, obwohl Vorteiler /8 bei 8Mhz Quarz (=1µs) und OCR1A auf 3000 gesetzt ist?