Ixptyti
1

Событие нажатия кнопки.

30.01.2010, 23:32. Показов 22049. Ответов 42
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Кнопка, замыкающаяся на землю подключена к PB0. Светодиод подключен к PB1.
Как включить светодиод при нажатии кнопки? МК ATmega16.
Светодиод я знаю как включить, но не знаю как уловить это событие.
Пишу на Си (WinAvr)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.01.2010, 23:32
Ответы с готовыми решениями:

Обработка долгого нажатия кнопки
Оговорюсь что читал похожую тему на форуме и умею пользоватся поиском (так думаю)! Есть задача...

Обработка нажатия кнопки
Есть кнопка без фиксатора( нажали отпустили и она разомкнулась) Как обработать событие нажали, она...

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

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

42
SWK
30.01.2010, 23:52 2
Светодиод я знаю как включить, но не знаю как уловить это событие.
Периодически (в цикле, а лучше - по прерыванию от таймера, например, раз в 1мсек или в 100 мсек), проверяешь состояние ноги, к которой подключена кнопка. Для защиты от дребезга можно считать несколько одинаковых опросов подряд, или просто зашунтировать ногу с кнопкой конденсатором. Можно повесить кнопку и на вход внешнего прерывания, но это не подходит, когда кнопок нужно много.
Ixptyti
30.01.2010, 23:56 3
[QUOTE="SWK"][QUOTE="Цитата:[/QUOTE]
Светодиод я знаю как включить, но не знаю как уловить это событие.
Периодически (в цикле, а лучше - по прерыванию от таймера, например, раз в 1мсек или в 100 мсек), проверяешь состояние ноги, к которой подключена кнопка. Для защиты от дребезга можно считать несколько одинаковых опросов подряд, или просто зашунтировать ногу с кнопкой конденсатором. Можно повесить кнопку и на вход внешнего прерывания, но это не подходит, когда кнопок нужно много.
я бесконечный цикл поставил в котором было if (PINB = 0x01) { PORTB = 0x02 }
или что-то типа того но ничего не зажигалось (
0 / 0 / 0
Регистрация: 03.11.2012
Сообщений: 9
31.01.2010, 00:46 4
Настройки порта правильные? В0- вход, В1- выход?
или что-то типа того но ничего не зажигалось
Как-то неконкретно. Надо бы кусок кода присовокупить.
0
Shodow
31.01.2010, 12:09 5
Цитата Сообщение от Ixptyti
я бесконечный цикл поставил в котором было if (PINB = 0x01) { PORTB = 0x02 }
или что-то типа того но ничего не зажигалось (
1. Сравнение в Си это знак - "==", а знак "=" это присваивание.
2. Если у вас кнопка замыкается на ноль то условие зажигания диода должно быть PINB == 0х00.
3. Так как остальные линии порта могут иметь уровни отличающиеся от 0 (например PВ1 когда вы включите диод) то перед сравнением не интересующие вас биты надо "замаскировать".
В результате получим
Код
if (PINB & 0x01 == 0x00) { PORTB = 0x02 }
В принципе сравнение с нулём лучше писать так:
Код
if (!(PINB & 0x01)) { PORTB = 0x02 }
Ixptyti
31.01.2010, 22:43 6
спасибо) вся проблема была в условии ( PINB & 0x01 )

кстати в этом случае зажигать светодиод надо так:
PORTB = 0x03;
c 02 вырубается подтяжка с PB0 и можно словить наводки))
Pirdymomosti
28.03.2012, 11:31 7
А у меня такая проблема - решил попользовать две такие кнопки
<Изображение удалено>
По инструкции (http://domko.ru/pdf/DFROBOT/DFR0029.pdf) всё просто - даже есть код под Ардуино, но...
Под WinAVR написал проверочный код - две кнопки + 2 светодиода - по нажатию определённой кнопки зажигается определённый светодиод:
Код
#define F_CPU 12000000UL  // указываем частоту в герцах
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

unsykned char StatusKey=0;

int main(void) // начало основной программы
{

// к порту B подключена кнопка, а к порту D - светодиод

DDRB = 0x00; // все выводы порта B сконфигурировать как входы
DDRD = 0xFF; // все выводы порта D сконфигурировать как выходы

PORTB &= ~_BV(PB0);    // установить "0" (низкий уровень) на выводе PB0
PORTB &= ~_BV(PB1);    // установить "0" (низкий уровень) на выводе PB1
PORTD &= ~_BV(PD5);   // установить "0" (низкий уровень) на выводе PD5 // светодиод не горит
PORTD &= ~_BV(PD6);   // установить "0" (низкий уровень) на выводе PD6 // светодиод не горит

while (1) // Начало бесконечного цикла
{

// Обработка нажатия кнопки
_delay_ms(1000); // Пауза на 0.01 сек

// Кнопка подключена к PB0. Светодиод подключен к PD5.
if((PINB = 0b11111110) && (StatusKey==0))
{
PORTD |= _BV(PD5); // установить "1" (высокий уровень) на выводе PD5
StatusKey=1;
}

else // Кнопка подключена к PB1. Светодиод подключен к PD6.
{
if((PINB = 0b11111101) && ((StatusKey==0) || (StatusKey==1)))
{
PORTD |= _BV(PD6); // установить "1" (высокий уровень) на выводе PD6
StatusKey=2;
}

else  //Если ни одна кнопка не нажата
{
StatusKey=0;
return 0;
}
};

} // Конец бесконечного цикла
} // закрывающая скобка основной программы
И... в результате ничего!

Подскажите, пожалуйста, в чём ошибка?

Упростил до одной кнопки и одного светодиода
Код
#define F_CPU 12000000UL
#include <avr/io.h>
#include <util/delay.h>

int main(void) // начало основной программы
{

// к порту A0 подключена кнопка, а к порту B0 - светодиод

DDRA = 0x00; // все выводы порта A сконфигурировать как входы
DDRB = 0xFF; // все выводы порта B сконфигурировать как выходы

PORTA = 0X00;
PORTB = 0X00;

while (1) // Начало цикла
{
_delay_ms(500);
if(PINA == 0x01) {PORTB = 0X01;};
}; // Конец цикла

} // Конец программы
Но, светодиод загорается не по нажанию кнопки, а после задержки...
Подскажите, пожалуйста, где ошибка в коде?
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
28.03.2012, 11:40 8
если у вас нажатие произойдёт в момент начала задержки, то естественно задержка будет,

и проверять нужно не весь байт а нужный бит, иначе другие ножки будут влиять
0
Pirdymomosti
28.03.2012, 12:04 9
В том то и дело, что сразу же после прошивки МК, после пятисотмиллисекундной паузы загорается светодиод, а я к кнопке не прикасаюсь...

Подскажите как исправить код, чтобы светодиод загорался по нажатию кнопки.
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
28.03.2012, 12:20 10
кнопка к земле подключена? тогда сравнивать надо с нулём
Shodow выше всё вроде написал
0
Pirdymomosti
28.03.2012, 12:27 11
Динная кнопка подключается тремя проводами: к ножке МК, к +5В и также на землю.
Здесь есть описание http://domko.ru/pdf/DFROBOT/DFR0029.pdf и код для Ардуино.
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
28.03.2012, 12:33 12
Как я понял, это какая-то цифровая кнопка с термосенсором, а не механический контакт, поэтому и питание на неё подаётся. А ваш код тут в принципе не подойдёт- он для обычной кнопки
0
Pirdymomosti
28.03.2012, 12:42 13
Термосенсора (и вообще, любого сенсора) нет. Обыкновенная механическая кнопка без фиксации - код для ардуино (http://domko.ru/pdf/DFROBOT/DFR0029.pdf) это подтверждает, но в описании в коде, наоборот, сравнивается с высоким уровнем на ножке МК.
Код
Sample Code
///Arduino Sample Code
///www.DFRobot.com
///Last modified on 16th September 2010
int tidPin = 13; // choose the pin for the LED
int inputPin = 3; // Connect simsor to input pin 3
void setup() {
pinMode(tidPin, OUTPUT); // declare LED as output
pinMode(inputPin, INPUT); // declare pushbutton as input
}
void loop(){
val = digitalRead(inputPin); // read input value
if (val == HIGH) { // check if the input is HIGH
digitalWrite(tidPin, LOW); // turn LED OFF
} else {
digitalWrite(tidPin, HIGH); // turn LED ON
}
А для чего питание подключается, тоже не пойму...
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
28.03.2012, 12:48 14
да сейчас тоже посмотрел код для ардуино, вроде ведёт себя как обычная кнопка.

фиг знает, чего они намутили
DFRobot LM35 Linear Temperature Sensor
This is a big button which gives the first touch of the physical world. Simply plug to IO expansion board to
fymish your first taste of Arduino.
Features
· Digital push button simsor
· Easy to plug omd play
· Large button keypad omd high-quotyty first-ctoss h

а вольтметр что показывает на выходе кнопки?
0
Pirdymomosti
28.03.2012, 12:54 15
~ +5B
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
28.03.2012, 12:55 16
ну так при нажатой или всё время?
0
Pirdymomosti
28.03.2012, 13:09 17
только при нажатой
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
28.03.2012, 13:13 18
а может у вас подтяжка включена на входе? тогда будет срабатывать всё время. неизвестно что в этой кнопке, может отжатая она просто в Н-Z переходит? попробуйте ризистор на землю подключить или просто кнопку отключить будет срабатывать?
0
Pirdymomosti
28.03.2012, 13:18 19
Сейчас не могу проверить. Как посмотрю - отпишусь.
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
28.03.2012, 13:23 20
и кстати, включаться он включается а для выключения команды нет (сейчас только заметил)
надо добавить хотя бы
if(PINA == 0x00) {PORTB = 0X00;}

ну лучше с else, естественно

здесь можно тупо PORTB =PINA

иначе, он если включится, то уже не выключится никогда
0
28.03.2012, 13:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.03.2012, 13:23
Помогаю со студенческими работами здесь

Как из обработчика Form1_KeyPress вызвать событие для нажатия заданной по имени кнопки на форме (кнопки 0-9)
Пишу калькулятор. Есть несколько кнопок (Button) с цифрами и знаками. Для цифр имена кнопок:...

Событие не нажатия кнопки
Уважаемые форумчане, подскажите как поступить: есть форма для ввода данных в таблицу. Ввод...

Не срабатывает событие нажатия кнопки
Привет, private void richTextBox1_KeyPress(object sender, KeyPressEventArgs e) { ...

Событие нажатия кнопки Back
Как сделать, чтоб при нажатии кнопки Back выполнялось сразу несколько действий? Например, если при...

Событие нажатия кнопки в кохан
Здравствуйте как в кохане узнать какая кнопак была нажата, есть страница на ней две кнопки найти и...

Не работает событие нажатия кнопки
Код html: &lt;html&gt; &lt;head&gt; &lt;title id='title'&gt;Комната моей мечты&lt;/title&gt; &lt;link...

Событие нажатия кнопки на USB наушниках
История: Имеются наушники Platronics 628 USB. Пока были новые, кнопка &quot;Выключить/включить микрофон&quot;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru