#define COUNT_TIME 156 //значение в регистр совпадения таймера (10мс)
#define PIN_BTN PC0 //A0
#define PIN_LED_BLUE PC3 //A3
#define PIN_LED_RED PC2 //A2
#define PIN_LED_GREEN PC1 //A1
#define BOUNCE_CONTACT 7
#define PRESS_NORMAL 200-BOUNCE_CONTACT
#define PRESS_PROG1 400-PRESS_NORMAL
#define PRESS_PROG2 600-PRESS_PROG1
//#define PRESS_PROG_MAX 600-PRESS_PROG2
#define WORK_NO 0
#define WORK_NORMAL 1
#define WORK_PROG1 2
#define WORK_PROG2 3
#define WORK_ERR 4
// Операции с битами:
#define SetBit(reg, bit) reg = reg | (1<<bit)
#define ClearBit(reg, bit) reg = reg & (~(1<<bit))
#define InvBit(reg, bit) reg ^= (1<<bit)
#define BitIsSet(reg, bit) ((reg & (1<<bit)) != 0)
#define BitIsClear(reg, bit) ((reg & (1<<bit)) == 0)
uint8_t BtnState = 0; // статус состояния нажатия кнопки
uint8_t WorkState = WORK_NO; // состояние работы
uint8_t flag = 0; // флаг устанавливается в прерывании в 1 каждые 10мс
uint16_t cntBtn = 0; // счетчик времени нажатия кнопки
#define LEDON 1
#define LEDOFF 2
#define valueLEDON 1
#define valueLEDOFF 2
uint8_t LedState = 0;
uint8_t cntBlinkLed = 0;
uint8_t cnt = 20;
uint8_t cnt1 = 20;
//-----Прототипы функций----------------------------
void timer_init();
void port_init();
void BlinkLed();
//-----END Прототипы функций----------------------------
//PORTC &= ~(1 << PIN_LED_BLUE | 1 << PIN_LED_RED | 1 << PIN_LED_GREEN);
//-----Прерывания----------------------------
ISR(TIMER1_COMPA_vect) {
flag = 1; // устанавливаем флаг в прерывании таймера =10мс
cnt--;
if (cnt == 0) {
InvBit(PORTC, PIN_LED_GREEN);
cnt = 20;
}
}
//-----END Прерывания----------------------------
int main() {
timer_init();
port_init();
while (1) {
if (flag == 1) {
cnt1 --;
if (cnt1 == 0) {
InvBit(PORTC, PIN_LED_BLUE);
cnt1 = 20;
}
}
flag = 0; //сбрасываем флаг, установленный в прерывании таймера =10мс
}
}
/*
switch (WorkState) {
case WORK_NO:
break;
case WORK_NORMAL:
LedState = LEDON;
WorkState = WORK_NO;
break;
}
BlinkLed();
}
flag = 0; //сбрасываем флаг, установленный в прерывании таймера =10мс
}
}*/
////////////////////////////////////////////////
//////////////////////////////////////////////
//-----Функции----------------------------
/*
частота 16МГц 1сек/16000000Гц*1024 = 0,000064 сек/такт
0,001сек = 1мс= 0,001/0,000064 = 16 значение в регистр совпадения
0,010сек = 10мс=0,010/0,000064 = 156 значение в регистр совпадения
*/
void timer_init() {// инициализация Timer1
cli(); // отключить глобальные прерывания
TCCR1A = 0; // установить регистры в 0
TCCR1B = 0;
OCR1A = COUNT_TIME; // установка регистра совпадения
TCCR1B |= (1 << WGM12); // включение в CTC режим
// Установка битов CS10 и CS12 на коэффициент деления 1024
TCCR1B |= (1 << CS10);
TCCR1B |= (1 << CS12);
TIMSK1 |= (1 << OCIE1A); // включение прерываний по совпадению
sei(); // включить глобальные прерывания
}
void port_init() //инициализация портов
{
//pinMode(LEDPIN1, OUTPUT);
//pinMode(A2, OUTPUT);
DDRC |= (1 << PIN_LED_BLUE | 1 << PIN_LED_RED | 1 << PIN_LED_GREEN);
PORTC &= ~(1 << PIN_LED_BLUE | 1 << PIN_LED_RED | 1 << PIN_LED_GREEN); //В ПОРТАХ 0
DDRC &= ~(1 << PIN_BTN); //ПОРТ НА ВЫХОД
PORTC |= (1 << PIN_BTN); //В ПОРТУ 1
}
void BlinkLed() //Функция мигания светодиодов
{
switch (LedState) {
case 0:
//cntBlinkLed = valueLEDON;
break;
case LEDON:
SetBit(PORTC, PIN_LED_RED);
cntBlinkLed--;
if (cntBlinkLed == 0) {
LedState = LEDOFF;
cntBlinkLed = valueLEDOFF;
}
break;
case LEDOFF:
ClearBit(PORTC, PIN_LED_RED);
cntBlinkLed--;
if (cntBlinkLed == 0) {
LedState = 0;
}
break;
}
}