我正在尝试在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值。
有没有人知道如何做到这一点?提前谢谢!
答案 0 :(得分:0)
您可能想要使用以下内容:
Process_wait_event_until(ev==XXXXXX);
而不是process yield
。