Hallo,
ich versuche gerade ein Programm auf den ATtiny1606 zu portieren. Im
ursprünglichen Projekt, geschrieben für ATmega328, Wird der Timer
gestartet und im weiteren Programmverlauf gestoppt, das Interval neu
berechnet und neu gestartet.
Das versuche ich gerade bei dem 1606 mit dem TCA0 zu konfigurieren.
Leider wird der Interrupt scheinbar nicht korrekt ausgeführt und wenn,
dann hat die Variable timerInterval keinen Einfluss auf die Zeit. Hier
mein Versuch.
1 | void startTimer(uint32_t timerInterval)
|
2 | {
|
3 | if ( timerInterval > 0 )
|
4 | {
|
5 | TCA0.SINGLE.CTRLA = 0; // Stop timer
|
6 | TCA0.SINGLE.INTFLAGS = TCA_SINGLE_CMP0_bm; // Clear interrupt flag
|
7 |
|
8 | TCA0.SINGLE.CTRLB = TCA_SINGLE_ALUPD_bm; // enabled Auto Lock Update
|
9 | TCA0.SINGLE.CTRLB = TCA_SINGLE_WGMODE_FRQ_gc; // Frequency Mode
|
10 | TCA0.SINGLE.CTRLA = TCA_SINGLE_CLKSEL_DIV8_gc; // Prescaler
|
11 |
|
12 | if (timerInterval > 65535) {
|
13 | TCA0.SINGLE.CMP0H = (65535 >> 8);
|
14 | TCA0.SINGLE.CMP0L = (65535 & 0xFF);
|
15 | } else {
|
16 | TCA0.SINGLE.CMP0H = (timerInterval >> 8);
|
17 | TCA0.SINGLE.CMP0L = (timerInterval & 0xFF);
|
18 | }
|
19 |
|
20 | TCA0.SINGLE.INTCTRL = TCA_SINGLE_CMP0_bm;
|
21 | TCA0.SINGLE.CTRLA |= TCA_SINGLE_ENABLE_bm; // enable TCA module
|
22 | timerOn = true;
|
23 |
|
24 | }
|
25 |
|
26 | }
|
27 |
|
28 | void stopTimer()
|
29 | {
|
30 | TCA0.SINGLE.CTRLA = 0; // Stop timer
|
31 | TCA0.SINGLE.INTCTRL = 0; // Disable interrupts
|
32 | timerOn = false;
|
33 |
|
34 | }
|
35 |
|
36 | ISR (TCA0_CMP0_vect)
|
37 | {
|
38 | TCA0.SINGLE.INTFLAGS = TCA_SINGLE_CMP0_bm; // Clear interrupt flag
|
39 | }
|
Bin jetzt bereits knapp eine Woche dabei diesen Timer zu bändigen, aber
ohne Erfolg. Hoffe, Ihr könnt mir helfen.
VG
Matze