Обсуждаем контроллеры компании Atmel.
Ответить

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Пн сен 25, 2017 11:19:51

смотря как выходить
:roll:
можно и "комбинированным" способом через "подстановку вектора возврата"... изменение значения самого указателя стека...
там важнее вопрос - допускается или нет на том участке "вложенное" внешнее прерывание.
:roll:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Вс окт 01, 2017 06:19:15

Всем спасибо за подсказку с этим "ldi r16, (1<<USIWMO)|(1<<USICS1)|(1<<USICLK)|(1<<USITC)" разобрался, в СИ то же пользуются таким приемом

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Вт окт 17, 2017 13:49:46

Добрый день! Программа на АSM для тини2313 работает не совсем красиво, как того хотелось бы. Сразу скажу, в качестве практического развития пытаюсь сделать освещения на, как бы, модель автомобиля. Есть 4 кнопки, 4 пары св-диодов. Нажимаем кн1-вкл поворот влево, кн2- передний свет и т.д. Далее будет идти речь только о левом повороте и переднем освещении (для простоты и понятности изложения).
Чего хочется: есть две кнопки( с фиксацией). Нажимаем одну - первая пара св-диодов должна моргать (частота 1Гц). Нажимаем вторую кнопку - другая пара св-диодов должна просто засветится.
Что не получается: программа работает правильно, НО! не красиво... допустим, я нажал на кн1 и через долю секунды на кн2. Первая пара св-диодов загорелась, вторая пара тоже уже должна загореться, НО! МК в это время выполняет задержку для свечения первой пары, затем выключит первую пару и вновь 0,5секунды будет выполнять задержку и лишь затем включит мне вторую пару... и эта небольшая задержка во вкл 2-рой пары создает в моей душе неприятный осадок :( :cry: )))
У меня была идея :idea: по коду программы по чаще растолкать команду опроса вкл 2-рой пары, но... интуиция новичка мне подсказывает, что это не профессионально :))
Код программы:
;Инициализация портов
clr R16
out DDRD,R16
ser R16
out PORTD,R16

out DDRB,R16
clr R16
out PORTB,R16
;Основной цикл
MAIN:
check_L:sbis PIND,PIND0 ;Запрос вкл левой пары
rjmp left
cbi PORTB,7
cbi PORTB,6

check_F:sbis PIND,PIND1 ;Запрос вкл передней пары
rjmp frwrd
cbi PORTB,5
cbi PORTB,4
rjmp MAIN


left: sbi PORTB,7 ;Вкл левой пары
sbi PORTB,6
rcall delay_LR
cbi PORTB,7
cbi PORTB,6
rcall delay_LR
rjmp check_F

frwrd: sbi PORTB,5 ;Вкл передней пары
sbi PORTB,4
rjmp check_L
delay_LR:
; ===========
; delay loop generator
; 500000 cycles:
(Задержку вырезал да бы не засорять эфир)
ret

Спасибо за ответ!

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Вт окт 17, 2017 14:30:25

4 кнопки (да еще и с фиксацией!) и 4 светика (группы светиков) это задача для релейно-контактной логики (не то чтоб для МК). Ну отсилы еще пару NE555...
8)
а тут "МК не справляется"...
:facepalm:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Вт окт 17, 2017 16:23:55

dumbass писал(а):Программа на АSM для тини2313...Чего хочется: есть две кнопки( с фиксацией). Нажимаем одну - первая пара св-диодов должна моргать (частота 1Гц). Нажимаем вторую кнопку - другая пара св-диодов должна просто засветится.
Я бы использовал таймер (частота 1Гц), в прерывании таймера изменял бы состояние первой пары св-диодов.
В основном цикле опрашивал бы кнопки без каких либо задержек, ну разве что на дребезг.
При опросе первой кнопки принимаем решение о запуске таймера или даем разрешение таймеру моргать первой парой св-диодов.
При опросе второй кнопки - зажигаем вторую пару св-диодов.
Где-то так.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Вт окт 17, 2017 16:59:42

Спасибо за ответы!!!
С помощью NE555 не хочется решать так проблему. Хочется решить программно, а не аппаратно ( для того ж и изучаю МК :) )
Буду пытаться на таймерах... нужно только до них добраться их изучить как следует.
Спасибо за понятный алгоритм и видео, очень доходчиво и понятно.
Если получится, то обязательно поделюсь результатами :)

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Ср окт 18, 2017 06:08:23

Если с пониманием таймеров сложности, можно и без них. Просто не использовать полусекундные задержки, а дробить их на более короткие.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Ср окт 18, 2017 08:55:40

... Хочется решить программно, а не аппаратно ( для того ж и изучаю МК :) )...

Ну ежли только для учебы...
Есть буфер ввода (одновременно ВСЕ ВОЗМОЖНЫЕ комбинации кнопок) и есть буфер вывода (одновременно ВСЕ ВОЗМОЖНЫЕ комбинации включения светиков) есть таймер опроса и таймер инвертора... (независимо - программные или аппаратные).
Можно еще флажок добавить - разрешение работы инвертора.
Итогом - согласно статуса считанного состояния входных линий активируем соответствующие позиции выходных сигналов и флаг разрешения работы инвертора.
Порционно выпихиваем содержимое буфера вывода в порт вывода. А инвертор в ведомы ему моменты меняет статус нужных ему бит в буфере (пока ессно его работа разрешена флажком).
8)

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Ср окт 18, 2017 23:08:12

Надо просто правильно разбить программу на задачи. Сделайте так называемый суперцикл, который будет выполняться с заранее заданной задержкой - например 10мс. В этом цикле, смотрим на кнопки и выставляем в переменной "флажки". Задача простая как 5 копеек, не правда ли?
Вторая задача - на каждый флажок своя ветка в суперцикле, с немигающими фарами понятно - ничего дополнительно анализировать не надо, просто смотрим на КОНКРЕТНЫЙ флажок и включаем нужную пару светодиодов, или выключаем.
Немного сложнее с поворотами - для каждого из них заводишь дополнительную переменную счетчик - когда флажок поворота неактивен - принудительно гасим соответствующий светодиод и ОБНУЛЯЕМ его счетчик, если флажок активен - и счетчик равен нулю - меняем состояние светодиода на противоположное. Инкрементируем счетчик, и когда он достигает значения 100(или 50?) - сбрасываем. Всё.

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

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Чт окт 26, 2017 08:43:22

Всем привет, не могу справиться с банальной задачей - подключение компаратора и сделать так что бы он вошел в прерывание, из-за разности напряжения в 2 вольта, и подключил PORTB4 . Вот код на ассемблере, и снимок в протеусе.


Снимок в протеусе
Вложения
Коту.png
(27.85 KiB) Скачиваний: 364

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Чт окт 26, 2017 10:48:51

Код:
//Если порт DDB установлен в 1 то данный порт является входам,
//а если в 0 то выходам.
DDRx=1 это выход!
Желательно отключать цифровые входы от лап АС
Код:
 //Отключаем аналогово-цифровой преобразователь
; CBI ADCSRA, ADEN;
//Подключаем компаратор для сравнения сигналов
////Команда CBI устанавливает значение в 0 регистра ACSR ячейки ASD что включает компаратор - по умолчанию он и так включен;
;CBI ACSR, ACD;
//Команда SBI устанавливает значение в 1 регистра ACSR ячейки ACIE которая включает разрешения прерывания от компаратора.
;SBI ACSR, ACIE;
//Устанавливаем условие генерации прерывания выставляем изменения сосотояния от 0 до 1;
   LDI   R22,1<<ACIS1|1<<ACIS0|1<<ACIE
   OUT   ACSR,R22
   LDI   R22,1<<AIN1D|1<<AIN0D
   OUT   DIDR0,R22

;sbi ACSR, ACIS1;
;sbi ACSR, ACIS0
Последний раз редактировалось akl Чт окт 26, 2017 11:02:00, всего редактировалось 1 раз.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Чт окт 26, 2017 10:59:57

А вот и нет. В книги написано:

Изображение
Вложения
Коту2.png
(56.18 KiB) Скачиваний: 738

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Чт окт 26, 2017 11:04:28

А вот и нет. В книги написано:
Изображение

читайте оригинальные даташиты. в этой книжке ошибка.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Чт окт 26, 2017 11:13:31

Ой спасибо действительно ошибка. Изначально все пины МК это входы, переделал код, проверил и все ровно компаратор не входит в прерывания. Что еще не так?



Протеус:



Желательно отключать цифровые входы от лап АС


Попробовал как советовали выше:

Жаль но прерывания все равно нет.
Вложения
Коту3.png
(28.06 KiB) Скачиваний: 358

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Чт окт 26, 2017 15:45:29

Жаль но прерывания все равно нет.
У вас в схеме протеуса ошибка, состояние вывода PB0 не определено, поставьте на вывод PB0 резистор 10к на землю.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Чт окт 26, 2017 20:42:46

и в программе недопустимые ошибки....
На старте не обязательно запрещать прерывания - они и так запрещены. В обработчике прерывания разрешать/запрещать прерывания НЕ НУЖНО, они запрещаются и разрешаться сами при входе в прерывание и выполнении команды RETI соответственно.

А вот что делать в прерывании КРАЙНЕ НЕ РЕКОМЕНДУЕТСЯ так это менять регистр статуса.
Ваша команда INC в обработчике прерывания таймера его меняет. Поскольку прерывание возникает в самый неожиданный момент выполнения программы, внезапное изменение регистра статуса может оказаться большим нежданчиком для программы и получишь постоянные глюки "из ниоткуда и везде".
Если в обработчике выполняется хоть одна команда изменяющая регистр статуса, его надо при входе в обработчик сохранить а перед выходом - освободить. Обычно для этого отводят отдельный регистр который больше нигде не используется - только в прерывании и только для хранения регистра статуса. Или если все регистры в ходу то сначала делаем PUSH любого регистра в стек и может использовать его в тех же целях, не забыв потом и этот регистр восстановить перед выходом из прерывания.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Пт окт 27, 2017 07:32:57

Alexeyslav писал(а):а перед выходом - освободить
восстановить

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Пт окт 27, 2017 07:57:36

И все равно нет прерывания по компаратору, спасибо всем за советы учту.
Переделанный код согласно замечанием: Может кто свой небольшой пример на асемблере скинет, что бы компаратор уходил в прерывания.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Пт окт 27, 2017 08:13:08

strengerst писал(а):И все равно нет прерывания по компаратору, спасибо всем за советы учту.
Переделанный код согласно замечанием: Может кто свой небольшой пример на асемблере скинет, что бы компаратор уходил в прерывания.
Вот рабочий пример в протеусе.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Пт окт 27, 2017 08:16:49

strengerst писал(а):Жаль но прерывания все равно нет.
Адаптировал программу и проверил в железе на tiny2313, благо распиновка и поддержка такая же как tiny13. Работает!
Для tiny13 будет так
Ответить