Dit artikel is een spiegelartikel van machinevertaling, klik hier om naar het oorspronkelijke artikel te gaan.

Bekijken: 7368|Antwoord: 0

Zigbee Journey (3): Verschillende belangrijke CC2430 basisexperimenten - externe onderbreking

[Link kopiëren]
Geplaatst op 30-10-2014 23:16:46 | | | |
1. Het verbinden van de boven- en benedenverdiepingen

In de vorige lezing maakten we ons vertrouwd met het basisproces van IAR bij het ontwikkelen van het CC2430-programma via een eenvoudig LED-knipperexperiment. Het mes is toch geslepen (hoewel mijn wetsteen niet goed is), en nu ga ik insecten slachten :). Laten we vervolgens een paar basisexperimenten van CC2430 leren. Elk klein experiment is verdeeld in drie delen: "Experiment Introductie", "Programmastroomdiagram" en "Experimentele Broncode en Analyse".

Dit artikel legt externe onderbrekingen uit.

2. Externe onderbreking(1) Inleiding tot het experiment

Interrupts zijn een intern mechanisme waarmee microcontrollers interne of externe gebeurtenissen in realtime kunnen verwerken. Wanneer er een interne of externe gebeurtenis plaatsvindt, zal het interruptsysteem van de microcontroller de CPU dwingen het uitvoerende programma te pauzeren en in plaats daarvan het interrupt te verwerken.

Interrupts zijn onderverdeeld in externe en interne interrupts, en CC2430 bevat in totaal 18 interruptbronnen (voor specifieke interruptbeschrijvingen en definities van interruptvectoren, zie "CC2430 Chinese handleiding》)。

Laten we nu eens kijken naar het schakelschema van deze ontwikkelplaat:

De S1-knop is verbonden met P0.1 op het ontwikkelbord, en het effect van dit experiment is dat de interrupt van P0.1 via de knop S1 wordt geactiveerd, en vervolgens het aan/uit-activeren van LED1 in het interruptservice-subprogramma wordt aangestuurd.

(2) Experimenteel principe en stroomdiagram

Het experimentele stroomdiagram is als volgt:


(3) Experimentele broncode//头文件
#include

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

leegteVertraging(Onondertekendn)   
{
  Onondertekendtt;
  voor(tt =0; TT<N; tt++);
  voor(tt =0; TT<N; tt++);
  voor(tt =0; TT<N; tt++);
  voor(tt =0; TT<N; tt++);
  voor(tt =0; TT<N; tt++);
}

//32M晶振初始化
leegtextal_init(leegte)
{
  SLAAP &= ~0x04;            //都上电
  terwijl(! (SLAAP &0x40));     //晶体振荡器开启且稳定
  CLKCON &= ~0x47;           //Kies een 32MHz kristaloscillator.
  SLAAP |=0x04;
}

//LED灯初始化
leegteled_init(leegte)
{
  P1SEL =0x00;         P1 is de normale I/O-poort
  P1DIR |=0x0F;         P1.0 P1.1 P1.2 P1.3 uitgang
  
  led1 = 0;
  led2 = 0;
  led3 = 0;
  led4 = 0;
}

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

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

//主函数
leegtehoofd(leegte)   
{
  xtal_init();
  led_init();  
  io_init();

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

//中断服务子程序
#pragma vector = P0INT_VECTOR
__interrupt leegteP0_ISR(leegte)
{
  EA =0;                        De poort wordt onderbroken  

  Vertraging(10000);  
  Vertraging(10000);
  Vertraging(10000);
  Vertraging(10000);
  Vertraging(10000);

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

  EA =1;                        //开中断
}

Begin met initialiseren van de systeemklok: kies een 32MHz kristaloscillator.

Begin dan de LED's: stel P1 in als de algemene I/O-poort, stel de richting P1.0 ~ P1.3 als uitgang in, en doe dan de 4 LED-lampen uit.

Vervolgens configureer je de relevante SFR-registers voor externe interrupts om interrupts op alle niveaus mogelijk te maken, waarbij 3 SFR's betrokken zijn:EAIEN1PICTL(Voor details over elke SFR, zie deCC2430 Chinese handleiding》):

EA- Totale interrupt enable;

    IEN1.5- P0-interrupt ingeschakeld;

    PICTL.3—— P0.1 poortinterrupt ingeschakeld;

    PICTL.0—— Stel de P0.1-poort ingangsdroprand in om interrupt te triggeren.

Gebruik dan while(1) in de hoofdfunctie en wacht op de interrupt.

CC2430 Tips
(1) Samenvatting van bittoewijzingssyntaxis
Vaak moeten we een bit (0 of 1) toewijzen aan één byte SFR om het hardwareapparaat nauwkeurig te besturen.
Er is SFROndersteuning bitadresseringBijvoorbeeld, TCON, P0, enzovoort, op dit moment is de toewijzing van contrapunten heel eenvoudig, zoek gewoon de bitdefinitie op in het SFR Bitaccess-gedeelte van het ioCC2430.h-headerbestand:
P0_0 = 0; // ken 0 toe aan het eerste cijfer van P0
P0_0 = 1; // ken een waarde van 1 toe aan het eerste cijfer van P0  

Maar sommige SFR's zijn er nietBitadressering wordt niet ondersteund, zoals in dit experimentPICTL, op dit moment wilt u een waarde toewijzen aan een van hen, de syntaxis is als volgt:
PICTL &= ~0x01;   Ken een waarde van 0 toe aan het eerste cijfer
PICTL |= 0x01;     Ken een waarde van 1 toe aan het eerste cijfer

Je kunt het je herinneren&= ~|=Deze twee veelgebruikte bittoewijzingssyntaxis.
(2) Samenvatting van onderbrekingsmogelijkheden
Wanneer een interrupt in het programma betrokken is, moet deze worden ingeschakeld voordat de interrupt wordt geactiveerd.
De hiërarchie van het C51-interrupt-enablesysteem is zeer duidelijk:
Interrupt Boss: EAis de baas, verantwoordelijkAlgemeenInterrupt Activ:
EA = 1;

  Elke onderbroken squadleider: Vervolgens is voor elke postFunctionele onderdelen(zoals P0, timer 1, enz.), zijn dergelijke SFR's over het algemeen bit-adresserbaar, en bevat de naam doorgaans IE (Interrupt Enable):
P0IE = 1;

  Elk teamlid werd onderbroken: Squad Maar omdat elke feature ook meerdere interrupts bevat, is het laatste level hiervoorElke onderbrekingDit type SFR is over het algemeen bitloos en onadresseerbaar, en bevat meestal IE (Interrupt Enable) of IM (Interrupt Mask) in de naam:
PICTL |=0x01;

Geen noodzaak om interrupt SFR te routinematig gebruiken, gewoon de hiërarchie begrijpen en dan de tijd nemen om de handleiding of het headerbestand op te zoeken.
(3) Het schrijven van programma's onderbreken
Het gebruik van interrupts in een programma bestaat doorgaans uit twee onderdelen: het schrijven van het interruptservice-subprogramma en het openen van de interrupt-enablement. De interruptfunctie is hierboven geïntroduceerd, en hieronder volgt een korte introductie tot het schrijven van het interruptservice-subprogramma:
Specificeer eerstBreekvector, die kan worden bevraagd in de sectie Interruptvectors van het headerbestand ioCC2430.h, met de volgende syntaxis:
#pragma vector = interruptvector

Schrijf daarna direct daarna de interrupthandler, die als volgt is gestructureerd:
__interrupt naam van de void-functie (void)
  {
    //开中断
    //中断处理
    //中断标志清0
    //关中断
  }



3. Conclusie

Dit artikel introduceert de implementatiemethode van eenvoudige externe interrupts gebaseerd op CC2430, en na de basis van interrupts introduceren we een andere zeer belangrijke module - timers. CC2430 heeft in totaal 4 timers, die in drie categorieën kunnen worden onderverdeeld: timer 1, timer 2, timer 3/4 (3 en 4 zijn in principe hetzelfde gebruik).


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




Vorig:Zigbee Journey (2): Het eerste CC2430-programma - LED-lichtflitsexperiment
Volgend:Zigbee Journey (4): Verschillende belangrijke CC2430 basisexperimenten - timeronderbreking
Disclaimer:
Alle software, programmeermaterialen of artikelen die door Code Farmer Network worden gepubliceerd, zijn uitsluitend bedoeld voor leer- en onderzoeksdoeleinden; De bovenstaande inhoud mag niet worden gebruikt voor commerciële of illegale doeleinden, anders dragen gebruikers alle gevolgen. De informatie op deze site komt van het internet, en auteursrechtconflicten hebben niets met deze site te maken. Je moet bovenstaande inhoud volledig van je computer verwijderen binnen 24 uur na het downloaden. Als je het programma leuk vindt, steun dan de echte software, koop registratie en krijg betere echte diensten. Als er sprake is van een inbreuk, neem dan contact met ons op via e-mail.

Mail To:help@itsvse.com