Ez a cikk egy tükör gépi fordítás, kérjük, kattintson ide, hogy ugorjon az eredeti cikkre.

Nézet: 9371|Válasz: 0

Zigbee Journey (9): Több fontos alapvető CC2430 kísérlet – rendszerszintű alvás és megszakított ébrenlét

[Linket másol]
Közzétéve 2014. 10. 30. 23:24:30 | | | |
1. A felső és alsó szintek összekapcsolása

Ebben a cikkben a CC2430 alvási funkcióját és ébresztési módszerét tárgyaljuk. A tényleges használat során a CC2430 csomópontot általában akkumulátorokkal táplálják, így az energiafogyasztás szabályozása kulcsfontosságú.

Az alábbiakban egy részlet található a CC2430 kínai kézikönyvéből, amely a CC2430 4 energiafogyasztási módjának bevezetéséhez szolgált:

Ahogy a fenti táblázatból is látható, a CC2430-nak összesen 4 teljesítménymódja van:PM0(teljesen ébren),PM1(kissé álmos),PM2(félig ébren, félig alvás),PM3(Nagyon mélyen alszik). Minél hátrébb haladunk, annál több funkció van kikapcsolva, és az energiafogyasztás egyre alacsonyabb. A konverziós kapcsolat közöttük a következő:

putPM1、PM2ÉbresztőPM0, három módja van: reset (reset rendszer) külső megszakítás, alvási időzítő megszakítása; De teddPM3ÉbresztőPM0, csak két módja van: reset és külső megszakítás (mert inPM3Minden oszcillátor leállt, és persze az alvásidőzítő ki volt kapcsolva~)

Nézzünk egy kis kísérletet, hogy bemutassuk az alvó módba való belépést és hogyan ébredj felPM0állam.

2. Rendszerezett alvás és megszakított ébredési kísérletek(1) Bevezetés a kísérlethezRendszer inicializálása, inPM0
→ belépniPM1
→ Ébredj az alvásidőzítőnél 1 másodperc utánPM0
→ belépniPM2
→ 2 másodperc után az alvási időzítő ébresztette felPM0
→ belépniPM3
→ Várd meg, amíg az S1 gomb megnyomódik, ami külső megszakítást indít el és felébredjPM0
(2) Programáram

(Megjegyzés: A fenti képen látható lekerekített doboz a rendszer állapotát jelzi)

(3) Kísérleti forráskód és elemzés (A következő dobozokra kattintható~Fejlécfájl és makrodefiníció[url=] [/url]
/*
    Kísérleti leírás: Megszakított ébredési alvás kísérlet, amely három alvási módban vezeti be az ébrenlétet
*/

#include
#define LED_ON 0
#define LED_OFF 1#defineled1 P1_0         
#defineled2 P1_1         
#defineLED3 P1_2         
#defineLED4 P1_3   [url=] [/url]

Alfunkciók[url=] [/url]
/*Rendszeróra inicializálása
-------------------------------------------------------
*/
Semmixtal_init(Semmi)
{
  ALVÁS &= ~0x04;            //Mindegyik motoros
  miközben(! (ALVÁS &0x40));     //A kristályoszcillátor bekapcsolva és stabil
  CLKCON &= ~0x47;         //Válassz egy 32 MHz-es kristályoscillátort
  ALVÁS |=0x04;
}


/*LED inicializáció
-------------------------------------------------------
*/
Semmiled_init(Semmi)
{
  P1SEL =0x00;         //A P1 a normál I/O port
  P1DIR |=0x0F;         //P1.0 P1.1 P1.2 P1.3 kimenet
  
  led1 = LED_OFF;         //Kapcsold ki az összes LED-et
  led2 = LED_OFF;
  led3 = LED_OFF;
  led4 = LED_OFF;
}


/*Külső megszakítás inicializálása
-------------------------------------------------------
*/
Semmiio_init(Semmi)
{
    P0INP &= ~0X02;   //A P0.1-ben van húzódás és lehúzás

    EA =1;           //Teljes megszakítás engedélyezett
   
    IEN1 |=  0X20;   //P0IE = 1, P0 megszakítások engedélyezve vannak
   
    PICTL |=  0X09;   //A P0.1 lehetővé teszi a megszakításokat, a ledobott él triggereket
   
    P0IFG &= ~0x02;   //P0.1 Megszakítás jel clear0
}


/*Alvás időzítő megszakítás inicializálása
-------------------------------------------------------
*/
SemmisleepTimer_init(Semmi)
{
  STIF=0;   //Az alvási időzítő megszakítási jel tiszta 0
   
  STIE=1;   //Kapcsold be az alvási időzítőt megszakítva
   
  EA=1;     //Nyisd ki a teljes megszakítást
}


/*Állítsd be az alvási időzítő ütemezett intervallumát
-------------------------------------------------------
*/
SemmisetSleepTimer(nem aláírtintsec)
{
  Aláírás nélkülhosszúsleepTimer =0;
  
  sleepTimer |= ST0;                     //Szerezd meg az aktuális alvási időzítő számértékét
  sleepTimer |= (nem aláírthosszú)ST1 <<8;
  sleepTimer |= (nem aláírthosszú)ST2 <<16;
  
  sleepTimer += ((nem aláírthosszú)sec * (aláíratlanulhosszú)32768);   //Plusz a szükséges időzítési idő
  
  ST2 = (nem aláírtchar)(sleepTimer >>16);   //Állítsd be az alvásidőzítő összehasonlítási értékét
  ST1 = (nem aláírtchar)(sleepTimer >>8);
  ST0 = (aláíratlanchar)sleepTimer;
}


/*Válaszd ki az Erő Módot
-------------------------------------------------------
*/
SemmiPowerMode(nem aláírtcharmód)
{
  ha(mód <4)
  {
    ALVÁS &=0xfc;      //Töröld a SLEEP.MODE 0-ra
    ALVÁS |= mód;      //Válaszd ki az Erő Módot
    PCON |=0x01;        //Kapcsold be ezt a teljesítmény módot
  }
}


/*Késleltetési függvény
-------------------------------------------------------
*/
SemmiKésleltetés(alárendellenintn)
{
  Aláírás nélkülinti,j;
  for(i=0; i<n; i++)
    for(j=0; j <1000; j++);
}
[url=] [/url]

Fő funkció[url=] [/url]
/*Fő funkció
-------------------------------------------------------
*/
Semmimain(Semmi)
{
  xtal_init();         
  led_init();         
  
  //PM0 állapot, lámpa ég és késleltetés
  led1 = LED_ON;         //A fényerő LED1 azt jelzi, hogy a rendszer PM0 módban működik
  Késés(10);


  //PM1 állapot, lámpák kikapcsolva
  setSleepTimer(1);      //Állítsd be az alvási időkorlátot 1s-re
  sleepTimer_init();     //Kapcsold be az alvási időzítőt megszakítva
  led1 = LED_OFF;
  PowerMode(1);         //Állítsd be a teljesítmény módot PM1-re
  
  
//1 másodperc után a PM1 belép PM0-ba, felvillar és késlekedik
  led1 = LED_ON;
  Késés(50);
  
  //PM2, lekapcsolva a lámpák
  setSleepTimer(2);      //Állítsd be az alvási időkorlátot 2 másodpercre
  led1 = LED_OFF;
  PowerMode(2);         //Állítsd be a teljesítmény módot PM2-re


  
//2 másodperc után a PM2 belép PM0-ba, felvillar és késik
  led1=0;
  Késés(50);
  
  //PM3, világítás le  
  io_init();            //Külső megszakítások inicializálása
  led1 = LED_OFF;
  PowerMode(3);         //Állítsd be a teljesítménymódot PM3-ra
  
  
//Amikor külső megszakítás történik, a PM3 belép a PM0-ba és felvillan
  led1 = LED_ON;

  miközben(1);
}
[url=] [/url]

Megszakítási szolgáltatási eljárások[url=] [/url]
/*Külső megszakítási szolgáltatási program
-------------------------------------------------------
*/
#pragmavektor = P0INT_VECTOR
__interruptSemmiP0_ISR(Semmi)
{
  EA =0;                        //A kapu megszakítva van
  
  Késés(50);

  ha((P0IFG &0x02) >0)         //A billentyűk megszakítva vannak
  {
    P0IFG &= ~0x02;               //P0.1 Megszakítás jel clear0
  }
  P0IF =0;                       //P0 megszakítás jel clear0


  EA =1;                        //Nyílt megszakítás
}


/*Az alvási időzítő megszakítja a szolgáltatási programokat
-------------------------------------------------------
*/
#pragmavektor= ST_VECTOR
__interruptSemmisleepTimer_IRQ(Semmi)
{
  EA=0;     //A kapu megszakítva van
   
  STIF=0;   //Az alvási időzítő megszakítási jel tiszta 0
  
  EA=1;     //Nyílt megszakítás
}
[url=] [/url]

Hogyan lehet használni az alvási időzítőt a rendszer felébresztéséhez, az alábbiakban összefoglalható:Nyisd ki az alvási időzítő megszakítást, → állítsd be az alvási időmérő időzítő intervallumát → beállítsuk az áramellátási módot

(Megjegyzés: "Állítsd be az alvási időzítő intervallum" lépést a "Teljesítmény mód beállítása" előtt kell lennie, mert a rendszer nem folytatja a program futtatását alvó állapot után is)

Ezután koncentráljunk arra az alfüggvényre, amely az alvási időzítő intervallumat állítja be:setSleepTimer

Először is, egy rövid bevezetés az alvásidőzítőhöz: az tovább fut32.768kHzof24. helyIdőzítő, amikor a rendszer futA PM3 mellettMinden árammódban az alvó időzítő aMegszakítás nélküli működés

Az alvó időzítők által használt regiszterek a következők:ST0ST1ST2。 Az alábbiakban részletes bevezetés található a CC2430 kínai kézikönyvéből a funkcióihoz:

Látható, hogy funkcióik két szempontból állnak:Olvasd elírni

  Olvasd el: Az aktuális időzítő számértékének felolvasására, az olvasási sorrendre:Olvasd el ST0-t → Olvasd az ST1-et → Olvasd el ST2-t

  írni: Az időzítő összehasonlítási értékének beállításához (amikor az időzítő számértéke = összehasonlítási érték, megszakítás következik), az írási sorrendnek a következőképpen kell következnie:ST2-t írj → ST1-et → ST0-t írj

Rendben, magyarázzuk el a forráskóddal együtt:

(1) Először definiáljunk egy alárendellen hosszú változót (32 bites) sleepTimer-t, amely megkapja az alvó időzítő aktuális számértékét:

  Aláírás nélkülhosszúsleepTimer =0;
  
  sleepTimer |= ST0;                     //Szerezd meg az aktuális alvási időzítő számértékét
  sleepTimer |= (nem aláírthosszú)ST1 <<8;
  sleepTimer |= (nem aláírthosszú)ST2 <<16;

(2) Ezután adjuk össze a szükséges időintervallumot:

  sleepTimer += ((nem aláírthosszú)sec * (aláíratlanulhosszú)32768);   //Plusz a szükséges időzítési idő

Íme egy kis magyarázat:

Miért az 1-esek jelentik a 32768-at? Mivel az időzítő 32,768 kHz alatt működik, minden hozzáadott időzítő 1/32768 másodpercre van szükség; Add hozzá a 32768-at, és szükséged lesz 1-esekre;

(3) Végül a sleepTimer értékét használják az időzítő összehasonlító értékeként:

  ST2 = (nem aláírtchar)(sleepTimer >>16);   //Állítsd be az alvásidőzítő összehasonlítási értékét
  ST1 = (nem aláírtchar)(sleepTimer >>8);
  ST0 = (aláíratlanchar)sleepTimer;

Így sikeresen beállíthatod az időzítő időzítését~

(Megjegyzés: A forráskód többi részével úgy gondolom, hogy részletes jegyzetekkel együtt könnyen megérthető, és itt nem ismétlem meg.)

(4) Kísérleti eredmények
Programot futtatva, LED1 megfigyelésével a jelenség a következő:A LED1 villog (azaz egyszer be- > kikapcsol), 1 másodperc után újra villog, 2 másodperc után újra villog, majd kikapcsolva marad, majd megnyomja az S1-et, a LED1 felgyullad.
A kísérleti jelenség teljesen összhangban van a várakozással, Over~

3. Következtetés

Ó~ Két nap szabadidőm után végre megkaptam ezt a naplót. Nagyon rájöttem, hogy blog írása, különösen egy "olvasóbarát" blogbejegyzés írása valóban fizikai feladat: szigorúság, esztétika, logika... Minden a megfontoláson múlik.

Minden alkalommal, amikor feltöltöm a kódot, túl hosszúnak érzem, de vonakodom használni a blog kerthez tartozó hajtogató eszközt. Ezért ebben a blogbejegyzésben a szerző óvatosan hozzáadott néhány JQuery elemet, hogy sima hajtogatást érjen el a kódban, és még mindig van egy kis sikerélmény, hehe (JQuery újonc, ne nevess a mesteren~). De nem tudom, hogy ez valóban javítja-e a cikk olvashatóságát, és olvasók, barátok szívesen hozzászólhatnak :)

Ebben a hónapban a szerző igazán úgy döntött, hogy gyökeret veli a blogkertben, így sok szabadidőmet töltöttem blogbejegyzések írásával. Amikor először írtam blogot, bár kevés hozzászólás volt, a legtöbb napló több mint 500 kattintással rendelkezett, ami egy kis bátorítás volt számomra! Bátorság kell mikrokontrollerekről írt tartalmat publikálni a blogkertben, de kitartok mellette~

A kilenc blogbejegyzés a kezdetektől napjainkig a CC2430 chip alapvető hardvermoduljainak használatára fókuszál. Eddig gyakorlatilag átnéztük a CC2430 legtöbb perifériáját, de még mindig vannak olyan dolgok, mint a Flash hozzáférés, véletlenszámgenerátor, AES koprocesszor, RF kommunikáció stb., amikről még nem beszéltünk. Azonban a Zigbee út még nem ért véget, és a szerző szelektíven kívánja kitölteni ezeket a hiányosságokat a következő témában (a Z-Stack protokoll megvalósítása).

A következő blogbejegyzésben tervezem befejezni Zigbee első útját egy kicsit átfogóbb és hosszabb kísérlettel – a "hőmérséklet-megfigyelő rendszerrel", és elmagyarázom, hogyan lehet átfogóan alkalmazni a korábban megtanult tudáspontokat.

Valójában nem alkalmas arra, hogy ""MagyarázatKezdőként a szerző csak abban reménykedik, hogy bátorítsa egymást, és együtt haladhasson előre a doktori cím megírásában!


</n; i++)




Előző:Zigbee Journey (8): Több fontos CC2430 alapkísérlet – őrkutyák
Következő:Zigbee Journey (10): Átfogó kísérlet – CC2430 alapján készült hőmérséklet-megfigyelő rendszer
Lemondás:
A Code Farmer Network által közzétett összes szoftver, programozási anyag vagy cikk kizárólag tanulási és kutatási célokra szolgál; A fenti tartalmat nem szabad kereskedelmi vagy illegális célokra használni, különben a felhasználók viselik az összes következményet. Az oldalon található információk az internetről származnak, és a szerzői jogi vitáknak semmi köze ehhez az oldalhoz. A fenti tartalmat a letöltés után 24 órán belül teljesen törölni kell a számítógépéről. Ha tetszik a program, kérjük, támogassa a valódi szoftvert, vásároljon regisztrációt, és szerezzen jobb hiteles szolgáltatásokat. Ha bármilyen jogsértés történik, kérjük, vegye fel velünk a kapcsolatot e-mailben.

Mail To:help@itsvse.com