Страница 2 из 3
Re: ПОДСВЕТКА, проверьте ))
Добавлено: Чт мар 03, 2011 15:05:15
Engineer_Keen
Если я выкину задержку, строчки из инициализации (стек, запись не-0 в порты) и макросы, у меня почти тоже самое будет

Re: ПОДСВЕТКА, проверьте ))
Добавлено: Чт мар 03, 2011 15:14:15
Uklunok
КЛЁВО!!! Спасибо вам ARV и Engineer_Keen. Попробую оба варианта. Это надо вставлять в мой код вместо DLY ???
Re: ПОДСВЕТКА, проверьте ))
Добавлено: Чт мар 03, 2011 15:33:35
Engineer_Keen
Uklunok писал(а):Это надо вставлять в мой код вместо DLY ???
Посмотрите внимательнее, у
ARV первая строчка - .org 0, а у меня .cseg и метка START (макросы не в счет), и там и там далее идет настройка портов, о чем это может говорить? Правильно, это код ЦЕЛИКОМ

Re: ПОДСВЕТКА, проверьте ))
Добавлено: Чт мар 03, 2011 15:47:14
ChipKiller
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
на то и макросы, чтобы быть "ленивым"

... а тут
задержка 250мс (RC 1 МГц)
ИМХО лучше так:
Код: Выделить всё
.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
... и независимо от частоты пишем
_delay_us_w 20000 или
_delay_us_w 5000, а если мало - можно загнать во внешний цикл.
Re: ПОДСВЕТКА, проверьте ))
Добавлено: Чт мар 03, 2011 16:07:29
Engineer_Keen
Согласен насчет того, что так удобней. Можно еще и задефайнить переменные s, ms и us, забить в макросе несколько IF и тогда вызов задержки вообще будет на человеческом языке - Delay 250,ms
Просто я по привычке использую в задержках регистры R16-R18, они как расходный материал, а вот пары с которыми можно делать ADIW и SBIW и уж тем более X,Y,Z, я обычно берегу
Кстати вместо строчки
можно воткнуть
хотя это не дает преимущества ни в скорости ни в размере

Re: ПОДСВЕТКА, проверьте ))
Добавлено: Чт мар 03, 2011 16:14:42
ChipKiller
хотя это не дает преимущества ни в скорости ни в размере
... это злобные проделки RISC AVR

... как ни крутись, а меньше чем word, размер не выйдет

Re: ПОДСВЕТКА, проверьте ))
Добавлено: Чт мар 03, 2011 16:51:18
Uklunok
Такие короткие программулины

. С тем что придумал я, конечно не сравнить. И что, на стенде тоже будет работать??? Жесть..., как коротко

Правда не могу разобрать половины кода))
.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 - это что-то вроде самодельной функции, как в языке "С" ???
И вобще в какой книжки можно найти такую информацию? А то похоже, так как написал код я - "в лоб", так писать программу вобще не вариант...
Re: ПОДСВЕТКА, проверьте ))
Добавлено: Чт мар 03, 2011 17:07:28
ChipKiller
Uklunok писал(а):Конструкция от .macro до .endm - это что-то вроде самодельной функции, как в языке "С" ???
... это макрос, а прочитать про это лучше всего в справке по AVR Studio.
Re: ПОДСВЕТКА, проверьте ))
Добавлено: Чт мар 03, 2011 17:08:28
Engineer_Keen
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,xx-OUT yy,R16, то все они автоматом уменьшатся в 2 раза, правда только визуально, прошивка останется такого-же размера.
Uklunok писал(а):
.def LastKey=R20 - В avr без разницы какими буквами обзывать, заглавными или маленькими?
Пофиг
Uklunok писал(а):
И вобще в какой книжки можно найти такую информацию?
Ну хотябы HELP к авр студии
Кроме того есть Евстифеев - "Микроконтроллеры AVR семейств Tiny и Mega" и Ревич - "Практическое программирование микроконтроллеров Atmel AVR на языке ассемблера". Первая - больше про железо, вторая про программирование. Я к сожалению их "открыл" совсем недавно и большую часть информации извлек именно из хелпа к студии и даташитов. Ну из из форума конечно.
Да, еще
тут много интересного нашел, особенно касательно хитростей типа "управления 12 светодиодами по 3 ножкам"
Uklunok писал(а):
А то похоже, так как написал код я - "в лоб", так писать программу вобще не вариант...
см. первый ответ
Re: ПОДСВЕТКА, проверьте ))
Добавлено: Сб мар 05, 2011 08:15:35
Uklunok
Хотите посмеяться?. Сегодня принёс на сдачу программу, которую я написал. Даю отчёт, препод говорит, типо слишком большой код и давай минимизируй. Ну я ни долго думая показываю код Engineer_Keen - а. Он смотрит и говорит, типа если пользоваться макросами, то код не уменьшится. Я сравнил hex. коды обоих кодов. Во второй программе объём кода оказался в два раза меньше чем в первом - моём варианте. Сказал ему это, он отвечает - докажите мне что это действительно так, нарисуйте блок - схемы для обоих программ и покажи чего не стало во втором коде. Придётся теперь рисовать, тратить на это время. На паре конечно не успел, так и не зачёл 1 лабу...

Re: ПОДСВЕТКА, проверьте ))
Добавлено: Сб мар 05, 2011 10:06:48
Engineer_Keen
Uklunok писал(а):Хотите посмеяться?. Сегодня принёс на сдачу программу, которую я написал. Даю отчёт, препод говорит, типо слишком большой код и давай минимизируй.
Ну это он был прав конечно
Uklunok писал(а):
Ну я ни долго думая показываю код Engineer_Keen - а. Он смотрит и говорит, типа если пользоваться макросами, то код не уменьшится.
Если использовать макросы код(текст программы) уменьшится, а hex естественно останется прежним, но моя (или
ARV) программа все равно короче, даже без макросов.
Uklunok писал(а):
Сказал ему это, он отвечает - докажите мне что это действительно так, нарисуйте блок - схемы для обоих программ и покажи чего не стало во втором коде. Придётся теперь рисовать, тратить на это время. На паре конечно не успел, так и не зачёл 1 лабу...
Надеюсь блок схему сможете нарисовать по готовой программе

Вкратце у вас - анализ кнопки и вывод в порт отдельно для каждого из 8 каналов, у нас оптом, сразу все каналы, в этом кардинальное отличие.
Re: ПОДСВЕТКА, проверьте ))
Добавлено: Сб мар 05, 2011 10:07:50
ChipKiller
Uklunok писал(а):...Он смотрит и говорит, типа если пользоваться макросами, то код не уменьшится.
... и абсолютно правильно говорит - макросы служат для сокращения и упрощения текста программы (...это ведь упрощенно текстовые подстановки), а для уменьшения размера кода применяют вызов подпрограмм.
ЗЫ похоже с макросами так и не разобрались...
Re: ПОДСВЕТКА, проверьте ))
Добавлено: Сб мар 05, 2011 10:23:01
Engineer_Keen
В чем отличие макроса и подпрограммы?
Макрос это несколько строчек кода, свернутые в одну команду, поэтому:
- Макрос можно вызывать красиво, с параметрами как у языков высшего уровня, при использовании подпрограммы параметры нужно сначала загонять в промежуточные регистры.
- Макрос выполняется сразу, потому как это просто подстановка кода, при использовании процедуры выполняются еще и команды (R)CALL и RET, а это дополнительные 7-9 циклов.
- Процедура занимает место в hex-е один раз, там где она написана. Макрос разворачивается целиком в каждом месте, где его вызвали.
Последние 2 пункта определяют что использовать - макрос (быстродействие, чуть более красивый исходник) или подпрограмму (меньше размер hex).
Re: ПОДСВЕТКА, проверьте ))
Добавлено: Сб мар 05, 2011 10:59:43
Uklunok
Блин! да что вы!... Я просто не написал в сообщении про то что макрос, это всего лишь типа как функция в "с", т.е. берутся некоторые параметры (данные) и вставляются в функцию, которая делает то или иное действие. Для того чтобы не писать постоянно одно и то же в коде, например как у меня метки INIT1...INIT8, используют макросы.
Может быть препод не поверил, что можно так быстро написать новый код (новый алгоритм), увидел макросы и сказал, что обращений к памяти, переходов, циклов и т.п. осталось в прежнем количестве => размер кода не поменялся... Ну а говорить про совершенно другой алгоритм я не стал...
Блок - схемы думаю состряпаю, этож не новый код писать как-никак. Правда рисовать много...
Re: ПОДСВЕТКА, проверьте ))
Добавлено: Сб мар 05, 2011 11:17:02
ChipKiller
Uklunok писал(а):Может быть препод не поверил, что можно так быстро написать новый код
... скорее он понял, что это сделали не Вы.
Uklunok писал(а):Я просто не написал в сообщении про то что макрос, это всего лишь типа как функция в "с", т.е. берутся некоторые параметры (данные) и вставляются в функцию, которая делает то или иное действие.
... связывать asm-макро и функцию Си глупо. Си-аналогом для
macro можно считать
define.
Re: ПОДСВЕТКА, проверьте ))
Добавлено: Сб мар 05, 2011 11:27:42
Engineer_Keen
ChipKiller писал(а):... связывать asm-макро и функцию Си глупо. Си-аналогом для macro можно считать define.
А вот аналогом
функции Си, в асме как-раз можно назвать
подпрограмму.
Re: ПОДСВЕТКА, проверьте ))
Добавлено: Вт мар 08, 2011 09:36:45
Uklunok
Решил сегодня нарисовать БЛОК-СХЕМУ алгоритма, который написал Engineer_Keen. Алгоритм оказался довольно замудрённым. Вот что у меня получилось:
1). Считать содержимое PINA
2). Состояние кнопок изменилось?:
Если НЕТ, то вывод содержимого в PORTB и вернуться в начало.
Если ДА, то:
3). Определить нажатую кнопку
4). Добавить значение новой кнопки к предыдущему значению состояния кнопок
5). Вывести в PORTB
6). Сохранить состояние кнопок
7). Задержка
8.). Вернуться в начало.
В общем, хочу удостовериться в правильности моих мыслей на счёт алгоритма)))
Re: ПОДСВЕТКА, проверьте ))
Добавлено: Вт мар 08, 2011 13:19:43
Jack_A
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) в Си.
Re: ПОДСВЕТКА, проверьте ))
Добавлено: Ср мар 09, 2011 10:31:41
Engineer_Keen
Uklunok писал(а):Решил сегодня нарисовать БЛОК-СХЕМУ алгоритма [...]
В общем, хочу удостовериться в правильности моих мыслей на счёт алгоритма)))
В принципе правильно, только условия там нет, и вот почему. Делается все с использованием логических функций. Составляется таблица истинности для портаБ (F), где параметры - ПинА (A), текущее состояние портаБ (B) и старое состояние нажатых кнопок (C), в итоге получается функция: F=B XOR С1, где С1=A AND NOT(C), тогда:
Код: Выделить всё
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) в начало
То есть вычисление функции и вывод в портБ происходит в каждом цикле, независимо от того, нажималась ли какая-то кнопка или нет.
Re: ПОДСВЕТКА, проверьте ))
Добавлено: Ср мар 09, 2011 11:09:29
Uklunok
Ого как! Оригинальный подход к написанию кода)) с помощью таблицы истинности. В следущий раз попробую)