Проблема при обработке кнопок

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 11
Зарегистрирован: Вс дек 29, 2013 02:26:35
Откуда: Украина, Киев

Сообщение zyhelman »

Доброй ночи=)
Возникла проблема при работе с элементарными вещами, имеется тинька 13, к ногам 2,3,7 подключены кнопки повешенные на VCC к ногам 5,6 два полевика для лент светодиодных. Проблема в том что в симке все отлично отрабатывает но в железе мк считает что кнопки зажаты постоянно. Возможно я неправильно выставил конфигурацию ног, подправьте если не трудно :)) Собственно это кусок кода который не работал упростил всю программу до него.



Код: Выделить всё

#define F_CPU 9600000
#include <tiny13a.h>
#include <delay.h>


void main(void)
{
DDRB=0b00011; 
PORTB=0b00000;


TCCR0A=0b10100011;
TCCR0B=0b00000010;                                                   
OCR0A=0;
OCR0B=128;
while(1)
{   
    if(PINB.3) 
    {         
        delay_ms(50);
        if(PINB.3)
        {
            OCR0A++; 
        }
    }   
    if(PINB.4) 
    {      
        delay_ms(50);
        if(PINB.4)
        {
            OCR0B++; 
        }  
    }
 
}
}
Реклама
Встал на лапы
Сообщения: 81
Зарегистрирован: Пт июл 09, 2010 17:44:34
Откуда: Татарстан, г. Казань

Сообщение DARKMAVR »

Использовании PINB.3, при обработке нажатия, надо с чем-то сравнить
Попробуйте написать

Код: Выделить всё

if (PINB.3==0) {delay_ms(50); 
      OCR0A++;  }; // и так далее
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.

Сообщение da-nie »

надо с чем-то сравнить
Да, собственно, он уже и сравнивает с не нулём.
подключены кнопки повешенные на VCC к ногам 5,6
А резисторы подтягивающие порты к земле есть?
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Контактная информация:
Родился
Сообщения: 11
Зарегистрирован: Вс дек 29, 2013 02:26:35
Откуда: Украина, Киев

Сообщение zyhelman »

Резисторы не вешал, только на ресет, но понял что подтягивать нужно, однако думал что у меня программная проблема, надеялся на подтяжку внутри мк
Реклама
Эиком - электронные компоненты и радиодетали
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.

Сообщение da-nie »

надеялся на подтяжку внутри мк
А там подтяжка встроенная случайно не к плюсу питания?
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Контактная информация:
Реклама
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Сообщение Alkul »

da-nie писал(а):
надеялся на подтяжку внутри мк
А там подтяжка встроенная случайно не к плюсу питания?
К плюсу питания, естественно.
Для реализации опроса кнопок в варианте использования внутренних резисторов подтяжки кнопки нужно замыкать на "землю". Тогда при разомкнутой кнопке вывод будет в состоянии лог.1 за счет подтяжки внутренним резистором, а при замкнутой кнопке вывод будет с состоянии лог.0
zyhelman писал(а):имеется тинька 13, к ногам 2,3,7 подключены кнопки повешенные на VCC
Давайте я чуток подкорректирую.
Если у Вас кнопки подключены к выводам 2,3 и 7, то это означает, что кнопки подключены к линиям PB3, PB4 и PB2 соответственно.
Хорошо. Во-первых, кнопки должны быть подключены не к VCC, а к "земле".
А дальше так:

Код: Выделить всё

.include "tn13def.inc"

.cseg
.org 0x00

rjmp RESET 		; Reset Handler
rjmp EXT_INT0 	; IRQ0 Handler
rjmp PCINT0_ 	; PCINT0 Handler
rjmp TIM0_OVF 	; Timer0 Overflow Handler
rjmp EE_RDY 	; EEPROM Ready Handler
rjmp ANA_COMP 	; Analog Comparator Handler
rjmp TIM0_COMPA ; Timer0 CompareA Handler
rjmp TIM0_COMPB ; Timer0 CompareB Handler
rjmp WATCHDOG 	; Watchdog Interrupt Handler
rjmp ADC_ 		; ADC Conversion Handler


EXT_INT0: 		; IRQ0 Handler
PCINT0_: 		; PCINT0 Handler
TIM0_OVF: 		; Timer0 Overflow Handler
EE_RDY: 		; EEPROM Ready Handler
ANA_COMP: 		; Analog Comparator Handler
TIM0_COMPA: 	; Timer0 CompareA Handler
TIM0_COMPB: 	; Timer0 CompareB Handler
WATCHDOG: 		; Watchdog Interrupt Handler
ADC_: 			; ADC Conversion Handler
		reti



RESET: 	ldi R16, low(RAMEND)				;Инициализировать
		out SPL,R16 						;указатель вершины стека

		ldi R16,(1<<PB0)|(1<<PB1)			;Установить в рег.R16 биты 0 и 1
		out DDRB,R16						;Установить линии PB0 и PB1 в состояние "выход"
		
		ldi R16,(1<<PB2)|(1<<PB3)|(1<<PB4)	;Установить в рег.R16 биты 2,3 и 4
		out PORTB,R16						;Включить резисторы подтяжки на линиях PB2,PB3 и PB4

;		sbi/cbi PORTB,PB0					;Определите начальное состояние выводов, управляющих полевиками
;		sbi/cbi PORTB,PB1					;

;Опрос кнопок

BUTTON:	sbis PINB,PB2						;Кнопка PB2 нажата?
		rjmp PRESS_PB2					;Если да, то переход на обработчик нажатия кнопки PB2
		sbis PINB,PB3						;Иначе кнопка PB3 нажата?
		rjmp PRESS_PB3					;Если да, то переход на обработчик нажатия кнопки PB3
		sbis PINB,PB4						;Иначе кнопка PB4 нажата?
		rjmp PRESS_PB4					;Если да, то переход на обработчик нажатия кнопки PB4
		rjmp BUTTON						;Иначе возврат на опрос кнопки PB2

;Обработчик нажатия на кнопку PB2
PRESS_PB2:
;Подавление "дребезга"
		sbis PINB,PB2						;Кнопка PB2 нажата?
		rjmp PRESS_PB2					;Если да, то вернуться на опрос кнопки PB2
		rcall DELAY300						;Кнопка PB2 отпущена, вызвать подпрограмму задержки
;Подавление "дребезга" завершено

;		Код, который должен выполниться при нажатии на кнопку PB2

		rjmp BUTTON

;Обработчик нажатия на кнопку PB3
PRESS_PB3:
;Подавление "дребезга"
		sbis PINB,PB3						;Кнопка PB3 нажата?
		rjmp PRESS_PB3					;Если да, то вернуться на опрос кнопки PB3
		rcall DELAY300						;Кнопка PB3 отпущена, вызвать подпрограмму задержки
;Подавление "дребезга" завершено

;		Код, который должен выполниться при нажатии на кнопку PB3

		rjmp BUTTON

;Обработчик нажатия на кнопку PB4
PRESS_PB4:
;Подавление "дребезга"
		sbis PINB,PB4						;Кнопка PB4 нажата?
		rjmp PRESS_PB4					;Если да, то вернуться на опрос кнопки PB4
		rcall DELAY300						;Кнопка PB4 отпущена, вызвать подпрограмму задержки
;Подавление "дребезга" завершено

;		Код, который должен выполниться при нажатии на кнопку PB4

		rjmp BUTTON

;Подпрограмма задержки 0,3 секунды (300 мс)
DELAY300:

;		Код продпрограммы задержки

		ret

Вот простейшая программа опроса кнопок. Допишите сами начальную инициализацию выводов, к которым подключены полевики, допишите, какие действия должны выполняться в обработчиках нажатий на кнопки, а также допишите подпрограмму, реализующую задержку на 300 мс.

Чуть посложнее реализуется опрос кнопок по прерываниям, но тоже ничего супер трудного. В этом случае действия при нажатии на кнопку будут также выполнены в обработчике прерывания, при этом пока Вы раздумываете, на какую кнопку нажать, основная программа будет заниматься чем-нибудь общественно-полезным :)
Последний раз редактировалось Alkul Сб янв 04, 2014 19:18:14, всего редактировалось 1 раз.
Реклама
Ответить

Вернуться в «AVR»