Ассемблер (ASM) для AVR в вопросах и ответах
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
А , да, простите. 20 МГц у меня.
Хотя, если нужно, могу кварц поменять.
Хотя, если нужно, могу кварц поменять.
Станислав
- Реклама
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Z_h_e
С аппаратным ШИМом...
можно разве что на прерываниях работать...
суть ожидания флага по специфике аналогична.
гляньте вот это:
http://radiokot.ru/forum/viewtopic.php? ... 7#p2858887
по крайней мере алгоритм проверен в железе m.ixом
да и сама идея использования структур при решении не имеющих разной длительности при выполнении ветвлений по "ложь" и по "истина" дает весьма интересные области применения. При том, что код чуток более громоздкий.
Там бы еще разрядность счетчика массива увеличить... да мне пока ВЛОООМКИИ...
подсказка:
сам счетчик ставим в R26:R25 (вместо однобайтового по тексту исходника)
и выполняем банальное
sbiw r25,1
но снова надо на симуляторе подгонять будет...

С аппаратным ШИМом...
можно разве что на прерываниях работать...
суть ожидания флага по специфике аналогична.
гляньте вот это:
http://radiokot.ru/forum/viewtopic.php? ... 7#p2858887
по крайней мере алгоритм проверен в железе m.ixом
да и сама идея использования структур при решении не имеющих разной длительности при выполнении ветвлений по "ложь" и по "истина" дает весьма интересные области применения. При том, что код чуток более громоздкий.
Там бы еще разрядность счетчика массива увеличить... да мне пока ВЛОООМКИИ...
подсказка:
сам счетчик ставим в R26:R25 (вместо однобайтового по тексту исходника)
и выполняем банальное
sbiw r25,1
но снова надо на симуляторе подгонять будет...
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Я короче, сделал тупо так:
Простите, мало комментариев, но это был пробный код...
Спойлер
Код: Выделить всё
; =================
; ОБЪЯВЛЕНИЯ И КОНСТАНТЫ (.def, .equ)
; =================
.def temp = R16
.def SETX = R17
.def CLIX = R18
.def cnt = R19
.def Dt = R20
.def NopX = R21
.equ HIGHX = 0b11111111 ; Единички в нужных местах для выводв порта управленя светодиодами
.equ LOWX = 0b00000000 ; Нолики в нужных местах для выводв порта управленя светодиодами
.equ PORTX = PORTB ; Порт управления светодиодами, выводы которого используются для передачи данных
;=====================
ВСЕ ОСТАЛЬНОЕ
;===========
; --------- конфигурация портов -----------------------------------------------
Reset: ldi temp, 0b11111111 ; Конфигурируем порт B (направление порта)
out DDRB, temp
ldi temp, 0b00000000 ; Конфигурируем порт В (выводы порта)
out PORTB, temp
ldi SETX, HIGHX ; Загружаем единички выводов для высокого уровня порта вывода
ldi CLIX, LOWX ; Загружаем нолики выводов для низкого уровня порта вывода
ldi temp, RAMEND ; Загрузка указателя стека
out SPL, temp
SBI ACSR,ACD ; Выключаем аналоговый компаратор (для меньшего потребления)
; *******************************************************************************************************************
; ОСНОВНАЯ ПРОГРАММА (основной цикл) ********************************************************************************
; *******************************************************************************************************************
Start:
ldi ZH, high (DATA*2)
ldi ZL, low (DATA*2)
; add ZL, RAZ1 ; Переходим на элемент
ldi Dt, 55
NEXT: dec Dt
breq Rst
ldi cnt, 9
lpm temp, Z+ ; Загружаем элемент (загрузка с пост-инкрементом) 3 такта
BY: dec cnt
breq NEXT
rol temp
brcc T ; 1/2 такта
ldi NopX, 6
out PORTX, SETX ; Установили порты, отправляем высокий уровень
M: dec NopX
brne M
out PORTX, CLIX ; Сбросили порты, отправляем низкий уровень
nop ; 9 тактов ожидания высокого 4500 нс
nop
rjmp BY
T: ldi NopX, 3
out PORTX, SETX ; Установили порты, отправляем высокий уровень
N: dec NopX
brne N
out PORTX, CLIX ; Сбросили порты, отправляем низкий уровень
nop ; 17 тактов ожидания высокого 850 нс
nop
nop
nop
nop
nop
nop
nop
rjmp BY ; 2 такта
Rst: out PORTX, CLIX
; rjmp Rst
rjmp Start ; Конец программы, переход на начало
; ***************************************************************************************************
; ПОДПРОГРАММЫ **************************************************************************************
; ***************************************************************************************************
;----------------------- ВЫВОД НА СВЕТОДИОДЫ --------------------------------------------------
DATA: .db 0b11111111, 0b11111111, 0b00000000, 0b00000000, 0b11111111, 0b11111111 ; 1,2
.db 0b11111111, 0b00000000, 0b11111111, 0b00000000, 0b11111111, 0b00000000 ; 3,4
.db 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000 ; 5,6
.db 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000 ; 7,8
.db 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000 ; 9,10
.db 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000 ; 11,12
.db 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000 ; 13,14
.db 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000 ; 15,16
.db 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000 ; 17,18
Простите, мало комментариев, но это был пробный код...
Станислав
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Может в пределах часа, двух портирую. Я тут параллельно еще всякой хренью занимаюсь.
Че это. Тем более прерывание внесет задержку на прыжок в него и обратно. А на 16 МГц все впритык.BOB51 писал(а):С аппаратным ШИМом...
можно разве что на прерываниях работать...
Позже гляну. Главное не забыть.BOB51 писал(а):гляньте вот это:
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Еще бы к нему приделать то, чтобы каждый раз новый вывод массива начинался со следующего элемента, а заканчивался теми, которые пропустили. Тогда, можно сделать двигающуюся радугу... 
З.Ы. Я никуда не тороплюсь. )
З.Ы. Я никуда не тороплюсь. )
Станислав
- Реклама
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Блок вывода в ленту стабилен - ибо длина самой ленты также стабильна.
А поскольку выборочно изменить статус произвольного светика не перезагружая ВСЕ СВЕТИКИ ленты невозможно (разве что если это не последний в текущем пакете светик - тогда можно отбросить передачу в последующие не подверженные изменениям) то удовольствуемся условием как и для обычной динамической развертки на светодиодах - используем буфер вывода для обслуживания ленты, а в промежутках между загрузками пакетов изменяем его содержимое по собственному усмотрению.

И дабы не флудить в теме, касательно ассемблера спецификой применения компонентов предлагаю желающим продолжить обсуждение ws2812b в свою винну тему:
http://radiokot.ru/forum/viewtopic.php? ... 7#p2858887

А поскольку выборочно изменить статус произвольного светика не перезагружая ВСЕ СВЕТИКИ ленты невозможно (разве что если это не последний в текущем пакете светик - тогда можно отбросить передачу в последующие не подверженные изменениям) то удовольствуемся условием как и для обычной динамической развертки на светодиодах - используем буфер вывода для обслуживания ленты, а в промежутках между загрузками пакетов изменяем его содержимое по собственному усмотрению.
И дабы не флудить в теме, касательно ассемблера спецификой применения компонентов предлагаю желающим продолжить обсуждение ws2812b в свою винну тему:
http://radiokot.ru/forum/viewtopic.php? ... 7#p2858887
Re: Ассемблер (ASM) для AVR в вопросах и ответах
А таймер2 не подошёл бы?Z_h_e писал(а):Сейчас сам портирую. На атмеге 8 таймер0 ущербный, потому и сделал на 1. Погляжу сейчас ДШ. Может на другом 8 битном сделаю.
Я всё-всё узнAю и стану профессором.
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Ассемблер (ASM) для AVR в вопросах и ответах
да он такой же как и таймер 0, нет ограничения верха счета в режиме FAST PWM.
------------
Создал новую тему по таким светодиодам в периферии.
------------
Создал новую тему по таким светодиодам в периферии.
-
Serhio
- Прорезались зубы
- Сообщения: 249
- Зарегистрирован: Вс авг 15, 2010 20:42:44
- Откуда: Тюмень
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Всем доброго времени суток. Мне необходимо перебирать последовательность нулей и единиц от 0000 до 1111. Единица, например, 100мкс высокого уровня, 100мкс низкого, ноль - 100мкс низкого, 100мкс высокого (цифры беру с потолка)
. Пишу подпрограмму "Единица", пишу подпрограмму "Ноль" (задержки 100мкс организовываю без таймера - простым пожиранием процессорных тактов). Алгоритм такой - допустим нужно выплюнуть число 0101, МК смотрит и видит, что первое число "0" и некая подпрограмма говорит мол выбери подпрограмму "Ноль" и выплюнь с такого то пина, затем МК смотрит дальше и видит "1" и опять некая подпрограмма говорит выбери подпрограмму "Единица" и выплюнь, затем опять "0", опять "1". То есть между импульсами нуля и единицы получается цикл проверки (на ноль или единицу), что само по себе занимает процессорное время, а затем еще "некая подпрограмма говорит", пока она "говорит" проц.время тоже тратится тем самым выходит, что между нулями и единицами возникает пауза (пусть в 6-10мкс, но она есть). То есть получается так - выплюнули "ноль", затем пауза, выплюнули "единицу", затем пауза и тд. Допустима ли такая пауза или алгоритм изначально не верен. Хочу переписать переборщик кодов для шлагбаумов САМЕ с пик 18f252 на Мегу8. Проект вот этот http://phreakerclub.com/forum/showthread.php?t=29. Прошу помощи знающих котов так как разбираю исходник и мне кажется, что алгоритм тамошний так и работает, а мне не дает покоя эта пауза между импульсами или я что-то не так понимаю?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Можно один из таймеров установить на 100мкс, и в обработчике его прерывания выдавать данные. Подготавливать данные можно вне обработчика, это позволит точнее выдерживать паузы. Также можно в обработчике прерывания изменять длительность следующей паузы в зависимости от значения данных. Главное, чтобы от момента входа в прерывание до момента "выдачи" данных всегда было одинаковое время.
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: Ассемблер (ASM) для AVR в вопросах и ответах
SPI не подходит?Короче, можно ли в АВР загрузить в ОЗУ некоторый массив данных (довольно много, но определенный) из ФЛЕШа, а потом его тупо с какого-либо адреса начать читать и с легкой обработкой выдавать ПОБИТНО (последовательно) в порт?
-
Serhio
- Прорезались зубы
- Сообщения: 249
- Зарегистрирован: Вс авг 15, 2010 20:42:44
- Откуда: Тюмень
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Таймер хочу использовать для отсчетов времени высокого и низкого уровней -установили высокий уровень, таймер отсчитал 100мкс, затем низкий, таймер снова отсчитал 100мкс и тд. Не совсем понял про прерывание- зачем именно там выдавать данные. Данных будет 12 бит и посылка повторяется раза 4. Думаю не стоит этого делать в прерывании?!dimmer писал(а):Можно один из таймеров установить на 100мкс, и в обработчике его прерывания выдавать данные.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Вот в обработчике прерывания этого таймера и выдавать очередной бит, а значение следующего бита затем вычислять в основной программе или после передачи в самом обработчике. Это позволит жестко привязать момент передачи бита к моменту возникновения прерывания.Serhio писал(а):Таймер хочу использовать для отсчетов времени высокого и низкого уровнейdimmer писал(а):Можно один из таймеров установить на 100мкс, и в обработчике его прерывания выдавать данные.
-
Serhio
- Прорезались зубы
- Сообщения: 249
- Зарегистрирован: Вс авг 15, 2010 20:42:44
- Откуда: Тюмень
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
То есть наличие паузы (пауза - есть машинное время затраченное на вычисление следующего бита в основной программе) между посылаемыми битами не критично?dimmer писал(а): Вот в обработчике прерывания этого таймера и выдавать очередной бит, а значение следующего бита затем вычислять в основной программе
- ptr128
- Вымогатель припоя
- Сообщения: 606
- Зарегистрирован: Чт окт 06, 2016 21:12:07
- Откуда: Южное Бутово
Re: Ассемблер (ASM) для AVR в вопросах и ответах
У Вас же 100мкс между сменами битов. За это время раз 10 можно очередной бит вычислить )
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
-
Serhio
- Прорезались зубы
- Сообщения: 249
- Зарегистрирован: Вс авг 15, 2010 20:42:44
- Откуда: Тюмень
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Вот это и не понятно зачем мне вообще пауза между посылаемыми битами? Тем более 100мкс. При продолжительности бита в 960мкс, 100мкс, думаю, чувствительно. Честно говоря, вообще не пойму зачем мне необходим уход в прерывание в данном случае. Таймер мне необходим для формирования точной задержки в 320мкс (один интервал).
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Первое прерывание допустим установит выход в 1, через какое-то время (320мкс) второе прерывание сбросит выход и т. д.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Есть такой у таймера странный режим CTC, а ещё у таймера есть выходы , которые меняют свое состояние сами, без процессора. Процессору остается - только вовремя остановит и запустить неугомонного.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Да ILYAUL, если это соответствует логике программы, то это идеальное решение.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Прерывание позволит разгрузить контроллер на время передачи бита. Т.е. программа выдала уровень первого бита и начала отсчет времени. ***Программа подготавливает уровень следующего бита и занимается своими делами или просто уходит в SLEEP. Отсчитав заданное время, вызывается прерывание и значение следующего уровня одной командой (желательно не изменяющей SREG, чтобы его не нужно было пушить-попить) заносится на выход. Далее производится анализ передачи всей кодовой посылки и, если она не передана переходит на ***. В итоге, обработчик займет 10,11 тактов. Выше уже советовали применить режим CTC. Задействовать лапы контроллера в режиме OCx не советую, т.к. при этом вскакивают слишком много ограничений.Serhio писал(а):... Честно говоря, вообще не пойму зачем мне необходим уход в прерывание в данном случае. Таймер мне необходим для формирования точной задержки в 320мкс (один интервал).



