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

Все прочитали, вроде даже поняли, взяли паяльник - а нифига не получается? Скорее сюда! Поможем. Чем можем...
Ответить
Родился
Сообщения: 11
Зарегистрирован: Чт дек 10, 2009 16:47:43
Откуда: Иркутская область

Сообщение 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 только края. :(
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 593
Зарегистрирован: Ср мар 25, 2009 11:29:31
Откуда: Москва

Сообщение __STING__ »

а реально контроллер прошивал?
Лучшее враг хорошего
Реклама
Родился
Сообщения: 11
Зарегистрирован: Чт дек 10, 2009 16:47:43
Откуда: Иркутская область

Сообщение demon_tulun »

__STING__

Да прошивал и не один раз. Поведение такое же как описани выше.
Друг Кота
Аватара пользователя
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....

Сообщение Meteor »

Нарисуй временную диаграмму как сигналы в железе подаешь
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Сообщение md5sum »

Оригинально, но не работает :)

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

ldi temp3,0b00000000
out pinc,temp3 
Сделай нормальную защиту от дребезга и проверяй отпускание кнопки после нажатия.....
Это только кажется, что ты кнопочку быстро нажал и отпустил.....
А сколько за это время тиков на МК набежит ?
Реклама
Родился
Сообщения: 11
Зарегистрирован: Чт дек 10, 2009 16:47:43
Откуда: Иркутская область

Сообщение 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 кнопки, на порт А повесил свето диодное табло. При нажатии кнопки должен сменяться символ (цифра)на табло в сторону увеличения или уменьшения.
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Сообщение md5sum »

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

3 и 4 можно менять местами.... тогда задача будет вылняться или при отпускании или при нажатии кнопки...
Друг Кота
Аватара пользователя
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....

Сообщение Meteor »

demon_tulun писал(а):как это должно выглядить? Есть микруха, на порт С повесил 2 кнопки, на порт А повесил свето диодное табло. При нажатии кнопки должен сменяться символ (цифра)на табло в сторону увеличения или уменьшения.
Вот пример временной диаграммы. Не для МК но не суть. Выделены красным цветом входные сигналы. Вот так и рисуй. Когда какой сигнал подаешь (на какую кнопку жмешь, могут ли быть нажаты несколько кнопок и т.д.)
Вложения
Time_diagr.JPG
(180.3 КБ) 381 скачивание
Последний раз редактировалось Meteor Чт дек 17, 2009 19:52:34, всего редактировалось 2 раза.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Контактная информация:
Родился
Сообщения: 11
Зарегистрирован: Чт дек 10, 2009 16:47:43
Откуда: Иркутская область

Сообщение demon_tulun »

Поясните пожалуйста праимно я понял или ошибаюсь. Если в порт отравить данные то они там сохраняются только на один такт мк? А после быстренько удоляются. Поясню в чем суть: если нажимаю кнопку то нужный символ горит, только отпустил кнопку тут же символ погас и горит всякая хре.. Еще заметил что схема сильно реагирует на руку (типо срабатывают кнопки не прикасаясь кним). Так понимаю Это наводки. Как с этим можно бороться?
Друг Кота
Аватара пользователя
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....

Сообщение Meteor »

Если в порт записывать только при нажатии кнопки и больше к нему не обращаться, то данные должны храниться там.
Для борьбы с помехами, включай подтягивающие резисторы у порта. Или ставь внешние резисторы.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Сообщение md5sum »

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

Отпустил кнопку и получил хре.. : При проверке на отпускание кнопки защиту от дребезга не забыл? А то при отпускании получишь мало-мало "нажатий" :)
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Сообщение md5sum »

Вдогонку: неиспользуемые выводы порта С подтяни к нулю или запрограммируй на out иначе при чтении и проверке

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

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

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

Вернуться в «Практика»