-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.c
executable file
·88 lines (81 loc) · 2.74 KB
/
main.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
uint8_t period=0;
uint32_t recievedData=0;
void NextChannel(){
uint8_t chanSel = PORTB & 0x07;
chanSel++;
if (chanSel<4) chanSel=4;
if (chanSel>7) chanSel=0;
PORTB = ((PORTB & 0xf8)|chanSel);
}
void SwitchOff(){
if(PORTB & 0x07){
PORTB = ((PORTB & 0xf8)|0x00);
}else{
PORTB = ((PORTB & 0xf8)|0x04);
}
}
//Прерывание по сигналу на кнопке или ИК-приемнику.
ISR(PCINT0_vect){
if(PINB&(1<<PINB3)){
NextChannel();
_delay_ms(500);
}else{
if((PINB&(1<<PINB4))==0){
uint8_t ticks = TCNT0;
TCCR0B |= (3<<CS00); //Включаем/перевключаем таймер. Предделитель 64
if (ticks>80){ //Если это длительный пакет на входе. >5мс
recievedData=0; //Обнуляем данные
}else if (ticks>36){ //Пакет >2мс, но меньше 5
recievedData = (recievedData<<1)|1;
}else if (ticks>5){
recievedData = (recievedData<<1)|0;
}
TCNT0=0; //Обнуляем счетчик.
}
//_delay_ms(200);
}
}
//Прерывание по переполнению таймера.
ISR (TIM0_OVF_vect){
//static uint32_t lastData = 0;
TCCR0B &= ~(7<<CS00); //Выключаем таймер.
TCNT0=0;
//if (lastData==recievedData){
switch (recievedData)
{
case 0x18000:
NextChannel();
break;
case 0x0E0E040BF:
SwitchOff();
break;
default:
//if(recievedData) NextChannel();
break;
}
//lastData = 0;
//}else{
// lastData = recievedData;
//}
recievedData=0;
_delay_ms(500);
}
int main(void)
{
//Настраиваем прерывание
SREG |= (1<<7);
GIMSK = (1<<PCIE); //Включаем прерывание по изменению пина
PCMSK = (1<<PCINT3)|(1<<PCINT4); //На порту PB4 (IRприемник) и PB3 (по кнопке).
//Настройка таймера
TCCR0B |= (4<<CS00); //Предделитель 256
TIMSK0 |= (1<<TOIE0); //Прерывание по переполнению.
//Настройка порта
DDRB = 0x07; //PB0,PB1,PB2 - На выход. Остальное на вход.
//_delay_ms(50);
PORTB = 0x10; //Вкл. Подтяжку для ИК приемника.
while(1){
}
}