Contiki - 我如何触发事件?

时间:2017-12-18 12:07:59

标签: c contiki

我正在尝试在Contiki中为Zolertia REmote编写一个程序,它将从传感器中读取一个值,并且根据此值以及遥控器上的用户按钮是否被按下一段时间,一个LED将被转动打开,变暗或将保持关闭状态。到目前为止,我所拥有的部分代码是:

while(1){

PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
ldr = adc_zoul.value(ZOUL_SENSORS_ADC1);
printf("ADC1 = %u raw\n", ldr);

if (ldr >= 16500) {
PROCESS_YIELD();
if (ev == button_press_duration_exceeded) {
    GPIO_SOFTWARE_CONTROL(EXAMPLE_PORT_BASE, EXAMPLE_PIN_MASK);
    GPIO_SET_OUTPUT(EXAMPLE_PORT_BASE, EXAMPLE_PIN_MASK);
    GPIO_SET_PIN(EXAMPLE_PORT_BASE, EXAMPLE_PIN_MASK); /*Set High*/
     }
else {
    pwm_enable(pwm_num.freq, pwm_num.duty, 0, pwm_num.timer, pwm_num.ab);
    pwm_start(pwm_num.timer, pwm_num.ab, pwm_num.port, pwm_num.pin);
  }
}
else if (ldr < 16500 && ldr >= 6600) {
PROCESS_YIELD();
if(ev == button_press_duration_exceeded) {
    pwm_enable(pwm_num.freq, pwm_num.duty, 0, pwm_num.timer, pwm_num.ab);
    pwm_start(pwm_num.timer, pwm_num.ab, pwm_num.port, pwm_num.pin);
    }
else {
    GPIO_SOFTWARE_CONTROL(EXAMPLE_PORT_BASE, EXAMPLE_PIN_MASK);
    GPIO_SET_OUTPUT(EXAMPLE_PORT_BASE, EXAMPLE_PIN_MASK);
    GPIO_CLR_PIN(EXAMPLE_PORT_BASE, EXAMPLE_PIN_MASK); /*Set Low*/
   }
 }
else { 
   GPIO_SOFTWARE_CONTROL(EXAMPLE_PORT_BASE, EXAMPLE_PIN_MASK);
   GPIO_SET_OUTPUT(EXAMPLE_PORT_BASE, EXAMPLE_PIN_MASK);
   GPIO_CLR_PIN(EXAMPLE_PORT_BASE, EXAMPLE_PIN_MASK); /*Set Low*/
}


etimer_reset(&et);

}

我的问题是当ldr值从低于6600变为高于16500时,因此无论如何,LED都应该变暗。事实上,除非我按下用户按钮,否则它不会变暗,即使是一秒钟。然后只要ldr值保持在16500以上,一切都运行良好 - 当我按下按钮时,LED已经完全打开,当我释放它时,led暗淡。然而,当ldr从16500以上变为[6600,16500]时,如果按下按钮时LED应该关闭,它实际上会变暗,直到我再次按下用户按钮一秒钟。

正如我所看到的,问题是即使ldr值发生变化,除非我按下用户按钮,否则它不会被读取。我认为这与使用命令PROCESS_YIELD();有关,它告诉程序要等到事件发生。如果我删除此命令,则led根本不会打开或变暗。所以,我的猜测是我必须触发一个事件,以便读取ldr值。

有没有人知道如何做到这一点?提前谢谢!

1 个答案:

答案 0 :(得分:0)

您可能想要使用以下内容:

Process_wait_event_until(ev==XXXXXX); 

而不是process yield