Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Ср дек 15, 2010 13:59:59
Есть программа для 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.
Я только недавно начал изучать МК, так что...
Ср дек 15, 2010 16:10:46
по всякому можно. например вставить в основной цикл это.
- Код:
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" - зло, и так лучьше не писать.
СОГЛАСЕН, но я уже так привык.
Ср дек 15, 2010 16:41:09
КАШАК писал(а):Например нажал кнопку - цикл остановился. Нажал другую - продолжился.
- Код:
if(!PINB.0) //Если нажали одну кнопку
while(PINB.1);//Ждем пока не нажмем другую, т.е цикл остановился пока не нажмем другую кнопку
Не забудьте подтянуть ноги на которые повесили кнопки типа так PORTB |= 0b00000011; ну и ессесно порты на вход DDRB &= ~(0b00000011);
Ср дек 15, 2010 16:57:44
как правило время "дребезга" принимают равным 50 мс.
и если тупо в лоб, то нажатие кнопки не плохо бы проверять несколько раз в течении например 200 мс.
Ср дек 15, 2010 17:19:10
Так работает только если вставить в тот цикл, который мигает зелёным, т.е. вот в этот
- Код:
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.
Ср дек 15, 2010 18:02:05
Учтите что у вас там задержки секундные, вам нужно в таком случае по прерыванию обрабатывать кнопки или написать свою задержку в которой будет опрос кнопок.
Ср дек 15, 2010 18:07:18
А можно пример?
Ср дек 15, 2010 18:32:32
В вашем случаи не имеет смысла опрашивать кнопку внутри основного цикла. Кнопку "стоп" нужно повесить на внешнее прерывание.
И делать, например, так:
- Код:
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));
}
В данном случаи это сработает, но впредь знайте, что задержки и вечные циклы в прерывании, мягко говоря, не есть гуд.
Ср дек 15, 2010 18:57:15
по всякому можно.
если делать правильно, то надо все менять. убрать delay, задержки с помощью таймеров, кнопки можно и в основном цикле опрашивать. общем см цитату выше.
а еще можно посмотреть в инете, периодически встречаю "конструкторов светофоров". наверное популярное у преподавателей задание в институтах.
Ср дек 15, 2010 19:13:15
Это не задание преподавателя
Просто пришла идея... Где можно хороший самоучитель найти по программированию AVR на C ? А то я весь инет перерыл а ничего нормального не нашёл.
А как без задержек реализовать?
Ср дек 15, 2010 20:22:58
Мне очень сильно помогает книга в моей подписи.
еще заказал
http://www.ukazka.ru/product-book791251.html обещают после нового года.
буду Си учить, а то ничего по настоящему сложного писать не получается
задержки прерыванием делают так. Настраиваешь таймер чтоб он тикал раз в секунду. в прерывании выводишь то что тебе надо в порт. и все, до след. прерывания твой контроллер свободен, можешь занять его чем хочешь, например опросом кнопок.
зы. готовый код не проси. задача по плечу начинающему. знаю по себе, т.к. тоже начинающий.
Ср дек 15, 2010 20:38:03
Zheleznjakov писал(а):как правило время "дребезга" принимают равным 50 мс.
и если тупо в лоб, то нажатие кнопки не плохо бы проверять несколько раз в течении например 200 мс.
если мне не изменяет память, то дребезг большинства низковольтных контактов заканчивается за 10-15 миллисекунд. поэтому делать защиту от дребезга на 50 мс, а тем более 200 мс, - это явно перебор, т.к. человек такую задержку уже может почувствовать.
Ср дек 15, 2010 21:36:25
Спасибо
Пт дек 17, 2010 00:59:14
Можете объяснить, как работать с таймерами прерываний в CodeVision AVR. А то я никак не могу разобраться...
Пт дек 17, 2010 01:36:13
Это возможно, но в рамках форума трудно. много нюансов. если все описать, то получится не хилая многостраничная обучалка.
Возьми почитай книги, статьи и обучалки в интернете. их много. по таймерам, (да и про другое) неплохо рассказано на сайте у дихалта. правда он больше делает упор на ассемблер, говорит с него начать полезней. может быть.
по книгам мне понравились
Создаем устройства на микроконтроллерах. Белов А В. она дала мне пинок, и помогла сдвинуться с мертвой точки в изучении МК
В подписи - просто настольная книга у меня. Практически полный даташит на все меги. и главное на РУССКОМ, что для неучей типа меня просто находка
CodeVisionAVR Пособие для начинающих М.Б.Лебедев 2008 мне не понравилась, пустая и не о чем.
Программирование на языке С для AVR и PIC микроконтроллеров Шилов. - вроде не плохая. заказал её, жду (В моем городе такой литературы не бывает вообще)
Пт дек 17, 2010 02:02:15
Ясно, можете тогда объяснить, вкратце, что делает вот такой код
- Код:
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
Все, разобрался. Только немного не понял расчет времени, исходя из частоты
.
Спасибо за книгу
Создаем устройства на микроконтроллерах. Белов А В. Все очень понятно и подробно расписано
Пт дек 17, 2010 04:05:06
Появился такой вопрос: Например нажал я кнопку, цикл остановился, но таймер все равно считает, как его сбросить перед запуском цикла (нажатием другой кнопки)?
Пт дек 17, 2010 05:36:17
тов.
КАШАК, книги - это, конечно, хорошо, но не следует забывать про даташит. Ответы на многие вопросы, включая ваши, содержатся там.
КАШАК писал(а):...Только немного не понял расчет времени, исходя из частоты
...
Формула для подсчёта частоты тактирования таймера:
КАШАК писал(а):... как его сбросить перед запуском цикла ...
Считает таймер в регистре TCNT, его и нужно сбрасывать.
- Вложения
-
- 1.PNG
- (5.84 KiB) Скачиваний: 15879
Пт дек 17, 2010 11:10:47
Т.е. нужно написать так:
- Код:
TCNT1H=0x00;
TCNT1L=0x00;
?
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.