Dieser Artikel ist ein Spiegelartikel der maschinellen Übersetzung, bitte klicken Sie hier, um zum Originalartikel zu springen.

Ansehen: 7368|Antwort: 0

Zigbee-Reise (3): Mehrere wichtige CC2430-Grundexperimente – externe Unterbrechung

[Link kopieren]
Veröffentlicht am 30.10.2014 23:16:46 | | | |
1. Verbindung der oberen und unteren Ebenen

In der vorherigen Vorlesung machten wir uns mit dem grundlegenden Prozess der Entwicklung des CC2430-Programms durch ein einfaches LED-Blinkexperiment vertraut. Das Messer ist ohnehin geschärft (obwohl mein Wetzstein nicht gut ist), und jetzt werde ich anfangen, Insekten :) zu schlachten. Als Nächstes lernen wir einige grundlegende Experimente von CC2430 kennen. Jedes kleine Experiment ist in drei Teile unterteilt: "Experiment-Einführung", "Programm-Flussdiagramm" und "Experimenteller Quellcode und -analyse".

Dieser Artikel erklärt externe Unterbrechungen.

2. Externe Unterbrechung(1) Einführung in das Experiment

Interrupts sind ein interner Mechanismus, mit dem Mikrocontroller interne oder externe Ereignisse in Echtzeit verarbeiten können. Wenn ein internes oder externes Ereignis auftritt, zwingt das Interrupt-System des Mikrocontrollers die CPU, das ausführende Programm anzuhalten und stattdessen das Interrupt-Ereignis zu verarbeiten.

Interrupts sind in externe und interne Interrupts unterteilt, und CC2430 enthält insgesamt 18 Interruptquellen (für spezifische Interruptbeschreibungen und Definitionen von Interruptvektoren siehe bitte "CC2430 Chinesisches Handbuch》)。

Schauen wir uns nun den Schaltplan dieser Entwicklungsplatine an:

Der S1-Knopf ist mit P0.1 auf der Entwicklungsplatine verbunden, und der Effekt dieses Experiments besteht darin, den Interrupt von P0.1 über den Knopf S1 auszulösen und dann das Ein-/Ausschalten von LED1 im Interrupt-Service-Unterprogramm zu steuern.

(2) Experimentelles Prinzip und Flussdiagramm

Das experimentelle Flussdiagramm ist wie folgt:


(3) Experimenteller Quellcode//头文件
#include

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

LeereVerzögerung(Unsigniertn)   
{
  Unsignierttt;
  für(tt =0; tt<n; tt++);
  für(tt =0; tt<n; tt++);
  für(tt =0; tt<n; tt++);
  für(tt =0; tt<n; tt++);
  für(tt =0; tt<n; tt++);
}

//32M晶振初始化
Leerextal_init(Leere)
{
  SCHLAF &= ~0x04;            //都上电
  während(! (SCHLAF &0x40));     //晶体振荡器开启且稳定
  CLKCON &= ~0x47;           //Wählen Sie einen 32-MHz-Kristalloszillator
  SCHLAF |=0x04;
}

//LED灯初始化
Leereled_init(Leere)
{
  P1SEL =0x00;         P1 ist der normale I/O-Port
  P1DIR |=0x0F;         P1.0 P1.1 P1.2 P1.3 Ausgang
  
  led1 = 0;
  led2 = 0;
  led3 = 0;
  led4 = 0;
}

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

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

//主函数
Leeremain(Leere)   
{
  xtal_init();
  led_init();  
  io_init();

  während(1);   //等待中断
}

//中断服务子程序
#pragma Vektor = P0INT_VECTOR
__interrupt LeereP0_ISR(Leere)
{
  EA =0;                        Das Tor wird unterbrochen  

  Verzögerung(10000);  
  Verzögerung(10000);
  Verzögerung(10000);
  Verzögerung(10000);
  Verzögerung(10000);

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

  EA =1;                        //开中断
}

Zuerst initialisieren Sie den Systemtakt: Wählen Sie einen 32-MHz-Kristalloszillator.

Dann initialisiere die LEDs: setze P1 als allgemeinen I/O-Port, setze die Richtung P1.0 ~ P1.3 als Ausgang und schalte dann die 4 LED-Lichter aus.

Als Nächstes konfigurieren Sie die entsprechenden SFR-Register für externe Interrupts, um Interrupts auf allen Ebenen zu ermöglichen, wobei 3 SFRs beteiligt sind:EAIEN1PICTL(Für Einzelheiten zu jedem SFR siehe bitte dieCC2430 Chinesisches Handbuch》):

EA- Totale Interrupt-Aktivierung;

    IEN1.5- P0-Unterbrechungsaktivierung;

    BILDBILD 3—— P0.1 Port-Unterbrechung aktiviert;

    PICTL.0—— Stellen Sie die P0.1-Port-Eingangs-Drop-Kante so ein, dass sie eine Interrupt-Auslösung auslöst.

Dann benutze while(1) in der Hauptfunktion und warte auf den Interrupt.

CC2430 Tipps
(1) Zusammenfassung der Bitzuweisungssyntax
Oft müssen wir einem einzelnen Byte SFR ein Bit (0 oder 1) zuweisen, um das Hardwaregerät präzise zu steuern.
Es gibt SFRSupport-Bit-AdressierungZum Beispiel TCON, P0 usw., zu diesem Zeitpunkt ist die Zuweisung von Kontrapunkten sehr einfach, man fragt einfach die Bitdefinition im SFR Bit Access-Abschnitt der ioCC2430.h-Headerdatei ab:
P0_0 = 0; // weist 0 der ersten Ziffer von P0 zu
P0_0 = 1; // weist der ersten Ziffer von P0 den Wert 1 zu  

Aber einige SFRs gibt es nichtBitadressierung wird nicht unterstützt, wie in diesem ExperimentPICTL, wenn Sie einem von ihnen einen Wert zuweisen möchten, lautet die Syntax wie folgt:
PICTL &= ~0x01;   Weisen Sie der ersten Ziffer den Wert 0 zu
PICTL |= 0x01;     Weisen Sie der ersten Ziffer den Wert 1 zu

Du kannst dich erinnern&= ~|=Diese beiden häufig verwendeten Bitzuweisungssyntaxen.
(2) Zusammenfassung der Unterbrechungs-Ermöglichung
Wenn ein Interrupt im Programm beteiligt ist, muss er aktiviert werden, bevor der Interrupt ausgelöst wird.
Die Hierarchie des C51-Interrupt-Aktivierungssystems ist sehr offensichtlich:
Interrupt-Boss: EAist der Chef, verantwortlichAllgemeinUnterbrechungsaktivierung:
EA = 1;

  Jeder unterbrochene Truppführer: Als Nächstes gilt für jedenFunktionale Teile(wie P0, Timer 1 usw.), sind solche SFRs in der Regel bitadressierbar, und der Name enthält meist IE (Interrupt Enable):
P0IE = 1;

  Jedes Teammitglied wurde unterbrochen: Squad Aber da jedes Feature auch mehrere Interrupts enthält, ist das letzte Level dafür vorgesehenJede UnterbrechungDiese Art von SFR ist in der Regel bitlos und nicht adressierbar und enthält meist IE (Interrupt Enable) oder IM (Interrupt Mask) im Namen:
PICTL |=0x01;

SFR ist nicht nötig, SFR aus dem Kopf zu schreiben, man sollte einfach seine Hierarchie verstehen und sich dann die Zeit nehmen, das Handbuch oder die Header-Datei nachzuschlagen.
(3) Unterbrechen des Schreibens von Programmen
Die Verwendung von Interrupts in einem Programm besteht im Allgemeinen aus zwei Teilen: dem Schreiben des Interrupt-Service-Subprogramms und dem Öffnen der Interrupt-Enablement. Die Interrupt-Funktion wurde oben eingeführt, und im Folgenden eine kurze Einführung in das Schreiben des Interrupt-Service-Subprogramms:
Zuerst spezifizierenBruchvektor, der im Abschnitt Interrupt Vectors der ioCC2430.h-Headerdatei mit folgender Syntax abgefragt werden kann:
#pragma Vektor = Interruptvektor

Schreiben Sie dann unmittelbar danach den Interrupt-Handler, der wie folgt strukturiert ist:
__interrupt Void-Funktionsname (void)
  {
    //开中断
    //中断处理
    //中断标志清0
    //关中断
  }



3. Fazit

Dieser Artikel stellt die Implementierungsmethode einfacher externer Interrupts auf Basis von CC2430 vor, und nach der Basis der Interrupts stellen wir ein weiteres sehr wichtiges Modul vor – Timer. CC2430 hat insgesamt 4 Timer, die in drei Kategorien unterteilt werden können: Timer 1, Timer 2, Timer 3/4 (3 und 4 sind im Grunde die gleiche Nutzung).


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




Vorhergehend:Zigbee Journey (2): Das erste CC2430-Programm – LED-Lichtblitzexperiment
Nächster:Zigbee Journey (4): Mehrere wichtige CC2430-Grundexperimente – Timerunterbrechung
Verzichtserklärung:
Alle von Code Farmer Network veröffentlichten Software, Programmiermaterialien oder Artikel dienen ausschließlich Lern- und Forschungszwecken; Die oben genannten Inhalte dürfen nicht für kommerzielle oder illegale Zwecke verwendet werden, andernfalls tragen die Nutzer alle Konsequenzen. Die Informationen auf dieser Seite stammen aus dem Internet, und Urheberrechtsstreitigkeiten haben nichts mit dieser Seite zu tun. Sie müssen die oben genannten Inhalte innerhalb von 24 Stunden nach dem Download vollständig von Ihrem Computer löschen. Wenn Ihnen das Programm gefällt, unterstützen Sie bitte echte Software, kaufen Sie die Registrierung und erhalten Sie bessere echte Dienstleistungen. Falls es eine Verletzung gibt, kontaktieren Sie uns bitte per E-Mail.

Mail To:help@itsvse.com