Ixptyti
|
|
1 | |
Событие нажатия кнопки.30.01.2010, 23:32. Показов 22049. Ответов 42
Метки нет (Все метки)
Кнопка, замыкающаяся на землю подключена к PB0. Светодиод подключен к PB1.
Как включить светодиод при нажатии кнопки? МК ATmega16. Светодиод я знаю как включить, но не знаю как уловить это событие. Пишу на Си (WinAvr) |
30.01.2010, 23:32 | |
Ответы с готовыми решениями:
42
Обработка долгого нажатия кнопки Обработка нажатия кнопки Обработка нажатия кнопки... обработка нажатия пользовательской кнопки |
SWK
|
|
30.01.2010, 23:52 | 2 |
|
Ixptyti
|
|
30.01.2010, 23:56 | 3 |
[QUOTE="SWK"][QUOTE="Цитата:[/QUOTE]
я бесконечный цикл поставил в котором было 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
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 | |
28.03.2012, 13:23 | |
Помогаю со студенческими работами здесь
20
Как из обработчика Form1_KeyPress вызвать событие для нажатия заданной по имени кнопки на форме (кнопки 0-9) Событие не нажатия кнопки Не срабатывает событие нажатия кнопки Событие нажатия кнопки Back Событие нажатия кнопки в кохан Не работает событие нажатия кнопки Событие нажатия кнопки на USB наушниках Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |