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

Обсуждаем контроллеры компании Atmel.
Ответить
ExMachinaRus
Родился
Сообщения: 6
Зарегистрирован: Ср мар 21, 2012 23:52:48

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

Сообщение 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 естественно нельзя установить. Голова рушиться, не могу понять в чем дело, прошу помощи!
Реклама
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

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

Сообщение DX168B »

Жестоко. :) Выкиньте это:

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

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

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

sbi PORTB, 0 ; Зажечь светодиод на ноге PB0
cbi PORTB, 0 ;Потушить светодиод на ноге PB0
Просто, в вашем случае, вы портите содержимое второго бита, отвечающего за подтяжку входа (кнопка на ноге PB1), пытаясь зажечь светодиод. По этому и не работает.
I am DX168B and this is my favourite forum on internet!
Реклама
ExMachinaRus
Родился
Сообщения: 6
Зарегистрирован: Ср мар 21, 2012 23:52:48

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

Сообщение ExMachinaRus »

Спасибо за ответ! Я удалил эти две строки с "tempp", но почему-то всёравно программа вначале перепрыгивает "sbic PINB, BUTTON_ON". При отладке через Atmel Studio видно что на строке " out PORTB, temp " загорается соответствующий бит в PortB, но при этом PinB так и остаётся пустым! Может нужно как-то сам проект настроить, или я что-то не понимаю?
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение 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
Попробуйте так.
Последний раз редактировалось akl Чт сен 13, 2012 10:22:19, всего редактировалось 2 раза.
Реклама
Эиком - электронные компоненты и радиодетали
ExMachinaRus
Родился
Сообщения: 6
Зарегистрирован: Ср мар 21, 2012 23:52:48

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

Сообщение ExMachinaRus »

Спасибо, всё заработало! Пардон за предыдущий вариант сообщения, намудрил немного )
Реклама
ExMachinaRus
Родился
Сообщения: 6
Зарегистрирован: Ср мар 21, 2012 23:52:48

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

Сообщение ExMachinaRus »

Вот тут теперь другой вопрос - где у как вставить сюда задержки, чтобы переключение было не дрыганьем, и всегда срабатывало? (а то и в протеусе, и на бредборде не всегда срабатывает и дрыгается)
Реклама
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

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

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