架构师_程序员_码农网

B Passwort abrufen
Registrieren

QQ登录

Nur ein Schritt zum Start

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

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

[Link kopieren]
D 跳转到指定楼层
dem Eigentümer des Gebäudes
发表于 2014-10-30 23:16:46|只看该作者回帖奖励 | UmgekehrtesBlättern|Lesemodus
I. Weiterführung vom Vorangegangenen zum Nächsten

  In der letzten Vorlesung haben wir uns mit dem grundlegenden Prozess der Entwicklung von CC2430-Programmen in IAR anhand eines kleinen Experiments mit der einfachsten blinkenden LED vertraut gemacht. Das Messer wurde zumindest geschärft (obwohl ich nicht sehr gut mit diesem Schleifstein umgehen kann), und nun ist es an der Zeit, mit dem Schlachten von Bugs zu beginnen :). Als nächstes lernen wir ein paar grundlegende CC2430-Experimente. Jedes kleine Experiment ist in die drei Teile "Experimentelle Einführung", "Programmablaufplan", "Experimenteller Quellcode und Analyse" unterteilt.

  Dieser Artikel erklärt den externen Interrupt.

Zweitens, die externe Unterbrechung(1) Einführung in das Experiment

  Interrupt ist ein Echtzeit-Mikrocontroller, um mit internen oder externen Ereignissen, einen internen Mechanismus. Wenn eine Art von internen oder externen Ereignissen auftritt, wird der Mikrocontroller Interrupt-System zwingt die CPU, um das Programm ausgeführt wird, sondern um die Unterbrechung Ereignis Verarbeitung gehen, ist Interrupt-Verarbeitung abgeschlossen, und dann zurück, um durch das Programm unterbrochen werden, weiterhin auszuführen.

  Interrupts werden in externe Interrupts und interne Interrupts unterteilt, der CC2430 enthält insgesamt 18 Interrupt-Quellen (spezifische Interrupt-Beschreibung und Interrupt-Vektor-Definition können Sie im " CC2430 Chinese Manual " nachlesen).

  Werfen wir nun einen Blick auf den Schaltplan dieses Entwicklungsboards:

  Die Entwicklungsplatine wurde mit der Taste S1 und P0.1 verbunden. Der Effekt, den dieses Experiment erreichen will, ist die Auslösung des Interrupts von P0.1 durch Drücken der Taste S1 und die anschließende Steuerung des Aufleuchtens der LED1 im Interrupt-Service-Unterprogramm.

(2) Experimentelles Prinzip und Flussdiagramm

  Das Flussdiagramm des Experiments sieht wie folgt aus:

2011021811430713.png
c













(
3) Experimenteller Quellcode// Header-Datei#include // delay subfunction#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++); }//32M Quarz Initialisierungvoid xtal_init( void ) { SLEEP &=~0x04; &
nbsp; //alles einschaltenwhile (!
(SLEEP & 0x40 )); //Quarzoszillator eingeschaltet und stabil CLKCON &=~0x47; &






nbsp; //Kristalloszillator 32MHz auswählen SLEEP |=0x04; }//LED-Initialisierungvoid led_init( void ) { P1SEL =0x00; &nbsp


; //P1 ist ein normaler E/A-Anschluss P1DIR |=0x0F; //P1.0 P1.1 P1.2 P1.3 Ausgang








led1 = 0; led2 = 0; led3 = 0; led4 = 0; }//io und externer Interrupt Initialisierungvoid io_init( void ) { P0INP &=~0X02;



/ /P0.1 hat Pull-up und Pull-down EA =1; //Gesamtinterruptfreigabe P0IE =1; &



nbsp; //P0 Interrupt Freigabe PICTL |=0X09; //P0.1 Port Interrupt Freigabe, fallende Flanke Trigger P0IFG &=~0x02







; //P0.1 Interrupt-Flag clear 0 };//main functionvoid main( void ) { xtal_init(); led_init();








io_init();while ( 1 ); //warte auf Interrupt }//Unterprogramm für Interrupt-Service#pragma vector = P0INT_VECTOR__interrupt void P0_ISR( void ) { EA =0;

/ / Interrupt ausschalten Delay





( 10000 ); Delay(10000 ); Delay(10000 ); Delay(10000 ); Delay(10000 ); &

nbsp; if ((P0IFG & 0x02 ) >0 ) //Tasteninterrupt { P0IFG &=~0x02; &


nbsp; //P0.1 Interrupt-Flag löschen 0 led1 = !led1; } P0IF =0; &

nbsp; //P0-Interrupt-Flag löschen 0 EA =1; &
nbsp; // Interrupt einschalten }

  Initialisieren Sie zunächst die Unity Clock: Wählen Sie einen 32MHz-Quarzoszillator.

  Dann initialisieren Sie die LEDs: Setzen Sie P1 als Allzweck-E/A-Port, setzen Sie die Richtung von P1.0 ~ P1.3 als Ausgang und schalten Sie die 4 LEDs aus.

  Konfigurieren Sie dann die relevanten SFR-Register für externe Interrupts und schalten Sie die Interrupt-Freigabe auf allen Ebenen ein, wobei 3 SFRs betroffen sind: EA, IEN1, PICTL (eine detaillierte Beschreibung der einzelnen SFRs finden Sie im " CC2430 Chinese Manual "):

     EA -- gesamte Interrupt-Freigabe;

     IEN1.5 -- P0-Interrupt-Freigabe;

     PICTL.3 -- P0.1 Port-Interrupt-Freigabe;

     PICTL.0 -- Die fallende Flanke des P0.1 Port-Eingangs löst den Interrupt aus.

  Verwenden Sie dann while(1) in der Hauptfunktion, um auf den Interrupt zu warten.

CC2430 Tipps
(1) Bit-Zuweisungs-Syntax Zusammenfassung
Sehr oft müssen wir einem Bit in einem Ein-Byte-SFR einen Wert (0 oder 1) zuweisen, um ein Hardware-Gerät präzise zu steuern.
  

E
inige SFRs unterstützen Bit-Adressierung, wie TCON, P0, etc., zu dieser Zeit, die Zuweisung des Bits ist sehr einfach, nur Abfrage der ioCC2430.h Header-Datei in der SFR Bit Access Teil der Bit-Definition kann sein:
P0_0 = 0; // P0 das erste Bit der Zuweisung des Wertes von 0
P0_0 = 1; / / / P0 das erste Bit der Zuweisung des Wertes von 1
Es gibt
jedoch SFRs nicht
unterstützen Bit-Adressierung, wie im Fall des
ersten Bits der Zuweisung des Wertes des ersten Bits des ersten Bits des ersten Bits des ersten Bits des
zweiten
Bits
.
Einige SFRs
unterstützen
jedoch
keine Bitadressierung, wie z. B. die PICTL in diesem Experiment. Wenn Sie einem dieser SFRs einen Wert zuweisen möchten, lautet die Syntax wie folgt:
PICTL &= ~0x01; //dem ersten Bit einen Wert von 0 zuweisen
PICTL |= 0x01; //dem ersten Bit einen Wert von 1 zuweisen
Sie können sich merken, dass &
amp;= ~, |= ~, |= ~,
|= P0_0
=
1; //dem ersten Bit von P0 einen Wert von 1 zuweisen
. amp;= ~, |= diese beiden gängigen Bit-Zuweisungssyntaxen.
(2) Zusammenfassung der Unterbrechungsfreigabe
Wenn ein Interrupt in ein Programm eingebunden ist, muss er freigegeben werden, bevor der Interrupt ausgelöst wird.
  

C
51 Interrupt-Enable-System, seine hierarchische Struktur ist sehr offensichtlich:
Interrupt-Chef: EA ist der Chef, verantwortlich für die gesamte Interrupt-Enable:
EA = 1;
Interrupt Ablösung Kapitän: nächste ist für jede funktionale Komponente (z. B. P0, Timer 1, etc.) aktivieren Kontrolle, wie SFR in der Regel Bit adressierbar, Benennung enthält in der Regel IE (Interrupt Enable):
P0IE = 1; die
Unterbrechung Teammitglieder
: Ablösung, sondern aufgrund der
Unterbrechung
des
Programms
, muss
die Unterbrechung
vor der Auslösung der Unterbrechung aktiviert werden.

j
ede Unterbrechung Teammitglieder: Team, sondern weil jede funktionale Komponente enthält auch mehrere Interrupts, so dass die letzte Ebene ist für jeden Interrupt Enable Control, wie SFR ist in der Regel nicht Bit adressierbar, genannt enthalten IE (Interrupt Enable) oder IM (Interrupt Mask):
PICTL | = 0x01;
nicht brauchen, um die Unterbrechung SFRs zu speichern Es ist nicht notwendig, sich die Interrupt-SFRs zu merken, solange Sie die Hierarchie verstehen und dann das Handbuch oder die Header-Dateien konsultieren, wenn Sie sie verwenden.
(3) Schreiben von Interrupt-Programmen
Die Verwendung von Interrupts in einem Programm besteht im Allgemeinen aus zwei Teilen: dem Schreiben des Interrupt-Service-Unterprogramms und dem Öffnen der Interrupt-Freigabe.

U
nterbrechungsfreigabe wurde oben eingeführt, das Folgende ist eine kurze Einführung in die Vorbereitung des Unterbrechungsdienst-Unterprogramms:
Zuerst spezifizieren Sie den Unterbrechungsvektor, kann in der ioCC2430.h Header-Datei im Unterbrechungsvektoren Teil der Abfrage sein, die Syntax ist wie folgt:
# pragma vector = Unterbrechungsvektoren
und dann gefolgt von der Vorbereitung des Unterbrechungshandlers, die Struktur ist wie folgt:
___ interrupt void Funktionsname (___)


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

III. Schlussfolgerung

  Dieser Artikel stellt eine einfache externe Interrupt-Implementierung Methode auf CC2430 basiert, mit der Grundlage der Unterbrechung, dann stellen wir ein weiteres sehr wichtiges Modul - Timer. CC2430 verfügt über insgesamt vier Timer, die in drei Kategorien unterteilt werden können: Timer 1, Timer 2, Timer 3/4 (3 und 4 der Verwendung der gleichen grundlegenden). das gleiche).


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




Previous :[Re-]Zigbee Journey (II): Das erste CC2430-Programm - LED-Blinkexperiment
Next :[Re-]Zigbee Journey (4): Ein paar wichtige CC2430-Basisexperimente - Timer-Interrupts
Der Code Bauer Netzwerk, nur in den Prozess der Praxis veröffentlicht, stieß auf technische Schwierigkeiten, nicht in die Irre führen andere.
Sie müssen sich anmelden, bevor Sie zurückschreiben können Anmelden | Registrieren

D iese Version der integralen Regeln


HAFTUNGSAUSSCHLUSS: Alle Software, Programmiermaterialien oder Artikel, die von Code Farmer veröffentlicht werden, dürfen nur zu Lern- und Forschungszwecken verwendet werden; die oben genannten Inhalte dürfen nicht zu kommerziellen oder illegalen Zwecken verwendet werden, andernfalls müssen alle Konsequenzen von den Benutzern selbst getragen werden. Diese Seite informiert aus dem Netz, Urheberrechtsstreitigkeiten haben nichts mit dieser Seite zu tun. Sie müssen die oben genannten Inhalte innerhalb von 24 Stunden nach dem Herunterladen vollständig von Ihrem Computer entfernen. Wenn Ihnen das Programm gefällt, unterstützen Sie bitte die echte Software, kaufen Sie die Registrierung und erhalten Sie einen besseren echten Service. Wenn es irgendeine Verletzung gibt, kontaktieren Sie uns bitte per E-Mail, um damit umzugehen.

E-Mail To:help@itsvse.com

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

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

SchnellantwortZurück zum AnfangZurück zur Liste