10:18 pm on Sep 22, 2012 | read the article | tags: hobby
don’t know if you have any idea what this is, but i love the wixel. it’s a CC2511F32 based device that works basically like every arduino except that it has a embed wireless transceiver. i got mine from watterott. the wixel is a nifty little device, good for connecting sensors to a PC, both wired and wireless. the problem for the wireless approach is that the device is power hungry 30mA is quite a lot for a battery powered app. but luckily, CC2511F32 is made by texas instruments that addressed this issue: it has a sleep mode in which it consumes less than 1uA.
here’s a small code i’ve wrote to test this sleep mode, based on blink led. it blinks the led 10 times, then powers down and waits for a falling edge on P1_0 (remember to connect this pin with a resistor to 3V3 in order to make the device sleep, otherwise P1_0 is quite sensitive).
#include <wixel.h>
#include <usb.h>
#include <usb_com.h>
#include <stdio.h>
int32 CODE param_blink_period_ms = 500;
int32 CODE param_count = 20; // counting 20 changes of the red led state, then go to sleep
uint32 count = 0; // the actual counter
uint32 lastToggle = 0;
/* catch interrupts on P1INT */
ISR (P1INT, 0) {
/* clearing the CPU interrupt registers */
/* 1. first the general interrupt register, IRCON2 */
IRCON2 &= ~0x08; // clear IRCON2.P1IF
/* 2. followed by the P1 interrupt register, P1IFG */
P1IFG &= ~0x01; // clear P1IF0
/* not related to the interrupt itself, but to the */
/* sleep mode: clear SLEEP.MODE flag */
SLEEP &= ~0x03; // clear SLEEP.MODE
/* disable interrupt only for P1_0 */
P1IEN &= ~0x01; // clear P1_0IEN
/* wait, disabling interrupts on P1 also :) */
IEN2 &= ~0x10; // clear IEN2.P1IE
}
/* the function that puts the system to sleep */
/* i've chosen PM3 as i don't need a timer wake-up event */
void putToSleep () {
/* make the P1_0 a input pin */
P1DIR &= ~0x01; // P1_0DIR = 0 -> input
/* clear any interrupt flags. see above for details */
IRCON2 &= ~0x08; // clear IRCON2.P1IF
P1IFG &= ~0x01; // clear P1IF0
/* set the interrupt enable flag on P1_0 */
P1IEN |= 0x01; // P1_0IEN = 1;
/* set the type of interrupt: 0=rising edge; 1=falling */
PICTL &= ~0x02; // PICTL.P1ICON = 0
/* set the interrupt enable flag for the entire P1 */
IEN2 |= 0x10; // IEN2.P1IE = 1;
/* enable global interrupts */
IEN0 |= 0x80; // IEN0.EA = 1;
/* the sleep mode i've chosen is PM3 */
SLEEP |= 0x03; // SLEEP.MODE = PM3
/* idling the CPU - required in the manual */
if (SLEEP & 0x03) PCON |= 0x01; // PCON.IDLE = 1;
}
void updateLeds()
{
usbShowStatusWithGreenLed();
LED_YELLOW(0);
if (getMs() - lastToggle >= param_blink_period_ms/2)
{
LED_RED(!LED_RED_STATE);
lastToggle = getMs();
/* the piece of code that counts and if the counter */
/* hits the limit, puts the system to sleep */
count++;
if (count == param_count) {
count = 0;
/* here the blinking freezes, waiting for a */
/* falling edge on P1_0 */
putToSleep();
}
}
}
void main()
{
systemInit();
usbInit();
while(1)
{
boardService();
updateLeds();
usbComService();
}
}
aceast sait folosește cookie-uri pentru a îmbunătăți experiența ta, ca vizitator. în același scop, acest sait utilizează modulul Facebook pentru integrarea cu rețeaua lor socială. poți accesa aici politica mea de confidențialitate.