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

Обсуждаем контроллеры компании Atmel.
Ответить
Грызет канифоль
Сообщения: 264
Зарегистрирован: Сб июл 30, 2011 21:00:24

Сообщение AQ29 »

ptr128 писал(а): Сизифов труд, заниматься математикой на ассемблере. "учите C"
“поддерживать и контролировать ассемблерный код в разы дороже,.
Все расчёты, которые мне приходилось делать (умножение, деление, и т.д.) делаются просто, часто банально. В приведенном мною выше примере есть и деление, и умножение, и логарифм — и всё это несколько строчек простого кода. Где тут «сизифов труд»?

Для оперативного управления с помощью МК каким-либо процессом часто важна скорость, что хорошо реализуется в макроассемблере. Думаю, поэтому по этой причине не только безработные и «для хобби» пишут на макроассемблере.
Ну и ещё и гибкость. Например, легко рассчитать нужный логарифм под потребности задачи (медленный и точный, быстрый и не такой точный).

Не вижу проблем в поддержке и контролировании кода на макроассемблере.
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 606
Зарегистрирован: Чт окт 06, 2016 21:12:07
Откуда: Южное Бутово

Сообщение ptr128 »

AQ29 писал(а):Где тут «сизифов труд»?
Сизифов труд - заниматься самостоятельной поддержкой для всех используемых архитектур аналога libc, который вообще без усилий разработчика поддерживается разработчиками компилятров для всех поддерживаемых архитектур.

AQ29 писал(а):часто важна скорость, что хорошо реализуется в макроассемблере.
Что значит часто? По мне, когда она нужна - тогда и делаем ассемблерную вставку. Получается ~1-2% всего кода, если, конечно не весь проект из сотни строк.
AQ29 писал(а):Не вижу проблем в поддержке и контролировании кода на макроассемблере.
Расскажите. Я действительно не в курсе. Для C я знаю множество автоматизированных средств контроля за надежностью и безопасностью кода. Наиболее распостранены MISRA, PVS, ITS и т.п.
С поддержкой тоже не понятно. Разве 10 библиотек для 10 архитектур менее проблематично поддерживать, чем одну C библиотеку для этих же 10 архитектур?
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 117
Зарегистрирован: Ср окт 15, 2014 12:45:46
Откуда: Анапа

Сообщение Jetetex »

Народ, помогите юзверю.
на тини 13 нужно прерывание по совпадению, а оно судя по моделированию не происходит. перепроверил уже по 100500 раз все регистры - вроде все верно установлено. В режиме "по переполнению" все фурычет.

Суть программы:
в осн цикле выводим в порт данные для 5-ти сдвиговых регистров (матрица 8*32)
Во время прерывания идет вмена выводимых данных (кроме 1-го, который мотает в основном цикле для динамического отображения по 8-ми столбцам)

код прилагаю:
Спойлер.include "output\tn13def.inc"
;======================



;======================

;******************************* обзываем переменные ****************************

.def Temp=R16
.def Temp1=R17
.def Temp2=R18
.def Temp3=R19
.def countsht=R20



.dseg
;******************************** ЗДЕСЯ **********************************
;******************************** выпрашиваем у компилятора чуток ОЗУ **********************************
;******************************** для хранения "личных данных" **********************************
stroka: .byte 4
stolbik: .byte 1
.cseg
;*************************** Вектора прерываний ************************
.org 0
rjmp RESET
rjmp INT_0 ; External Interrupt 0
rjmp PCI0 ; External Interrupt Request 0
rjmp OVF0 ; Timer/Counter0 Overflow
rjmp ERDY ; EEPROM Ready
rjmp AnaComp ; Analog Comparator
rjmp OC0A ; Timer/Counter Compare Match A
rjmp OC0B ; Timer/Counter Compare Match B
rjmp WDT ; Watchdog Time-out
rjmp ADCC ; ADC Conversion Complete

;RESET:
INT_0:
PCI0:
OVF0:
ERDY:
AnaComp:
;OC0A:
OC0B:
WDT:
ADCC:
reti

;********************** обработчик прерывания переполнения таймера *********************
;********************** TIMER0_OVF *********************
OC0A: in R15,SREG
ldi Temp,0
out TCNT0,Temp ;обнуляем счетный регистр
rcall effects

exitoc0a:
out SREG,R15
reti





RESET:

;*********************** инициализация МК **********************
ldi countsht,0
ldi Temp,1
sts stroka,Temp
ldi Temp,2
sts stroka+1,Temp
ldi Temp,3
sts stroka+2,Temp
ldi Temp,4
sts stroka+3,Temp
ldi Temp,1
sts stolbik,Temp

ldi Temp,0b11111111 ;настройка портов
out DDRB,Temp

ldi Temp,0
out TCNT0,Temp ;обнуляем счетный регистр

ldi Temp,0b00001000 ;разрешить прерывание по переполнению таймера/счетчика 0
out TIMSK0,Temp

ldi Temp,0b00001000 ;Флаг наступления прерывания по переполнению
out TIFR0,Temp

ldi Temp,0b00000010 ;режим работы "сброс при совпадении"
out TCCR0A,Temp

ldi Temp,0b00000100 ;тактовый сигнал = CK/256
out TCCR0B,Temp

ldi Temp,RamEnd ;установка указателя стека
out SPL,Temp

ldi Temp,255 ;регистр сравнения
out OCR0A,Temp

ldi Temp1,0b00000000
sei

;**************************** ****************************
;**************************** Основной цикл программы ****************************
;**************************** ****************************


main:
rcall shifting

cbi PORTB,1
sbi PORTB,1
cbi PORTB,1
rcall dealey
rjmp main
Во вложении полный текст и схема для Протеус 7
Вложения
code.asm
код
(4.67 КБ) 533 скачивания
снежинка.rar
схема
(16.47 КБ) 162 скачивания
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Ваш код не смотрел.
Не знаю для всех ли AVR, но в протеусе прерывание по совпадению в нормальном режиме счетчика не работает (не помню на каком МК выяснил). Включаешь СТС - работает.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Эиком - электронные компоненты и радиодетали
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Сб сен 17, 2016 18:56:30

Сообщение dimmer »

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

ldi Temp,0b11111111			;настройка портов
out DDRB,Temp
		  
;ldi Temp,0 
;out TCNT0,Temp				;обнулЯем счетный регистр

;ldi Temp,0b00001000 			;разрешить прерывание по переполнению таймера/счетчика 0
ldi Temp,(1<<OCIE0A)		;Timer/Counter0 Output Compare Match A Interrupt Enable
out TIMSK0,Temp

;ldi Temp,0b00001000 			;”лаг наступлениЯ прерываниЯ по переполнению
;out TIFR0,Temp

ldi Temp,0b00000010 			;режим работы "сброс при совпадении"
out TCCR0A,Temp

ldi Temp,0b00000100 			;тактовый сигнал = CK/256
out TCCR0B,Temp

ldi Temp,RamEnd     			;установка указателЯ стека
out SPL,Temp

ldi Temp,255					;регистр сравнениЯ 
out OCR0A,Temp

ldi Temp1,0b00000000
sei

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

OC0A:		in R15,SREG
;			ldi Temp,0 
;			out TCNT0,Temp				;обнулЯем счетный регистр  ???????????
				rcall effects

exitoc0a:
			out SREG,R15
		reti
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 117
Зарегистрирован: Ср окт 15, 2014 12:45:46
Откуда: Анапа

Сообщение Jetetex »

спасибо за подсказку, помогло

А в прерывании забыл убрать после предыдущего эксперимента )
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
Реклама
Грызет канифоль
Сообщения: 264
Зарегистрирован: Сб июл 30, 2011 21:00:24

Сообщение AQ29 »

ptr128 писал(а): Сизифов труд - заниматься самостоятельной поддержкой для всех используемых архитектур аналога libc, который вообще без усилий разработчика поддерживается разработчиками компилятров для всех поддерживаемых архитектур.
Но мне не нужно «поддерживать все используемые архитектуры». Вполне достаточно АВР. Здесь есть и библиотека, и отработанные решения, и знание всяческих тонкостей. Отрабатывать всё это на новом семействе МК пока не вижу смысла — большие затраты времени — и для чего?
AQ29 писал(а):часто важна скорость, что хорошо реализуется в макроассемблере.
ptr128 писал(а):Что значит часто? По мне, когда она нужна - тогда и делаем ассемблерную вставку. Получается ~1-2% всего кода, если, конечно не весь проект из сотни строк.
Не всегда получается 1-2%. Знакомый, умеющий писать на СИ, довольно большую программу писал на АБ — скорость нужна была. Причем что-то серьёзное, для военных. У себя я, естественно, процент не считал, хотя были разные случаи.
Но это, конечно, несущественное замечание.
Основная проблема — удобство написания. Конечно, СИ лучше ассемблера, а вот сравнение с макроассемблером - вопрос.
На мой взгляд, метод программирования в АБ лучше подходит для МК. Но, наверно, автору АБ для зарабатывания денег надо было после существенного усовершенствования новую версию продавать по дополнительной цене. Кто «подсел» на АБ — купит.
Нужна, конечно, отработанная библиотека. Чтобы окупить затраты на создание мощных библиотечных элементов их можно продавать отдельно. Ежели 1000 пользователей, да за 1000 рублей, то тут хорошая сумма получается. Но я тут совсем не специалист.
ptr128 писал(а):
AQ29 писал(а):Не вижу проблем в поддержке и контролировании кода на макроассемблере.
Расскажите. Я действительно не в курсе. Для C я знаю множество автоматизированных средств контроля за надежностью и безопасностью кода. Наиболее распостранены MISRA, PVS, ITS и т.п.
С поддержкой тоже не понятно. Разве 10 библиотек для 10 архитектур менее проблематично поддерживать, чем одну C библиотеку для этих же 10 архитектур?
Для АБ, насколько знаю, нет автоматизированных средств контроля.
Насколько представляю, средства контроля для СИ проверяют правила написания программ для сложного компилятора. В ассемблере сложного компилятора нет.
Что должны делать средства контроля для ассемблера?
Надёжность кода — большая тема.
Для надёжности кода, во-первых, соблюдение ряда правил при написании, во-вторых, тестирование.
Правила при написании простые, например:
- Никаких «боковых» выходов из вызываемых подпрограмм. Только стандартный выход, при необходимости устанавливается флаг.
- Минимум действий в прерывании. Практически почти во всех случаях в прерывании только устанавливаю программный флаг. Флаг из-за специфики АБ выбирать в регистрах РОН.
- Обеспечение выхода из возможных точек зависания.
И т.д.
Неплохо бы, чтобы какая-нибудь программа контролировала выполнения правил, но это малосущественно, правила простые и легко автоматически выполняются при некотором навыке.
Программирование упрощается. Скажем, подпрограммы деления или логарифма в примере можно просто вызывать в любом участке программы не думая о регистрах, о возможности наложения переменных и т. д.
Тестирование — тоже большая тема. Скажем, в программе есть обработки дефектов в работе и аварийных ситуаций. Для проверки надо имитировать такие ситуации, а это канительно и иногда неясно, как сделать. Как имитировать воздействие помехи на кабель, по которому обмениваются два МК? Не знаю, может быть есть специальные генераторы помех, поднёс к кабелю и проверяй.
Тестирование проводят испытатели. Затем аппараты передаются в опытную эксплуатацию пользователям, скажем, на год. После отработки замечаний, вроде как, должно надёжно работать.

Библиотека у меня, как уже писал, только для АВР. Что-то иногда добавить по мелочи или подкорректировать - это не проблема.
Вот когда понадобится мощный библиотечный элемент, а его у меня нет, тогда, конечно, того...
Но, во-первых, такое бывает редко, во-вторых, думаю, такой созданный элемент будет более оптимален для решаемой задачи, в-третьих, создание элементов — увлекательное занятие.
Встал на лапы
Аватара пользователя
Сообщения: 117
Зарегистрирован: Ср окт 15, 2014 12:45:46
Откуда: Анапа

Сообщение Jetetex »

кто знает как узнать обьем данных, которые будут загружены в МК из HEX файла, сгенерированого TavrAsm.
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
akl
Друг Кота
Сообщения: 4473
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Как вариант, загрузить в программатор
СпойлерИзображение
Вложения
hex.PNG
(28.31 КБ) 1048 скачиваний
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

akl, добрый день. У меня есть к Вам вопрос, но Вы отключили личные сообщения. Можно как-то с Вами связаться?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
akl
Друг Кота
Сообщения: 4473
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Вопрос решен. Удалил.
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Сб сен 17, 2016 18:56:30

Сообщение dimmer »

Возможности макропрограммирования avrasm2 позволяют делать интересные вещи, вот пример рекурсии в макросах:

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

.macro Ft
.if a != 1
	.set r = r * a
	.set a = a - 1
	Ft a

.endif
.endmacro

.macro Factorial
.set a = @0
.set r = 1
	Ft a

.endmacro

.cseg
	Factorial 7

	ldi r16,byte4(r)
	ldi r16,byte3(r)
	ldi r16,byte2(r)
	ldi r16,byte1(r)
А вот ещё пример макроса для инициализации портов ввода/вывода ATmega, ATtiny.
Не получается добавить вложение, вот прямая ссылка [url]www.avr-assm.ru\files\macro2.zip[/url]
Родился
Сообщения: 10
Зарегистрирован: Сб июл 11, 2015 09:22:54

Сообщение dmitriy131313 »

Здравствуйте, Друзья! Помогите пожалуйста. Никак не могу понять код умножения из атмеловской аппноы 200. Принцип действия каждой команды понятен, а вот в логику никак не могу въехать. Заранее спасибо!
.def mc8u =r16
.def mp8u =r17
.def m8uL =r17
.def m8uH =r18
.def mcnt8u =r19


mpy8u_c:
clr m8uH
ldi mcnt8u, 8
lsr mp8u

m8u_1:
brcc m8u_2
add m8uH, mc8u

m8u_2:
ror m8uH
ror m8uL
dec mcnt8u
brne m8u_1
akl
Друг Кота
Сообщения: 4473
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Лучше чем в самом AVR200 вряд ли кто напишет.
AVR200_MULT.txt
(728 байт) 151 скачивание
Родился
Сообщения: 10
Зарегистрирован: Сб июл 11, 2015 09:22:54

Сообщение dmitriy131313 »

akl писал(а):Лучше чем в самом вряд ли кто напишет.
Тут конечно не поспоришь. Заново изобретать велосипед нет смысла. Но всё же с кодом разобраться хочется. В аппноте подробно расписан алгоритм, но отсутствует разъяснение логики действий. Хотелось бы увидеть хотя бы формулу по котой ведётся расчёт. Если кто знает, был бы благодарен за помощь!
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Возьмите два числа в двоичном виде и умножьте их столбиком - как в школе, только в двоичной системе. Вот именно это в коде и реализуется.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

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

.macro	outi
	ldi	r16,@1
	out	@0,r16
.endm
что такое @1 и @0 ?
Tell Me The Truth
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Сообщение Пока_без_кота »

Параметры макроса. Первый (@0), и второй (@1).
Родился
Сообщения: 4
Зарегистрирован: Чт окт 22, 2009 17:41:38

Сообщение Dim-k12 »

Привет форумчанам!
Пока только курю форумы и даташиты, поэтому нужно мнение тех, кто в теме.
Имеется давний проект https://www.drive2.ru/b/1561303/
Вот накарябал код, но надо идти дальше
Вопрос как реализовать контроль переменного напряжения поступающего на вывод МК?
Как прерывание по изменению состояния вывода или измерять ацп?
Нужно начать процесс регулирования только после того, как генератор раскрутится, т.е с обмотки статора начнет поступать напряжение.
Вложения
525ab3cs-960.jpg
(70.23 КБ) 315 скачиваний
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

какая разница между этими формами записи ?

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

out	_SFR_IO_ADDR(USICR), r24

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

out	USICR, r24
Tell Me The Truth
Ответить

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