Dr. Sommer schrieb:
> lex7 schrieb:
>> hiermit bekomme ich auch eine doppelte Ausgabe:
>
> Die andere Version mit uint8_t liefert genauso doppelte Ausgaben - die
> sind halt nur immer "0" ;-) Daher ist das println(temp) da auch etwas
> sinnlos, weil temp da eh immer 0 ist.
>
> lex7 schrieb:
>> Aber klar, die ISR wird nur alle 10ms ausgeführt, da kann der loop()
>> doppelt durchlaufen werden.
>
> Ja, eigentlich sogar noch viel schneller. Das println bremst es
> wahrscheinlich.
Sicher, aber das Grundkonzept ist schon Unsinn. Wenn man einen Vorgang
mit einer Frequenz X anstoßen will, dann DIREKT!
1 | volatile uint16_t countISRTimer1=0;
|
2 | volatile uint8_t isr_flag=0;
|
3 |
|
4 | ISR( TIMER1_COMPA_vect ) // every 10ms
|
5 | {
|
6 | ++countISRTimer1;
|
7 | if ( (countISRTimer1 & 0x7F) == 0) isr_flag = 1; // fast modulo operation
|
8 | }
|
9 |
|
10 | void setup() {
|
11 | //...
|
12 | }
|
13 |
|
14 | void loop() {
|
15 |
|
16 | if (isr_flag) {
|
17 | isr_flag=0;
|
18 | cli ();
|
19 | uint16_t temp = countISRTimer1;
|
20 | sei ();
|
21 | Serial.println(temp);
|
22 | }
|
23 | }
|
Das ist eindeutig und laufzeitunabhängig (es sei denn, die Ausgabe per
UART läuft mit 10 Baud).