Hi!
Ich bin gerade etwas überfordert mit meinem 16bit Timer ohne PWM:
Ich wollte eigentlich nur Mikro und/oder Nanosekunden anzeigen/messen
können. Den Timer habe ich vor längerem mal durch ein Tutorial
aufgebaut, und habe ihn schon des öfteren mal eingesetzt, hier das
Tutorial:
http://www.rn-wissen.de/index.php/Hallo_Welt_f%C3%...)
Ich hab das ganze natürlich etwas umgebaut, und kann prima Millisekunden
vom Systemstart an anzeigen. Jetzt dachte ich mir, wenn Millisekunden
über
1 | #define IRQS_PER_SECOND 2000 /* 500 µs */
|
2 | #define IRQS_PER_MS IRQS_PER_SECOUND/1000 /* 2IRQs pro ms*/
|
berechnen kann, müsste man nur die IRQS pro Sekunde erhöhen (damit beim
teilen keine Kommazahl rauskommt) und das ganze "/1000/1000" rechnen:
1 | #define IRQS_PER_SECOND 1000000 /* 1 µs */
|
2 | #define IRQS_PER_MS IRQS_PER_SECOUND/1000 /* 1000 IRQs pro milli sec*/
|
3 | #define IRQS_PER_MS IRQS_PER_SECOUND/1000 /* 1 IRQ pro mikro sec*/
|
Leider sind die Milliskunden jetzt extrem Langsam - was vorher eine
Sekunde war, sind jetzt sozusagen 10 (kein genauer Wert).
Nun, jetzt kann ich mir leider nicht erklähren, warum das ganze
Langsamer wird - kann es sein das durch Hochzählen der Variable
interrupt_num0 das Programm verlangsamt wird?
1 | SIGNAL (SIG_OUTPUT_COMPARE1A){
|
2 |
|
3 | static uint32_t interrupt_num0;
|
4 | static uint32_t interrupt_num1;
|
5 |
|
6 |
|
7 | if (++interrupt_num0 == IRQ_PER_MILLISEC){
|
8 | interrupt_num0 = 0;
|
9 | msecs++;
|
10 | }
|
11 |
|
12 | if (++interrupt_num1 == IRQ_PER_MICROSEC){
|
13 | interrupt_num1 = 0;
|
14 | microsecs++;
|
15 | }
|
16 | }
|
Ich bin grad etwas Ratlos...
Edit: Ich habe einen ATMega16-16 auf 8Mhz auf meinem Steckbrett.