Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 20
Зарегистрирован: Чт дек 07, 2017 04:44:22

Сообщение леМурр »

это только у меня gavrasm (свежий, v.37) не видит XH,XL,YH,YL,ZH,ZL ?
странно, что более ранние версии нормально понимали, например v.25
а в добавок -
свистопляска прописи ворда - и R25:R24, и R25:24, и даже тупо R24

З.Ы.ну когда уже весна нафик
..всего две 6Ф1П, включенные последовательно,
высушат обое ваших сапог даже в автомобиле..
Реклама
Это не хвост, это антенна
Сообщения: 1495
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Чем AVR-Studio не нравится? Или IAR. Зачем вам экзотика?
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15779
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Ассемблер видит то, что прописано в *.inc файлах.
Возможно в новой версии где-то "очепятались".
Или используется файл от старых версий (проблемы совместимости).
8)

"ПОДАРКИ" от микрощип-атмел:
http://radiokot.ru/forum/viewtopic.php? ... 0#p3299980
:evil:
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 20
Зарегистрирован: Чт дек 07, 2017 04:44:22

Сообщение леМурр »

Demiurg писал(а):...Зачем вам экзотика?
не знаю... нравится когда открытые исходники,
да и список поддерживаемых микрух неплохой
СпойлерИзображение
..всего две 6Ф1П, включенные последовательно,
высушат обое ваших сапог даже в автомобиле..
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 15779
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Компилятор поддерживает базовую систему команд ядра.
Дополнительные особенности обеспечивают файлы с указанием/объявлением расширенного функционала.
Тот же результат можно получить написав собственный файлик с такими определениями.
Другое дело симулятор или программатор (софт-оболочка). В основном проблемы применения МК в них и упираются - программатор хош и можно самому сочинить, но ради единичного случая такое сооружать долго и накладно.
8)
Переписывать/дополнять компилятор как-то... Лучше для начала досконально его изучить в том виде, который имеется, а уж потом чего мудрить (это относительно "открытых исходников").
Лучше хорошо построенное описание правил работы/синтаксиса компилятора... и предпочтительно владение несколькими "дружественно-подобными" для различных семейств...
Дык вроде как микрочип/атмел постарался немного над юзерс гвиде avrasm2 для народопользователя:
http://radiokot.ru/forum/download/file.php?id=303044
:beer:
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2022
Зарегистрирован: Вт фев 09, 2010 02:04:53
Откуда: Санкт-Петербург

Сообщение Гефестион »

Продолжаю писать программу для бегущей строки. И столкнулся с каким-то непонятным глюком.
Есть вот такой простой кусок кода (это конец обработчика прерываний по таймеру)

Код: Выделить всё

	lds R21,ArrCtrOffset
	inc R21 ; Увеличиваем ArrayCounterOffset
	cpi R21,6
	brne Exit
	clr R21
	       
	lds R25,ReadOffset
	inc R25 ; Увеличиваем ReadOffset
	cpi R25,BuffSize
	brne Exit
	clr R25
		
Exit:	sts ArrCtrOffset,R21
	sts ReadOffset,R25
	pop XH
	pop XL
	pop R19
	pop R18
	pop R17
	pop R16
	out SREG,R16
	pop R16
Первая часть кода, которая увеличивает значение ArrCtrOffset, заработала сразу. Читаем из ОЗУ значение ArrCtrOffset в регистр R21, инкрементируем, сохраняем обратно в ОЗУ. Но как выяснилось позже, заработала только потому, что R21 больше нигде не используется. Если взять другой регистр (R16, R17, R18), то начинается какая-то хрень. Сначала взял R16 - значение ReadOffset вообще не инкрементируется (или не сохраняется в ОЗУ?), с R18 то же самое, с R17 вообще знакогенератор стал выдавать крякозябры вместо букв. Вторая половина этого кода, которая изменяет значение ReadOffset, сначала никак не хотела работать, поскольку я пробовал регистры R16, R17, R18. И только когда взял нигде больше не используемый R25, всё заработало (хотя и не совсем как надо).

На первый взгляд кажется, что проблема очевидна - я изменяю содержимое указанных регистров, а они ведь где-то используются. Да, используются, но в начале подпрограммы (обработчик прерываний по таймеру) идёт загрузка в эти регистры из ОЗУ

Код: Выделить всё

	lds R18,Read		; Берём точку чтения
	lds R16,ReadOffset	; Берём смещение точки чтения
	lds R21,ArrCtrOffset	; Берём смещение счётчика массива
Переменные Read, ReadOffset, ArrCtrOffset объявлены в самом начале (до таблицы векторов прерываний) по 1 байту на каждую. BuffSize - константа, равная 32, тоже объявлена в начале.
Далее идёт работа с этими регистрами, но никакой записи обратно в ОЗУ! И только в самом конце подпрограммы надо инкрементировать их значения и сохранить в ОЗУ. Да и в любом случае, в начале обработчика прерываний R16, R17, R18 сохраняются в стек, а в конце извлекаются, т.е. это локальные переменные.

Такое ощущение, что запись регистров в ОЗУ и извлечение оттуда вообще не работает, а работа идёт только напрямую с регистрами. Не могу понять, почему так :dont_know:

Добавлено after 7 minutes 15 seconds:
При этом когда я изменял значения ReadOffset, ArrCtrOffset в обработчике другого прерывания - INT0 (при вращении энкодера), всё работало. Т.е. тогда прокрутка текста была вручную.
Фак, кот грызёт провод! Сейчас его ударит либо током, либо тапком! ))
Реклама
Это не хвост, это антенна
Сообщения: 1495
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Если хрень по вине куска кода в прерывании, то причины:
Не сохраняется SREG.
Не сохраняются регистры, используемые в прерывании.
В обработчике прерывания ошибка.
Основной код и обработчик не корректно работают по временным параметрам.

Пользуйтесь симулятором в студии для отладки программ.
Контактная информация:
akl
Друг Кота
Сообщения: 4473
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Гефестион писал(а):Переменные Read, ReadOffset, ArrCtrOffset объявлены в самом начале (до таблицы векторов прерываний) по 1 байту на каждую.
Может переменные объявлены, но не установлены?

Код: Выделить всё

.equ	ReadOffset=$70
.equ	ArrCtrOffset=$71
.equ	BuffSize=32

	CLR	R0
	STS	ArrCtrOffset,R0
	STS	ReadOffset,R0

TTT:
   lds R21,ArrCtrOffset
   inc R21 ; Увеличиваем ArrayCounterOffset
   cpi R21,6
   BRLO Exit
;   brne Exit
   clr R21
          
   lds R25,ReadOffset
   inc R25 ; Увеличиваем ReadOffset
   cpi R25,BuffSize
   brne Exit
;   brne Exit
   clr R25
      
Exit:   sts ArrCtrOffset,R21
   sts ReadOffset,R25

	RJMP	TTT
Друг Кота
Сообщения: 3342
Зарегистрирован: Ср янв 02, 2013 08:37:35

Сообщение АСУ »

[uquote="Гефестион",url="/forum/viewtopic.php?p=3301130#p3301130"]сначала никак не хотела работать, поскольку я пробовал регистры R16, R17, R18.[/uquote]
Регистр r16 и r17 у AVR используются как аккумулятор… для новичков их использование не рекомендуется. Тебе нужно взять в привычку при любом прерывании сохранять в стек значения регистров r16, r17 и SREG, а при выходе из прерывания возвращать из стека сохраненные значения этих регистров. Небольшой нюанс при сохранении заключается в следующем: всегда первым сохраняется регистр r16 все последующие не имеют упорядоченного значения. Извлекаются значения из стека строго в обратной последовательности (r16 последним). Таким же образом поступают и с теми регистрами, которые используются как в основном теле программы, так и задействованы в теле прерывания.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2022
Зарегистрирован: Вт фев 09, 2010 02:04:53
Откуда: Санкт-Петербург

Сообщение Гефестион »

[uquote="akl",url="/forum/viewtopic.php?p=3301166#p3301166"]Может переменные объявлены, но не установлены?

Код: Выделить всё

.equ	ReadOffset=$70
.equ	ArrCtrOffset=$71
.equ	BuffSize=32

	CLR	R0
	STS	ArrCtrOffset,R0
	STS	ReadOffset,R0

TTT:
   lds R21,ArrCtrOffset
   inc R21 ; Увеличиваем ArrayCounterOffset
   cpi R21,6
   BRLO Exit
;   brne Exit
   clr R21
          
   lds R25,ReadOffset
   inc R25 ; Увеличиваем ReadOffset
   cpi R25,BuffSize
   brne Exit
;   brne Exit
   clr R25
      
Exit:   sts ArrCtrOffset,R21
   sts ReadOffset,R25

	RJMP	TTT
[/uquote]

У меня начало вот так выглядит:

Код: Выделить всё

*************** Константы *****************************************

.equ	BuffSize		= 32

*************** ОЗУ ***********************************************

.dseg

IN_buff:		.byte	32	; Буфер приема
Read:			.byte	1	; Указатель точки чтения из буфера
ReadOffset:		.byte	1	; Смещение точки чтения
ArrCtrOffset:		.byte	1	; Смещение счётчика чтения массива
Write:			.byte	1	; Указатель точки записи в буфер

;************** Макросы *******************************************

.macro	PUSHF
push	R16
in	R16,SREG
push	R16
.endmacro
 
.macro	POPF
pop	R16
out	SREG,R16
pop	R16
.endmacro          

*******************************************************************
.cseg
.org 0
Дальше идёт таблица векторов прерывания и затем начинается программа.

Может, я макросы не там разместил? Наверное, их надо размещать после .cseg ?

Добавлено after 6 minutes 16 seconds:
[uquote="АСУ",url="/forum/viewtopic.php?p=3301171#p3301171"]Тебе нужно взять в привычку при любом прерывании сохранять в стек значения регистров r16, r17 и SREG, а при выходе из прерывания возвращать из стека сохраненные значения этих регистров. Небольшой нюанс при сохранении заключается в следующем: всегда первым сохраняется регистр r16 все последующие не имеют упорядоченного значения. Извлекаются значения из стека строго в обратной последовательности (r16 последним). Таким же образом поступают и с теми регистрами, которые используются как в основном теле программы, так и задействованы в теле прерывания.[/uquote]
В стек всё сохраняю. Начинаю с R16, затем SREG (написал макросы PUSHF и POPF)

Добавлено after 5 minutes 9 seconds:
[uquote="Demiurg",url="/forum/viewtopic.php?p=3301150#p3301150"]Пользуйтесь симулятором в студии для отладки программ.[/uquote] Кстати да, я симулятором ни разу не пользовался. Надо попробовать) Как думаете, лучше Proteus или AVR Studio?
Фак, кот грызёт провод! Сейчас его ударит либо током, либо тапком! ))
akl
Друг Кота
Сообщения: 4473
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Не вижу обнуления.

Код: Выделить всё

  CLR   R0
   STS   ArrCtrOffset,R0
   STS   ReadOffset,R0
Симулировать, на мой взгляд, лучше в студии.
Это не хвост, это антенна
Сообщения: 1495
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

[uquote="АСУ",url="/forum/viewtopic.php?p=3301171#p3301171"]...[/uquote]
Ерундой болтать изволите. Вдобавок позиционируете себя как не новичок, но вышло ровно наеборот.
1 - никакого сравнения регистров авр с другими мк. Аккумуляторы на других мк.
2 - любые регистры можно испрользовать где хочешь, как хочешь. Главное, что ты понимаешь, что делаешь. И учитываем, что у младших регистров ограничения по командам.
3 - Порядок сохранения регистров в прерываний произвольный, вот как тебе на душу ляжет. Главное правило, как правильно сохранять SREG и порядок восстановления регистров.
4 - Сохранять и восстанавливать нужно только те регистры, которые используются в обработчике прерывания.

Код: Выделить всё

push r16
in r16, SREG
push r16
push r17

bla-bla

pop r17
pop r16
out SREG, r16
pop r16
reti
Последний раз редактировалось Demiurg Вт фев 06, 2018 11:09:58, всего редактировалось 1 раз.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

[uquote="Гефестион",url="/forum/viewtopic.php?p=3301213#p3301213"]Как думаете, лучше Proteus или AVR Studio?[/uquote]
Если нужна симуляция только куска кода, то можно использовать студию, если нужно учитывать взаимодействие с другими элементами схемы, то без Протеуса будет сложно. ИМХО Протеус в любом случае удобнее студии, тем более что ничто не мешает скомпилировать проект, и моментально переключившись в протеус его запустить. Главное знать в каком симуляторе какие глюки есть!
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Встал на лапы
Аватара пользователя
Сообщения: 107
Зарегистрирован: Ср авг 05, 2015 19:34:20

Сообщение siimao »

Вклинусь в беседу о симуляторе... В АВР можно пошагово проверить работу, сравнить содержимое регистров,... А в протеус - только работу: реакцию на нажатие,...
Или я не прав относительно Протеус? Было бы здорово наблюдать содержимое регистров, ставить точки останова,...
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Есть там и регистры и точки останова, только регистры I/O там отображаются просто таблицей как и RAM, но их можно в watch лист добавить и дать нормальные имена (причем они там уже в списке есть, только выбрать). Как например в авр студии просимулировать обмен между 2-мя (3-мя, 10-ю) контроллерами например по SPI? Или динамическую индикацию? Тыкать по битам в регистрах PINx уныло...
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Вообще-то в протеусе есть модуль удалённой отладки. Не знаю как в новых студиях, но для 4-й есть плагин удалённого отладчика в протеусе, но он несколько неудобен - протеус запускается исключительно в рамках окна студии и "переключиться" на него проблематично. А в остальном отладка происходит в студии, а симуляция полноценной схемы(её надо нарисовать для проекта заранее и сохранить, в отладке схему изменить нельзя да и проблематично).
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 107
Зарегистрирован: Ср авг 05, 2015 19:34:20

Сообщение siimao »

Значит возможность есть и я о ней не знаю (((
Всегда тыкал в флаги прерывания и руками устанавливал значения регистров (((
Видел, что в протеус можно открыть лист кода... В этом направлении всеми лапами копаться?
Proteus 8.1 SP1
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Суйте в модель МК в протеусе не hex, а obj-файл, во время симуляции на паузе тыкайте правой кнопкой на контроллер, внизу меню будет пункт "AVR" - вот там все что вам надо и регистры и память и код, если исходник сишный, еще и переменные можно смотреть...
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Только там не абы какой obj-файл надо подсунуть, а скомпилированный с отладочными данными - тогда имена переменных появятся и т.д. Но заманчивей всё-таки использовать возможность удалённой отладки. Только х.з. как её настроить из последней студии... может там какой-то виртуальный отладчик ещё должен быть, через который студия сконектится к протеусу как к обычному программатору-отладчику.
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Alexeyslav писал(а):Но заманчивей всё-таки использовать возможность удалённой отладки. Только х.з. как её настроить из последней студии...
судя по идеологии GCC там должен использоваться gdb-сервер на удаленном хосте, он там запускается, открывает порт и слушает его. а студия потом по сети к этому порту обращается и командует отладчиком gdb. если не ошибаюсь, вся отладка GCC так работает...

со студиями я никаких дел не имею давно, но пробовал такую удаленку запускать в Eclipse. если протеус может быть запущен в качестве gdb-сервера, то всё должно быть достаточно просто - в настройках оладчика надо будет задать адрес хоста и порт, и все. но как быть с протеусом я вообще не в курсе... а без протеуса только simulavr может быть таким сервером - это крайне убогая, глючная, не симулирующая периферию приблуда... о нормальной отладке с нею речь идти не может, разве что для крайне примитивных проектов типа мигания светодиодом на задержках...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Ответить

Вернуться в «AVR»