Я вот со своей прогой приемника ДУ замучался, уже опять на Тини13 переделал,а когда более детально симуляцию прогнал, то вообще впал в недоумение. Когда контроллеру разрешено прерывание, в регистре статуса висит флаг I. Так вот когда у меня идет обработка ISR(TIM0_OVF_vect) флаг по нормальному сбрасывается, считаем тики и если больше 600 - выполняем операции, удачно зависаем, и видим - флаг I то появился! Т.е. прерывание считается обработанным! Если в этот момент я искусственно в симуляторе вызову внешнее прерывание, то МК уходит на его обработку - сюда ISR(INT0_vect). Но мне то надо, чтобы он ушел в этот кусок -
while(paket==0)
{
PORTB|=(1‹‹PB4); //включаем приемник
_delay_ms(300); //задержка 300мС
if(paket==0)
{
PORTB&=(~(1‹‹PB4)); //отключаем питание приемника
_delay_ms(700); //задержка 700мС
}
else {PORTB|=(1‹‹PB4);} //включаем приемник
}
Подскажите кто-нибудь как это все-таки исправить?
Почему то с утра не могу ничего подгрузить на форум попробую всатвить весь текст
/************************************************** ***
Chip type :
ATtiny13
Program type : Application
Clock frequency : 4,800000 MHz
************************************************** ***/
#include ‹avr/io.h›
#include ‹avr/iotn13.h›
#include ‹util/delay.h›
#include ‹avr/interrupt.h›
#define F_CPU 4800000UL //тактовая частота МК
unsigned int tick = 0; //счетчик тиков таймера
unsigned char b_cnt = 0; //счетчик принятых бит
unsigned char start_cond = 0; //флаг стартового условия
unsigned char repeat_cond = 0; //флаг повтора
unsigned long cod = 0; //байт полученного кода валидности
unsigned long cod_valid=0x800e; //байт установленного кода валидности
unsigned long cod_2 = 0; //байт полученного кода валидности
unsigned long cod_1 = 0; //байт полученного кода валидности
unsigned long cod_cod = 0; //байт проверенного кода валидности
volatile unsigned char paket=0; //признак начала приема посылки
int main(void)
{
// Declare your local variables here
// Port B initialization
// Func5=Out Func4=Out Func3=Out Func2=Out Func1=In Func0=Out
// State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0x3D;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
// External Interrupt(s) initialization
// INT: On
// INT Mode: Falling Edge
MCUCR=0x02;
GIMSK=0x40;
PCMSK=0x00;
GIFR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK0=0x02;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
//ACSR=0x80;
//SFIOR=0x00;
sei();
while(paket==0)
{
PORTB|=(1‹‹PB4); //включаем приемник
_delay_ms(300); //задержка 300мС
if(paket==0)
{
PORTB&=(~(1‹‹PB4)); //отключаем питание приемника
_delay_ms(700); //задержка 700мС
}
else {PORTB|=(1‹‹PB4);} //включаем приемник
}
}
// External Interrupt 0 service routine
ISR(INT0_vect)
{
PORTB|=(1‹‹PB4); // для надежности опять включаем приемник
paket=1; // устанавливаем признак начала обработки посылки
MCUCR^=(1‹‹ISC00); // меняем работу внешнего прерывания на срез
TCNT0=0xFE; //запускаем таймер
TCCR0B=2; //к-т деления тактовой для таймера 8
if (tick›=240 && tick‹450) //если случилось от 110 до 135 тиков
{
start_cond = 1; //фиксируем стартовое условие - как-бы сарт-бит
cod = 0; //обнуляем ранее полученный код
}
if (tick ›= 33 && tick ‹ 44 && start_cond) //если случилось от 14 до 20 тиков
{
++b_cnt; //приняли "1" и увеличили счетчик битов
cod = (cod ‹‹ 1) + 1; // пишем единицу в код
PORTB^=(1‹‹PB2);
}
if (tick ›= 12 && tick ‹ 21 && start_cond) //если случилось от 5 до 9 тиков
{
++b_cnt; //приняли "0" и увеличили счетчик битов
cod = (cod ‹‹ 1); //далее - аналогично по битам
PORTB^=(1‹‹PB3);
}
tick = 0; //обнулили тики
if (b_cnt == 25) //если приняли уже все 25 бит
{
b_cnt = 0; //обнулили счетчик битов
start_cond = 0; //сбросили стартовое условие
TCCR0B=0x00; //остановили таймер
TCNT0=0x00;
paket=0;
MCUCR=0x02;
if (cod==cod_valid)
{
PORTB|=(1‹‹PB0); //если принятый код равен коду проверки, включаем...
}
}
}
// Timer 0 overflow interrupt service routine
ISR(TIM0_OVF_vect)
{
if(paket==1)
{
TCNT0=0xFE; //переинициализировали таймер
}
if (++tick › 600) //если насчитали более 600 тиков
{
TCCR0B=0x00; //сбросили все к исходному состоянию
TCNT0=0x00;
tick = 0;
start_cond = 0;
paket=0;
MCUCR=0x02; //настраиваем внешнее прерывание по фронту сигнала
} //для измерения длительности сигнала
}