Страница 1 из 1

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

Добавлено: Вс дек 29, 2013 02:39:55
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++;
        } 
    }
 
}
}

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

Добавлено: Вс дек 29, 2013 07:31:38
DARKMAVR
Использовании PINB.3, при обработке нажатия, надо с чем-то сравнить
Попробуйте написать

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

if (PINB.3==0) {delay_ms(50); 
      OCR0A++;  }; // и так далее

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

Добавлено: Вс дек 29, 2013 09:17:35
da-nie
надо с чем-то сравнить


Да, собственно, он уже и сравнивает с не нулём.

подключены кнопки повешенные на VCC к ногам 5,6


А резисторы подтягивающие порты к земле есть?

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

Добавлено: Вс дек 29, 2013 13:06:53
zyhelman
Резисторы не вешал, только на ресет, но понял что подтягивать нужно, однако думал что у меня программная проблема, надеялся на подтяжку внутри мк

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

Добавлено: Вс дек 29, 2013 13:45:08
da-nie
надеялся на подтяжку внутри мк


А там подтяжка встроенная случайно не к плюсу питания?

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

Добавлено: Сб янв 04, 2014 12:08:16
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 мс.

Чуть посложнее реализуется опрос кнопок по прерываниям, но тоже ничего супер трудного. В этом случае действия при нажатии на кнопку будут также выполнены в обработчике прерывания, при этом пока Вы раздумываете, на какую кнопку нажать, основная программа будет заниматься чем-нибудь общественно-полезным :)