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

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

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

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

.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
DX168B
Жестоко. :) Выкиньте это:

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

out      portB,tempp     ; заготовка для моргания светодиодом
И пользуйтесь этим:

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

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

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

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

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

Добавлено: Ср сен 12, 2012 12:33:20
akl
Для проверки в студии можно делать так. Ну и вручную кликать по 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
Попробуйте так.

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

Добавлено: Ср сен 12, 2012 21:31:48
ExMachinaRus
Спасибо, всё заработало! Пардон за предыдущий вариант сообщения, намудрил немного )

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

Добавлено: Ср сен 12, 2012 22:26:06
ExMachinaRus
Вот тут теперь другой вопрос - где у как вставить сюда задержки, чтобы переключение было не дрыганьем, и всегда срабатывало? (а то и в протеусе, и на бредборде не всегда срабатывает и дрыгается)

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

Добавлено: Чт сен 13, 2012 10:24:11
akl
Ввел задержку и изменил программу. См. предыдущее сообщение.