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

AT90s2313: вопрос по ассемблеру

Добавлено: Ср янв 23, 2008 14:22:46
Puher
Есть вопрос... нужно на контроллере реализовать
вызов функции по нажатию кнопки и завершение функции по отпусканию кнопки и опять возврат к ожиданию нажатия...

при помощи чего это можно сделать?

Добавлено: Ср янв 23, 2008 14:30:24
Artem333
Можно написать сканирование кнопки в таймере, а он будет устанавливать соответствующий флаг вызова функции. Или можно вставить функцию в прерывание от внешнего источника и в ней-же анализировать отпускание кнопки. В крайнем случае можно опрашивать порт в головной программе через некоторые куски кода.

Добавлено: Ср янв 23, 2008 14:55:31
Puher
впринципе опрос надо проводить только в одном месте....


тогда как реализовать такой алгоритм?:
;метка и нужный код

;повторять опрос порта до тех пор, пока на нём не появится 1

;выполнить нужный код

;повторять опрос порта до тех пор, пока на нём не появится 0

;выполнить нужный код

;переход к метке
я с ассемблером вот только начал рабоать....но сейчас могу только инитить порты, выводить на них и rjump .
а вот как опрос первого (нулевого) пина порта D организовать?

Добавлено: Ср янв 23, 2008 20:42:56
ARV
Puher писал(а): а вот как опрос первого (нулевого) пина порта D организовать?

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

wait_1_pind0:
       sbis    PinD, PD0      ; пропустить следующую команду, если на линии PortD.0 присутствует 1
       rjmp    wait_1_pind0   ; перейти к метке повторного опроса порта
; сюда попадаем, если PinD.0==1
для проверки линии порта на 0 вместо SBIS есть другая команда SBIC - пропустить следующую команду, если на линии указанного порта присутствует 0

Добавлено: Чт янв 24, 2008 13:32:22
Puher
сенк...опросы сделал...

так ещё один вопросец наклюнулся....
есть у меня задержка 0,1 сек и она используется (через rcall)

нужно сделать задержки 0,5 ; 1 ; 3 ; 5 секунд.
не будет ли матюгаться стек, если я просто вызову 10 раз подпрограмму задержки 0,1 сек в подпрограмме задержки 1 сек ?
типа такого:
;\\\\\\\\\\\\\ИНИЦИАЛИЗАЦИЯ СТЕКА\\\\\\\\\\\\\\\
ldi Temp5,RamEnd
out SPL,Temp5

.
код
программы
.
.
.
.
.

;\\\\\\\\\\\\ОБЪЯВЛЕНИЕ ЗАДЕРЖЕК\\\\\\\\\
;задержка 0.1 сек
Delay01: ldi Temp2,0
ldi Temp3,0
ldi Temp4,10

Loop1: dec Temp2
brne Loop1

dec Temp3
brne Loop1

dec Temp4
brne Loop1
ret
;задержка 1 сек
Delay1: rcall Delay01
rcall Delay01
rcall Delay01
rcall Delay01
rcall Delay01
rcall Delay01
rcall Delay01
rcall Delay01
rcall Delay01
rcall Delay01
ret
;задержка 3 сек
Delay3: rcall Delay1
rcall Delay1
rcall Delay1
ret
;задержка 5 сек
Delay5: rcall Delay1
rcall Delay1
rcall Delay1
rcall Delay1
rcall Delay1
ret
ну и естестьвенно упрощу это с помощью лупов?

Добавлено: Чт янв 24, 2008 13:38:41
ARV
Puher писал(а):не будет ли матюгаться стек, если я просто вызову 10 раз подпрограмму задержки 0,1 сек в подпрограмме задержки 1 сек ?
во-первых, стек никогда матюгаться не будет :) на крайняк он переполнится и все тебе порушит, но молча! во-вторых, ОЗУ у тебя ж все-таки больше 4 байт, надеюсь? Значит, глубину rcall-ов в 2 уровня выдержит :)

Добавлено: Чт янв 24, 2008 13:48:31
Puher
ок. пасиба. буду играться....

Re: AT90s2313: вопрос по ассемблеру

Добавлено: Пн мар 15, 2010 10:31:23
nsl2004
Хоть и старая тема , но в тему. Хотел попросить объяснить мне как работает код. Он написан не мной и абсолютно рабочий. Ассемблер я не знаю, разбираюсь по мере необходимости. Никак не могу взять в толк как это работает. Коментарии мои - взяты по обрывкам информации найденной в интернете. Вся прога на баскоме, но трудности вызывают ассемблерные вставки

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

Const Dqpin = 1
........
.........
Readbyte:
 For I = 0 To 7 ' это понятно
L11:
 sbis pinb, DqPin ' пропустить след. команду если на линии 1
                       ' иначе не пропускать
 rjmp L11           'перейти к метке опроса порта ( L11???)
                       Далее абсолютно обратное условие
L12:
 sbic pinb, DqPin 'Если на линии 0 то пропустить, иначе вернутся к метке
rjmp L12            ' перейти к метке повторного опроса порта
 
Timer = 256 - T1reset
 Start Timer0
Вот и не могу взять в толк - на линии 1 - первый кусок кода пропустит , второй нет, а если на линии 0 то вернет первй кусок кода. Где моя логика ущербна? По моему пониманию работать не должно, а работает, причем вся прога состоит наполовину из таких конструкций. Буду благодарен за любую подсказку.

Re: AT90s2313: вопрос по ассемблеру

Добавлено: Пн мар 15, 2010 10:38:49
GP1
Чем тебе не нравится код?
логика работы примерно такая:
- если 0, ждем появления 1
- если 1, ждем 0

Re: AT90s2313: вопрос по ассемблеру

Добавлено: Пн мар 15, 2010 10:43:03
ARV
GP1 писал(а):Чем тебе не нравится код?
логика работы примерно такая:
- если 0, ждем появления 1
- если 1, ждем 0
и так 8 раз, а потом что-то еще делаем :)))

Re: AT90s2313: вопрос по ассемблеру

Добавлено: Пн мар 15, 2010 11:10:48
nsl2004
ARV писал(а):
GP1 писал(а):Чем тебе не нравится код?
логика работы примерно такая:
- если 0, ждем появления 1
- если 1, ждем 0
и так 8 раз, а потом что-то еще делаем :)))
Так вот это и непонятно. Вы пишете если ноль , ждем 1 - дождались и что? Куда дальше пойдет программа - я так понял на метку L12, которая при наличии той же 1 будет возвращатся на свое начало и таймер не сработает.
Если придет ноль то возвращать будет код под меткой L11. Т.е я зациклился с пониманием логики процесса. Код мне очень нравится, мне не нравится что я не понимаю как машинка работает.
Должно же что то одно срабатывать либо 0 либо 1, а тут ни на что не срабатывает. Правда я исхожу из того что все выполняется последовательно сперва L11 потом L12 и только потом остальное. Уважаемые, Вы меня извините , но я попал в тупик. Помогите понять.

Re: AT90s2313: вопрос по ассемблеру

Добавлено: Пн мар 15, 2010 11:29:34
GP1
Во-первых: "чужая душа - потемки", понять почему реализовано именно так а не иначе, может только автор строк.
Во-вторых: рассматривать код готового ус-ва в отрыве от схемы.... :roll:
Ну и в-третьих: таймер сработает всегда, как только произойдет изменение состояния вывода DqPin.
Например:
на выше означеном пине 1, программа пропустит переход на L11, и зациклится на куске L12.
Как только состояние вывода поменяется на 0, программа перейдет на загрузку и запуск таймера.
Аналогично для 0.

Re: AT90s2313: вопрос по ассемблеру

Добавлено: Пн мар 15, 2010 11:56:12
nsl2004
GP1 писал(а):
Ну и в-третьих: таймер сработает всегда, как только произойдет изменение состояния вывода DqPin.
Например:
на выше означеном пине 1, программа пропустит переход на L11, и зациклится на куске L12.
Как только состояние вывода поменяется на 0, программа перейдет на загрузку и запуск таймера.
Аналогично для 0.
Претензии принимаю. Но разобратся надо, просто скопировав код, я не смогу работать дальше, на все случаи кодов не найдешь.
Вот вот вот гдето рядом. Таким образом с приходом единицы управление перейдет на L12 и там зациклится, можно ли это понять что следующий цикл начнется не с L11, а с L12? Т.е на изменение будет реагировать именно код после метки L12!? И если появится 0 то сработает L12, выполнится команда и опять вернется к L11 пока не закончится цикл? Это так?
Тогда как быть с нулем. Прога зациклится на L11 пока не придет единица, передаст L12 которая зациклится до прихода нуля. и выполнит команду и опять к L11? Т.е это фильтр перехода по изменению с 1 на ноль? Не Важно почему так реализовано автором, мне важнее логика работы этих операторов.

Re: AT90s2313: вопрос по ассемблеру

Добавлено: Пн мар 15, 2010 12:19:16
GP1
Ну да, так оно и есть.
Я подозреваю что это обработки какой-то кнопки.

Re: AT90s2313: вопрос по ассемблеру

Добавлено: Пн мар 15, 2010 12:47:48
akl
Здравствуйте. Может это программный синхронизатор приема 8 бит в сопровождении синхроимпульсов с активным
переходом из 1 в 0? Если скорость работы контроллера высокая, то он выполнит все действия быстро и вернется на
это место в том же периоде. Чтобы исключить такую ситуацию, нужно дождаться окончания текущего периода.

Re: AT90s2313: вопрос по ассемблеру

Добавлено: Пн мар 15, 2010 13:32:45
nsl2004
GP1 писал(а):Ну да, так оно и есть.
Я подозреваю что это обработки какой-то кнопки.
Большое Вам спасибо. Моя голова зациклилась на том что все возвращается к L11 ( когда повторяется цикл от 1 до 8 ) а оказалочь что правильно - работает с того места где зациклилась т.е L12.
Это кусок кода из эмулятора DS2450 для сети 1-wire. Не мой. Мне его автор любезно предоставил для разбирательства. Что я и делаю.