Осваиваю программирование микроконтроллеров, в данный момент разбираюсь с внешними прерываниями. Значит, подключил 2 кнопки, мигаю светодиодами, всё замечательно, но никак не получается реализовать вот этот код:
CODE:
#define F_CPU 1000000UL // указываем частоту в герцах
#include <avr/io.h> // подключаем библиотеку АВР
#include <util/delay.h> // подключаем библиотеку задержек
#include <avr/interrupt.h> // подключаем библиотеку прерываний
#define nop() {asm("nop");}
int s = 50000; // переменная для задержки
unsigned int x;
void delay(int t)
{
for (x=t; x>0 ;x--)
nop ();
}
SIGNAL(SIG_INTERRUPT0)//обработка прерываний INT0
{
cli();//запрещение прерываний на время обработки прерывания
PORTC |=_BV(PC4);
s=s+50000;
_delay_ms(200);
PORTC &=~_BV(PC4);
_delay_ms(200);
sei();//разрешение прерываний
}
SIGNAL(SIG_INTERRUPT1)//обработка прерываний INT1
{
cli();//запрещение прерываний на время обработки прерывания
PORTC |=_BV(PC4);
s=s-50000;
_delay_ms(200);
PORTC &=~_BV(PC4);
_delay_ms(200);
sei();//разрешение прерываний
}
int main(void)
{
DDRC = 0xFF; //все вывод
DDRD = 0x00; //все вход
GICR=0b11000000; //разрешаем прерывание int0 и int1 - кнопка
MCUCR=0b00001010;// int by rising front - для кнопки 1 и 2
sei();//разрешение прерываний
while (1==1)//вечный цикл
{
PORTC |=_BV(PC5);
delay(s);
PORTC &=~_BV(PC5);
delay(s);
}
}
#include <avr/io.h> // подключаем библиотеку АВР
#include <util/delay.h> // подключаем библиотеку задержек
#include <avr/interrupt.h> // подключаем библиотеку прерываний
#define nop() {asm("nop");}
int s = 50000; // переменная для задержки
unsigned int x;
void delay(int t)
{
for (x=t; x>0 ;x--)
nop ();
}
SIGNAL(SIG_INTERRUPT0)//обработка прерываний INT0
{
cli();//запрещение прерываний на время обработки прерывания
PORTC |=_BV(PC4);
s=s+50000;
_delay_ms(200);
PORTC &=~_BV(PC4);
_delay_ms(200);
sei();//разрешение прерываний
}
SIGNAL(SIG_INTERRUPT1)//обработка прерываний INT1
{
cli();//запрещение прерываний на время обработки прерывания
PORTC |=_BV(PC4);
s=s-50000;
_delay_ms(200);
PORTC &=~_BV(PC4);
_delay_ms(200);
sei();//разрешение прерываний
}
int main(void)
{
DDRC = 0xFF; //все вывод
DDRD = 0x00; //все вход
GICR=0b11000000; //разрешаем прерывание int0 и int1 - кнопка
MCUCR=0b00001010;// int by rising front - для кнопки 1 и 2
sei();//разрешение прерываний
while (1==1)//вечный цикл
{
PORTC |=_BV(PC5);
delay(s);
PORTC &=~_BV(PC5);
delay(s);
}
}
взят он вот отсюда: http://avrlab.com/node/37
вобщем, я убрал светодиодную дорожку и оставил один светодиод, для наглядности, в обработчиках прерываний, помимо изменения переменной мигаю другим светодиодом. так вот в чём проблема: светодиод мигает всегда с одинаковой частотой, не зависимо от того нажимаю я на кнопки или нет, а дожно быть вот как: нажал на кнопку, сработало прерывание, значение переменной s увеличилось на 50000 и светодиод начал мигать реже. При этом, когда я нажимаю на кнопки светодиоды мигают, как описанно в подпрограмме обработчике прерываний. Я не знаю в чём может быть проблема, но наверно она в подпрограмме задержки, я не совсем понимаю, как она работает.
Помогите!!!
заранее спасибо