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

Не могу найти ошибку в логике asm.

Добавлено: Вт дек 15, 2009 18:43:28
demon_tulun
Подскожите люди добрые в чем косяк.

Написал текст под atmega16. Должен получиться перебор на порту А. Перебором управлют кнопки на порту С pin 0 и 1. В теории должно все работать, а по факту перебор работает только на краях тоесть вывод 0 и 5 (первый и последний) вариант. Промежуточного перебора нет. Проверяю, вроде све должно работать. Но не идет.
Текст программы ниже:

.include "m16def.inc"

.def temp1=r16
.def temp2=r17
.def porttest=r18
.def temp3=r19

.cseg
.org 0

//Настраиваем порт А на вывод и зажигаем табло
ldi temp1,0b11111111
out ddra,temp1
out porta,temp1

ldi temp1,0b00000000
out ddrc,temp1

ldi temp1,0b00000000
out porta,temp1

// зажигаем 0
ldi temp1,0b01001000// 0
out porta,temp1
ldi temp2,3

//ставим цикл с опросом на кнопки

loop: in porttest,pinc
cpi porttest,1
breq step1
cpi porttest,2
breq step2
cpi porttest,3
breq step2_1
rjmp loop

step1: cpi temp2,5
breq loop
inc temp2
rjmp step1_1

step2: cpi temp2,0
breq loop
dec temp2
rjmp step1_1

step1_1:cpi temp2,0
ldi temp1,0b01001000
breq step2_1
cpi temp2,1
ldi temp1,0b11001011
breq step2_1
cpi temp2,2
ldi temp1,0b10001100
breq step2_1
cpi temp2,3
ldi temp1,0b10001001
breq step2_1
cpi temp2,4
ldi temp1,0b00101011
breq step2_1
cpi temp2,5
ldi temp1,0b00011001
breq step2_1

step2_1:out porta,temp1
ldi temp3,0b00000000
out pinc,temp3
rjmp loop

прогонял текст в AVR Studio 4.17 пошагово все нормально идет. А в Proteuse ISIS только края. :(

Добавлено: Вт дек 15, 2009 20:45:08
__STING__
а реально контроллер прошивал?

Добавлено: Ср дек 16, 2009 10:59:46
demon_tulun
__STING__

Да прошивал и не один раз. Поведение такое же как описани выше.

Добавлено: Ср дек 16, 2009 20:39:33
Meteor
Нарисуй временную диаграмму как сигналы в железе подаешь

Добавлено: Ср дек 16, 2009 23:42:56
md5sum
Оригинально, но не работает :)

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

ldi temp3,0b00000000
out pinc,temp3 
Сделай нормальную защиту от дребезга и проверяй отпускание кнопки после нажатия.....
Это только кажется, что ты кнопочку быстро нажал и отпустил.....
А сколько за это время тиков на МК набежит ?

Добавлено: Чт дек 17, 2009 14:45:18
demon_tulun
md5sum писал(а):Оригинально, но не работает :)

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

ldi temp3,0b00000000
out pinc,temp3 
Сделай нормальную защиту от дребезга и проверяй отпускание кнопки после нажатия.....
Это только кажется, что ты кнопочку быстро нажал и отпустил.....
А сколько за это время тиков на МК набежит ?
Если я правильно понял необходимо организовать проверку нажатия кнопки с задержкой по времени при этом необходимо установить момент отпускания кнопки и взять утот период за один сигнал.

примерно так:
loop:in porttest,pinc
cpi porttest,1
breq times
ldi temp5,1
cpi temp5,1
breq step1

cpi porttest,2
breq step2
cpi porttest,3
breq step2_1
rjmp loop


times: dec temp4
breq loop
rjmp times

Meteor

Нарисуй временную диаграмму как сигналы в железе подаешь
Извени за тупой вопрос как это должно выглядить? Есть микруха, на порт С повесил 2 кнопки, на порт А повесил свето диодное табло. При нажатии кнопки должен сменяться символ (цифра)на табло в сторону увеличения или уменьшения.

Добавлено: Чт дек 17, 2009 16:16:45
md5sum
demon_tulun писал(а): Если я правильно понял необходимо организовать проверку нажатия кнопки с задержкой по времени при этом необходимо установить момент отпускания кнопки и взять утот период за один сигнал.
Понял правильно!
Только алгоритм такой:
1. Увидели нажатие кнопки
2. запустили подпрограмму задержки для пропуска дребезга (я 100 миллисекунд обычно ставлю)
3. после задержки ждем отпускания кнопки ( если не проверять, то при частоте 1МГц за секунду удержания кнопки лимон тактов пройдет и твоя прога ~ 50 тысяч раз по кругу выполнится)
4. после отпускания выполняем требуемые задачи

3 и 4 можно менять местами.... тогда задача будет вылняться или при отпускании или при нажатии кнопки...

Добавлено: Чт дек 17, 2009 19:47:24
Meteor
demon_tulun писал(а):как это должно выглядить? Есть микруха, на порт С повесил 2 кнопки, на порт А повесил свето диодное табло. При нажатии кнопки должен сменяться символ (цифра)на табло в сторону увеличения или уменьшения.
Вот пример временной диаграммы. Не для МК но не суть. Выделены красным цветом входные сигналы. Вот так и рисуй. Когда какой сигнал подаешь (на какую кнопку жмешь, могут ли быть нажаты несколько кнопок и т.д.)

Добавлено: Вс дек 20, 2009 13:15:21
demon_tulun
Поясните пожалуйста праимно я понял или ошибаюсь. Если в порт отравить данные то они там сохраняются только на один такт мк? А после быстренько удоляются. Поясню в чем суть: если нажимаю кнопку то нужный символ горит, только отпустил кнопку тут же символ погас и горит всякая хре.. Еще заметил что схема сильно реагирует на руку (типо срабатывают кнопки не прикасаясь кним). Так понимаю Это наводки. Как с этим можно бороться?

Добавлено: Вс дек 20, 2009 15:40:20
Meteor
Если в порт записывать только при нажатии кнопки и больше к нему не обращаться, то данные должны храниться там.
Для борьбы с помехами, включай подтягивающие резисторы у порта. Или ставь внешние резисторы.

Добавлено: Вс дек 20, 2009 22:13:32
md5sum
demon_tulun писал(а):если нажимаю кнопку то нужный символ горит, только отпустил кнопку тут же символ погас и горит всякая хре.. Еще заметил что схема сильно реагирует на руку (типо срабатывают кнопки не прикасаясь кним). Так понимаю Это наводки. Как с этим можно бороться?
Реакция на руку: отсутствуют подтягивающие резисторы и судя по твоему коду подтягивать надо к "0" внешними резисторами т.к. кнопки при нажатии на ногу МК подают Vcc (питание). Внутренняя подтяжка есть только к Vcc.

Отпустил кнопку и получил хре.. : При проверке на отпускание кнопки защиту от дребезга не забыл? А то при отпускании получишь мало-мало "нажатий" :)

Добавлено: Вс дек 20, 2009 22:29:24
md5sum
Вдогонку: неиспользуемые выводы порта С подтяни к нулю или запрограммируй на out иначе при чтении и проверке

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

loop: in porttest,pinc
cpi porttest,1
breq step1
cpi porttest,2
breq step2 
есть большой шанс получить не 1 и 2 а совсем другие значения.

И попробуй вышеуказанный код заменить на другой с использованием SBIC / SBIS (для тренировки :) )