|
Кнопки на atmega16 |
|
|
|
Jul 30 2008, 09:53
|
Группа: Новичок
Сообщений: 11
Регистрация: 14-04-08
Пользователь №: 36 773

|
Искал поиском, но самого простого и базового объяснения нигде не нашел. В общем идея такова: нажимается кнопочка и двоичное число, высвечиваемое на светодеодах, увеличивается на единичку. Деоды прикреплены к порту D, кнопочка висит на порте А. Вот код: Код .include "m16def.inc"
.def Temp=R16 .def Temp1=R17 .def Temp2=R18 .def Temp3=R19 .def Temp4=R20
.cseg .org 0
ldi Temp, 0b11111111 out DDRB,Temp
ldi Temp,0b00000001 out PortB,Temp
BUT:
sbis PinA,0x00; если нажато - переходим к SWITCH rjmp BUT
SWITCH:
inc Temp out PortB,Temp ldi Temp1,0 ldi Temp2,0
DLY:
dec Temp1 ; задержка brne DLY dec Temp2 brne DLY
rjmp BUT Вроде бы все логично, но почему-то работает как угодно, но не так как описано. Что я делаю неверно?
|
|
|
|
|
 |
Ответов
|
Aug 3 2008, 20:42
|
Группа: Новичок
Сообщений: 11
Регистрация: 14-04-08
Пользователь №: 36 773

|
Помогите разобраться с прикручиванием нескольки кнопок. Например, при нажатии нулевой число увеличивается на единицу, а при нажатии первой – уменьшается. Написал код, но снова что-то не так: Код .include "m16def.inc"
.def temp1=R16 .def temp2=R17 .def temp3=R18 .def temp4=R19 .def temp=R20
.dseg
Line: .byte 2
.cseg .org 0
ldi temp, High(RamEnd) out SPH, Temp ldi temp, Low(RamEnd) out SPL, Temp
ldi temp, 0b11111111 out DDRB, temp ldi Temp,0b00000001 out PortB,Temp
KeyRead:
in temp1,PinA ; читаем порт А sts Line, temp1 ; записываем результат в ОЗУ rcall DLY ; Задержка cpi Temp1,0 brne KeyTest ; если что-то нажато - переходим на обработку rjmp KeyRead ;если ничего не нажато - сначала
KeyTest: lds temp1, line ; загружаем результат чтения порта cpi temp1, 0b00000001; если нажата нулевая кнопка переходим к But0 breq But0 cpi temp1, 0b00000010; если нажата первая кнопка переходим к But1 breq But1
But0:
inc Temp ;инкремент out PortB,Temp rcall DLY ; вызываем задержку rjmp KeyRead ; в начало
But1: dec Temp ;декремент out PortB,Temp rcall DLY ;задержка rjmp KeyRead
;----------------------------------------------------------------------
DLY:
ldi Temp1,0 ldi Temp2,0
Loop:
dec Temp1 brne Loop dec Temp2 brne Loop
ret А точнее, кнопки не откликаются вовсе. Наставьте на путь истиный
|
|
|
|
|
Aug 5 2008, 13:49
|
Участник

Группа: Участник
Сообщений: 35
Регистрация: 18-05-08
Пользователь №: 37 607

|
Цитата(SpiritCoat @ Aug 3 2008, 23:42)  Код ldi temp, 0b11111111 out DDRB, temp ldi Temp,0b00000001 out PortB,Temp Здесь устанавливаете все биты PORTB на выход, как же кнопки будут работать? Цитата(SpiritCoat @ Aug 3 2008, 23:42)  Код in temp1,PinA; читаем порт А sts Line, temp1; записываем результат в ОЗУ rcall DLY; Задержка cpi Temp1,0 содержимое temp1 после вызова задержки пропадет, поэтому строка cpi temp1, 0 не имеет смысла. используйте стек или другие регистры Цитата(SpiritCoat @ Aug 3 2008, 23:42)  Код Loop:
dec Temp1 brne Loop dec Temp2 brne Loop
ret а тут будет зацикливание. сделайте лучше так: Код Loop:
dec Temp1 brne Loop
Loop2:
dec Temp2 brne Loop2
ret а кнопки лучше подключить, как советует SasaVitebsk, с внутренней подтяжкой (DDRx=0, PORTx=1), соответственно проверяете на 0
Сообщение отредактировал Paulina - Aug 5 2008, 14:07
|
|
|
|
Сообщений в этой теме
SpiritCoat Кнопки на atmega16 Jul 30 2008, 09:53 MrYuran Для начала - нет подавления дребезга.
Дальше - нет... Jul 30 2008, 10:05 SasaVitebsk Цитата(SpiritCoat @ Jul 30 2008, 12:53) В... Jul 30 2008, 10:09 AHTOXA Цитата(SpiritCoat @ Jul 30 2008, 15:53) Д... Jul 30 2008, 10:15 defunct Цитата(SpiritCoat @ Jul 30 2008, 12:53) н... Jul 30 2008, 10:19 SpiritCoat Спасибо всем, кто отписался! Этот алгоритм:
Ц... Jul 30 2008, 11:36 defunct Цитата(SpiritCoat @ Jul 30 2008, 14:36) К... Jul 30 2008, 11:40
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|