Ассемблер (ASM) для AVR в вопросах и ответах
- Реклама
Вопрос следующий. Начал изучать Атмел контроллеры (вроде даже успешно). Написал несколько пробных программ, проверил их работу на макетке и вот - Микроконтроллер ATtiny2313 выводит на индикатор 1602 (по заданию) следующее: сначала 5 цифр адреса от 00032 (0x20) до 00255 (0xFF) следом пробел, а затем символ зашитый в индикатор. Так вот сразу после прошивки все работает очень четко, а стоит передернуть питание - вместо цифр х.з. что. Вывожу на светодиоды значение единиц - выводит то, что показывает индикатор. Вдобавок ко всему - адрес отображаемого знака инкрементируется, а "числа" порой просто "тикают" (инкремент - декремент). Подпрограмма преобразования BIN - BCD в Атмел студио 6 и протеусе работает на ура. Алгоритм преобразования переписал из PIC (у Корабельникова расписан хорошо). Регистры РОН перед преобразованием сохраняю в ОЗУ а потом восстанавливаю. Участок кода преобразования BIN-BCD привожу. Заранее благодарю
- Вложения
-
- Полный код.asm
- (12.2 КБ) 534 скачивания
-
- BIN-BCD.asm
- (3.92 КБ) 372 скачивания
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
Может, что-то с цепью сброса? При программировании вывод RESET используется и управляется программатором, а дальше уже МК сам... Или добавить конденсаторов по питанию, керамических и электролитических.
Нет, тут дело именно в косвенной адресации. Я заменил группы команд ST X,Rd на ячейку ОЗУ и все стало работать как надо.
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
- Сообщения: 107
- Зарегистрирован: Чт июл 17, 2008 16:21:32
Приветствую!
изучаю работу с шаговым двигателем на примере из книги Кравченко А.В. "10 практических устройств на AVR-микроконтроллерах"
открываю проэкт в AVRStudio , собираю, выдает ошибку:
номер строки и исходный файл прилагаю. никак не пойму где там ошибка?
изучаю работу с шаговым двигателем на примере из книги Кравченко А.В. "10 практических устройств на AVR-микроконтроллерах"
открываю проэкт в AVRStudio , собираю, выдает ошибку:
Код: Выделить всё
.....Step_40.asm(17): error: syntax error, unexpected REGISTER, expecting SYMBOL or FUNCTION or REGDEF- Вложения
-
- Step_40.asm
- (7.48 КБ) 529 скачиваний
-
- 2013-03-21_2210233.png
- (8.51 КБ) 401 скачивание
- Реклама
ггг... потому что компилятор не ожидал такого подвоха, что ты попытаешься переопределить символ X который он использует как виртуальный регистр в командах с относительной адресацией. Не делай так больше.
Вот он и пишет что "unexpected REGISTER, expecting SYMBOL" = "неожиданный РЕГИСТР, ожидается символ(в смысле неделимое понятие) или функция"
Вот он и пишет что "unexpected REGISTER, expecting SYMBOL" = "неожиданный РЕГИСТР, ожидается символ(в смысле неделимое понятие) или функция"
- Сообщения: 107
- Зарегистрирован: Чт июл 17, 2008 16:21:32
понятно, а какие еще символы зарезервированы за компилятором тиа "Х"?
Это несложно проверить. Букв в алфавите всего лишь 26, и некоторые из них ты уже опробовал.
Можно сразу сказать что X,Y,Z уже заняты.
Можно сразу сказать что X,Y,Z уже заняты.
если пользоваться avrasm2 то для подобных ситуаций имеется директива undef

Ей по силам отменить определение части команд? или например отменить R16 чтобы использовать его в качестве имени другой переменной или в качестве метки?
Переопределение того, что ранее определено директивами def.
А Z,X и Y как раз так и определены в *def.inc файле:
; ***** CPU REGISTER DEFINITIONS *****************************************
.def XH = r27
.def XL = r26
.def YH = r29
.def YL = r28
.def ZH = r31
.def ZL = r30

Т.е. если мне хочется обозвать какой-либо из регистров r31-r26 собственным именем нужно предварительно отменить заранее заданное (речь не идет о специменах зарезервированных для компилятора) - просто по другому присвоить любое произвольное имя (даже правильное) для этих регистров не удастся.
А Z,X и Y как раз так и определены в *def.inc файле:
; ***** CPU REGISTER DEFINITIONS *****************************************
.def XH = r27
.def XL = r26
.def YH = r29
.def YL = r28
.def ZH = r31
.def ZL = r30
Т.е. если мне хочется обозвать какой-либо из регистров r31-r26 собственным именем нужно предварительно отменить заранее заданное (речь не идет о специменах зарезервированных для компилятора) - просто по другому присвоить любое произвольное имя (даже правильное) для этих регистров не удастся.
вижу только XL и XH но не X.
X, Y, Z являются неотъемлемыми частями некоторых команд!!! и рассматриваются компилятором наравне с регистрами.
Если переопределить Z, как можно будет использовать команду LPM R16, Z+ или LD R16, Z
X, Y, Z являются неотъемлемыми частями некоторых команд!!! и рассматриваются компилятором наравне с регистрами.
Если переопределить Z, как можно будет использовать команду LPM R16, Z+ или LD R16, Z
Храню во флэше шрифт, по 5 байт на цифру (букву).
Хотел писать по 5 байт в строке
Но так из-за двухбайтной адресации занимает 12 байт, а не 10. И идёт не подряд.
А на такое
Студия ругается. Не хочется писать по 10 байт в одной строке — очень длинно и нечитабельно получается.
Есть ли какое-то решение проблемы?
Хотел писать по 5 байт в строке
Код: Выделить всё
numbers: .DB 0b00111110, 0b01010001, 0b01001001, 0b01000101, 0b00111110; 0
.DB 0b00000000, 0b01000010, 0b01111111, 0b01000000, 0b00000000; 1А на такое
Код: Выделить всё
numbers: .DB 0b00111110, 0b01010001, 0b01001001, 0b01000101, 0b00111110,;0
0b00000000, 0b01000010, 0b01111111, 0b01000000, 0b00000000; 1Есть ли какое-то решение проблемы?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
прошу прощения. неправильно ответил. есть решение.
Line continuation
Like in C, source lines can be continued by means of having a backslash (\) as the last character of a line. This is particularly useful when defining long preprocessor macros, and for long .db directives.
ExampleКод: Выделить всё
.db 0, 1, "This is a long string", '\n', 0, 2, \ "Here is another one", '\n', 0, 3, 0
Ставим плюсы: )
Ты ж ёбтibiza11 писал(а):есть решение
Правда, придётся немного похимичить с комментами
Код: Выделить всё
numbers: .DB 0b00111110, 0b01010001, 0b01001001, 0b01000101, 0b00111110,/*0*/\
0b00000000, 0b01000010, 0b01111111, 0b01000000, 0b00000000,/*1*/\[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
комментарий можно и после бэкслеша поставить
Ставим плюсы: )
Не-не-не, Дэвид Блейн
Студия ругается, бэкслэш должен быть реально последним в строке.backslash (\) as the last character of a line
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Парни, подскажите, плз, в строчке, выделенной жирным, add - это опечатка, или это так надо?
Взято здесьldi Temp,0 ;инициализация регистра
;внутренней адресации массива
ReadArray:
ldi ZH,High(MyArray*2) ;загрузка адреса 0-го
ldi ZL,Low(MyArray*2) ;элемента в рег. пару Z
ldi Temp1,0
add ZL,Temp ;прибавление
adc ZH,Temp1 ;внутр. адреса
lpm ;загрузка из ПЗУ
mov Temp1,R0 ;копирование
out PortB,Temp1 ;вывод в порт
inc Temp ;увелич. внутр. адреса
rjmp ReadArray ;в начало цикла
MyArray:
.db 12,16,3,4,10,17,255,37,158,14,13,98
.db 14,85,30,9,145,52,64,49,119,72,209,46
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Потому что хочу научиться.
Так надо. Младший байт прибавляется без учёта переноса (add), старший (после младшего!) — с учётом переноса (adc).
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]


