Опрос кнопок микроконтроллером
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Помогите опросить кнопку
Ты читать умеешь? Чтобы у порта работала подтяжка, её нужно ГЛОБАЛЬНО разрешить, за это отвечает бит PUD в регистре SFIOR. Сейчас у тебя порт находится БЕЗ ПОДТЯЖКИ, как и прежде потому что она запрещена для всего контроллера.
Re: Помогите опросить кнопку
Alexeyslav писал(а): и установить бит PUD в регистре SFIOR
Точнее, сбросить, т.е. записать 0. Это состояние по умолчанию ( initial value ) .
Так что не обязательно слушатся знакомого программиста
И незнакомого форумиста
Re: Помогите опросить кнопку
Можно код плиз? Я уже 5 часов долбаюсь как разрешить глобальную подтяжку? Просто не знаю как это прописать в IARе?
Re: Помогите опросить кнопку
#include <ioavr.h>
#include <intrinsics.h>
int main( void )
{
DDRC=255; //Все порты C как выход (для светодиода)
DDRA=255; //Все порты A как выход
PORTA|=(1<<4); //Сделали на порте A4 логическую 1, то есть включился подтягивающий резистор.
while (1) //Организовываем бесконечный цикл
{
if (PINA==(1<<4)) //если состояние 1 то светодиод горит
{
PORTC|=(1<<4);
}
if (PINA==(0<<4)) //если состояние 0 то светодиод тухнет
{
PORTC&=(~(1<<4));
}
}
}
DDRA=255; //было 0, исправил на 255, теперь вроде слушается) Есть замечания по коду?
#include <intrinsics.h>
int main( void )
{
DDRC=255; //Все порты C как выход (для светодиода)
DDRA=255; //Все порты A как выход
PORTA|=(1<<4); //Сделали на порте A4 логическую 1, то есть включился подтягивающий резистор.
while (1) //Организовываем бесконечный цикл
{
if (PINA==(1<<4)) //если состояние 1 то светодиод горит
{
PORTC|=(1<<4);
}
if (PINA==(0<<4)) //если состояние 0 то светодиод тухнет
{
PORTC&=(~(1<<4));
}
}
}
DDRA=255; //было 0, исправил на 255, теперь вроде слушается) Есть замечания по коду?
- Goodefine
- Держит паяльник хвостом
- Сообщения: 906
- Зарегистрирован: Ср апр 16, 2008 13:22:54
- Откуда: Приднестровье, Тирасполь
Re: Помогите опросить кнопку
nikityan писал(а):DDRA=255; //Все порты A как выход
PORTA|=(1<<4); //Сделали на порте A4 логическую 1, то есть включился подтягивающий резистор.
...
if (PINA==(0<<4)) //если состояние 0 то светодиод тухнет
...
}
теперь вроде слушается) Есть замечания по коду?
Весело тут у вас
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
- Goodefine
- Держит паяльник хвостом
- Сообщения: 906
- Зарегистрирован: Ср апр 16, 2008 13:22:54
- Откуда: Приднестровье, Тирасполь
Re: Помогите опросить кнопку
Код: Выделить всё
#include <ioavr.h>
#include <intrinsics.h>
int main( void )
{
DDRC|=(1<<4);
DDRA=0x00;
PORTA|=(1<<4);
while (1)
{
if (PINA&(1<<4)) //если состояние 1 то светодиод горит
{
PORTC|=(1<<4);
}
else
{
PORTC&=~(1<<4);
}
}
}
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Re: Помогите опросить кнопку
Спасибо мужик! Всё стало хоть как то понятно! Благодарю! Работает!
- VanyaSV
- Встал на лапы
- Сообщения: 126
- Зарегистрирован: Пн ноя 05, 2012 22:23:32
- Откуда: Санкт-Петербург
Re: Помогите опросить кнопку
Alexeyslav писал(а):В даташите черным по английски нарисована именно такая же табличка. Так что не обязательно слушатся знакомого программиста - иногда быстрее и точнее найти это в даташите.
Ну так это было тогда, когда я осваивал микроконтроллеры. Сейчас то я пдфы юзаю)
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Помогите опросить кнопку
Goodefine писал(а):nikityan писал(а):DDRA=255; //Все порты A как выход
PORTA|=(1<<4); //Сделали на порте A4 логическую 1, то есть включился подтягивающий резистор.
...
if (PINA==(0<<4)) //если состояние 0 то светодиод тухнет
...
}
теперь вроде слушается) Есть замечания по коду?
Весело тут у вас
надо писать не весело тут у вас, а КОШМАР бедный контроллер, подтяжку без резистора установили. Ноги не отгорели случайно?
Работать может только от того, что внутри кристалла происходит падение напряжения и на PINA от этого получается в логической единице.Но есть одно НО, зато какое!!!! Порт может испортиться либо весь контроллер выйдет из строя.
PS обсуждение про ШИМ это походит на оффтопик.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Помогите опросить кнопку
Перенёс все оффтопные посты в новую тему viewtopic.php?f=20&t=80250 .
- RGB
- Родился
- Сообщения: 17
- Зарегистрирован: Пт ноя 09, 2012 17:22:37
- Откуда: Москва
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Доброго времени суток Уважаемые!
Вопрос покажиться глупым, но это факт!
теоретически в функции обработке прерывания от таймера_0 должен проходить опрос кнопки! В AVR Studio когда включаю режим отладки, всё красиво, курсор проходит через эту функцию и проверяет кнопку, но вот в Proteuse работать не хотит эта прошивка! такое ощущение что переменная "button" либо не сохроняет новое значение, либо не записывается новое значение.
Уважаемые профессионалы, поясните мне пожалуйста, с чем это связано, и почему так выходит? перерыл уже весь инет, но во многих стотьях не однократно используют такой метод опроса кнопок!
Ни чего не понимаю что не так? Либо я дурак, лидо лыжи не едут
За ранее спасибо!
Вопрос покажиться глупым, но это факт!
Код: Выделить всё
#include <avr/interrupt.h>
#include <avr/io.h>
unsigned char button = 0;
ISR (TIMER0_OVF_vect) // Обработка прерывания таймера_0
{
if ((PIND&0x80) == 0)
{ delay_ms(50); button++;}
if (button == 8)
{ button = 0;}
delay_ms(100);
}
/*** процедура задержки в микросекундах ***/
void delay_us(unsigned char time_us)
{ register unsigned char i;
for(i = 0; i < time_us; i++) // 4 цикла
{ asm (" PUSH R0 "); // 2 цикла
asm (" POP R0 "); // 2 цикла
// 8 циклов = 1 us для 8MHz
}
}
/*** процедура задержки в милисекундах ***/
void delay_ms(unsigned int time_ms)
{ register unsigned int i;
for(i = 0; i < time_ms; i++)
{ delay_us(250);
delay_us(250);
delay_us(250);
delay_us(250);
}
}
int main (void)
{
DDRD = 0x00; // Порт "D" - вход
PORTD = 0xFF; //Включены подтягивающие резисторы
DDRB = 0xFF; // Порт "B" - выход
TIMSK |= (1 << TOIE0); // Разрешение прерыванияя
TCCR0 |= (0 << CS02)|(0 << CS01)|(1 << CS00); // без пределителя
sei(); // глобальное разрешение прерываний
while(1)
{
if (button == 0) PORTB = 0x01; // это просто сделал для проверки работоспособности
if (button == 1) PORTB = 0x02;
if (button == 2) PORTB = 0x04;
if (button == 3) PORTB = 0x08;
if (button == 4) PORTB = 0x10;
if (button == 5) PORTB = 0x20;
if (button == 6) PORTB = 0x40;
if (button == 7) PORTB = 0x80;
}
}теоретически в функции обработке прерывания от таймера_0 должен проходить опрос кнопки! В AVR Studio когда включаю режим отладки, всё красиво, курсор проходит через эту функцию и проверяет кнопку, но вот в Proteuse работать не хотит эта прошивка! такое ощущение что переменная "button" либо не сохроняет новое значение, либо не записывается новое значение.
Уважаемые профессионалы, поясните мне пожалуйста, с чем это связано, и почему так выходит? перерыл уже весь инет, но во многих стотьях не однократно используют такой метод опроса кнопок!
Ни чего не понимаю что не так? Либо я дурак, лидо лыжи не едут
За ранее спасибо!
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Помогите опросить кнопку
Покажите, в каких стОтьях так кнопки опрашиваютно во многих стотьях не однократно используют такой метод опроса кнопок!
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Помогите опросить кнопку
Жестак... у тебя ОСНОВНАЯ программа практически не выполняется - ей не хватает времени!
Вот контроллер входит в обработчик прерывания от таймера... и ждет 150мс, при этом НЕ ОТДАЕТ УПРАВЛЕНИЕ, прерывание заканчивается выполняется одна инструкция из основной программы и тут БАЦ снова прерывание... в итоге у тебя основной код выполняется со скоростью 1 инструкция в 150мс и при этом каждую инструкцию идет инкремент твоей переменной. В результате в основной программы срабатывание ХОТЯБЫ ОДНОГО условия - очень маловероятное событие.
УБЕРИ с прерывания задержки! Любые задержки!
Вот контроллер входит в обработчик прерывания от таймера... и ждет 150мс, при этом НЕ ОТДАЕТ УПРАВЛЕНИЕ, прерывание заканчивается выполняется одна инструкция из основной программы и тут БАЦ снова прерывание... в итоге у тебя основной код выполняется со скоростью 1 инструкция в 150мс и при этом каждую инструкцию идет инкремент твоей переменной. В результате в основной программы срабатывание ХОТЯБЫ ОДНОГО условия - очень маловероятное событие.
УБЕРИ с прерывания задержки! Любые задержки!
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Помогите опросить кнопку
Видимо, на одном форуме мало нормальных ответов (?), надо ещё на нескольких запостить... http://forum.cxem.net/index.php?showtopic=116605
- RGB
- Родился
- Сообщения: 17
- Зарегистрирован: Пт ноя 09, 2012 17:22:37
- Откуда: Москва
- Контактная информация:
Re: Помогите опросить кнопку
Аlex пожалуйста
http://avrlab.com/node/364
Аlex, вы меня конечно извените, но если вы с того форума, то очень жаль что вы меня там закляпали! я вам там очень многое хотел сказать! первое что хотел это то, что вы очень много критекуете, а помочь по делу видать не в вашей компитенции!
Alexeyslav
спасибо вам, кое что понял, ща попробую! Попробывал убрать все задержки в прерывании, и добавил в основную программу тупо PORTC++; ну что бы там хоть что то ещё выполнялось! но как то безрезультатно
http://avrlab.com/node/364
Аlex, вы меня конечно извените, но если вы с того форума, то очень жаль что вы меня там закляпали! я вам там очень многое хотел сказать! первое что хотел это то, что вы очень много критекуете, а помочь по делу видать не в вашей компитенции!
Alexeyslav
спасибо вам, кое что понял, ща попробую! Попробывал убрать все задержки в прерывании, и добавил в основную программу тупо PORTC++; ну что бы там хоть что то ещё выполнялось! но как то безрезультатно
Последний раз редактировалось RGB Пт ноя 09, 2012 21:04:56, всего редактировалось 3 раза.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Помогите опросить кнопку
RGB писал(а):Аlex пожалуйста
http://avrlab.com/node/364

У Вас будет такая возможность через сутки, не переживайтея вам там очень многое хотел сказать!
Т.е. получается, что Вы, придя на форум и задавая вопрос, мечтаете увидеть только то, что хотите увидеть ? Типа - я критики не хочу, и те кто критикует - флудят !вы очень много критекуете
Нет уж, уважаемый, такого не будет. Будьте любезны ожидать даже того, что Вам неприятно. А если не хотите видеть подобного - не ходите по форумам, а сидите и курите буквари.
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Помогите опросить кнопку
И какого результата нет? ПортC щелкает? как быстро?
- RGB
- Родился
- Сообщения: 17
- Зарегистрирован: Пт ноя 09, 2012 17:22:37
- Откуда: Москва
- Контактная информация:
Re: Помогите опросить кнопку
Да вообще ни какого! Порт С щёлкает. Ну если верить протеусовскому осцилографу то на пине C.1 = 1 us а на пине C.5 = 2.5 us очень быстро
Аlex: я не спорю, критика нужна, но в меру! вы подскажите в каком направлении двигаться, а то (цитата с форума "паяльник" - Где это видано, что в обработчике таймера так опрашивались кнопки ? Извращение одним словом....) вы бы подсказали хоть статейку нормальную в таком случае, раз уж вы профессионал! К сожалению у меня небыло информатики, и приходиться всё изучать самому!
Минуточку! Добавил в основной цикл задержку, появились первые позывы
Вроде как переключается, но уж слишком быстро инкрементируется переменная button. Уважаемый Alexeyslav как тогда бороться с этим? если в обработчик прерываний нельзя вносить задержки?
Аlex: я не спорю, критика нужна, но в меру! вы подскажите в каком направлении двигаться, а то (цитата с форума "паяльник" - Где это видано, что в обработчике таймера так опрашивались кнопки ? Извращение одним словом....) вы бы подсказали хоть статейку нормальную в таком случае, раз уж вы профессионал! К сожалению у меня небыло информатики, и приходиться всё изучать самому!
Минуточку! Добавил в основной цикл задержку, появились первые позывы
Последний раз редактировалось RGB Пт ноя 09, 2012 22:58:35, всего редактировалось 1 раз.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Помогите опросить кнопку
Настраивайте свой таймер так, что-бы получить такты для опроса входов, миллисек. на 20, примерно. Можно сделать по 1 мс. (они потом Вам пригодятся), и в обработчике создать счётчик до 20.
Далее, нужно ловить изменения и устанавливать флаги, которые будут обрабатываться основным циклом. Изменения ловятся просто - считываем значение входа в темповский флаг, сравниваем этот флаг с предыдущим значением (с прошлого такта) и сохраняем его для следующего опроса (он потом будет предыдущим). При сравнении смотрим изменение, если текущее значение - отжата и предыдущее - нажата, то считаем кнопку кликнутой, устанавливая глобальный флаг кликнутой кнопки.
В основном цикле просто проверяем этот флаг и , если он установлен, сбрасываем его и выполняем необходимые действия, связанные с нажатием этой кнопки.
Имеем быстрый (не зацикленный) обработчик; текущее состояние кнопки; можем ловить как отжатие, так и нажатие; добавив ещё один счётчик, привязанный к кнопке, имеем возможность обрабатывать нажатия любой длительности.
Ну вот как-то так....
Далее, нужно ловить изменения и устанавливать флаги, которые будут обрабатываться основным циклом. Изменения ловятся просто - считываем значение входа в темповский флаг, сравниваем этот флаг с предыдущим значением (с прошлого такта) и сохраняем его для следующего опроса (он потом будет предыдущим). При сравнении смотрим изменение, если текущее значение - отжата и предыдущее - нажата, то считаем кнопку кликнутой, устанавливая глобальный флаг кликнутой кнопки.
В основном цикле просто проверяем этот флаг и , если он установлен, сбрасываем его и выполняем необходимые действия, связанные с нажатием этой кнопки.
Имеем быстрый (не зацикленный) обработчик; текущее состояние кнопки; можем ловить как отжатие, так и нажатие; добавив ещё один счётчик, привязанный к кнопке, имеем возможность обрабатывать нажатия любой длительности.
Ну вот как-то так....
- RGB
- Родился
- Сообщения: 17
- Зарегистрирован: Пт ноя 09, 2012 17:22:37
- Откуда: Москва
- Контактная информация:
Re: Помогите опросить кнопку
Аlex А вот теперь от души вам огромное человеческое СПАСИБО!
Буду пробывать, но уже завтра.
Буду пробывать, но уже завтра.