Начинаю осваивать МК.
Но что то не пошло с прерываниями. С таймером разобрался, начал разбираться с внешними прерываниями, но идет затыкаю Вот код.
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
unsigned int k,hour, set_hout, delta, i;
ISR(TIMER0_OVF_vect)
{
k=k+1;
if (k>=900)
{
hour=hour+delta;
k=0;
}
}
ISR(INT0_vect)
{
cli();
_delay_ms(100);
set_hour=set_hour+delta;
i=i+1;
if (i==5)
{
i=0;
set_hour=delta;
}
switch (i)
{
case 0 : PORTB &= ~((1 << 0)|(1 << 2)|(1 << 3)|(1 << 4));
case 1 : PORTB |= (1 << 0); break;
case 2 : PORTB |= (1 << 2); break;
case 3 : PORTB |= (1 << 3); break;
case 4 : PORTB |= (1 << 4); break;
default : PORTB &= ~((1 << 0)|(1 << 2)|(1 << 3)|(1 << 4));
}
sei();
}
int main(void)
{
k=0;
hour=0;
delta=30;
set_hour=delta;
i=0;
DDRB=0; // все ножки на вход
DDRB |= (1 << 0)|(1 << 2)|(1 << 3)|(1 << 4)|(1 << 5); //1,2,3,4,5 на выход
PORTB |= (1 << 5); //5 =1
PORTB &= ~((1 << 0)|(1 << 2)|(1 << 3)|(1 << 4));//1,2,3,4 = 0
PORTB |= (1 << 1); //0 вывод вход по умолчани
GIMSK|=(1<<INT0);//Включаем внешние прерывание
MCUCR|=(0<<ISC00)|(1<<ISC01); //Настраиваем прерывание на срабатывание по спадающему фронт
TCCR0A=0; //счетчик счетает в режиме нормаль
TCCR0B|= (0<<CS02)|(0<<CS01)|(1<<CS00); //001 без деления 101 -1024, 100-256
TCNT0 = 0; //обнулние счетчика
TIMSK0 |= (1<<TOIE0); //разрешение прерывания по переполнению
sei(); // разрешаем глобальное прерывание
while (1)
{
if (set_hour==hour)
PORTB &= ~((1 << 5));
}
}
Работать должен так: нажимаем кнопку 5-вывод отключается через delta-время, еще раз нажимаем, delt+delta и т.д. до 4 раз. Так же при нажатии загораются светодиоды. Но при отладке вылетает из цикла и начинает работать с int main(void). Думаю какой то конфликт прерываний, хотя в отладке пока ничего не нажимаю.



