ПОДСВЕТКА, проверьте ))
- Engineer_Keen
- Друг Кота
- Сообщения: 3872
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: ПОДСВЕТКА, проверьте ))
Если я выкину задержку, строчки из инициализации (стек, запись не-0 в порты) и макросы, у меня почти тоже самое будет 
- Реклама
- Uklunok
- Вымогатель припоя
- Сообщения: 561
- Зарегистрирован: Сб апр 03, 2010 10:12:41
- Откуда: Хабаровск
Re: ПОДСВЕТКА, проверьте ))
КЛЁВО!!! Спасибо вам ARV и Engineer_Keen. Попробую оба варианта. Это надо вставлять в мой код вместо DLY ???
- Engineer_Keen
- Друг Кота
- Сообщения: 3872
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: ПОДСВЕТКА, проверьте ))
Посмотрите внимательнее, у ARV первая строчка - .org 0, а у меня .cseg и метка START (макросы не в счет), и там и там далее идет настройка портов, о чем это может говорить? Правильно, это код ЦЕЛИКОМUklunok писал(а):Это надо вставлять в мой код вместо DLY ???
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: ПОДСВЕТКА, проверьте ))
... раз уж в ход пошли макросы, то программную задержку можно было сделать "проще"Engineer_Keen писал(а):А так с антидребезгом в виде задержки.
Код: Выделить всё
.macro DelayMS
LDI R16,@0
RCALL DELAY
....
DelayMS 250 ;задержка 250мс (RC 1 МГц)
....
DELAY: LDI R17,0x02
DEL1: LDI R18,0xA6
DEL0: DEC R18
BRNE DEL0
DEC R17
BRNE DEL1
DEC R16
BRNE DELAY
RET
.endmИМХО лучше так:
Код: Выделить всё
.equ XTAL_CLK = 1000000
.macro _delay_us_w
.if ((@0*XTAL_CLK/1000000)/4)>0x10000
; "проверка на жадность ;)"
.error "Overflow r25:r24"
.else
ldi r24,low((@0*XTAL_CLK/1000000)/4)
ldi r25,high((@0*XTAL_CLK/1000000)/4)
sbiw r25:r24,1
brne PC-1
.endif
.endm
- Engineer_Keen
- Друг Кота
- Сообщения: 3872
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: ПОДСВЕТКА, проверьте ))
Согласен насчет того, что так удобней. Можно еще и задефайнить переменные s, ms и us, забить в макросе несколько IF и тогда вызов задержки вообще будет на человеческом языке - Delay 250,ms
Просто я по привычке использую в задержках регистры R16-R18, они как расходный материал, а вот пары с которыми можно делать ADIW и SBIW и уж тем более X,Y,Z, я обычно берегу
Кстати вместо строчки
можно воткнуть
хотя это не дает преимущества ни в скорости ни в размере 
Просто я по привычке использую в задержках регистры R16-R18, они как расходный материал, а вот пары с которыми можно делать ADIW и SBIW и уж тем более X,Y,Z, я обычно берегу
Кстати вместо строчки
Код: Выделить всё
EOR LASTKEY,R16
Код: Выделить всё
COM LASTKEY
- Реклама
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: ПОДСВЕТКА, проверьте ))
... это злобные проделки RISC AVRхотя это не дает преимущества ни в скорости ни в размере
- Uklunok
- Вымогатель припоя
- Сообщения: 561
- Зарегистрирован: Сб апр 03, 2010 10:12:41
- Откуда: Хабаровск
Re: ПОДСВЕТКА, проверьте ))
Такие короткие программулины
. С тем что придумал я, конечно не сравнить. И что, на стенде тоже будет работать??? Жесть..., как коротко
Правда не могу разобрать половины кода))
.macro OUTI - что такое OUTI??? И почему после метки START в каждой строке вначале OUTI?
LDI R16,@1 - запись всех единиц???
OUT @0,R16
.endm - что за конструкция?
.macro DelayMS
LDI R16,@0
RCALL DELAY
.endm
.def LastKey=R20 - В avr без разницы какими буквами обзывать, заглавными или маленькими?
Это что за запись такая: DelayMS 250 ???
Конструкция от .macro до .endm - это что-то вроде самодельной функции, как в языке "С" ???
И вобще в какой книжки можно найти такую информацию? А то похоже, так как написал код я - "в лоб", так писать программу вобще не вариант...
.macro OUTI - что такое OUTI??? И почему после метки START в каждой строке вначале OUTI?
LDI R16,@1 - запись всех единиц???
OUT @0,R16
.endm - что за конструкция?
.macro DelayMS
LDI R16,@0
RCALL DELAY
.endm
.def LastKey=R20 - В avr без разницы какими буквами обзывать, заглавными или маленькими?
Это что за запись такая: DelayMS 250 ???
Конструкция от .macro до .endm - это что-то вроде самодельной функции, как в языке "С" ???
И вобще в какой книжки можно найти такую информацию? А то похоже, так как написал код я - "в лоб", так писать программу вобще не вариант...
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: ПОДСВЕТКА, проверьте ))
... это макрос, а прочитать про это лучше всего в справке по AVR Studio.Uklunok писал(а):Конструкция от .macro до .endm - это что-то вроде самодельной функции, как в языке "С" ???
- Engineer_Keen
- Друг Кота
- Сообщения: 3872
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: ПОДСВЕТКА, проверьте ))
Просто дело опыта...Uklunok писал(а):Такие короткие программулины. С тем что придумал я, конечно не сравнить. И что, на стенде тоже будет работать??? Жесть..., как коротко
![]()
Правда не могу разобрать половины кода))
Это называется макросы.Uklunok писал(а): .macro OUTI - что такое OUTI??? И почему после метки START в каждой строке вначале OUTI?
...
Это что за запись такая: DelayMS 250 ???
...
Конструкция от .macro до .endm - это что-то вроде самодельной функции, как в языке "С" ???
начинаются с .macro, потом имя макроса, потом строчки кода (до .endm) которые компилятор воткнет в то место программы, в котором будет вызван макрос. Причем вместо @0,@1,@2... он поставит параметры с которыми макрос был вызван.
Так что запись:
Код: Выделить всё
;перед началом программы
.macro DelayMS
LDI R16,@0
RCALL DELAY
.endm
;где-то в программе:
OUTI PORTB,0xFF
Код: Выделить всё
LDI R16,0xFF
OUT PORTB,R16
ПофигUklunok писал(а): .def LastKey=R20 - В avr без разницы какими буквами обзывать, заглавными или маленькими?
Ну хотябы HELP к авр студииUklunok писал(а): И вобще в какой книжки можно найти такую информацию?
Кроме того есть Евстифеев - "Микроконтроллеры AVR семейств Tiny и Mega" и Ревич - "Практическое программирование микроконтроллеров Atmel AVR на языке ассемблера". Первая - больше про железо, вторая про программирование. Я к сожалению их "открыл" совсем недавно и большую часть информации извлек именно из хелпа к студии и даташитов. Ну из из форума конечно.
Да, еще тут много интересного нашел, особенно касательно хитростей типа "управления 12 светодиодами по 3 ножкам"
см. первый ответUklunok писал(а): А то похоже, так как написал код я - "в лоб", так писать программу вобще не вариант...
- Uklunok
- Вымогатель припоя
- Сообщения: 561
- Зарегистрирован: Сб апр 03, 2010 10:12:41
- Откуда: Хабаровск
Re: ПОДСВЕТКА, проверьте ))
Хотите посмеяться?. Сегодня принёс на сдачу программу, которую я написал. Даю отчёт, препод говорит, типо слишком большой код и давай минимизируй. Ну я ни долго думая показываю код Engineer_Keen - а. Он смотрит и говорит, типа если пользоваться макросами, то код не уменьшится. Я сравнил hex. коды обоих кодов. Во второй программе объём кода оказался в два раза меньше чем в первом - моём варианте. Сказал ему это, он отвечает - докажите мне что это действительно так, нарисуйте блок - схемы для обоих программ и покажи чего не стало во втором коде. Придётся теперь рисовать, тратить на это время. На паре конечно не успел, так и не зачёл 1 лабу... 
- Engineer_Keen
- Друг Кота
- Сообщения: 3872
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: ПОДСВЕТКА, проверьте ))
Ну это он был прав конечноUklunok писал(а):Хотите посмеяться?. Сегодня принёс на сдачу программу, которую я написал. Даю отчёт, препод говорит, типо слишком большой код и давай минимизируй.
Если использовать макросы код(текст программы) уменьшится, а hex естественно останется прежним, но моя (или ARV) программа все равно короче, даже без макросов.Uklunok писал(а): Ну я ни долго думая показываю код Engineer_Keen - а. Он смотрит и говорит, типа если пользоваться макросами, то код не уменьшится.
Надеюсь блок схему сможете нарисовать по готовой программеUklunok писал(а): Сказал ему это, он отвечает - докажите мне что это действительно так, нарисуйте блок - схемы для обоих программ и покажи чего не стало во втором коде. Придётся теперь рисовать, тратить на это время. На паре конечно не успел, так и не зачёл 1 лабу...![]()
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: ПОДСВЕТКА, проверьте ))
... и абсолютно правильно говорит - макросы служат для сокращения и упрощения текста программы (...это ведь упрощенно текстовые подстановки), а для уменьшения размера кода применяют вызов подпрограмм.Uklunok писал(а):...Он смотрит и говорит, типа если пользоваться макросами, то код не уменьшится.
ЗЫ похоже с макросами так и не разобрались...
- Engineer_Keen
- Друг Кота
- Сообщения: 3872
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: ПОДСВЕТКА, проверьте ))
В чем отличие макроса и подпрограммы?
Макрос это несколько строчек кода, свернутые в одну команду, поэтому:
- Макрос можно вызывать красиво, с параметрами как у языков высшего уровня, при использовании подпрограммы параметры нужно сначала загонять в промежуточные регистры.
- Макрос выполняется сразу, потому как это просто подстановка кода, при использовании процедуры выполняются еще и команды (R)CALL и RET, а это дополнительные 7-9 циклов.
- Процедура занимает место в hex-е один раз, там где она написана. Макрос разворачивается целиком в каждом месте, где его вызвали.
Последние 2 пункта определяют что использовать - макрос (быстродействие, чуть более красивый исходник) или подпрограмму (меньше размер hex).
Макрос это несколько строчек кода, свернутые в одну команду, поэтому:
- Макрос можно вызывать красиво, с параметрами как у языков высшего уровня, при использовании подпрограммы параметры нужно сначала загонять в промежуточные регистры.
- Макрос выполняется сразу, потому как это просто подстановка кода, при использовании процедуры выполняются еще и команды (R)CALL и RET, а это дополнительные 7-9 циклов.
- Процедура занимает место в hex-е один раз, там где она написана. Макрос разворачивается целиком в каждом месте, где его вызвали.
Последние 2 пункта определяют что использовать - макрос (быстродействие, чуть более красивый исходник) или подпрограмму (меньше размер hex).
- Uklunok
- Вымогатель припоя
- Сообщения: 561
- Зарегистрирован: Сб апр 03, 2010 10:12:41
- Откуда: Хабаровск
Re: ПОДСВЕТКА, проверьте ))
Блин! да что вы!... Я просто не написал в сообщении про то что макрос, это всего лишь типа как функция в "с", т.е. берутся некоторые параметры (данные) и вставляются в функцию, которая делает то или иное действие. Для того чтобы не писать постоянно одно и то же в коде, например как у меня метки INIT1...INIT8, используют макросы.
Может быть препод не поверил, что можно так быстро написать новый код (новый алгоритм), увидел макросы и сказал, что обращений к памяти, переходов, циклов и т.п. осталось в прежнем количестве => размер кода не поменялся... Ну а говорить про совершенно другой алгоритм я не стал...
Блок - схемы думаю состряпаю, этож не новый код писать как-никак. Правда рисовать много...
Может быть препод не поверил, что можно так быстро написать новый код (новый алгоритм), увидел макросы и сказал, что обращений к памяти, переходов, циклов и т.п. осталось в прежнем количестве => размер кода не поменялся... Ну а говорить про совершенно другой алгоритм я не стал...
Блок - схемы думаю состряпаю, этож не новый код писать как-никак. Правда рисовать много...
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: ПОДСВЕТКА, проверьте ))
... скорее он понял, что это сделали не Вы.Uklunok писал(а):Может быть препод не поверил, что можно так быстро написать новый код
... связывать asm-макро и функцию Си глупо. Си-аналогом для macro можно считать define.Uklunok писал(а):Я просто не написал в сообщении про то что макрос, это всего лишь типа как функция в "с", т.е. берутся некоторые параметры (данные) и вставляются в функцию, которая делает то или иное действие.
- Engineer_Keen
- Друг Кота
- Сообщения: 3872
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: ПОДСВЕТКА, проверьте ))
А вот аналогом функции Си, в асме как-раз можно назвать подпрограмму.ChipKiller писал(а):... связывать asm-макро и функцию Си глупо. Си-аналогом для macro можно считать define.
- Uklunok
- Вымогатель припоя
- Сообщения: 561
- Зарегистрирован: Сб апр 03, 2010 10:12:41
- Откуда: Хабаровск
Re: ПОДСВЕТКА, проверьте ))
Решил сегодня нарисовать БЛОК-СХЕМУ алгоритма, который написал Engineer_Keen. Алгоритм оказался довольно замудрённым. Вот что у меня получилось:
1). Считать содержимое PINA
2). Состояние кнопок изменилось?:
Если НЕТ, то вывод содержимого в PORTB и вернуться в начало.
Если ДА, то:
3). Определить нажатую кнопку
4). Добавить значение новой кнопки к предыдущему значению состояния кнопок
5). Вывести в PORTB
6). Сохранить состояние кнопок
7). Задержка
8.). Вернуться в начало.
В общем, хочу удостовериться в правильности моих мыслей на счёт алгоритма)))
1). Считать содержимое PINA
2). Состояние кнопок изменилось?:
Если НЕТ, то вывод содержимого в PORTB и вернуться в начало.
Если ДА, то:
3). Определить нажатую кнопку
4). Добавить значение новой кнопки к предыдущему значению состояния кнопок
5). Вывести в PORTB
6). Сохранить состояние кнопок
7). Задержка
8.). Вернуться в начало.
В общем, хочу удостовериться в правильности моих мыслей на счёт алгоритма)))
Re: ПОДСВЕТКА, проверьте ))
Макрос можно рассматривать как аналог Сишного оператора.Engineer_Keen писал(а): А вот аналогом функции Си, в асме как-раз можно назвать подпрограмму.
.macro Copy_ROM
LDI ZL,low(@0<<1)
LDI ZH,high(@0<<1)
LDI YL,low(@1)
LDI YH,high(@1)
rcall CopyROM
.endmacro
Вызов : Copy_ROM TXT1 Bufer - аналогично CopyROM (TXT1,Bufer) в Си.
- Engineer_Keen
- Друг Кота
- Сообщения: 3872
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: ПОДСВЕТКА, проверьте ))
В принципе правильно, только условия там нет, и вот почему. Делается все с использованием логических функций. Составляется таблица истинности для портаБ (F), где параметры - ПинА (A), текущее состояние портаБ (B) и старое состояние нажатых кнопок (C), в итоге получается функция: F=B XOR С1, где С1=A AND NOT(C), тогда:Uklunok писал(а):Решил сегодня нарисовать БЛОК-СХЕМУ алгоритма [...]
В общем, хочу удостовериться в правильности моих мыслей на счёт алгоритма)))
Код: Выделить всё
1) Считать PINA (A=PINA)
2) Вычислить С1 (C1=A AND NOT(C))
3) Вычислить F (F=B XOR C1)
4) Вывод F (PORTB=F)
5) С=С1
6) Задержка
7) в начало
- Uklunok
- Вымогатель припоя
- Сообщения: 561
- Зарегистрирован: Сб апр 03, 2010 10:12:41
- Откуда: Хабаровск
Re: ПОДСВЕТКА, проверьте ))
Ого как! Оригинальный подход к написанию кода)) с помощью таблицы истинности. В следущий раз попробую)


