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

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Родился
Сообщения: 4
Зарегистрирован: Ср янв 23, 2008 14:07:44
Откуда: Украина, Киев

Сообщение Puher »

Есть вопрос... нужно на контроллере реализовать
вызов функции по нажатию кнопки и завершение функции по отпусканию кнопки и опять возврат к ожиданию нажатия...

при помощи чего это можно сделать?
Бублик - это на самом деле циклобатон.
Контактная информация:
Реклама
Встал на лапы
Сообщения: 119
Зарегистрирован: Вт апр 17, 2007 15:24:47
Откуда: Новосиб

Сообщение Artem333 »

Можно написать сканирование кнопки в таймере, а он будет устанавливать соответствующий флаг вызова функции. Или можно вставить функцию в прерывание от внешнего источника и в ней-же анализировать отпускание кнопки. В крайнем случае можно опрашивать порт в головной программе через некоторые куски кода.
Всё просто как самогонный аппарат
Реклама
Родился
Сообщения: 4
Зарегистрирован: Ср янв 23, 2008 14:07:44
Откуда: Украина, Киев

Сообщение Puher »

впринципе опрос надо проводить только в одном месте....


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

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

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

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

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

;переход к метке
я с ассемблером вот только начал рабоать....но сейчас могу только инитить порты, выводить на них и rjump .
а вот как опрос первого (нулевого) пина порта D организовать?
Бублик - это на самом деле циклобатон.
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18859
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Puher писал(а): а вот как опрос первого (нулевого) пина порта D организовать?

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

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 4
Зарегистрирован: Ср янв 23, 2008 14:07:44
Откуда: Украина, Киев

Сообщение 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
ну и естестьвенно упрощу это с помощью лупов?
Бублик - это на самом деле циклобатон.
Контактная информация:
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18859
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Родился
Сообщения: 4
Зарегистрирован: Ср янв 23, 2008 14:07:44
Откуда: Украина, Киев

Сообщение Puher »

ок. пасиба. буду играться....
Бублик - это на самом деле циклобатон.
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 402
Зарегистрирован: Пт май 29, 2009 10:14:29

Сообщение 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 то вернет первй кусок кода. Где моя логика ущербна? По моему пониманию работать не должно, а работает, причем вся прога состоит наполовину из таких конструкций. Буду благодарен за любую подсказку.
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

Чем тебе не нравится код?
логика работы примерно такая:
- если 0, ждем появления 1
- если 1, ждем 0
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18859
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

GP1 писал(а):Чем тебе не нравится код?
логика работы примерно такая:
- если 0, ждем появления 1
- если 1, ждем 0
и так 8 раз, а потом что-то еще делаем :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 402
Зарегистрирован: Пт май 29, 2009 10:14:29

Сообщение nsl2004 »

ARV писал(а):
GP1 писал(а):Чем тебе не нравится код?
логика работы примерно такая:
- если 0, ждем появления 1
- если 1, ждем 0
и так 8 раз, а потом что-то еще делаем :)))
Так вот это и непонятно. Вы пишете если ноль , ждем 1 - дождались и что? Куда дальше пойдет программа - я так понял на метку L12, которая при наличии той же 1 будет возвращатся на свое начало и таймер не сработает.
Если придет ноль то возвращать будет код под меткой L11. Т.е я зациклился с пониманием логики процесса. Код мне очень нравится, мне не нравится что я не понимаю как машинка работает.
Должно же что то одно срабатывать либо 0 либо 1, а тут ни на что не срабатывает. Правда я исхожу из того что все выполняется последовательно сперва L11 потом L12 и только потом остальное. Уважаемые, Вы меня извините , но я попал в тупик. Помогите понять.
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

Во-первых: "чужая душа - потемки", понять почему реализовано именно так а не иначе, может только автор строк.
Во-вторых: рассматривать код готового ус-ва в отрыве от схемы.... :roll:
Ну и в-третьих: таймер сработает всегда, как только произойдет изменение состояния вывода DqPin.
Например:
на выше означеном пине 1, программа пропустит переход на L11, и зациклится на куске L12.
Как только состояние вывода поменяется на 0, программа перейдет на загрузку и запуск таймера.
Аналогично для 0.
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 402
Зарегистрирован: Пт май 29, 2009 10:14:29

Сообщение nsl2004 »

GP1 писал(а):
Ну и в-третьих: таймер сработает всегда, как только произойдет изменение состояния вывода DqPin.
Например:
на выше означеном пине 1, программа пропустит переход на L11, и зациклится на куске L12.
Как только состояние вывода поменяется на 0, программа перейдет на загрузку и запуск таймера.
Аналогично для 0.
Претензии принимаю. Но разобратся надо, просто скопировав код, я не смогу работать дальше, на все случаи кодов не найдешь.
Вот вот вот гдето рядом. Таким образом с приходом единицы управление перейдет на L12 и там зациклится, можно ли это понять что следующий цикл начнется не с L11, а с L12? Т.е на изменение будет реагировать именно код после метки L12!? И если появится 0 то сработает L12, выполнится команда и опять вернется к L11 пока не закончится цикл? Это так?
Тогда как быть с нулем. Прога зациклится на L11 пока не придет единица, передаст L12 которая зациклится до прихода нуля. и выполнит команду и опять к L11? Т.е это фильтр перехода по изменению с 1 на ноль? Не Важно почему так реализовано автором, мне важнее логика работы этих операторов.
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

Ну да, так оно и есть.
Я подозреваю что это обработки какой-то кнопки.
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
akl
Друг Кота
Сообщения: 4476
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Здравствуйте. Может это программный синхронизатор приема 8 бит в сопровождении синхроимпульсов с активным
переходом из 1 в 0? Если скорость работы контроллера высокая, то он выполнит все действия быстро и вернется на
это место в том же периоде. Чтобы исключить такую ситуацию, нужно дождаться окончания текущего периода.
Мучитель микросхем
Аватара пользователя
Сообщения: 402
Зарегистрирован: Пт май 29, 2009 10:14:29

Сообщение nsl2004 »

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

Вернуться в «Микроконтроллеры и ПЛИС»