Symbol Counter-ul este un periferic al transceiver-ului din ATMega128RFA1 ce are rol de timer dar este proiectat în special pentru a ajuta în dezvoltarea stivelor wireless. Dintre funcționalitățile speciale pe care le are amintim:
Perifericul se regăsește în capitolul 10 al datasheet-ului pentru procesorul ATMega128RFA1. Regiștrii de control principali sunt:
SCCR0
controlează mai mulți biți de setări, dintre care folosim:SCEN
bit-ul de Enable pentru Symbol CounterSCCKSEL
selectarea ceasului de origine pentru ceasul symbol counter-ului (care este fixat la 62.5kHz)SCTSE
selectează procedura de timestamping pentru pachetele care ajung la transceiver. Timestamp-ul se regăsește în regiștrii SCTSR
(SCTSRHH
, SCTSRHL
, SCTSRLH
, SCTSRLL
).SCCMP1
, SCCMP2
, SCCMP3
selectează modul de lucru cu pragurile (pragurile fiind regăsite în regiștrii pe 32 de biți SCOCR1
, SCOCR2
, SCOCR3
)SCCR1
, care nu are biți de control necesari pentru implementarea temei
Scrierile în registrul counter de 32 de biți (SCCNT
) nu sunt instantanee și se poate aștepta terminarea lor prin așteptarea bitului SCBSY
din registrul de stare SCSR
while (SCSR & _BV(SCBSY));
Întreruperile pentru depășirea pragurilor sunt SCNT_CMP1_vect
, SCNT_CMP2_vect
și SCNT_CMP3_vect
și sunt activate din registrul SCIRQM
.
Datorită duratei lungi de updatare a registrului SCCNT, se recomandă următorul mod de lucru:
SCCNT
rtcCompareValue
din codul ce urmează este o variabilă globală de 32 de biți ce menține pragul curentvoid delayTimer(uint32_t delay) { rtcCompareValue += (uint32_t) delay; SCOCR1HH = (uint8_t) ((rtcCompareValue >> 24) & 0x000000ff); SCOCR1HL = (uint8_t) ((rtcCompareValue >> 16) & 0x000000ff); SCOCR1LH = (uint8_t) ((rtcCompareValue >> 8) & 0x000000ff); SCOCR1LL = (uint8_t) ((rtcCompareValue) & 0x000000ff); while (SCSR & _BV(SCBSY)); }