Форум РадиоКот https://radiokot.ru/forum/ |
|
Обработка нажатия кнопки в AVR... https://radiokot.ru/forum/viewtopic.php?f=20&t=39341 |
Страница 1 из 15 |
Автор: | КАШАК [ Ср дек 15, 2010 13:59:59 ] |
Заголовок сообщения: | Обработка нажатия кнопки в 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 [ Ср дек 15, 2010 16:10:46 ] |
Заголовок сообщения: | Re: Обработка нажатия кнопки в AVR... |
по всякому можно. например вставить в основной цикл это. Код: 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" - зло, и так лучьше не писать. СОГЛАСЕН, но я уже так привык. |
Автор: | leowka [ Ср дек 15, 2010 16:41:09 ] |
Заголовок сообщения: | Re: Обработка нажатия кнопки в AVR... |
КАШАК писал(а): Например нажал кнопку - цикл остановился. Нажал другую - продолжился. Код: if(!PINB.0) //Если нажали одну кнопку while(PINB.1);//Ждем пока не нажмем другую, т.е цикл остановился пока не нажмем другую кнопку Не забудьте подтянуть ноги на которые повесили кнопки типа так PORTB |= 0b00000011; ну и ессесно порты на вход DDRB &= ~(0b00000011); |
Автор: | Zheleznjakov [ Ср дек 15, 2010 16:57:44 ] |
Заголовок сообщения: | Re: Обработка нажатия кнопки в AVR... |
как правило время "дребезга" принимают равным 50 мс. и если тупо в лоб, то нажатие кнопки не плохо бы проверять несколько раз в течении например 200 мс. |
Автор: | КАШАК [ Ср дек 15, 2010 17:19:10 ] |
Заголовок сообщения: | 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 [ Ср дек 15, 2010 18:02:05 ] |
Заголовок сообщения: | Re: Обработка нажатия кнопки в AVR... |
Учтите что у вас там задержки секундные, вам нужно в таком случае по прерыванию обрабатывать кнопки или написать свою задержку в которой будет опрос кнопок. |
Автор: | КАШАК [ Ср дек 15, 2010 18:07:18 ] |
Заголовок сообщения: | Re: Обработка нажатия кнопки в AVR... |
А можно пример? |
Автор: | AI_Disable [ Ср дек 15, 2010 18:32:32 ] |
Заголовок сообщения: | Re: Обработка нажатия кнопки в AVR... |
В вашем случаи не имеет смысла опрашивать кнопку внутри основного цикла. Кнопку "стоп" нужно повесить на внешнее прерывание. И делать, например, так: Код: 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 [ Ср дек 15, 2010 18:57:15 ] |
Заголовок сообщения: | Re: Обработка нажатия кнопки в AVR... |
Цитата: по всякому можно. если делать правильно, то надо все менять. убрать delay, задержки с помощью таймеров, кнопки можно и в основном цикле опрашивать. общем см цитату выше. а еще можно посмотреть в инете, периодически встречаю "конструкторов светофоров". наверное популярное у преподавателей задание в институтах. |
Автор: | КАШАК [ Ср дек 15, 2010 19:13:15 ] |
Заголовок сообщения: | Re: Обработка нажатия кнопки в AVR... |
Это не задание преподавателя Просто пришла идея... Где можно хороший самоучитель найти по программированию AVR на C ? А то я весь инет перерыл а ничего нормального не нашёл. А как без задержек реализовать? |
Автор: | O-LED [ Ср дек 15, 2010 20:22:58 ] |
Заголовок сообщения: | Re: Обработка нажатия кнопки в AVR... |
Мне очень сильно помогает книга в моей подписи. еще заказал http://www.ukazka.ru/product-book791251.html обещают после нового года. буду Си учить, а то ничего по настоящему сложного писать не получается задержки прерыванием делают так. Настраиваешь таймер чтоб он тикал раз в секунду. в прерывании выводишь то что тебе надо в порт. и все, до след. прерывания твой контроллер свободен, можешь занять его чем хочешь, например опросом кнопок. зы. готовый код не проси. задача по плечу начинающему. знаю по себе, т.к. тоже начинающий. |
Автор: | ARV [ Ср дек 15, 2010 20:38:03 ] |
Заголовок сообщения: | Re: Обработка нажатия кнопки в AVR... |
Zheleznjakov писал(а): как правило время "дребезга" принимают равным 50 мс. если мне не изменяет память, то дребезг большинства низковольтных контактов заканчивается за 10-15 миллисекунд. поэтому делать защиту от дребезга на 50 мс, а тем более 200 мс, - это явно перебор, т.к. человек такую задержку уже может почувствовать.
и если тупо в лоб, то нажатие кнопки не плохо бы проверять несколько раз в течении например 200 мс. |
Автор: | КАШАК [ Ср дек 15, 2010 21:36:25 ] |
Заголовок сообщения: | Re: Обработка нажатия кнопки в AVR... |
Спасибо |
Автор: | КАШАК [ Пт дек 17, 2010 00:59:14 ] |
Заголовок сообщения: | Re: Обработка нажатия кнопки в AVR... |
Можете объяснить, как работать с таймерами прерываний в CodeVision AVR. А то я никак не могу разобраться... |
Автор: | O-LED [ Пт дек 17, 2010 01:36:13 ] |
Заголовок сообщения: | Re: Обработка нажатия кнопки в AVR... |
Это возможно, но в рамках форума трудно. много нюансов. если все описать, то получится не хилая многостраничная обучалка. Возьми почитай книги, статьи и обучалки в интернете. их много. по таймерам, (да и про другое) неплохо рассказано на сайте у дихалта. правда он больше делает упор на ассемблер, говорит с него начать полезней. может быть. по книгам мне понравились Создаем устройства на микроконтроллерах. Белов А В. она дала мне пинок, и помогла сдвинуться с мертвой точки в изучении МК В подписи - просто настольная книга у меня. Практически полный даташит на все меги. и главное на РУССКОМ, что для неучей типа меня просто находка CodeVisionAVR Пособие для начинающих М.Б.Лебедев 2008 мне не понравилась, пустая и не о чем. Программирование на языке С для AVR и PIC микроконтроллеров Шилов. - вроде не плохая. заказал её, жду (В моем городе такой литературы не бывает вообще) |
Автор: | КАШАК [ Пт дек 17, 2010 02:02:15 ] |
Заголовок сообщения: | 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. Нашел в программе с использованием таймера. Могу весь файл скинуть... |
Автор: | КАШАК [ Пт дек 17, 2010 02:49:34 ] |
Заголовок сообщения: | Re: Обработка нажатия кнопки в AVR... |
Все, разобрался. Только немного не понял расчет времени, исходя из частоты . Спасибо за книгу Создаем устройства на микроконтроллерах. Белов А В. Все очень понятно и подробно расписано |
Автор: | КАШАК [ Пт дек 17, 2010 04:05:06 ] |
Заголовок сообщения: | Re: Обработка нажатия кнопки в AVR... |
Появился такой вопрос: Например нажал я кнопку, цикл остановился, но таймер все равно считает, как его сбросить перед запуском цикла (нажатием другой кнопки)? |
Автор: | AI_Disable [ Пт дек 17, 2010 05:36:17 ] | ||
Заголовок сообщения: | Re: Обработка нажатия кнопки в AVR... | ||
тов. КАШАК, книги - это, конечно, хорошо, но не следует забывать про даташит. Ответы на многие вопросы, включая ваши, содержатся там. КАШАК писал(а): ...Только немного не понял расчет времени, исходя из частоты ... Формула для подсчёта частоты тактирования таймера: КАШАК писал(а): ... как его сбросить перед запуском цикла ... Считает таймер в регистре TCNT, его и нужно сбрасывать.
|
Автор: | КАШАК [ Пт дек 17, 2010 11:10:47 ] |
Заголовок сообщения: | Re: Обработка нажатия кнопки в AVR... |
Т.е. нужно написать так: Код: TCNT1H=0x00; TCNT1L=0x00; ? |
Страница 1 из 15 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |