Ассемблер (ASM) для AVR в вопросах и ответах
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Alexeyslav, данные разные бывают. Чаще всего это используется для вывода на индикатор в каких-нибудь часиках, где ни скорость, и точность не важны. А если вы собрались какое-нибудь потоковое аудио гнать по SPI - то конечно.
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Все равно, впустую гонять ядро когда есть более простые способы... да, недостаток аппаратного SPI только один - нельзя переназначить выводы, и часто это становится критичным или просто неудобным при разводке - тогда проблему решает программная реализация. Но когда таких ограничений нет, непонятно зачем использовать костыль. Да и вобщем-то надо привыкать к хорошему, в более сложных камнях подобные программные реализации уже не прокатывают или начинают становится источником проблем.
Недостаток программной реализации - передача в любой момент может быть прервана возникновением прерывания, эту проблему так же надо решать.
И даже при динамической индикации, очень критичен момент обновления сегментов - ошибка в +-1 такт от сегмента к сегменту может отразится на ряби на индикаторе, и чем больше тем заметней. А если прерывание будет прерывать передачу по SPI - этот момент будет очень сильно гулять и по индикатору пойдет рябь. Меня такая фигня бесит, вроде не заметно но глаз режет.
Это я все к чему, костылить конечно надо уметь, но и про правильные методы реализации не стоит забывать.
Недостаток программной реализации - передача в любой момент может быть прервана возникновением прерывания, эту проблему так же надо решать.
И даже при динамической индикации, очень критичен момент обновления сегментов - ошибка в +-1 такт от сегмента к сегменту может отразится на ряби на индикаторе, и чем больше тем заметней. А если прерывание будет прерывать передачу по SPI - этот момент будет очень сильно гулять и по индикатору пойдет рябь. Меня такая фигня бесит, вроде не заметно но глаз режет.
Это я все к чему, костылить конечно надо уметь, но и про правильные методы реализации не стоит забывать.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Недавно баловался с DDS на AD9833, на макетке подсоединил как надо по железному SPI, а когда решил все положить на нормальную плату, чето расслабился, и вместе со сменой других линий (для удобности разводки) поменял и линии управления DS-кой... очухался - когда уже прибор был готов и когда стал по новой обзывать выводы в программе, только тогда вспомнил что DS работала по железному SPI.....Alexeyslav писал(а):недостаток аппаратного SPI только один - нельзя переназначить выводы, и часто это становится критичным или просто неудобным при разводке - тогда проблему решает программная реализация.
Помогло софтовое решение.
Не ужто.... Это что получается, новые контроллеры уже не умеют то чего делали старые?Alexeyslav писал(а):в более сложных камнях подобные программные реализации уже не прокатывают или начинают становится источником проблем.
Ну это смотря какое прерывание.....Alexeyslav писал(а):Недостаток программной реализации - передача в любой момент может быть прервана возникновением прерывания, эту проблему так же надо решать. И даже при динамической индикации, очень критичен момент обновления сегментов - ошибка в +-1 такт от сегмента к сегменту может отразится на ряби на индикаторе, и чем больше тем заметней. А если прерывание будет прерывать передачу по SPI - этот момент будет очень сильно гулять и по индикатору пойдет рябь. Меня такая фигня бесит, вроде не заметно но глаз режет.
Я например при использовании библиотеки 1wire которая может запрещать прерывания на время до 75 микросек - мерцания на LED-ах не замечал...
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
получается, новые контроллеры уже не умеют то чего делали старые?
Умеют, но с каждым уровнем старые методы становятся ненадежными, неоптимальными. Это как принципиально не использовать прерывания или DMA в ARM-камушках, можно обойтись и без этих примочек но получится очень ресурсоемко и порой очень сложно или даже невозможно.
при использовании библиотеки 1wire которая может запрещать прерывания на время до 75 микросек - мерцания на LED-ах не замечал...
Термометр опрашивается лишь раз в секунду, вероятность попасть на момент обновления индикатора - минимальная даже если и проскочит одиночное совпадение - не заметишь. А вот попробуй запрещать прерывание на произвольные интервалы с частотой 20...500Гц при частоте обновления индикатора 1кГц - мерцание станет заметным.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Термометр опрашивается лишь раз в секунду....

Re: Ассемблер (ASM) для AVR в вопросах и ответах
только начинаю вникать в асм
для меня загадка вот это
если бы , припустим, была вот такая запись....., то вопросов бы не возникло
но сие неправильно, я знаю
как мы в переменной temp можем устанавливать биты INT0, INT1 когда их там нет ?
ведь данные быты пренадлежат GIMSK
обясните пожалуйста
для меня загадка вот это
Код: Выделить всё
ldi temp, (1<<INT0) | (1<<INT1)
out GIMSK, tempесли бы , припустим, была вот такая запись....., то вопросов бы не возникло
Код: Выделить всё
ldi GIMSK, (1<<INT0) | (1<<INT1) но сие неправильно, я знаю
как мы в переменной temp можем устанавливать биты INT0, INT1 когда их там нет ?
ведь данные быты пренадлежат GIMSK
обясните пожалуйста
Tell Me The Truth
Re: Ассемблер (ASM) для AVR в вопросах и ответах
INT0 и INT1 - всего-лишь, константы (читай - числа) и не могут принадлежать регистру.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
но ведь так называются 6 и 7 биты регистра GIMSK
Tell Me The Truth
Re: Ассемблер (ASM) для AVR в вопросах и ответах
просто так нагляднее, это одно и тоже:
Код: Выделить всё
ldi temp, (1<<6) | (1<<7)
ldi temp, (1<<INT0) | (1<<INT1)Re: Ассемблер (ASM) для AVR в вопросах и ответах
как мы в переменной temp можем устанавливать биты INT0, INT1 когда их там нет ?
Есть такой файл (лы) *.inc где всем битам и всем регистрам присвоены свои значения. Компилятор использует этот файл , что бы понять какому биту переменной temp соответствует INT0 INT1 / Это в кратце
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Интересно, почему это в переменной temp нет 6-го и 7-го битов?
INT0, INT1 - это всего лишь символические имена для указанных битов, численно равные 6 и 7.
Если откроешь стандартный инклуд-файл для твоего контроллера, удивишься сколько символических имен означают ОДНО И ТО ЖЕ. Все это исключительно для удобства и переносимости кода, ведь в другом контроллере запросто может оказаться что INT0 = 5, INT1 = 6.
Более того, т.к. это всего лишь символические имена то можно сделать и такой невероятный(для человека) трюк:
.equ sometemp = INT0 * INT1 В итоге, константа sometemp будет равна 42, хотя такая запись способна взорвать человеческий мозг.
Ну и в догонку. Раз ты задаешь такие глупые вопросы, то будешь знать что:
- LDI работает только с РОН R16...R31
- загрузить константу в регистр непосредственно одной командой НЕВОЗМОЖНО от слова НИКАК.
Для загрузки в регистр используется команда OUT, которая может в порты загрузить только содержимое какого-то РОН, а значит нужное значение нужно поместить сначала в РОН а потом в регистр.
- для регистров с адресами больше 0x3F загружать в регистр можно только командой STS, которая так же загрузить может только значение с РОН.
И надо быть внимательным, в инклуд-файле дя твоего контроллера все регистры с адресами меньше 0x3F имеют определенные константы для инструкций IN/OUT а все что выше - для STS/LDS. Хоть к регистрам с адресами меньше 0x3F и можно обратится инструкциями STS/LDS в таком случае символические имена для регистров будут неверны и к ним надо добавлять какое-то число, вроде бы 0x60.
п.с. регистры это ячейки в области адресов ввода-вывода, обычные регистры обозначены здесь как РОН.
INT0, INT1 - это всего лишь символические имена для указанных битов, численно равные 6 и 7.
Если откроешь стандартный инклуд-файл для твоего контроллера, удивишься сколько символических имен означают ОДНО И ТО ЖЕ. Все это исключительно для удобства и переносимости кода, ведь в другом контроллере запросто может оказаться что INT0 = 5, INT1 = 6.
Более того, т.к. это всего лишь символические имена то можно сделать и такой невероятный(для человека) трюк:
.equ sometemp = INT0 * INT1 В итоге, константа sometemp будет равна 42, хотя такая запись способна взорвать человеческий мозг.
Ну и в догонку. Раз ты задаешь такие глупые вопросы, то будешь знать что:
- LDI работает только с РОН R16...R31
- загрузить константу в регистр непосредственно одной командой НЕВОЗМОЖНО от слова НИКАК.
Для загрузки в регистр используется команда OUT, которая может в порты загрузить только содержимое какого-то РОН, а значит нужное значение нужно поместить сначала в РОН а потом в регистр.
- для регистров с адресами больше 0x3F загружать в регистр можно только командой STS, которая так же загрузить может только значение с РОН.
И надо быть внимательным, в инклуд-файле дя твоего контроллера все регистры с адресами меньше 0x3F имеют определенные константы для инструкций IN/OUT а все что выше - для STS/LDS. Хоть к регистрам с адресами меньше 0x3F и можно обратится инструкциями STS/LDS в таком случае символические имена для регистров будут неверны и к ним надо добавлять какое-то число, вроде бы 0x60.
п.с. регистры это ячейки в области адресов ввода-вывода, обычные регистры обозначены здесь как РОН.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
А если хотите взорвать мозг окончательно, то стоит знать, что имена регистров (в том числе и РОН, типа R0-R31) это тоже числа, которые прямо в коде можно записать. Да и вообще (о ужас!), все команды - тоже числа! И писать вы можете напрямую hex-файл без компилятора!
Ну а чтобы мозг остался цел, попытайтесь понять логику работы, пишите программы, пишите и ещё раз пишите. А как всё поймёте и надоест взрывать мозг - переходите на Си, поглядывая на то, какой ассемблеровский листинг генерит компилятор. Он будет читаться как стихи Пушкина, и косяки будут всплывать на поверхность в случае сомнений в адекватности компилятора.
Ну а чтобы мозг остался цел, попытайтесь понять логику работы, пишите программы, пишите и ещё раз пишите. А как всё поймёте и надоест взрывать мозг - переходите на Си, поглядывая на то, какой ассемблеровский листинг генерит компилятор. Он будет читаться как стихи Пушкина, и косяки будут всплывать на поверхность в случае сомнений в адекватности компилятора.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
я такое не говорилAlexeyslav писал(а):Интересно, почему это в переменной temp нет 6-го и 7-го битов?
Alexeyslav писал(а):а значит нужное значение нужно поместить сначала в РОН а потом в регистр.
это я знаю ....., только вот не понимаю почему так а не иначе ?
почему ?Alexeyslav писал(а):- для регистров с адресами больше 0x3F загружать в регистр можно только командой STS
Tell Me The Truth
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Как говорят на английском - "by design". Сделано оно так! Вот и всё.FreshMan писал(а):почему ?Alexeyslav писал(а):- для регистров с адресами больше 0x3F загружать в регистр можно только командой STS
Как ни странно, но подробности в "8-bit AVR Instruction Set"
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
- Engineer_Keen
- Друг Кота
- Сообщения: 3868
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: Ассемблер (ASM) для AVR в вопросах и ответах
FreshMan писал(а): почему так а не иначе ?
Потомучто это risc, все сочетания адресов и регистров в 16 бит не запихнуть, вот и приходится делать за несколько команд.
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
FreshMan писал(а):почему ?Alexeyslav писал(а):- для регистров с адресами больше 0x3F загружать в регистр можно только командой STS
Потому, что для команды OUT не хватает разрядности чтобы адресовать те регистры. Поэтому они доступны только через общее адресное пространство. Та же фигня с LDI происходит, под адресацию РОН в коде команды не хватило одного бита - поэтому имеем доступ только к одной половине РОН для этой команды. Там еще с битовыми командами подобная фигня... в итоге имеем что некоторую часть регистров можно дергать отдельные биты, а остальную - фиГ.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Alexeyslav писал(а):Раз ты задаешь такие глупые вопросы
надеюсь вы меня за это не презираете ?
а где можно почиать про команды асемблера в особенности из каких слов состоят все эти сокращения ?
Tell Me The Truth
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Ссылка в моём предыдущем сообщении 
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Re: Ассемблер (ASM) для AVR в вопросах и ответах
FreshMan писал(а):а где можно почиать про команды асемблера в особенности из каких слов состоят все эти сокращения ?
Вот тут еще - самое основное - доступно и понятно.....
http://www.nikolaew.org/avr_old/u3.htm
http://www.nikolaew.org/avr_old/u4.htm
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Еще вот на русском: Сборный документ по ассемблеру AVR - не только команды, а так же описано все по полочкам что может содержать файл исходного кода, все возможные директивы(.macro, .cseg, .include, .... ), как работает арифметика констант с примерами и пояснением. Язык довольно строгий - практически математический, и понимать все там надо так как написано а не иначе - например "побитное И" и "логическое И" две разные вещи и работают совершенно по разному.