Denne artikel er en spejling af maskinoversættelse, klik venligst her for at springe til den oprindelige artikel.

Udsigt: 7368|Svar: 0

Zigbee Journey (3): Flere vigtige CC2430 grundlæggende eksperimenter - ekstern afbrydelse

[Kopier link]
Opslået på 30/10/2014 23.16.46 | | | |
1. Forbindelse mellem øvre og nedre niveauer

I det forrige foredrag gjorde vi os fortrolige med den grundlæggende proces i IAR's udvikling af CC2430-programmet gennem et simpelt LED-blinkeksperiment. Kniven er alligevel blevet slebet (selvom min slibesten ikke er god), og nu vil jeg begynde at slagte insekter :). Lad os nu lære nogle grundlæggende eksperimenter i CC2430. Hvert lille eksperiment er opdelt i tre dele: "Eksperimentintroduktion", "Programflowdiagram" og "Eksperimentel kildekode og analyse".

Denne artikel forklarer eksterne afbrydelser.

2. Ekstern afbrydelse(1) Introduktion til eksperimentet

Interrupts er en intern mekanisme, som mikrocontrollere kan bruge til at behandle interne eller eksterne hændelser i realtid. Når en intern eller ekstern hændelse opstår, vil mikrocontrollerens afbrydelsessystem tvinge CPU'en til at pause det udførende program og i stedet behandle afbrydelseshændelsen.

Interrupts er opdelt i eksterne og interne interrupts, og CC2430 indeholder i alt 18 interrupt-kilder (for specifikke interruptbeskrivelser og definitioner af interruptvektorer, se venligst "CC2430 Kinesisk Manual》)。

Lad os nu se på kredsløbsdiagrammet for dette udviklingskort:

S1-knappen er forbundet til P0.1 på udviklingskortet, og effekten af dette eksperiment er at udløse afbrydelsen af P0.1 gennem knap S1 og derefter styre tænd/sluk af LED1 i afbrydelsesservice-underprogrammet.

(2) Eksperimentelt princip og flowdiagram

Det eksperimentelle flowdiagram er som følger:


(3) Eksperimentel kildekode//头文件
#include

//延时子函数
#defineled1 P1_0
#defineled2 P1_1
#defineled3 P1_2
#defineled4 P1_3

tomrumForsinkelse(Usigneretn)   
{
  Usignerettt;
  for(tt =0; TT<N; TT++);
  for(tt =0; TT<N; TT++);
  for(tt =0; TT<N; TT++);
  for(tt =0; TT<N; TT++);
  for(tt =0; TT<N; TT++);
}

//32M晶振初始化
tomrumxtal_init(tomrum)
{
  SOV &= ~0x04;            //都上电
  mens(! (SØVN &0x40));     //晶体振荡器开启且稳定
  CLKCON &= ~0x47;           //Vælg en 32MHz krystaloscillator
  SØVN |=0x04;
}

//LED灯初始化
tomrumled_init(tomrum)
{
  P1SEL =0x00;         P1 er den normale I/O-port
  P1DIR |=0x0F;         P1.0 P1.1 P1.2 P1.3 output
  
  led1 = 0;
  led2 = 0;
  led3 = 0;
  led4 = 0;
}

//io及外部中断初始化
tomrumio_init(tomrum)
{
    P0INP &= ~0X02;   //P0.1有上拉、下拉

    EA =1;           //总中断使能
   
    P0IE =1;   //P0中断使能
   
    PICTL |=  0X09;   //P0.1口中断使能,下降沿触发
   
    P0IFG &= ~0x02;   //P0.1中断标志清0
};

//主函数
tomrumhoved(tomrum)   
{
  xtal_init();
  led_init();  
  io_init();

  mens(1);   //等待中断
}

//中断服务子程序
#pragma vektor = P0INT_VECTOR
__interrupt tomrumP0_ISR(tomrum)
{
  EA =0;                        Porten er afbrudt  

  Forsinkelse(10000);  
  Forsinkelse(10000);
  Forsinkelse(10000);
  Forsinkelse(10000);
  Forsinkelse(10000);

  hvis((P0IFG &0x02) >0)         //按键中断
  {
    P0IFG &= ~0x02;               //P0.1中断标志清0
    led1 = !led1;
  }
  P0IF =0;                       //P0中断标志清0

  EA =1;                        //开中断
}

Først initialiser systemklokken: vælg en 32 MHz krystaloscillator.

Initialiser derefter LED'erne: sæt P1 som den generelle I/O-port, sæt P1.0 ~ P1.3-retningen som udgang, og sluk derefter de 4 LED-lys.

Dernæst konfigureres de relevante SFR-registre for eksterne afbrydelser for at muliggøre afbrydelser på alle niveauer, hvilket involverer 3 SFR'er:EAIEN1PICTL(For detaljer om hver SFR, se venligstCC2430 Kinesisk Manual》):

EA- Total interrupt aktivering;

    IEN1.5- P0 interrupt aktiveret;

    PICTL.3—— P0.1 port interrupt aktiveret;

    PICTL.0—— Indstil P0.1-portens indgangsdrop edge til at forårsage interrupt-udløsning.

Brug derefter while(1) i hovedfunktionen og vent på afbrydelsen.

CC2430 Tips
(1) Sammenfatning af bittildelingssyntaks
Mange gange skal vi tildele en bit (0 eller 1) til en enkelt byte SFR for præcist at kontrollere hardwareenheden.
Der findes SFRSupport bit-adresseringFor eksempel TCON, P0 osv., på nuværende tidspunkt er tildelingen af modpunkter meget simpel, bare forespørg bitdefinitionen i SFR Bit-adgangssektionen i ioCC2430.h-headerfilen:
P0_0 = 0; // tildel 0 til det første ciffer i P0
P0_0 = 1; // tildel værdien 1 til det første ciffer i P0  

Men nogle SFR'er findes ikkeBitadressering understøttes ikke, som i dette eksperimentPICTL, på dette tidspunkt vil du tildele en værdi til en af dem, syntaksen er som følger:
PICTL &= ~0x01;   Tildel værdien 0 til det første ciffer
PICTL |= 0x01;     Tildel værdien 1 til det første ciffer

Du kan huske&= ~|=Disse to almindeligt anvendte bittildelingssyntaks.
(2) Sammenfatning af afbrydelsesaktivering
Når et interrupt er involveret i programmet, skal det aktiveres, før interruptet udløses.
Hierarkiet i C51-interrupt-aktiveringssystemet er meget tydeligt:
Interrupt Boss: EAer chefen, ansvarligGenerelAfbrydelsesaktivering:
EA = 1;

  Hver afbrudt holdleder: Næste er for hver af demFunktionelle dele(såsom P0, timer 1 osv.), er sådanne SFR'er generelt bit-adresserbare, og navnet indeholder generelt IE (Interrupt Enable):
P0IE = 1;

  Hvert holdmedlem blev afbrudt: Squad Men da hver funktion også indeholder flere interrupts, er det sidste niveau til detteHver afbrydelseDenne type SFR er generelt bitløs og uadresserbar, og indeholder som regel IE (Interrupt Enable) eller IM (Interrupt Mask) i navnet:
PICTL |=0x01;

Der er ikke behov for at styre afbrydelses-SFR, bare forstå dens hierarki og tag dig tid til at slå manualen eller headerfilen op.
(3) Afbryde skrivningen af programmer
Brugen af interrupts i et program omfatter generelt to dele: skrivningen af interruptservice-delprogrammet og åbningen af interrupt-aktiveringen. Interrupt-funktionen er blevet introduceret ovenfor, og følgende er en kort introduktion til skrivningen af interruptservice-underprogrammet:
Specificér førstBrudvektor, som kan forespørges i afsnittet Interrupt Vectors i ioCC2430.h-headerfilen med følgende syntaks:
#pragma vektor = afbrydelsesvektor

Skriv derefter interrupt-håndtereren umiddelbart efter, som er struktureret som følger:
__interrupt void funktionsnavn (void)
  {
    //开中断
    //中断处理
    //中断标志清0
    //关中断
  }



3. Konklusion

Denne artikel introducerer implementeringsmetoden for simple eksterne afbrydelser baseret på CC2430, og efter grundlaget for afbrydelser vil vi introducere et andet meget vigtigt modul – timere. CC2430 har i alt 4 timere, som kan opdeles i tre kategorier: timer 1, timer 2, timer 3/4 (3 og 4 er grundlæggende samme brug).


</n; TT++);
</n; TT++);
</n; TT++);
</n; TT++);
</n; TT++);




Tidligere:Zigbee Journey (2): Det første CC2430-program - LED-lysblinkeksperiment
Næste:Zigbee Journey (4): Flere vigtige CC2430 grundlæggende eksperimenter - timerafbrydelse
Ansvarsfraskrivelse:
Al software, programmeringsmaterialer eller artikler udgivet af Code Farmer Network er kun til lærings- og forskningsformål; Ovenstående indhold må ikke bruges til kommercielle eller ulovlige formål, ellers skal brugerne bære alle konsekvenser. Oplysningerne på dette site kommer fra internettet, og ophavsretstvister har intet med dette site at gøre. Du skal slette ovenstående indhold fuldstændigt fra din computer inden for 24 timer efter download. Hvis du kan lide programmet, så understøt venligst ægte software, køb registrering og få bedre ægte tjenester. Hvis der er nogen overtrædelse, bedes du kontakte os via e-mail.

Mail To:help@itsvse.com