Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * avtomat.c
- *
- * Created: 30.01.2022 20:15:03
- * Author : rockd
- */
- #define F_CPU 8000000UL// тактовая частота мк
- #include <avr/io.h>
- #include <avr/interrupt.h>
- uint8_t tiki;// глобальные тики
- uint8_t clk;// флаг клика
- uint8_t clk1;// флаг клика
- // обработчик прерывания по переполнению. ~61гц
- ISR(TIM0_OVF_vect)
- {
- tiki++;//инкрементируем с каждым прерыванием
- }
- ISR(TIM1_OVF_vect)
- {
- unsigned int u;
- TCNT1=64536;
- ADCSRA |= (1 << ADSC); // Начинаем преобразование
- while ((ADCSRA&(1 << ADIF))== 0); // Ждем флага окончания преобразования
- u = (ADCL|ADCH << 8); // Считываем ADC
- if (u > 1)
- {
- PORTA |= (1<<PA4);
- PORTA &= ~(1<<PA5);
- }
- if (u > 740)
- {
- PORTA |= (1<<PA5);
- PORTA &= ~(1<<PA4);
- }
- }
- // инициализация таймера
- void timer_ini(void)
- {
- TCCR0B|=(1<<CS01)|(1<<CS00);// запуск таймера 0 с делителем 64
- TIMSK0|=(1<<TOIE0);// разрешить прерывание по переполнению
- TCCR1B|=(1<<CS11);
- TIMSK1|=1<<TOIE1;
- }
- void adc_ini(void)
- {
- /*** Настройка АЦП ***/
- ADCSRA |= (1 << ADEN) // Включение АЦП
- |(1 << ADPS1)|(1 << ADPS0); // предделитель преобразователя на 8
- ADMUX |= (0 << REFS1)|(0 << REFS0) // внешний ИОН
- |(1 << MUX0)|(1 << MUX1); // вход PA3
- }
- // получить тики эта функция возвращает текущее значение тики
- uint8_t tikies(void)
- {
- return tiki;
- }
- // инициализация блинков
- void blink_ini(void)
- {
- DDRB|=(1<<PB2);
- DDRA|=(1<<PA0)|(1<<PA1) |(1<<PA2) | (1<<PA4)|(1<<PA5)| (1<<PA6)|(1<<PA7);
- }
- void button_KA(void)
- {
- static uint8_t status, press;
- uint8_t now=tikies();// получаем текущее время
- switch (status)
- {
- case 0:// опрос кнопки
- if (!(PINB&(1<<PB0))) // если кнопка нажата
- {
- status=1;// уходим в статус 1
- press=now;// запоминаем время нажатия
- }
- break;
- case 1:// учет времени удеражания кнопки
- if (PINB&(1<<PB0))// если кнопка уже отжата
- {
- if ((uint8_t) (now-press)>=3) clk=1;// рассчитываем время удержания кнопки, если достаточно поднимаем флаг клика
- status=0;// уходим в статус 0
- }
- else// иначе, кнопка всё еще удерживается
- {
- if ((uint8_t) (now-press)>=61) {// если удерживается уже достаточно долго
- clk=10;// поднимаем флаг длинного клика
- status=2;// уходим в статус 2
- }
- }
- break;
- case 2:// ждем пока кнопку отпустят
- if (PINB&(1<<PB0)) status=0;// когда на пине 1 уходим в статус 0
- break;
- }
- }
- void button_KA1(void)
- {
- static uint8_t status, press1;
- uint8_t now1=tikies();// получаем текущее время
- switch (status)
- {
- case 0:// опрос кнопки
- if (!(PINB&(1<<PB1))) // если кнопка нажата
- {
- status=1;// уходим в статус 1
- press1=now1;// запоминаем время нажатия
- }
- break;
- case 1:// учет времени удеражания кнопки
- if (PINB&(1<<PB1))// если кнопка уже отжата
- {
- if ((uint8_t) (now1-press1)>=3) clk1=1;// рассчитываем время удержания кнопки, если достаточно поднимаем флаг клика
- status=0;// уходим в статус 0
- }
- else// иначе, кнопка всё еще удерживается
- {
- if ((uint8_t) (now1-press1)>=61) {// если удерживается уже достаточно долго
- clk1=10;// поднимаем флаг длинного клика
- status=2;// уходим в статус 2
- }
- }
- break;
- case 2:// ждем пока кнопку отпустят
- if (PINB&(1<<PB1)) status=0;// когда на пине 1 уходим в статус 0
- break;
- }
- }
- uint8_t button_stat(void)
- {
- uint8_t a=clk;
- clk=0;
- return a;
- }
- uint8_t button_stat1(void)
- {
- uint8_t a=clk1;
- clk1=0;
- return a;
- }
- void blink_click_KA(void){
- static uint8_t status, change;
- uint8_t now=tikies();// текущее "время"
- uint8_t but=button_stat();// получение событий от кнопки
- switch (status)
- {
- case 0:// светодиод выключен
- if (but)// если было нажатие меняем статус.
- {
- if (but==1) status=1;
- if (but==10) status=2;
- }
- PORTB&=~(1<<PB2);
- break;
- case 1:// светодиод включен
- if (but)// если было нажатие меняем статус.
- {
- if (but==1) status=2;
- //if (but==10) status=2;
- }
- PORTB|=(1<<PB2);
- break;
- case 2:// светодиод мигает
- if (but)// если было нажатие меняем статус.
- {
- if (but==1) status=3;
- if (but==10) status=1;
- }
- if ( (uint8_t) (now-change)<50) break;
- PORTB^=(1<<PB2);
- change=now;
- break;
- case 3:// светодиод мигает
- if (but)// если было нажатие меняем статус.
- {
- if (but==1) status=0;
- if (but==10) status=1;
- }
- if ( (uint8_t) (now-change)<25) break;
- PORTB^=(1<<PB2);
- change=now;
- break;
- }
- }
- void blink_click_KA1(void){
- static uint8_t status, change1;
- uint8_t now1=tikies();// текущее "время"
- uint8_t but1=button_stat1();// получение событий от кнопки
- switch (status)
- {
- case 0:// светодиод выключен
- if (but1)// если было нажатие меняем статус.
- {
- if (but1==1) status=1;
- //if (but==10) status=5;
- }
- PORTA&=~(1<<PA0);
- //PORTA&=~(1<<PA3);
- break;
- case 1:// светодиод включен
- if (but1)// если было нажатие меняем статус.
- {
- if (but1==1) status=2;
- //if (but==10) status=2;
- }
- PORTA|=(1<<PA0);
- //PORTA|=(1<<PA3);
- break;
- case 2:// светодиод включен
- if (but1)// если было нажатие меняем статус.
- {
- if (but1==1) status=3;
- //if (but==10) status=2;
- }
- PORTA&=~(1<<PA0);
- //PORTA&=~(1<<PA3);
- PORTA|=(1<<PA1);
- //PORTA|=(1<<PA4);
- break;
- case 3:// светодиод включен
- if (but1)// если было нажатие меняем статус.
- {
- if (but1==1) status=4;
- //if (but==10) status=2;
- }
- PORTA&=~(1<<PA1);
- //PORTA&=~(1<<PA4);
- PORTA|=(1<<PA2);
- //PORTA|=(1<<PA5);
- break;
- case 4:// светодиод мигает
- if (but1)// если было нажатие меняем статус.
- {
- if (but1==1) status=1;
- if (but1==10) status=1;
- }
- if ( (uint8_t) (now1-change1)<1) break;
- PORTA&=~(1<<PA2);
- //PORTA&=~(1<<PA5);
- change1=now1;
- break;
- }
- }
- int main(void)
- {
- /*** Настройка АЦП ***/
- ADCSRA |= (1 << ADEN) // Включение АЦП
- |(1 << ADPS1)|(1 << ADPS0); // предделитель преобразователя на 8
- ADMUX |= (0 << REFS1)|(0 << REFS0) // внешний ИОН
- |(1 << MUX0)|(1 << MUX1); // вход PA3
- //TCCR1A = 0b00000000;
- //TCCR1B|=1<<CS11;
- //TIMSK1|=1<<TOIE1;
- adc_ini();
- blink_ini(); // инициализация блинков
- timer_ini();// инициализация таймера
- sei();// глобально разрешить прерывания
- while (1)
- { blink_click_KA();
- blink_click_KA1();
- button_KA();
- button_KA1();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment