Обработка нажатия кнопки в AVR...

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

Обработка нажатия кнопки в AVR...

Сообщение КАШАК »

Есть программа для AVR, имитирует работу светофора, написана в Code Vision AVR.

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

#define B_g PORTB=0b00000100;
#define B_y PORTB=0b00000010;
#define B_r PORTB=0b00000001;
#define C_g PORTC=0b00000100;
#define C_y PORTC=0b00000010;
#define C_r PORTC=0b00000001;
#define D_g PORTD=0b00000100;
#define D_y PORTD=0b00000010;
#define D_r PORTD=0b00000001;
#define B_g_off PORTB=0b00000000;
#define C_g_off PORTC=0b00000000;
#define D_g_off PORTD=0b00000000;
 
int a;
.
.
.
while(1){
             
      B_g;
      D_g;
      C_r;
      delay_ms(1000);
 
for(a=0; a<=4; a++){
      delay_ms(150);
      B_g_off;
      D_g_off;
      delay_ms(150);
      B_g;
      D_g;     
};
 
      B_y;
      D_y;
      C_y;
      delay_ms(1000);
 
      B_r;
      D_r;
      C_g;
      delay_ms(1000);
 
for(a=0; a<=4; a++){
      delay_ms(150);
      C_g_off;
      delay_ms(150);
      C_g;
};
 
      B_y;
      D_y;
      C_y;
      delay_ms(1000);
 
      };
}


Как в эту программу добавить обработку нажатия кнопки? Например нажал кнопку - цикл остановился. Нажал другую - продолжился.

P.S.

Я только недавно начал изучать МК, так что...
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Аватара пользователя
O-LED
Мудрый кот
Сообщения: 1800
Зарегистрирован: Вт окт 05, 2010 01:08:57
Контактная информация:

Re: Обработка нажатия кнопки в AVR...

Сообщение O-LED »

по всякому можно. например вставить в основной цикл это.

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

if (PINB.0==0){ per=1;            //если нажата кнопка подсоединенная к PINB.0, переменной per присвоить значение 1
delay_ms(200);}                   //  типа антидребезг
while(per==1)                     //  сидеть в этом цикле пока per равна 1
{
if (PINB.1==0) {per=2;             // если нажата кнопка подсоединенная к PINB.1, переменной per присвоить значение 2
delay_ms(200);}                    //  типа антидребезг         
}


зы. сейчас ктото обязательно скажет что "PINB.0" - зло, и так лучьше не писать. СОГЛАСЕН, но я уже так привык.
KIT
leowka
Открыл глаза
Сообщения: 42
Зарегистрирован: Ср мар 24, 2010 08:08:20
Контактная информация:

Re: Обработка нажатия кнопки в AVR...

Сообщение leowka »

КАШАК писал(а):Например нажал кнопку - цикл остановился. Нажал другую - продолжился.

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

if(!PINB.0) //Если нажали одну кнопку
 while(PINB.1);//Ждем пока не нажмем другую, т.е цикл остановился пока не нажмем другую кнопку

Не забудьте подтянуть ноги на которые повесили кнопки типа так PORTB |= 0b00000011; ну и ессесно порты на вход DDRB &= ~(0b00000011);
Аватара пользователя
Zheleznjakov
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Сб июн 12, 2010 16:19:17
Откуда: Россия, Томск
Контактная информация:

Re: Обработка нажатия кнопки в AVR...

Сообщение Zheleznjakov »

как правило время "дребезга" принимают равным 50 мс.
и если тупо в лоб, то нажатие кнопки не плохо бы проверять несколько раз в течении например 200 мс.
С уважением, Денис Железняков aka ZiB
Мой блог: http://ziblog.ru
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

Re: Обработка нажатия кнопки в AVR...

Сообщение КАШАК »

Так работает только если вставить в тот цикл, который мигает зелёным, т.е. вот в этот

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

for(a=0; a<=4; a++){
      delay_ms(150);
      B_g_off;
      D_g_off;
      delay_ms(150);
      B_g;
      D_g;     
};


И, естественно, только во время мигания. Если вставлять в цикл while(1) никакой реакции нет. Может код программы как-то по другому написать надо?

P.S.
Схему пока собираю в Proteus.
Опыт растет прямо пропорционально выведенному из строя оборудованию...
leowka
Открыл глаза
Сообщения: 42
Зарегистрирован: Ср мар 24, 2010 08:08:20
Контактная информация:

Re: Обработка нажатия кнопки в AVR...

Сообщение leowka »

Учтите что у вас там задержки секундные, вам нужно в таком случае по прерыванию обрабатывать кнопки или написать свою задержку в которой будет опрос кнопок.
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

Re: Обработка нажатия кнопки в AVR...

Сообщение КАШАК »

А можно пример?
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Аватара пользователя
AI_Disable
Сверлит текстолит когтями
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб
Контактная информация:

Re: Обработка нажатия кнопки в AVR...

Сообщение AI_Disable »

В вашем случаи не имеет смысла опрашивать кнопку внутри основного цикла. Кнопку "стоп" нужно повесить на внешнее прерывание.
И делать, например, так:

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

void main(void)
{
...
DDRB|=(1<<0);
DDRB|=(1<<1);
//тут нужно инициализировать INT0
asm("sei");
...
}


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

ISR(INT0) //непомню уже как объявляются в CVAVR обработчики прерываний и какие векторы
{
_delay_ms(70);
if(!(PINB&(1<<0))) while(PINB&(1<<1));
}


В данном случаи это сработает, но впредь знайте, что задержки и вечные циклы в прерывании, мягко говоря, не есть гуд.
Аватара пользователя
O-LED
Мудрый кот
Сообщения: 1800
Зарегистрирован: Вт окт 05, 2010 01:08:57
Контактная информация:

Re: Обработка нажатия кнопки в AVR...

Сообщение O-LED »

по всякому можно.
если делать правильно, то надо все менять. убрать delay, задержки с помощью таймеров, кнопки можно и в основном цикле опрашивать. общем см цитату выше.
а еще можно посмотреть в инете, периодически встречаю "конструкторов светофоров". наверное популярное у преподавателей задание в институтах.
KIT
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

Re: Обработка нажатия кнопки в AVR...

Сообщение КАШАК »

Это не задание преподавателя :) Просто пришла идея... Где можно хороший самоучитель найти по программированию AVR на C ? А то я весь инет перерыл а ничего нормального не нашёл.

А как без задержек реализовать?
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Аватара пользователя
O-LED
Мудрый кот
Сообщения: 1800
Зарегистрирован: Вт окт 05, 2010 01:08:57
Контактная информация:

Re: Обработка нажатия кнопки в AVR...

Сообщение O-LED »

Мне очень сильно помогает книга в моей подписи.
еще заказал http://www.ukazka.ru/product-book791251.html обещают после нового года.
буду Си учить, а то ничего по настоящему сложного писать не получается

задержки прерыванием делают так. Настраиваешь таймер чтоб он тикал раз в секунду. в прерывании выводишь то что тебе надо в порт. и все, до след. прерывания твой контроллер свободен, можешь занять его чем хочешь, например опросом кнопок.

зы. готовый код не проси. задача по плечу начинающему. знаю по себе, т.к. тоже начинающий.
KIT
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Обработка нажатия кнопки в AVR...

Сообщение ARV »

Zheleznjakov писал(а):как правило время "дребезга" принимают равным 50 мс.
и если тупо в лоб, то нажатие кнопки не плохо бы проверять несколько раз в течении например 200 мс.
если мне не изменяет память, то дребезг большинства низковольтных контактов заканчивается за 10-15 миллисекунд. поэтому делать защиту от дребезга на 50 мс, а тем более 200 мс, - это явно перебор, т.к. человек такую задержку уже может почувствовать.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

Re: Обработка нажатия кнопки в AVR...

Сообщение КАШАК »

Спасибо
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

Re: Обработка нажатия кнопки в AVR...

Сообщение КАШАК »

Можете объяснить, как работать с таймерами прерываний в CodeVision AVR. А то я никак не могу разобраться...
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Аватара пользователя
O-LED
Мудрый кот
Сообщения: 1800
Зарегистрирован: Вт окт 05, 2010 01:08:57
Контактная информация:

Re: Обработка нажатия кнопки в AVR...

Сообщение O-LED »

Это возможно, но в рамках форума трудно. много нюансов. если все описать, то получится не хилая многостраничная обучалка.
Возьми почитай книги, статьи и обучалки в интернете. их много. по таймерам, (да и про другое) неплохо рассказано на сайте у дихалта. правда он больше делает упор на ассемблер, говорит с него начать полезней. может быть.
по книгам мне понравились
Создаем устройства на микроконтроллерах. Белов А В. она дала мне пинок, и помогла сдвинуться с мертвой точки в изучении МК
В подписи - просто настольная книга у меня. Практически полный даташит на все меги. и главное на РУССКОМ, что для неучей типа меня просто находка
CodeVisionAVR Пособие для начинающих М.Б.Лебедев 2008 мне не понравилась, пустая и не о чем.
Программирование на языке С для AVR и PIC микроконтроллеров Шилов. - вроде не плохая. заказал её, жду (В моем городе такой литературы не бывает вообще)
KIT
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

Re: Обработка нажатия кнопки в AVR...

Сообщение КАШАК »

Ясно, можете тогда объяснить, вкратце, что делает вот такой код

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

TCCR1A=0x80;
TCCR1B=0x04;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x7A;
OCR1AL=0x12;
OCR1BH=0x00;
OCR1BL=0x00;
TIMSK=0x40


Как я понял, это настройка таймера, только вот что это значит...

P.S.
Нашел в программе с использованием таймера. Могу весь файл скинуть...
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

Re: Обработка нажатия кнопки в AVR...

Сообщение КАШАК »

Все, разобрался. Только немного не понял расчет времени, исходя из частоты :dont_know: .

Спасибо за книгу Создаем устройства на микроконтроллерах. Белов А В. Все очень понятно и подробно расписано :)
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

Re: Обработка нажатия кнопки в AVR...

Сообщение КАШАК »

Появился такой вопрос: Например нажал я кнопку, цикл остановился, но таймер все равно считает, как его сбросить перед запуском цикла (нажатием другой кнопки)?
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Аватара пользователя
AI_Disable
Сверлит текстолит когтями
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб
Контактная информация:

Re: Обработка нажатия кнопки в AVR...

Сообщение AI_Disable »

тов. КАШАК, книги - это, конечно, хорошо, но не следует забывать про даташит. Ответы на многие вопросы, включая ваши, содержатся там.
КАШАК писал(а):...Только немного не понял расчет времени, исходя из частоты :dont_know: ...

Формула для подсчёта частоты тактирования таймера:
Изображение
КАШАК писал(а):... как его сбросить перед запуском цикла ...

Считает таймер в регистре TCNT, его и нужно сбрасывать.
Вложения
1.PNG
(5.84 КБ) 16827 скачиваний
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

Re: Обработка нажатия кнопки в AVR...

Сообщение КАШАК »

Т.е. нужно написать так:

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

TCNT1H=0x00;
      TCNT1L=0x00;

?
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Закрыто

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