Страница 1 из 1

Помогите с кодом на си

Добавлено: Пн фев 23, 2009 18:10:33
Tigra
Всех защитников отечества с праздником!!!

мк тини 2313 подключен внутренний генератор 4 мгц .

порт В1 подтянут к 0 и подключен ч-з кнопку к 1.

Как написать на си :

пять нажатий на кнопку в течении 5 скунд goto m1;
если прошло пять секунд и не успел нажать 5 раз, или не нажимал вообще goto m2;

заранее спасибо! :)))

Добавлено: Пн фев 23, 2009 18:21:44
sachok
А может это как то через внешние прерывания и INT0 придумать.

Добавлено: Пн фев 23, 2009 19:12:10
Tigra
sachok писал(а):А может это как то через внешние прерывания и INT0 придумать.
Я бы с удовольствием , но с прерываниями я ещё очень плохо дружу.
Если кто знает как это сделать ПОДСКАЖИТЕ?
За готовый кусочек кода буду очень признателен!

Добавлено: Пн фев 23, 2009 21:11:56
sachok

Код: Выделить всё

#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) делаем проверку

Код: Выделить всё

if (i>=5)
{
goto m1;
}
else
{
goto m2;
}
Ну это я бы так пытался сделать ничего гарантировать не могу но но я думаю алгоритм должен быть рабочий.

Добавлено: Пн фев 23, 2009 21:28:41
Tigra
sachok писал(а):

Код: Выделить всё

#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! :)))

Добавлено: Пн фев 23, 2009 22:02:34
sachok

Код: Выделить всё

#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 Только не кричите на меня что я рекламирую єтот сайт - ЄТО НЕ ТАК!!!
:)))

Добавлено: Пн фев 23, 2009 22:22:19
Tigra
sachok писал(а):

Код: Выделить всё

#include <tiny2313>

что то типа того я сам только пол года учу AVR!
 :)))[/quote]

Большое вам спасибо за ответы! Буду разбираться.

Добавлено: Пн фев 23, 2009 22:32:38
sachok
http://radiokot.ru/forum/viewtopic.php?t=13499 вот темка сдесь найдете настройку таймера на прерывание в 1 секунду.

Добавлено: Вт фев 24, 2009 01:51:51
bsyomov
Не пойдёт - из-за дребезга контактов кнопки прерывание будет срабатывать больше раз чем было нажатий кнопки.
Надо либо бороться с дребезгом изменив схемотехнику, либо программно, опрашивая кнопку несколько раз через небольшие промежутки времени и считать кнопку нажатой, только если несколько последовательных опросов показывают состояние - нажата...

Добавлено: Вт фев 24, 2009 23:05:57
Tigra
Чё то с прерываниями ничего не получается :cry: Добрые дяди или тёти ХЕЛП МИ :shock:

Добавлено: Ср фев 25, 2009 00:45:26
sachok
Что именно не получается??? Внешние или внутренние прерывания?

Добавлено: Сб фев 28, 2009 15:46:13
Tigra
Тысяча извенений за то , что так долго не отвечал- завалили работой и небыло времени добраться до компа.
Наконец-то у меня получилось ! Да ещё всё именно так как хотел! :))) Вот код , с коментатиями -может кому пригодится.



interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
b++;
}
#asm("sei")

ok:

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:

А вот принцип внешних прерываний я так до конца не понял,
поделитесь пожалуста ссылками на обучалки :P