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

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Встал на лапы
Аватара пользователя
Сообщения: 99
Зарегистрирован: Сб ноя 29, 2008 19:34:25
Откуда: Нальчик

Сообщение Tigra »

Всех защитников отечества с праздником!!!

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

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

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

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

заранее спасибо! :)))
Реклама
Опытный кот
Аватара пользователя
Сообщения: 849
Зарегистрирован: Сб янв 05, 2008 11:05:15
Откуда: Україна м.Луцьк

Сообщение sachok »

А может это как то через внешние прерывания и INT0 придумать.
Я не Сашок!!!
Контактная информация:
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 99
Зарегистрирован: Сб ноя 29, 2008 19:34:25
Откуда: Нальчик

Сообщение Tigra »

sachok писал(а):А может это как то через внешние прерывания и INT0 придумать.
Я бы с удовольствием , но с прерываниями я ещё очень плохо дружу.
Если кто знает как это сделать ПОДСКАЖИТЕ?
За готовый кусочек кода буду очень признателен!
Опытный кот
Аватара пользователя
Сообщения: 849
Зарегистрирован: Сб янв 05, 2008 11:05:15
Откуда: Україна м.Луцьк

Сообщение 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;
}
Ну это я бы так пытался сделать ничего гарантировать не могу но но я думаю алгоритм должен быть рабочий.
Я не Сашок!!!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Аватара пользователя
Сообщения: 99
Зарегистрирован: Сб ноя 29, 2008 19:34:25
Откуда: Нальчик

Сообщение 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! :)))
Реклама
Опытный кот
Аватара пользователя
Сообщения: 849
Зарегистрирован: Сб янв 05, 2008 11:05:15
Откуда: Україна м.Луцьк

Сообщение 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 Только не кричите на меня что я рекламирую єтот сайт - ЄТО НЕ ТАК!!!
:)))
Я не Сашок!!!
Контактная информация:
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 99
Зарегистрирован: Сб ноя 29, 2008 19:34:25
Откуда: Нальчик

Сообщение Tigra »

sachok писал(а):

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

#include <tiny2313>

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

Большое вам спасибо за ответы! Буду разбираться.
Опытный кот
Аватара пользователя
Сообщения: 849
Зарегистрирован: Сб янв 05, 2008 11:05:15
Откуда: Україна м.Луцьк

Сообщение sachok »

http://radiokot.ru/forum/viewtopic.php?t=13499 вот темка сдесь найдете настройку таймера на прерывание в 1 секунду.
Я не Сашок!!!
Контактная информация:
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 179
Зарегистрирован: Вт ноя 04, 2008 11:15:49
Откуда: Санкт-Петербург

Сообщение bsyomov »

Не пойдёт - из-за дребезга контактов кнопки прерывание будет срабатывать больше раз чем было нажатий кнопки.
Надо либо бороться с дребезгом изменив схемотехнику, либо программно, опрашивая кнопку несколько раз через небольшие промежутки времени и считать кнопку нажатой, только если несколько последовательных опросов показывают состояние - нажата...
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 99
Зарегистрирован: Сб ноя 29, 2008 19:34:25
Откуда: Нальчик

Сообщение Tigra »

Чё то с прерываниями ничего не получается :cry: Добрые дяди или тёти ХЕЛП МИ :shock:
Опытный кот
Аватара пользователя
Сообщения: 849
Зарегистрирован: Сб янв 05, 2008 11:05:15
Откуда: Україна м.Луцьк

Сообщение sachok »

Что именно не получается??? Внешние или внутренние прерывания?
Я не Сашок!!!
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 99
Зарегистрирован: Сб ноя 29, 2008 19:34:25
Откуда: Нальчик

Сообщение 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
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»