Symbol Counter

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:

  • Counter pe 32 de biți, la un ceas de 62.5kHz, ceea ce înseamnă o resetare a counter-ului după maxim 19 ore, față de o secundă cât acordă un timer pe 16 biți fără prescaler
  • Timestamp automat instantaneu pentru începutul unui pachet sau pentru pachete speciale (parte din standardul 802.15.4)
  • rularea pe ceasul transceiver-ului, ceea ce înseamnă că procesorul poate intra în stări de conservare a energiei și poate fi trezit din acestea de la acest periferic
  • 3 praguri de comparație
  • alinierea unei unități de counter cu un simbol transmis pe wireless
  • Scriere atomică a regiștrilor de 32 biți, sincronizată cu octetul cel mai puțin semnificativ

Interfață

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 Counter
    • SCCKSEL selectarea ceasului de origine pentru ceasul symbol counter-ului (care este fixat la 62.5kHz)
      • Platforma simulată (development kit-ul pentru procesor, atmega128rfa1-ek1, are un cristal de 32.768 kHz
    • 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).
      • Ne-ar fi trebuit informații de timestamping dacă nu consideram nodurile complet sincronizate
    • 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:

  • la Inițializare se ia delay-ul inițial dorit și se adună la valoarea curentă a lui SCCNT
  • în fiecare întrerupere de prag se “amână” întreruperea de ceas cu următorul delay
  • rtcCompareValue din codul ce urmează este o variabilă globală de 32 de biți ce menține pragul curent
void 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));
}
si/teme/scounter.txt · Last modified: 2020/05/19 22:10 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0