Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * avtomat.c
- *
- * Created: 30.01.2022 20:15:03
- * Author : rockd
- */
- #include <avr/io.h>
- #include <avr/interrupt.h>
- uint8_t tiki;// глобальные тики
- // обработчик прерывания по переполнению. ~61гц
- ISR(TIMER0_OVF_vect)
- {
- tiki++;//инкрементируем с каждым прерыванием
- }
- // инициализация таймера
- void timer_ini(void)
- {
- TCCR0|=(1<<CS01) | (1<<CS00);// запуск таймера 0 с делителем 64
- TIMSK|=(1<<TOIE0);// разрешить прерывание по переполнению
- }
- // получить тики эта функция возвращает текущее значение тики
- uint8_t tikies(void)
- {
- return tiki;
- }
- // инициализация блинков
- void blink_ini(void){
- DDRB|=(1<<PB0) | (1<<PB1) | (1<<PB2)|(1<<PB3);
- }
- void blink_KA3(uint8_t on_time, uint8_t off_time){
- static uint8_t status, change;
- uint8_t now=tikies();
- switch (status)
- {
- case 0:
- PORTB^=(1<<PB2);// переключаем состояние пина светодиода
- change=now;//запоминаем время переключения
- if (PINB&(1<<PB2)) status=1;// если на пине 1 уходим в статус 1
- else status=2;//иначе уходим в статус 2
- break;
- case 1:// ждем когда кончится время включения
- if ( (uint8_t) (now-change)>=on_time) status=0;
- break;
- case 2:// ждем когда кончится время выключения
- if ( (uint8_t) (now-change)>=off_time) status=0;
- break;
- }
- }
- void blink_KA0(uint8_t on_time, uint8_t off_time){
- static uint8_t status, change;
- uint8_t now=tikies();
- switch (status)
- {
- case 0:
- PORTB^=(1<<PB3);// переключаем состояние пина светодиода
- change=now;//запоминаем время переключения
- if (PINB&(1<<PB3)) status=1;// если на пине 1 уходим в статус 1
- else status=2;//иначе уходим в статус 2
- break;
- case 1:// ждем когда кончится время включения
- if ( (uint8_t) (now-change)>=on_time) status=0;
- break;
- case 2:// ждем когда кончится время выключения
- if ( (uint8_t) (now-change)>=off_time) status=0;
- break;
- }
- }
- void blink_KA2(uint8_t on_time, uint8_t off_time){
- static uint8_t status, change;
- uint8_t now=tikies();
- switch (status)
- {
- case 0:
- PORTB&=~(1<<PB1);// выключить светодиод
- change=now;//запомнить время выключения
- status=1;//уходим в статус 1
- break;
- case 1:// ждем пока кончится время выключения и уходим в статус 2
- if ( (uint8_t) (now-change)>=off_time) status=2;
- break;
- case 2:
- PORTB|=(1<<PB1);// включить свеиодиод
- change=now;//запомнить время включения
- status=3;//уходим в статус 3
- break;
- case 3:// ждем пока кончится время включения и уходим в статус 0
- if ( (uint8_t) (now-change)>=on_time) status=0;
- break;
- }
- }
- void blink_KA(void){
- static uint8_t status, change;
- uint8_t now=tikies();
- switch (status)
- {
- case 0:
- if ( (uint8_t) (now-change)<60) break; // если время не вышло - выход
- PORTB|=(1<<PB0);// иначе включить светодиод
- change=now;// запомнить время включения
- status=1;// уходим в статус 1
- break;
- case 1:
- if ( (uint8_t) (now-change)<60) break; // если время не вышло - выход
- PORTB&=~(1<<PB0);// иначе выключить светодиод
- change=now;// запомнить время выключения
- status=0;// уходим в статус 0
- break;
- }
- }
- int main(void)
- {
- blink_ini(); // инициализация блинков
- timer_ini();// инициализация таймера
- sei();// глобально разрешить прерывания
- while (1)
- {
- blink_KA();
- blink_KA2(10,30);
- blink_KA3(10,10);
- blink_KA0(80,80);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment