架构师_程序员_码农网

N Recupera la password
Registrazione

QQ登录

Un solo passo per iniziare

Ricerca
架构师_程序员_码农网 "架构师 ' 管理专区&Management Area ' Reclami e suggerimenti ' 回收站 ' 【转】Zigbee之旅(三):几个重要的CC2430基础实验- . - ...
Vista:4624|Risposta: 0
打印 上一主题 下一主题

[转]Zigbee之旅(三):几个重要的CC2430基础实验--Interruzione esterna

[Copia link]
S 跳转到指定楼层
al proprietario dell'edificio
发表于 2014-10-30 23:16:46|只看该作者回帖奖励 | Scorri all'indietro|Modalità di lettura
I. Passaggio dalla lezione precedente a quella successiva

  Nella lezione precedente abbiamo familiarizzato con il processo di base dello sviluppo di programmi CC2430 in IAR attraverso un piccolo esperimento con il più semplice lampeggiamento di un LED. Il coltello è stato almeno affilato (anche se non sono molto bravo con questa pietra per affilare) e ora è il momento di iniziare a macellare gli insetti :). Quindi, impariamo alcuni esperimenti di base con il CC2430. Ogni piccolo esperimento è suddiviso in "introduzione sperimentale", "diagramma di flusso del programma", "codice sorgente sperimentale e analisi", tre parti della descrizione.

  Questo articolo spiega l'interrupt esterno.

Secondo, l'interrupt esterno(1) Introduzione all'esperimento

  L'interrupt è un microcontrollore in tempo reale che si occupa di eventi interni o esterni, un meccanismo interno. Quando si verifica un qualche tipo di evento interno o esterno, il sistema di interruzione del microcontrollore costringe la CPU a mettere in pausa il programma in esecuzione, ma per andare all'elaborazione dell'evento di interruzione, l'elaborazione dell'interruzione è completa, e poi tornare ad essere interrotto dal programma, continuare ad eseguire.

  Gli interrupt si dividono in interrupt esterni e interrupt interni; il CC2430 contiene un totale di 18 sorgenti di interrupt (per la descrizione specifica degli interrupt e la definizione dei vettori di interrupt, consultare il " Manuale cinese del CC2430 ").

  Ora diamo un'occhiata allo schema elettrico di questa scheda di sviluppo:

  La scheda di sviluppo è stata collegata al tasto S1 e a P0.1; l'effetto che questo esperimento vuole ottenere è quello di attivare l'interrupt di P0.1 premendo il tasto S1, per poi controllare l'accensione/spegnimento del LED1 nella subroutine del servizio di interrupt.

(2) Principio sperimentale e diagramma di flusso

  Il diagramma di flusso dell'esperimento è il seguente:

2011021811430713.png
c













(
3) Codice sorgente sperimentale// file header#include // sottofunzione delay#define led1 P1_0#define led2 P1_1#define led3 P1_2#define led4 P1_3void Delay( unsigned n) { & &



nbsp; unsigned tt;for (tt = 0;tt<n;tt++);for (tt = 0;tt<n;tt++);for (tt = 0;tt<n;tt++); &






nbsp; for (tt = 0;tt<n;tt++);for (tt = 0;tt<n;tt++); }//inizializzazione del cristallo 32Mvoid xtal_init( void ) { SLEEP &=~0x04; &
nbsp; //l'accensione è completamentre (!
(SLEEP & 0x40 )); // oscillatore a cristallo acceso e stabile CLKCON &=~0x47; &






nbsp; //Seleziona l'oscillatore a cristallo a 32 MHz SLEEP |=0x04; }//Inizializzazione del LEDvoid led_init( void ) { P1SEL =0x00; &nbsp


; //P1 è una normale porta di I/O P1DIR |=0x0F; //P1.0 P1.1 P1.2 P1.3 Uscita








led1 = 0; led2 = 0; led3 = 0; led4 = 0; }//inizializzazione I/O e interrupt esternivoid io_init( void ) { P0INP &=~0X02;



/ /P0.1 ha pull-up e pull-down EA =1; //Abilitazione totale dell'interrupt P0IE =1; &



nbsp; //P0 abilita l'interrupt PICTL |=0X09; //P0.1 abilita l'interrupt della porta, innesco del fronte di discesa P0IFG &=~0x02







/ /P0.1 interrupt flag clear 0 };//funzione principalevoid main( void ) { xtal_init(); led_init();








io_init();while ( 1 ); //attende l'interrupt }//subroutine di servizio per l'interrupt#pragma vector = P0INT_VECTOR__interrupt void P0_ISR( void ) { EA =0;

/ / disattiva l'interrupt Ritardo





( 10000 ); Ritardo(10000 ); Ritardo(10000 ); Ritardo(10000 ); Ritardo(10000 ); &

nbsp; if ((P0IFG & 0x02 ) >0 ) //interruzione del tasto { P0IFG &=~0x02; &


nbsp; //P0.1 flag di interrupt clear 0 led1 = !led1; } P0IF =0; &

nbsp; //P0.1 flag di interrupt clear 0 EA =1; &
nbsp; // attiva l'interrupt }

  Per prima cosa inizializzare l'Unity Clock: scegliere un oscillatore a cristallo da 32 MHz.

  Quindi inizializzare i LED: impostare P1 come porta di I/O generica, impostare la direzione di P1.0 ~ P1.3 come uscita e spegnere i 4 LED.

  Configurare quindi i registri SFR pertinenti per gli interrupt esterni e attivare l'abilitazione degli interrupt a tutti i livelli, coinvolgendo 3 SFR: EA, IEN1, PICTL (per la descrizione dettagliata di ciascun SFR, consultare il " Manuale cinese del CC2430 "):

     EA -- abilitazione totale all'interrupt;

     IEN1.5 -- abilitazione interrupt P0;

     PICTL.3 -- abilitazione dell'interrupt della porta P0.1;

     PICTL.0 -- imposta il fronte di discesa dell'ingresso della porta P0.1 per causare l'attivazione dell'interrupt.

  Utilizzare quindi while(1) nella funzione principale per attendere l'interrupt.

Suggerimenti CC2430
(1) Sintesi della sintassi di assegnazione dei bit
Molto spesso è necessario assegnare un valore (0 o 1) a un bit in un SFR a singolo byte per controllare con precisione un dispositivo hardware.
  

A
lcuni SFR supportano l'indirizzamento dei bit, come TCON, P0 e così via; in questo momento, l'assegnazione del bit è molto semplice, basta interrogare il file di intestazione ioCC2430.h nella parte SFR Bit Access della definizione del bit:
P0_0 = 0; // P0 il primo bit dell'assegnazione del valore di 0
P0_0 = 1; / / P0 il primo bit dell'assegnazione del valore di 1
Tuttavia, alcuni SFR non
supportano l'indirizzamento dei bit, come nel caso del
primo bit dell'assegnazione del valore del primo bit del primo bit del primo bit del primo bit del
secondo
bit
.
Tuttavia, alcuni SFR
non supportano l'indirizzamento a bit, come il PICTL in questo esperimento; quando si vuole assegnare un valore a uno di essi, la sintassi è la seguente:
PICTL &= ~0x01; //assegna un valore di 0 al primo bit
PICTL |= 0x01; //assegna un valore di 1 al primo bit
Si può ricordare che &
amp;= ~, |= ~, |= ~,
|= P0_0
=
1; //assegna un valore di 1 al primo bit di P0
. amp;= ~, |= sono due comuni sintassi di assegnazione dei bit.
(2) Riepilogo dell'abilitazione dell'interrupt
Quando un interrupt è coinvolto in un programma, deve essere abilitato prima che l'interrupt venga attivato.
  

I
l sistema di abilitazione degli interrupt del C51 ha una struttura gerarchica molto evidente:
capo dell'interrupt: EA è il capo, responsabile dell'abilitazione totale dell'interrupt:
EA = 1;
capitano del distacco dell'
interrupt: il prossimo è per ogni componente funzionale (come P0, timer 1, ecc.) il controllo dell'abilitazione, tale SFR generalmente indirizzabile a bit, la denominazione contiene generalmente IE (Interrupt Enable):
P0IE = 1; i
membri
del
team
dell'
interrupt
: distacco, ma a causa dell'
interruzione
del
programma
,
l' interrupt
deve essere abilitato prima dell'attivazione dell'interrupt.

o
gni membro del team di interrupt: team, ma poiché ogni componente funzionale contiene anche più interrupt, l'ultimo livello è per ogni controllo di abilitazione dell 'interrupt, tale SFR non è generalmente indirizzabile a bit, ma contiene generalmente IE (Interrupt Enable) o IM (Interrupt Mask):
PICTL | = 0x01;
non
è necessario memorizzare gli SFR di interrupt Non è necessario memorizzare i SFR di interrupt, purché se ne comprenda la gerarchia e si consulti il manuale o i file di intestazione quando li si utilizza.
(3) Scrittura di programmi di interrupt
L'uso degli interrupt in un programma consiste generalmente in due parti: la scrittura della subroutine di servizio di interrupt e l'apertura dell'abilitazione all'interrupt.

L
'abilitazione all'interrupt è stata introdotta in precedenza, di seguito viene riportata una breve introduzione alla preparazione della subroutine di servizio di interrupt:
prima di tutto, specificate il vettore di interrupt, che può trovarsi nel file di intestazione ioCC2430.h nella parte Interrupt Vectors della query, la sintassi è la seguente:
# pragma vector = Interrupt Vectors
e poi seguite dalla preparazione del gestore di interrupt, la struttura è la seguente:
___ interrupt void Function Name (___)


i
nterrupt void function name(void)
{
//on interrupt
//gestione dell'interrupt
//interrupt flag clear 0
//off interrupt
}

III. Conclusione

  Questo articolo presenta un semplice metodo di implementazione di un interrupt esterno basato sul CC2430, con la base dell'interrupt, quindi introduciamo un altro modulo molto importante - il timer. Il CC2430 ha un totale di quattro timer, che possono essere suddivisi in tre categorie: timer 1, timer 2, timer 3/4 (il 3 e il 4 utilizzano la stessa base). lo stesso).


</n;tt++).
</n;tt++);.
</n;tt++).
</n;tt++); </n;tt++); </n;tt++); </n;tt++).
</n;tt++).




Precedente: [Ri-]Viaggio Zigbee (II): il primo programma CC2430 - Esperimento di lampeggio LED
Next: [Re-]Zigbee Journey (4): alcuni importanti esperimenti di base CC2430 - interrupt del timer
La rete di agricoltori codice, solo pubblicato nel processo di pratica, ha incontrato difficoltà tecniche, non fuorviare gli altri.
Devi effettuare il login prima di poter postare Log in | Registrati

Q uesta versione delle regole integrali


DISCLAIMER: Tutti i software, i materiali di programmazione o gli articoli pubblicati da Code Farmer sono limitati all'uso per scopi di apprendimento e ricerca; i suddetti contenuti non devono essere utilizzati per scopi commerciali o illegali, altrimenti tutte le conseguenze saranno a carico degli utenti stessi. Le informazioni di questo sito provengono dalla rete, la disputa sul copyright non ha nulla a che fare con questo sito. È necessario rimuovere completamente il contenuto di cui sopra dal proprio computer entro 24 ore dal download. Se vi piace il programma, vi preghiamo di sostenere il software autentico, di acquistare la registrazione e di ottenere un servizio autentico migliore. In caso di violazione, si prega di contattarci via e-mail per risolvere il problema.

Posta To:help@itsvse.com

QQ| ( 鲁ICP备14021824号-2)|Sitemap

GMT+8, 2024-9-17 14:49

Risposta rapidaTorna all'inizioTorna all'elenco