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!