Hallo zusammen
Ich messe mit einem Interrupt und einem Timer die Periodendauer und
damit ja die Frequenz eines 50 Herz Signales. Dieses kann jedoch
zwischen 45-65Hz variieren.
Dazu mache ich momentan folgendes in meinem Interrupt:
1 | unsigned long uiTemp = 0;
|
2 | cli();
|
3 |
|
4 | TCD0.CTRLA = TC_CLKSEL_OFF_gc; //Clocksource von TCD0 off
|
5 |
|
6 | uiTemp = TCD1.CNT;
|
7 | ulPeriodendauer = (TCD0.CNT | (uiTemp << 16));
|
8 |
|
9 | TCC1.PER = (ulPeriodendauer / 200) - 1;
|
10 |
|
11 | TCD1.CNT = 0;
|
12 | TCD0.CNT = 0;
|
13 |
|
14 | TCD0.CTRLA = TC_CLKSEL_DIV1_gc; //Clocksource von TCD0 ist Sysclock mit 32MHz
|
15 |
|
16 | sei();
|
Nun die Frage, was könnte man hier noch Optimieren?
Denn grundsätzlich verilere ich ja Zählerstellen, sobald ich diesen im
Interrupt deaktiviere bis dieser wieder aktiv ist.
Ich wollte zuerst folgenderweise ulPeriodendauer beschreiben:
1 | ulPeriodendauer = (TCD0.CNT | (TCD1.CNT<< 16));
|
Leider scheint das nicht zu funktionieren.
Der Compiler meldet immer dass shiften sei aufgrund inkompatibler grösse
nicht möglich.
Wenn ich mit dem Debugger reinsehe erhält ulPeriodendauer auch nur den
Weert von TCD0.CNT
Hoffe ihr könnt mir ein paar Tipps geben...
Danke!