Kategorien
C

Wie spart ZigBee die Energie für den Betrieb der Geräte

ZigBee Netzwerke sind sehr energiesparend und langlebig. Man kann ohne Probleme ein End-Device ohne Stromquelle für 5Jahre z.B. an einer Wand befestigen und Sie funktionieren mit der eigene internen Mini Batterie weiter.

Der Grund dafür ist auf programmatischer Sicht das System der Interrupts, welches die Hardware eines ZigBee Devices bei Bedarf an und wieder ausschaltet. Die Bauteile verbrauchen im Sleep-Mode nur 0,1% der Energie im Vergleich zum normalen Betrieb.

Zur Bedienung dieser Events verwendet man HAL-Funktionen, mit deren Hilfe man eigene Funktionen zu diesen Events in C schreiben kann.

Interrupts werden wie folgt in das Programm eingebaut am Beispiel:
Mit Timer-Interrupt aus dem Schlafbetrieb aufwachen, sich melden und wieder einschlafen.

Lösung:
– „handleTimer“ definieren für 4 Sekunden Sleep-Mode und danach „wake up“
– HAL_SLEEP(); versetzt wieder in Schlafmode
– handleTimer() gibt „wake up“ auf Konsole aus, wenn der Timer Interrupt gesendet wird

#include "../HAL/hal_cc2530znp_target_board.h"
#include "../HAL/hal_vti_cma3000_D01_accelerometer.h"

/** function pointers (in hal file) for the function that gets called when an interrupt is detected*/
extern void (*buttonIsr)(void);
extern void (*timerIsr)(void);

/** Our interrupt handlers */

void handleTimer(void);

/*
char charBuffer[20];
char* start;
char* end;
*/

int main( void )
{

    halInit();                          //Initialize hardware
    delayMs(5000);
    HAL_DISABLE_INTERRUPTS();// bis Konfiguration beendet, keine Interrupts
    printf("\r\n************************************************************\r\n");    
    printf("Mit Timer-Interrupt Schlafbetrieb ausgehen, melden und einschlafen\r\n");    
    unsigned int vlo = calibrateVlo();
    printf("VLO = %u Hz\r\n", vlo);   
    timerIsr = &handleTimer;  
    printf("Send message on timer enabled.\r\n");    

    HAL_ENABLE_INTERRUPTS();              //Enable Interrupts
    signed int timerResult = initTimer(4, WAKEUP_AFTER_TIMER);
    if (timerResult != 0)
    {
        printf("timerResult Error %i, STOPPING\r\n", timerResult);
        while (1);   
    }
    while (1)
    {
        printf("sleep\r\n");
        HAL_SLEEP();
    }
}

/** Handles timer interrupt */
void handleTimer()
{
    printf("Wake up!\r\n");
}