#include "stm8s.h" #include "millis.h" // makra definující piny LEDek #define LEDR1_GPIO GPIOG #define LEDR1_PIN GPIO_PIN_7 #define LEDG1_GPIO GPIOG #define LEDG1_PIN GPIO_PIN_6 #define LEDY1_GPIO GPIOG #define LEDY1_PIN GPIO_PIN_5 // makra pro přepnutí stavu LEDek (jen pro zlepšení čitelnosti programu) #define LEDR1_ON GPIO_WriteHigh(LEDR1_GPIO,LEDR1_PIN) // červená LED #define LEDG1_ON GPIO_WriteHigh(LEDG1_GPIO,LEDG1_PIN) // zelená LED #define LEDY1_ON GPIO_WriteHigh(LEDY1_GPIO,LEDY1_PIN) // žlutá (oranžová) LED #define LEDR1_OFF GPIO_WriteLow(LEDR1_GPIO,LEDR1_PIN) #define LEDG1_OFF GPIO_WriteLow(LEDG1_GPIO,LEDG1_PIN) #define LEDY1_OFF GPIO_WriteLow(LEDY1_GPIO,LEDY1_PIN) // možné stavy semaforu (lepší dělat pomocí enum, ale teď pro jednoduchost makry) #define CERVENA 0 // stav "svítí červená" #define CERVENA_ZLUTA 1 // stav "svítí červená a žlutá" #define ZELENA 2 // stav "svítí zelená" #define ZLUTA 3 // stav "svítí žlutá" // časy jak dlouho má být semafor v jednotlivých stavech (m milisekundách) #define TRVANI_CERVENE 4000 #define TRVANI_CERZLUT 1500 #define TRVANI_ZELENE 4000 #define TRVANI_ZLUTE 1500 void process_semaphore1(void); void main(void){ CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); // taktujeme na 16MHz // nastavní pinů pro LEDky jako výstupy + počáteční rozscícení červené GPIO_Init(LEDR1_GPIO,LEDR1_PIN,GPIO_MODE_OUT_PP_HIGH_SLOW); GPIO_Init(LEDG1_GPIO,LEDG1_PIN,GPIO_MODE_OUT_PP_LOW_SLOW); GPIO_Init(LEDY1_GPIO,LEDY1_PIN,GPIO_MODE_OUT_PP_LOW_SLOW); init_millis(); // spouštíme millis časovač while (1){ process_semaphore1(); // obsloužíme semafor // obsluhujeme jiné (momentálě nepřítomné) činnosti } } // funkce obsluhující ovládání semaforu void process_semaphore1(void){ static uint32_t last_time=0; // ukládáme si časy abychom věděli kdy přepnout stav static uint8_t stav=CERVENA; // začínáme ze stavu "svítí červená" // zjistíme ve kterém stavu semafor je (lepší dělat pomocí switch/case) if(stav==CERVENA){ // jsme ve stavu že "svítí červená" ? if(millis() - last_time >= TRVANI_CERVENE){ // už uplynul čas ke svícení červené ? last_time = millis(); // uložit si akutální čas stav = CERVENA_ZLUTA; // přejdeme do stavu "svítí červená a žlutá" LEDR1_ON; // rozsvítit žlutou a červenou LEDku LEDY1_ON; LEDG1_OFF; } }else if(stav==CERVENA_ZLUTA){ // jsme ve stavu že "svítí červená a žlutá" ? // sledovat zda vypršel čas červené a žluté barvy if(millis() - last_time >= TRVANI_CERZLUT){ // už uplynul čas ke svícení červené a žluté ? last_time = millis(); // uložit si akutální čas stav = ZELENA; // přejdeme do stavu "svítí zelená" LEDR1_OFF; LEDY1_OFF; LEDG1_ON; // rozsvítit zelenou } }else if(stav==ZELENA){ // jsme ve stavu že "svítí zelená" ? // sledovat zda vypršel čas červené a žluté barvy if(millis() - last_time >= TRVANI_ZELENE){ // už uplynul čas ke svícení zelené ? last_time = millis(); // uložit si akutální čas stav = ZLUTA; // přejdeme do stavu "svítí žlutá" LEDR1_OFF; LEDY1_ON; // rozsvítit žlutou LEDG1_OFF; } }else if(stav==ZLUTA){ // jsme ve stavu že "svítí žlutá" ? // sledovat zda vypršel čas červené a žluté barvy if(millis() - last_time >= TRVANI_ZLUTE){ // už uplynul čas ke svícení žluté ? last_time = millis(); // uložit si akutální čas stav = CERVENA; // přejdeme do stavu "svítí červená" (čímž se vrátíme na začátek) LEDR1_ON; // rozsvítit červenou LEDY1_OFF; LEDG1_OFF; } } }