sachok писал(а):А может это как то через внешние прерывания и INT0 придумать.
Я бы с удовольствием , но с прерываниями я ещё очень плохо дружу.
Если кто знает как это сделать ПОДСКАЖИТЕ?
За готовый кусочек кода буду очень признателен!
#include <tiny2313>
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
i++;
}
void main(void)
{
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Rising Edge
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
GIMSK=0x40;
MCUCR=0x03;
EIFR=0x40;
}
Вот как я себе это представляю. Настраиваем внешние прерывания по возрастающему уровню. При каждом прерывании к переменой додается 1. Потом нужно настроить например таймер0 или лучше таймер1 на прерывание 1 раз в 1 секунду. В обработчике прерываний от таймера0(1) делаем проверку
#include <tiny2313>
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
i++;
}
void main(void)
{
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Rising Edge
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
GIMSK=0x40;
MCUCR=0x03;
EIFR=0x40;
}
.
Eсли вас сильно не затруднит подпишите пожалуйста этот код коментариями . Для меня это шанс разобраться с ПРЕРЫВАНИЯМИ!!! и раскрасить цветными красками ещё одно чёрное пятно в изучении AVR!
#include <tiny2313>
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void) //прерывание по возрастающему уровню на ноже INT0
{
// Place your code here //поместите свой код тут:)
i++; // с каждым прерыванием (изменением уровня с 0 до 1) добавляем к переменой i 1.
}
void main(void) //основная функция программы.
{
// External Interrupt(s) initialization //инициализация внешних прерываний
// INT0: On //ножка INT0 включена
// INT0 Mode: Rising Edge //способ инициирования прерывания - по нарастающему фронту
// INT1: Off //ножка INT1 выключена
// Interrupt on any change on pins PCINT0-7: Off //прерывания по любому изменению на линиях ввода/вывода PCINTх - выключены
GIMSK=0x40;
MCUCR=0x03; //в регистрах пока сам ничего толком не понимаю
EIFR=0x40;
}
что то типа того я сам только пол года учу AVR и только раз использовал такой алгоритм. поищите на страничке у tych'а дополнительную информацию. www.123avr.com Только не кричите на меня что я рекламирую єтот сайт - ЄТО НЕ ТАК!!!
Не пойдёт - из-за дребезга контактов кнопки прерывание будет срабатывать больше раз чем было нажатий кнопки.
Надо либо бороться с дребезгом изменив схемотехнику, либо программно, опрашивая кнопку несколько раз через небольшие промежутки времени и считать кнопку нажатой, только если несколько последовательных опросов показывают состояние - нажата...
Тысяча извенений за то , что так долго не отвечал- завалили работой и небыло времени добраться до компа.
Наконец-то у меня получилось ! Да ещё всё именно так как хотел! Вот код , с коментатиями -может кому пригодится.
while (!PINB.1==0) //ждём нажатие кнопки
{
if (b==5) c=0; //сброс кода на 0 по истечении 5сек
if (c==5) goto ura; //успел нажать 5 раз за 5 сек идти к ura
};
c++; //увеличение кода на 1 с каждым нажатием кнопки
if (c==1) b=0; //обнулить таймер при первом нажатии кнопки
sch:
delay_ms (20); //пауза для защиты от дребезга контакта
if (PINB.1==0) goto sch; //защита от длительного нажатия кнопки
goto ok;
ura:
А вот принцип внешних прерываний я так до конца не понял,
поделитесь пожалуста ссылками на обучалки