Ассемблер (ASM) для AVR в вопросах и ответах
Serhio, такой команды в AVRASM вообще нет. Скорее всего, sbi 0x27, 3. Очевидно адресация прямая.
- Реклама
Непосредственная(прямая). Это команда для 51 семейства.Serhio писал(а):Подскажите пожалуйста: SETB P1.3; (P1)=27H; (PC)=127H
Команда производит запись 1 в бит. Какая используется адресация для операнда-источника и операнда-приемника? и что чему будет равно?
C0FFEE=12648430
Вот столкнулся с одной проблемой.
Есть код для управления дисплеем, но суть не в этом. В этом коде я использую C-шные команды препроцессора для определения всяких параметров. И вот проблема.
Например есть объявление:
#define size_x 12
Задача: Записать это число в символьном виде в flash, т. е. после развёртывания в коде должна получиться такая конструкция:
.db "12",0
Как сделать?
.db "size_x",0 не катит.
Была идея создать макрос вида
#define _s(a) #a
а затем
.db _s(size_x),0
но не тут-то было - макрос _s() не обрабатывает препроцессором параметр a перед закавычинием, т.е. в результате после развёртывания получается вс ё тот же
.db "size_x",0
Есть код для управления дисплеем, но суть не в этом. В этом коде я использую C-шные команды препроцессора для определения всяких параметров. И вот проблема.
Например есть объявление:
#define size_x 12
Задача: Записать это число в символьном виде в flash, т. е. после развёртывания в коде должна получиться такая конструкция:
.db "12",0
Как сделать?
.db "size_x",0 не катит.
Была идея создать макрос вида
#define _s(a) #a
а затем
.db _s(size_x),0
но не тут-то было - макрос _s() не обрабатывает препроцессором параметр a перед закавычинием, т.е. в результате после развёртывания получается вс ё тот же
.db "size_x",0
Например, такIfoR писал(а): #define size_x 12
Задача: Записать это число в символьном виде в flash, т. е. после развёртывания в коде должна получиться такая конструкция:
.db "12",0
Как сделать?
.db size_x/10+0x30, size_x%10+0x30, 0
Ку?
Все будет только лучше, в крайнем случае - хуже.
Это постоянно то там, то сям пробегает. Нужна двойная проброска.
В результате первого разворачивания из _s(size_x) будет получено __s(12), а уже оно даст нужную строку.
Код: Выделить всё
#define size_x 12
#define __s(a) #a
#define _s(a) __s(a)
.db _s(size_x),0Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
- Реклама
coredumped, ну, ф-фпринципе то можно с учётом текущих обстоятельств...
avreal, спасибо! Не догадался.
avreal, спасибо! Не догадался.
Ньда, только сейчас проверил: двойная проброска не помогает. Получается тоже самое. 
В общем пока сделал как coredumped сказал с дополнительными костылями.
В общем пока сделал как coredumped сказал с дополнительными костылями.
Ну что тут сказать... Значит, в используемом Вами ассемблере С-шный препроцессор поддержан формально. Как бы и обрабатывает макросы, но по упрощённой технологии.
avr-gcc -Wa,-alm=tst.lst -c tst.S
cat tst.lst
Код: Выделить всё
#define STR_(a) #a
#define STR(a) STR_(a)
#define size_x 12
.text
.asciz STR(size_x)
.asciz STR_(size_x)
.endcat tst.lst
Код: Выделить всё
GAS LISTING /tmp/ccaOIlQd.s page 1
1 # 1 "tst.S"
1
0
0
2 #define STR_(a) #a
3 #define STR(a) STR_(a)
4
5 #define size_x 12
6
7 .text
8 0000 3132 00 .asciz STR(size_x)
9 0003 7369 7A65 .asciz STR_(size_x)
9 5F78 00
10
11 .endЛень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Есть вопрос.
Имеем число в одном регистре.
Как можно на ассемблере разделить единицы, десятки и сотни этого числа по трём разным регистрам? МК - MEGA8.
Число целое, со знаком (signed).
Имеем число в одном регистре.
Как можно на ассемблере разделить единицы, десятки и сотни этого числа по трём разным регистрам? МК - MEGA8.
Число целое, со знаком (signed).
Делить на 10, остатки забирать. Следующий вопрос будет - где взять деление. А нигде, написать
И воспользоваться поиском по форуму, неоднократно обсуждалось (емнип, даже в этой теме)
Искать апнот про BCD арифметику. Но там вроде без знака.Switch писал(а):Имеем число в одном регистре.
Как можно на ассемблере разделить единицы, десятки и сотни этого числа по трём разным регистрам? МК - MEGA8.
Число целое, со знаком (signed).
Вычитать сначала сотни, потом десятки, потом единицы, включив при этом три счётчикаploop писал(а):Делить на 10, остатки забирать. Следующий вопрос будет - где взять деление. А нигде, написать
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Ну да. Когда сам столкнулся с этой проблемой, искать не стал, просто взял и написалВычитать сначала сотни, потом десятки, потом единицы, включив при этом три счётчика
Советы все хорошие, но не совсем по делу.ploop писал(а):Ну да. Когда сам столкнулся с этой проблемой, искать не стал, просто взял и написалВычитать сначала сотни, потом десятки, потом единицы, включив при этом три счётчика
Во-первых, у человека signed. Значит первым делом надо расщепить на знак и абс. величину. И знак где-то хранить.
Во-вторых : Gudd-Head, зачем три счетчика ? Когда вычли сотни и десятки, остаток уже содержит единицы.
Если бы я был преподом, у меня ответивший по билету для получения "отл." прямо за столом должен был бы написать эту подпрограммку секунд за 40. Хорошо, что я не препод
Дык, я тоже ответ писал секунд 40, потому и не стал особо мозги напрягатьJack_A писал(а): Во-вторых : Gudd-Head, зачем три счетчика ? Когда вычли сотни и десятки, остаток уже содержит единицы.
... должен был бы написать эту подпрограммку секунд за 40.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Если бы вы так же хорошо преподавали, как спрашивали - нет проблем. А то сейчас преподаватели пошли, как бы помягче сказать, тоже не айс...Если бы я был преподом, у меня ответивший по билету для получения "отл." прямо за столом должен был бы написать эту подпрограммку секунд за 40.
Мдаа.... Холивар устроили, но не помогли.
На счёт деления - спрашивать не буду, так как гугл знает ответ на этот вопрос а вот запрос на разложение числа он не понимает.
Вообще, у меня этот вопрос возник при написании программы для термодатчика DS18B20
Вообще мне надо всего 2 числа достать из двух регистров (t LSB и t MSB) и оформить их так, чтобы можно было направить их в дешифраторы 4>10. А знак нужно отобразить отдельно. Десятые и сотые доли мне ненужны. Датчик настроен на минимальную точность.
Обмен 1Wire организовал, а вот это - даже в голову не приходит ничего.
ЗЫ:
И причём тут преподы? Я самоучка по электронике и МК и делаю для себя.
Никаких дипломных работ.
На счёт деления - спрашивать не буду, так как гугл знает ответ на этот вопрос а вот запрос на разложение числа он не понимает.
Вообще, у меня этот вопрос возник при написании программы для термодатчика DS18B20
Вообще мне надо всего 2 числа достать из двух регистров (t LSB и t MSB) и оформить их так, чтобы можно было направить их в дешифраторы 4>10. А знак нужно отобразить отдельно. Десятые и сотые доли мне ненужны. Датчик настроен на минимальную точность.
Обмен 1Wire организовал, а вот это - даже в голову не приходит ничего.
ЗЫ:
И причём тут преподы? Я самоучка по электронике и МК и делаю для себя.
Никаких дипломных работ.
Ё-моё, так бы сразу и сказали. А то "число со знаком"...Switch писал(а):Вообще, у меня этот вопрос возник при написании программы для термодатчика DS18B20.
Берёте 7 бит с датчика (2^6 ... 2^0), включаете счётчкик и начинаете вычитать по 10. Как только результат станет отрицательным, прибавляете 10. В счётчике получаете десятки, в результате - единицы.
См. вложение, если настолько тяжело усваивается информация.Switch писал(а):Мдаа.... Холивар устроили, но не помогли.
- Вложения
-
- BCD Conversion.asm
- (12.29 КБ) 210 скачиваний
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Нашел еще тему, правда без знака, да и опоздал немного 
Вдогонку помогла мне ещё и статья ARV. Теперь понятнее стало. Попробую доделать свою программу. Если будут конкретные вопросы, обращусь.



