Tajmeri i prekidi
U sljedećim vježbama naučit ćete koristiti klase Timer, Timeout, Ticker i InterruptIn iz standardne mbed biblioteke. Programski kôdovi su dijelom preuzeti iz preporučene literature: Toulson, R. & Wilmshurst, T. (2016). Fast and Effective Embedded Systems Design - Applying the ARM mbed (2nd edition), Newnes, Oxford, ISBN: 978-0-08-100880-5.
Korištenje mbed klase Timer¶
Proučite API dokumentaciju klase Timer.
Proučite sljedeći programski kôd i pokušajte zaključiti što će se događati s LED-icama. Nakon toga testirajte program na mbed-u i provjerite da li su vaša predviđanja bila točna. Ako nisu, vratite se natrag na programski kôd i zaključite zašto.
#include "mbed.h"
Timer timer_fast;
Timer timer_slow;
DigitalOut ledA(LED1);
DigitalOut ledB(LED4);
void task_fast(void);
void task_slow(void);
int main() {
timer_fast.start();
timer_slow.start();
while(true){
if (timer_fast.read() > 0.2) {
task_fast();
timer_fast.reset();
}
if (timer_slow.read() > 1) {
task_slow();
timer_slow.reset();
}
}
}
void task_fast(void) {
ledA = !ledA;
}
void task_slow(void) {
ledB = !ledB;
}
Korištenje mbed klase Timeout¶
Proučite API dokumentaciju klase Timeout.
Proučite sljedeći programski kôd i pokušajte zaključiti što će se događati s LED-icama. Nakon toga testirajte program na mbed-u i provjerite da li su vaša predviđanja bila točna. Ako nisu, vratite se natrag na programski kôd i zaključite zašto.
#include "mbed.h"
Timeout response;
DigitalIn button (p14);
DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
void blink() {
led2 = 1;
wait(0.5);
led2 = 0;
}
int main() {
while(true) {
if(button == 1){
response.attach(&blink, 3.0);
led3=1;
} else {
led3=0;
}
led1=!led1;
wait(0.2);
}
}
Modificirajte gornji programski kôd tako da dodate drugo tipkalo, čijim pritiskom se poništava pridruživanje blink() funkcije s objekta response (izvršite detach()).
Korištenje mbed klase Ticker¶
Proučite API dokumentaciju klase Ticker.
Proučite sljedeći programski kôd i pokušajte zaključiti što će se događati s LED-icama. Nakon toga testirajte program na mbed-u i provjerite da li su vaša predviđanja bila točna. Ako nisu, vratite se natrag na programski kôd i zaključite zašto.
#include "mbed.h"
void led_switch(void);
Ticker time_up;
DigitalOut myled(LED1);
void led_switch() {
myled=!myled;
}
int main(){
time_up.attach(&led_switch, 0.2);
while(true) {
wait(1);
}
}
Modificirajte gornji kôd tako da neka druga LED-ica blinka svaku sekundu.
Korištenje mbed klase InterruptIn¶
Proučite API dokumentaciju klase InterruptIn.
Proučite sljedeći programski kôd i pokušajte zaključiti što će se događati s LED-icama. Nakon toga testirajte program na mbed-u i provjerite da li su vaša predviđanja bila točna. Ako nisu, vratite se natrag na programski kôd i zaključite zašto.
#include "mbed.h"
InterruptIn button(p14);
DigitalOut led(LED1);
DigitalOut flash(LED4);
void isr1() {
led = !led;
}
int main() {
button.rise(&isr1);
while(true) {
flash = !flash;
wait(0.2);
}
}
Pritišćite button nekoliko puta i pažljivo promatrajte ponašanje diode LED1. Da li ste se prisjetili bouncing efekta?
Uklanjanje bouncing efekta (debouncing)¶
Modificirajte program iz prethodne vježbe tako da se ukloni problem bouncing-a, odnosno izvršite debouncing tipkala. Moguće rješenje dano je u sljedećem programskom kôdu:
#include "mbed.h"
InterruptIn button(p14);
DigitalOut led(LED1);
DigitalOut flash(LED4);
Timer debounce;
void isr1() {
if (debounce.read_ms() > 200) {
led = !led;
debounce.reset();
}
}
int main() {
debounce.start();
button.rise(&isr1);
while(true) {
flash = !flash;
wait(0.2);
}
}
Pogledajte također i dokumentaciju klasa DebounceIn i PinDetect, koje su napisane u svrhu debouncinga sklopki i tipkala. Dodatni korisni tutorial o tipkalima i sklopkama možete pročitati ovdje.
Mjerenje udaljenosti pomoću ultrazvučnog senzora HC-SR04¶
Na raspolaganju je ultrazvučni senzor udaljenosti HC-SR04. Napišite program za mjerenje udaljenosti pomoću navedenog senzora.
Čestitke!
Završili ste sve vježbe iz teme Tajmeri i prekidi.
Povratak na naslovnu stranicu TVZ Mechatronics Team-a.