Я уже все проверил раз 5. Вот код для mega16
Код:
#include <mega16.h>
#include <delay.h>
#include <stdio.h>
bit power=0; // 0-выключено 1-включено
bit direction=0; // 0-влево 1-вправо
bit run=0; // 0-стоп 1-крутим
bit pause_flag=0; // для выдерживания паузы перед переключением
unsigned char cnt_bit = 0; //счетчик принятых бит
unsigned char code [14]; //принятый код
unsigned char counter = 0; //"тики" таймера
#define l_min 73 //диапазон для "длинного" (long) интервала в посылке, в "тиках" таймера, 1,28..2,176мс
#define l_max 125
#define s_min 40 //диапазон для "короткого" (short) интервала в посылке, в "тиках" таймера, 0,704..1,088мс
#define s_max 62
bit state = 0; //флаг состояния линии приема
bit error = 0; //флаг ошибки
//переменные структуры посылки, всего 14 бит
unsigned char startbit1 = 0; //первый стартовый бит, д.б. = 1
unsigned char startbit2 = 0; //второй стартовый бит, д.б. = 1
unsigned char toggle = 0; //триггерный бит, инвертируется в посылке при нажатии кнопки, при удержании - не инв.!
unsigned char address = 0; //адрес устройства, 5 бит
unsigned char command = 0; //команда (данные), 6 бит
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
pause_flag=0; // разрешаем переключение питания
run=0;
TCCR1B=0x00; // останавливаем таймер
}
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
counter = TCNT0;
//сохраяем значение таймера-счетчика
TCNT0 = 0x00; //обнуляем таймер
error = 1; //поставили ошибку - потом сбросим в теле, если все ок
if (cnt_bit == 0) //старт посылки
{
TCCR0 = 0x04; //запускаем таймер, частота 31250кГц (или надо править диапазоны тиков для интервалов)
code [cnt_bit] = !PIND.2; //записываем бит кода, PIND.2 - входная нога, прерывание 0
cnt_bit++; //увеличиваем счетчик принятых бит
state = 1; //ставим флаг, т.к. была 1
}
else //в других случаях (не первое срабатывание прерывания)
{
if ((counter>s_min) && (counter<s_max)) //проверка короткого промежутка
{
if (state) //если была 1
{
state = 0; //обнуляем состояние
error = 0; //и ошибку, т.к. все корректно
}
else //если был 0
{
state = 1; //ставим флаг, т.к. теперь - 1
code[cnt_bit] = !PIND.2; //записываем данные - состояние линии
cnt_bit++; //увеличиваем счетчик приема
error=0; //обнуляем ошибку, т.к. все корректно
};
};
if ((counter>l_min) && (counter<l_max)) //проверка длинного промежутка
{
code[cnt_bit] = !PIND.2; //записываем данные - состояние линии
cnt_bit++; //увеличиваем счетчик приема
error = 0; //обнуляем ошибку, т.к. все корректно
};
if (error == 1) //если не попали ни в один из промежутков, то
{
char i = 0; //внутренняя переменная
TCCR0 = 0x00; //останавливаем таймер
TCNT0 = 0x00; //обнуляем таймер
counter = 0; //обнуляем счетчик
cnt_bit = 0; //обнуляем счетчик принятых бит
for (i=0; i<14; i++) code[i]=0; //обнуляем массив принятого кода
};
if (cnt_bit == 14) //если приняли все 14 бит
{
char i = 0; //внутренняя переменная
TCCR0 = 0x00; //останавливаем таймер
TCNT0 = 0x00;; //обнуляем таймер
cnt_bit = 0; //обнуляем счетчик принятых бит
startbit1 = code[0]; //первый стартовый бит
startbit2 = code[1]; //второй стартовый бит
toggle = code[2]; //триггер-бит
//формируем переменные адреса и команды
address = (code[3] << 4)|(code[4] << 3)|(code[5] << 2)|(code[6] << 1)|code[7];
command = (code[8] << 5)|(code[9] << 4)|(code[10] << 3 )|(code[11] << 2)|(code[12] << 1)|code[13];
if (command==12)
{
PORTB.0^=1; // инвертируем состояние включено/выключено;
}
for (i=0; i<14; i++) code[i]=0; //обнуляем массив принятого кода
};
};
}
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
char i = 0; //внутренняя переменная
TCCR0 = 0x00; //останавливаем таймер
TCNT0 = 0x00; //обнуляем таймер
counter = 0; //обнуляем счетчик
cnt_bit = 0; //обнуляем счетчик принятых бит
for (i=0; i<14; i++) code[i]=0; //обнуляем массив принятого кода
}
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=Out
// State7=T State6=T State5=T State4=T State3=T State2=T State1=0 State0=0
PORTB=0x00;
DDRB=0x07;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 7,813 kHz
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x05;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 14,400 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x00;
TCCR1B=0x04;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Any change
// INT1: Off
// INT2: Off
GICR|=0x40;
MCUCR=0x01;
MCUCSR=0x00;
GIFR=0x40;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 9600
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x5F;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x05;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// Global enable interrupts
#asm("sei")
while (1)
{
};
}