Ассемблер (ASM) для AVR в вопросах и ответах
Re: Ассемблер (ASM) для AVR в вопросах и ответах
[uquote="shonty",url="/forum/viewtopic.php?p=3820786#p3820786"]Закончил новые шрифты (переменной ширины).[/uquote]
Эт случайно не для ST7735 ? И как бы взглянуть на Вашу реализацию, ну конечно если это не комерческий проектик.
Эт случайно не для ST7735 ? И как бы взглянуть на Вашу реализацию, ну конечно если это не комерческий проектик.
- Реклама
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Проект не комерческий, просто база для последующих проектов, для вывода названий радиостанций в частности. Это для ILI9341, но подойдёт и для ST7735, хотя шрифт для последнего слишком крупный, всего 7-8 символов в строку уберётся.Jurkin писал(а):Эт случайно не для ST7735 ? И как бы взглянуть на Вашу реализацию, ну конечно если это не комерческий проектик.
Презентация исходника пока не планируется, но готов ответить на любые вопросы по теме, и куски кода также могу выложить.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Есть softuart.c для aattiny13, ttinyX5 и прочих.
Порты задаются в softuart.h.
Что необходимо?
Необходимо использовать RESET пин(БЕЗ отключения через фьюзы) как вход для UART_RX.
Т.е. этот RESET пин(БЕЗ отключения через фьюзы) можно использовать как аналоговый ADC0 и с определенным порогом напряжения (не ниже срабатывания RESET) определять пин как 1 или 0.
Может ли кто-то помочь как-то написать asm код для softuart_rx где в случае использования PB5(он же RESET он же ADC0)?
Или вообще, пожалуйста покажите на примере asm код для чтения ADC0 значения?
Может я что-то упускаю, и при чтении adc значения должна быть задержка - и из-за скорости это вообще не будет работать?
Порты задаются в softuart.h.
Что необходимо?
Необходимо использовать RESET пин(БЕЗ отключения через фьюзы) как вход для UART_RX.
Т.е. этот RESET пин(БЕЗ отключения через фьюзы) можно использовать как аналоговый ADC0 и с определенным порогом напряжения (не ниже срабатывания RESET) определять пин как 1 или 0.
Может ли кто-то помочь как-то написать asm код для softuart_rx где в случае использования PB5(он же RESET он же ADC0)?
Или вообще, пожалуйста покажите на примере asm код для чтения ADC0 значения?
Может я что-то упускаю, и при чтении adc значения должна быть задержка - и из-за скорости это вообще не будет работать?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Считаем время обработки трех последовательных преобразований АЦП, остальные интервалы по обработке одного бита приемника.
Ежли скорость устраивает - пробуем сотворить.
Только воть... Использование вывода сброса под чего иного без отключения функционала фузами...
Это весьма маловероятно.
В принципе для начала не помешает угробить пару кристаллов для проверки такого предположения...

Да и зачем софт уарту ДВА вывода?
Он же все равно или на приеме или на передаче - одновременно делать и прием и передачу не сумеет.
Тогда и вопросы с мозготрепом отпадут...

Ежли скорость устраивает - пробуем сотворить.
Только воть... Использование вывода сброса под чего иного без отключения функционала фузами...
Это весьма маловероятно.
В принципе для начала не помешает угробить пару кристаллов для проверки такого предположения...
Да и зачем софт уарту ДВА вывода?
Он же все равно или на приеме или на передаче - одновременно делать и прием и передачу не сумеет.
Тогда и вопросы с мозготрепом отпадут...
Последний раз редактировалось BOB51 Чт апр 09, 2020 10:48:13, всего редактировалось 1 раз.
- Starichok51
- Модератор
- Сообщения: 19055
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
убрал я этот весь базар о переменных на тему "есть ли жизнь на Марсе?".
если этот базар начнется опять, буду удалять без предупреждений.
если этот базар начнется опять, буду удалять без предупреждений.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
- Реклама
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Доброго времени,
возник такой вопрос: есть подпрограмма, в которой команду cbi нужно при разных запусках
выполнять то как cbi PORTC,0, то как cbi PORTC,1, чтобы не плодить кучу подпрограмм - можно ли как-то
это сделать путем передачи параметра?
пробовал с set - читал, что вроде как может изменять значение, но на практике получается ,что set не меняет значение в процессе работы программы...
возник такой вопрос: есть подпрограмма, в которой команду cbi нужно при разных запусках
выполнять то как cbi PORTC,0, то как cbi PORTC,1, чтобы не плодить кучу подпрограмм - можно ли как-то
это сделать путем передачи параметра?
пробовал с set - читал, что вроде как может изменять значение, но на практике получается ,что set не меняет значение в процессе работы программы...
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Не знаю, правильно ли я Вас понял, но предполагаю, что при разных условиях нужно выполнять разные действия. Я использую "регистр флагов" в таких случаях. Проверяю соответствующий бит, и произвожу соответствующие действия. Можно также бит "T" в SREG использовать для установки/проверки условия.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Ассемблер (ASM) для AVR в вопросах и ответах
[uquote="Леонид_М",url="/forum/viewtopic.php?p=3832596#p3832596"]можно ли как-то это сделать путем передачи параметра?[/uquote]Можно. Передать параметр в подпрограмму и в зависимости от его значения вызвать разную команду согласно алгоритму.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
[uquote="Леонид_М",url="/forum/viewtopic.php?p=3832596#p3832596"]Доброго времени,
возник такой вопрос: есть подпрограмма, в которой команду cbi нужно при разных запусках
выполнять то как cbi PORTC,0, то как cbi PORTC,1, чтобы не плодить кучу подпрограмм - можно ли как-то
это сделать путем передачи параметра?
пробовал с set - читал, что вроде как может изменять значение, но на практике получается ,что set не меняет значение в процессе работы программы...[/uquote]
Зависит от задачи.
Если динамически изменяемое условие, которое анализируется кодом программы - тогда механизм флагов.
Если это подпрограмма, которая в зависимости от фрагмента, в который вставляется, меняет свою "начинку" (в принципе тот же макрос) можно применить условное ассемблирование.
Однако скорее всего выбрано не лучшее(не оптимальное) решение алгоритма задачи.

возник такой вопрос: есть подпрограмма, в которой команду cbi нужно при разных запусках
выполнять то как cbi PORTC,0, то как cbi PORTC,1, чтобы не плодить кучу подпрограмм - можно ли как-то
это сделать путем передачи параметра?
пробовал с set - читал, что вроде как может изменять значение, но на практике получается ,что set не меняет значение в процессе работы программы...[/uquote]
Зависит от задачи.
Если динамически изменяемое условие, которое анализируется кодом программы - тогда механизм флагов.
Если это подпрограмма, которая в зависимости от фрагмента, в который вставляется, меняет свою "начинку" (в принципе тот же макрос) можно применить условное ассемблирование.
Однако скорее всего выбрано не лучшее(не оптимальное) решение алгоритма задачи.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
shonty, VladislavS, сейчас пока так и сделал, но хотел бы по другому, чтобы этот параметр подставлялся в нужную команду.
BOB51, условное ассемблирование - это то, что выбирается при компиляции и не меняктся?
вот пример того, что я хотел:
.set port_v=$0
rcall pppp
.set port_v=$1
rcall pppp
.......
pppp:
......
cbi PORTC,port_v
......
ret
это работает не совсем как надо, при компиляции port_v принимает значение 1 - и с ним отрабатывает все обращения у подпрограмме,
а не принимает значение сначала 0, потом 1.
как сделать, чтобы подставлялись разные значения?
BOB51, условное ассемблирование - это то, что выбирается при компиляции и не меняктся?
вот пример того, что я хотел:
.set port_v=$0
rcall pppp
.set port_v=$1
rcall pppp
.......
pppp:
......
cbi PORTC,port_v
......
ret
это работает не совсем как надо, при компиляции port_v принимает значение 1 - и с ним отрабатывает все обращения у подпрограмме,
а не принимает значение сначала 0, потом 1.
как сделать, чтобы подставлялись разные значения?
- Starichok51
- Модератор
- Сообщения: 19055
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
макрос это должен быть, а не подпрограмма.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Опишите полностью словами, чего хотите сделать...
Тогда можно чего подсказать.
Условная компиляция - это использование возможностей препроцессора и именованных меток/констант
для указания компилятору чего в случае необходимости обрабатывать, а чего пропустить в одном и том же текстовом фрагменте.
Для АВРок (avrasm2) это применение директив
#define
#ifdef
#ifndef
#if and #elif
#else
#endif

Тогда можно чего подсказать.
Условная компиляция - это использование возможностей препроцессора и именованных меток/констант
для указания компилятору чего в случае необходимости обрабатывать, а чего пропустить в одном и том же текстовом фрагменте.
Для АВРок (avrasm2) это применение директив
#define
#ifdef
#ifndef
#if and #elif
#else
#endif
Re: Ассемблер (ASM) для AVR в вопросах и ответах
[uquote="Starichok51",url="/forum/viewtopic.php?p=3832885#p3832885"]макрос это должен быть, а не подпрограмма.[/uquote]
ясно, спасибо, направление понял, буду изучать макросы...
Добавлено after 1 hour 21 minute 24 seconds:
BOB51 - "для указания компилятору чего в случае необходимости обрабатывать" - т.е. это определяется при компиляции... и больше не меняется... не пойдет... если я правильно понял...
ясно, спасибо, направление понял, буду изучать макросы...
Добавлено after 1 hour 21 minute 24 seconds:
BOB51 - "для указания компилятору чего в случае необходимости обрабатывать" - т.е. это определяется при компиляции... и больше не меняется... не пойдет... если я правильно понял...
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Подозреваю, что вы пытаетесь работать с "port_v", как с сущностью, про которую говорить в этой теме нельзя, иначе пост удалят 
Re: Ассемблер (ASM) для AVR в вопросах и ответах
сущностью, про которую говорить в этой теме нельзя - это как в сказке )
запрет - религиозный или практический?
запрет - религиозный или практический?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
[uquote="Леонид_М",url="/forum/viewtopic.php?p=3832959#p3832959"]запрет - религиозный или практический?[/uquote]
Скорее мировоззренческий, а по тому как исписали много, но к единому так и не пришли
Могу ошибаться, но возможно у вас есть опыт работы с языками высокого уровня, и вы пытаетесь этот опыт спроецировать в ассемблер.
Скорее мировоззренческий, а по тому как исписали много, но к единому так и не пришли
Могу ошибаться, но возможно у вас есть опыт работы с языками высокого уровня, и вы пытаетесь этот опыт спроецировать в ассемблер.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
[uquote="shonty",url="/forum/viewtopic.php?p=3832970#p3832970"]у вас есть опыт работы с языками высокого уровня, и вы пытаетесь этот опыт спроецировать в ассемблер.[/uquote]
да, именно так... я ассемблером почти не занимался... но знаком с языками высокого уровня,
а все возможности и ограничения ассемблера пока не знаю, ничего не нашел по своему вопросу,
кроме команды set, но и она не совсем то... может это и не возможно сделать на ассемблере.
да, именно так... я ассемблером почти не занимался... но знаком с языками высокого уровня,
а все возможности и ограничения ассемблера пока не знаю, ничего не нашел по своему вопросу,
кроме команды set, но и она не совсем то... может это и не возможно сделать на ассемблере.
- Starichok51
- Модератор
- Сообщения: 19055
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
shonty, человеку нужно создать макрос, работающий с любым битом порта, и к упомянутой тобой "сущности" это не имеет никакого отношения.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
с макросом заработало, спасибо, но макрос вставляется несколько раз в код (сколько обращений)
и тем самым увеличивает объем подпрограммы по сравнению с подпрограммами - я правильно понял?
и тем самым увеличивает объем подпрограммы по сравнению с подпрограммами - я правильно понял?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Сайт подвис, потому не ответил сразу. Если ещё актуально, то возможно подойдёт такой вариант:
Можно устанавливать биты в порт командой out - чтение регистра в порт. Но перед этим (возможно) понадобится прочитать порт в регистр (команда in), а потом логическими операциями поправить биты. Это для того, чтобы остальные биты в порту не нарушить, если весь порт задействован.
Приведённый вами пример перепишется типа так:
; установить на PC0 низкий:
in R8, PORTC
ldi R16, 0b111111_1_0
and R8, R16
rcall pppp
; установить на PC1 низкий:
in R8, PORTC
ldi R16, 0b111111_0_1
and R8, R16
rcall pppp
; инвертировать уровни на PC0 и PC1 одновременно:
in R8, PORTC
ldi R16, 0b000000_1_1
eor R8, R16
rcall pppp
pppp:
......
out PORTC, R8
......
ret
В данном примере подпрограмма "pppp" позволяет менять любые биты в PORTC, причём не только сбрасывать, но и устанавливать.
Операторы in, out, and, eor, or работают с регистрами 0...31, что в вашем случае позволит отвести под это отдельный регистр (например R8).
А вот andi и ori работают только с R16...R31, но сокращают запись.
; установить на PC0 низкий:
in R16, PORTC
andi R16, 0b111111_1_0
rcall pppp2
pppp2:
......
out PORTC, R16
......
ret
Нижнее подчёркивание в коде можно не убирать. Так нагляднее, и компилятор принимает.
Опять же, если ситуация позволяет не париться с другими битами порта или 2-7 биты настроены на вход с подтяжкой, то можно просто:
ldi R16, 0b111111_1_0
и на вывод.
Как то так...
Можно устанавливать биты в порт командой out - чтение регистра в порт. Но перед этим (возможно) понадобится прочитать порт в регистр (команда in), а потом логическими операциями поправить биты. Это для того, чтобы остальные биты в порту не нарушить, если весь порт задействован.
Приведённый вами пример перепишется типа так:
; установить на PC0 низкий:
in R8, PORTC
ldi R16, 0b111111_1_0
and R8, R16
rcall pppp
; установить на PC1 низкий:
in R8, PORTC
ldi R16, 0b111111_0_1
and R8, R16
rcall pppp
; инвертировать уровни на PC0 и PC1 одновременно:
in R8, PORTC
ldi R16, 0b000000_1_1
eor R8, R16
rcall pppp
pppp:
......
out PORTC, R8
......
ret
В данном примере подпрограмма "pppp" позволяет менять любые биты в PORTC, причём не только сбрасывать, но и устанавливать.
Операторы in, out, and, eor, or работают с регистрами 0...31, что в вашем случае позволит отвести под это отдельный регистр (например R8).
А вот andi и ori работают только с R16...R31, но сокращают запись.
; установить на PC0 низкий:
in R16, PORTC
andi R16, 0b111111_1_0
rcall pppp2
pppp2:
......
out PORTC, R16
......
ret
Нижнее подчёркивание в коде можно не убирать. Так нагляднее, и компилятор принимает.
Опять же, если ситуация позволяет не париться с другими битами порта или 2-7 биты настроены на вход с подтяжкой, то можно просто:
ldi R16, 0b111111_1_0
и на вывод.
Как то так...


