Страница 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
Оригинально, но не работает
Сделай нормальную защиту от дребезга и проверяй отпускание кнопки после нажатия.....
Это только кажется, что ты кнопочку быстро нажал и отпустил.....
А сколько за это время тиков на МК набежит ?
Добавлено: Чт дек 17, 2009 14:45:18
demon_tulun
md5sum писал(а):Оригинально, но не работает
Сделай нормальную защиту от дребезга и проверяй отпускание кнопки после нажатия.....
Это только кажется, что ты кнопочку быстро нажал и отпустил.....
А сколько за это время тиков на МК набежит ?
Если я правильно понял необходимо организовать проверку нажатия кнопки с задержкой по времени при этом необходимо установить момент отпускания кнопки и взять утот период за один сигнал.
примерно так:
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 (для тренировки

)