ATmega16A: некорректный вывод информации на ЖКИ

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 6
Зарегистрирован: Ср июл 04, 2012 20:06:25

Сообщение KaCD »

Цель программы: подключается матричная клавиатура 3х3 с последующим выводом номера кнопки на ЖКИ
Суть проблемы: на ЖКИ выводится не то, что требуется =)
(программирую на Асме в АВРСтудио 5
ЖКИ на контроллере HD44780)

Приведу кусок кода, в котором происходит затык:

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

t0_comp:    ;клава подключена к РА0-7 (PA0-2 - столбцы, PA4-6 строки). 

Stolbci:                ;пол порта сначала считывает -> сохраняет значение в XL, затем считывает другая часть -> в XH
ldi temp,0xF0
out ddrA,temp
ldi temp,0x0F
out portA,temp
nop					
nop
nop
nop
in XL,pinA

Strochki:
ldi temp,0x0F
out ddrA,temp
ldi temp,0xF0
out portA,temp
nop
nop
nop
nop
in XH,pinA

add XH,XL     ;обе половинки суммируются

ldi ZH,High(DATA*2)
ldi ZL,Low(DATA*2)

OUTPUT:                  ;здесь ведётся поиск совпадения значения с порта и значения в DATA (например, кнопка 3 имеет код 0b11101110 или же 0xEE)
V1:
	lpm
	tst R0
	breq exit
	cp XH,R0
	brne V2
	rcall BT_SEL    ;если нашли, то идём далее...
	rjmp exit
V2:
adiw ZL,1
rjmp V1

BT_SEL:        ;здесь позиции в DATA совпавшего значения прибавляется 7, что переносит "маркер" в позицию числа "3", соответствующее совпавшему коду
adiw ZL,7      (***) - пояснение ниже
rjmp OUTPUT2
rjmp exit

DATA:
.db 0b11101011,0b11101101,0b11101110,0b11011011,0x00,"1",0x00,"2",0x00,"3",0x00,"4",0x00

OUTPUT2:     ;ну и собственно вывод номера на ЖКИ (значение 0х00 служит меткой для конца вывода на ЖКИ)
lpm
mov PARAM,R0
tst PARAM
brne V9
rjmp exit

V9:
rcall LCD_DATA
adiw ZL,1
rjmp OUTPUT2
ret

exit:
reti
Собственно проблема заключается в том, что на ЖКИ выводится не число 3, а символ, соответствующий коду 0хEE, т.е. на участке (***) такое чувство, что команда adiw ZL,7 игнорируется и переход на 7 шагов вперёд не происходит, и соответственно на экран выводится, то, что было загружено командой lpm в R0 до этого, а именно значение 0хЕЕ. Если прогонять в дебаггере, то этой проблемы нет и переход происходит. В реале же, при загрузке прошивки вылезает этот глюк.
Вот, вообщем, в чём проблема. Сам пока решения не нашёл.

Не так давно была у меня проблема с 16-битным таймером и AVRStudio 4, но всё решилось установкой 5-й версии. Тут же даже не знаю... 6-ю что ли ставить?
Жду советов от светил программирования )))
Ну, и на всякий случай, приводу полный код
Вложения
Klaviatura 3x3.rar
(1.59 КБ) 188 скачиваний
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3793
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

BT_SEL:
adiw ZL,7
rjmp OUTPUT2
rjmp exit <- как управление попадет на эту инструкцию?

V9:
rcall LCD_DATA
adiw ZL,1
rjmp OUTPUT2
ret <- как управление попадет на ret ???
Реклама
Родился
Сообщения: 6
Зарегистрирован: Ср июл 04, 2012 20:06:25

Сообщение KaCD »

Ser60

Согласен, намудрил :)) Удалить эти переходы надо и rcall BT_SEL можно заменить на rjmp BT_SEL, тогда и rjmp exit, идущий следующий строкой, тоже становится не нужным. Проверил в дебаггере.
Ответить

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