Обсуждаем контроллеры компании Atmel.
Ответить

ATMEGA8 не работает кнопка

Вт сен 11, 2012 23:48:07

Здравствуйте. Пытаюсь освоить программирование микроконтроллеров, и начинаю с простейшего. Не могу написать простейшую программу ) Суть простая - по нажатии кнопки включать и выключать диод. Вот код который не работает

Код:
.include   "m8def.inc"               ; Header files
.def      tempp=r20
.def      temp=r16
.equ        BUTTON_ON = 0b00000001
;********************************************************************
; Инициализация контроллера
;********************************************************************
.org       0x0000                  ; Вектор сброса
         rjmp   reset            ; процессора
;********************************************************************
reset:

;********************************************************************
; Настройка портов
;********************************************************************
         ldi      temp, 0b00000001   ; Порты PВ на ввод кроме нулевого
         out      DDRB, temp         ;

         ldi     temp, 0b00000010  ;  Подтягивание кнопки (PB1)
         out      PORTB, temp       ;


         ldi tempp, 0b00000010     ; заготовка для моргания светодиодом
         nop
         nop
;********************************************************************
; Основная программа
;********************************************************************
         OFF_LOOP:
         sbic PINB, BUTTON_ON     ; ждать когда нажмется кнопка
         rjmp OFF_LOOP

         MAIN_LOOP:

         out      portB,tempp     ; заготовка для моргания светодиодом

         rjmp OFF_LOOP


На PB0 светодио, на PB1 - кнопка. Суть в том, что цикл "OFF_LOOP:" почему-то не срабатывает, и программа сразу прыгает дальше. Дебаггер показывает, что пин BUTTON_ON занулён, но я же подтянул кнопку, следовательно пин должен был стать 1 ! А вручную PINB естественно нельзя установить. Голова рушиться, не могу понять в чем дело, прошу помощи!

Re: ATMEGA8 не работает кнопка

Ср сен 12, 2012 00:50:33

Жестоко. :) Выкиньте это:
Код:
out      portB,tempp     ; заготовка для моргания светодиодом

И пользуйтесь этим:
Код:
sbi PORTB, 0 ; Зажечь светодиод на ноге PB0
cbi PORTB, 0 ;Потушить светодиод на ноге PB0

Просто, в вашем случае, вы портите содержимое второго бита, отвечающего за подтяжку входа (кнопка на ноге PB1), пытаясь зажечь светодиод. По этому и не работает.

Re: ATMEGA8 не работает кнопка

Ср сен 12, 2012 11:30:33

Спасибо за ответ! Я удалил эти две строки с "tempp", но почему-то всёравно программа вначале перепрыгивает "sbic PINB, BUTTON_ON". При отладке через Atmel Studio видно что на строке " out PORTB, temp " загорается соответствующий бит в PortB, но при этом PinB так и остаётся пустым! Может нужно как-то сам проект настроить, или я что-то не понимаю?

Re: ATMEGA8 не работает кнопка

Ср сен 12, 2012 12:33:20

Для проверки в студии можно делать так. Ну и вручную кликать по PINB1
Спойлер
Код:
;reset:
;********************************************************************
; Настройка портов
;********************************************************************
   LDI   R17, 0b00000011   ; Порты PВ на ввод кроме нулевого и первого для студии
   OUT   DDRB,R17         ;

   ldi     temp, 0b00000010  ;  Подтягивание кнопки (PB1)
   out      PORTB, temp       ;

   ldi      temp, 0b00000001   ; Порты PВ на ввод кроме нулевого
   out      DDRB, temp         ;

   LDI R20, 0b00000011     ; заготовка для моргания светодиодом
   OUT      PORTB,R20      ; светик нужно погасить, не потеряв при этом подтяжки
   LDI R21, 0b00000001      ; заготовка для моргания светодиодом
OFF_LOOP:
   RCALL   PAUSE
   SBIC   PINB, BUTTON_ON     ; ждать когда нажмется кнопка
   RJMP   OFF_LOOP
   EOR      R20,R21         ; кто-то нажал кнопку, значит
   OUT      PORTB,R20      ; светик нужно переключить, не потеряв при этом подтяжки
WAIT:
   SBIS   PINB, BUTTON_ON     ; ждать когда отпустится кнопка
   RJMP   WAIT
   RJMP   OFF_LOOP
PAUSE:
   LDI   YH,0
   LDI   YL,255
WAIT_PAUSE:
   SBIW   YH:YL,1
   BRNE   WAIT_PAUSE
   RET

13.09.2012
Попробуйте так.
Последний раз редактировалось akl Чт сен 13, 2012 10:22:19, всего редактировалось 2 раз(а).

Re: ATMEGA8 не работает кнопка

Ср сен 12, 2012 21:31:48

Спасибо, всё заработало! Пардон за предыдущий вариант сообщения, намудрил немного )

Re: ATMEGA8 не работает кнопка

Ср сен 12, 2012 22:26:06

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

Re: ATMEGA8 не работает кнопка

Чт сен 13, 2012 10:24:11

Ввел задержку и изменил программу. См. предыдущее сообщение.
Ответить