| I. Continuazione dell'articolo precedente Nella sezione precedente abbiamo appreso insieme l'implementazione di semplici interrupt esterni. Dopo aver fatto esperienza pratica con gli interrupt, in questa sezione parleremo degli interrupt del timer.Il CC2430 dispone di 4 timer, che possono essere suddivisi in 3 categorie: Timer1, Timer2, Timer3/4 (l'uso del 3 e del 4 è lo stesso). Dal momento che l'autore ha appena toccato il CC2430, il progetto che coinvolge l'esperienza del timer è fondamentalmente zero, quindi non ho intenzione di (e non posso aiutare) l'analisi approfondita del timer. Questo articolo si occupa solo dell'utilizzo dell'interrupt di overflow del conteggio del timer 1 per fare una semplice esplorazione sperimentale, mentre la funzione di cattura degli ingressi/confronto delle uscite/PWM viene omessa. Anche i timer 2 e 3/4 sono introdotti solo brevemente. In attesa che il potere dell'autore raggiunga un certo livello di fuoco, e poi stare all'altezza dell'esperienza di combattimento Zigbee per migliorare questo saggio. Timer 1 Il Timer1 è un timer a 16 bit con funzioni di timer/counter/modulazione di larghezza d'impulso. Dispone di tre canali di cattura/confronto degli ingressi programmabili individualmente, ciascuno dei quali può essere utilizzato come uscita PWM o per catturare il tempo del bordo del segnale di ingresso (per ulteriori informazioni su cosa sia la cattura/confronto degli ingressi e su come implementare le uscite PWM, i lettori possono fare riferimento al manuale cinese del CC2430). Il timer ha un concetto molto importante: la modalità di funzionamento. Le modalità di funzionamento comprendono: free-running, modulo e up-down. Di seguito viene riportata l'introduzione delle tre modalità dal manuale cinese del CC2430:
Confrontando le tre modalità, si può notare che: il valore di overflow della modalità free-running è 0xFFFF e non è modificabile; mentre le altre due modalità possono essere controllate con precisione assegnando un valore a T1CC0 per controllare con precisione il valore di overflow del timer. Questo esperimento sfrutta questa caratteristica per far sì che il timer attivi un interrupt ogni 1s attraverso lo specifico T1CC0, in modo da controllare con precisione l'intervallo di lampeggio del LED di 1s. (1) Introduzione all'esperimento Nella modalità modulo del timer, l'intervallo di lampeggiamento del LED è controllato con precisione a 1s, ovvero: luce 0,5s → buio 0,5s → luce 0,5s → buio 0,5s ...... → luce 0,5s → buio 0,5s (cioè il momento di transizione da buio a luce è 1s). L'inversione luce/buio viene realizzata tramite un interrupt di overflow. (2) Diagramma di flusso del programma (3) Calcoli correlati Come già detto, lo stato del LED è: luminoso 0,5s → scuro 0,5s → luminoso 0,5s → scuro 0,5s ...... → chiaro 0,5s → scuro 0,5s, e devono essere raggiunti con l'interrupt di overflow, quindi il periodo di overflow del temporizzatore deve essere di 0,5s. A tal fine, è necessario calcolare il valore di overflow corrispondente (temporaneamente impostato su N). La frequenza di clock del sistema è selezionata a 32 MHz e la frequenza di clock fornita al timer è di 16 MHz per impostazione predefinita (entrambe sono configurate dal registro speciale CLKCON, disponibile nel manuale cinese del CC2430). Per il timer 1, impostare la frequenza di clock a 128 divisioni. In sintesi, la formula può essere la seguente:
c
Scopri N = 62500, il suo esadecimale è 0xF424, cioè, è necessario impostare T1CC0H = 0xF4, T1CC0L = 0x24 che è .
(4) codice sorgente sperimentale e analisi/* Descrizione dell' esperimento: esperimento Timer1, overflow del conteggio del timer, lampeggiamento del LED1 */ #include #define led1 P1_0 # define led2 P1_1 #define led3 P1_0 #define led3 P1_1
1 #define led3 P1_2 #define led4 P1_3 &
n bsp; /* inizializzazione del clock di sistema-------------------------------------------------------*/void xtal_init( void ) { SLEEP &=~0x04;& nbsp; // entrambi si accendonomentre (! (SLEEP & 0x40 )); // oscillatore a cristalli acceso e stabile CLKCON &=~0x47; &
nbsp; //seleziona l'oscillatore a cristallo a 32 MHz SLEEP |=0x04; }/*Inizializzazione dei LED-------------------------------------------------------*/void led_init( void ) { & nbsp; P1SEL = 0x00; //P1 è una normale porta di I/O P1DIR |=0x0F; & nbsp; //P1.0 P1.1 P1.2 P1.3 uscite led1 =1; &
nbsp; //Spegni tutti i LED led2 =1; led3 =1; led4 =1; }/*Inizializzazione del T1---------------------------
- ---------------------------*/void timer1_init( void ) {EA=1; // attiva l'interrupt totale & nbsp; T1IE=1; // attiva l'interrupt T1OVFIM=1; // attiva l'overflow T1
i nterruptT1CC0L=0x24; /valore di overflow basso 8 bit T1CC0H=0xF4; /valore di overflow alto 8 bit &
nbsp; T1CTL =0x0e; //128 divisioni; modalità modulo (0x0000->T1CC0); avvio dell'esecuzione;T1IF=0; &
nbsp; // cancellare il flag di interrupt }/* funzione principale-------------------------------------------------------*/void main( void
) { xtal_init(); led_init(); timer1_init();while ( 1 ); &
nbsp; //attendere l'interrupt per overflow }/*Subroutine di servizio del terminale T1-------------------------------------------------------*/#pragma vector=T1_VECTOR __interrupt
v oid T1_ISR( void ) {EA=0; //off interrupt led1 = !
led1; //LED invertitiEA=1; //On interrupt  
; T1CTL &=~0x10; // cancella il flag di interruzione } OK, compilare il programma e il debug online, la scheda di sviluppo sul LED1 lampeggia come previsto, sentire l'intervallo lampeggiante di circa 1s. Ma questo non è sufficiente a dimostrare il successo dell'esperimento, se è possibile determinare rigorosamente l'intervallo di 1s sarebbe perfetto ~ così ho aperto l'orologio WIN 7 (fare clic sul lato destro del tempo barra delle applicazioni può essere). Mentre guardavo la lancetta dei secondi, ho dato un'occhiata al LED1 lampeggiante con la coda dell'occhio. Il risultato è: in due minuti, il ritmo dei due è sostanzialmente identico (questa precisione può essere tollerata ~). A questo punto, l'esperimento può dirsi sostanzialmente completato, hehehe~ Terzo, Timer 2 Il timer 2, noto anche come timer MAC, è stato progettato appositamente per supportare il protocollo di tracciamento degli eventi nel MAC IEEE 802.15.4. Il timer è dotato di un overbooking a 8 bit e di un'uscita di sicurezza a 8 bit. Il timer ha un contatore di overflow a 8 bit che può essere utilizzato per registrare il numero di cicli che si sono verificati; ha un registro di cattura a 16 bit che viene utilizzato per registrare l'ora esatta in cui viene ricevuto/trasmesso un delimitatore di inizio frame o l'ora esatta in cui viene completata una trasmissione; contiene inoltre un registro di confronto di uscita a 16 bit che viene utilizzato per generare vari segnali di comunicazione selettivi di comando al modulo wireless in un momento specifico (inizio ricezione, inizio trasmissione, ecc.). Timer 3/4 Il timer 3/4 è un timer a 8 bit con funzioni di timer/counter/PWM. t3/t4 dispone di due canali di confronto in uscita, ciascuno dei quali può essere utilizzato come uscita PWM. V. Conclusione In questa sezione abbiamo appreso il metodo di conteggio dell'interrupt di overflow del timer 1 e abbiamo ottenuto il controllo preciso dell'intervallo di lampeggiamento del LED di 1 s. Ci limiteremo a sfiorare gli altri timer, per poi tornare ad aggiungerli in seguito. Nella prossima sezione introdurremo la comunicazione con la porta seriale del CC2430. |