Страница 298 из 400

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

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

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

Не вижу проблем в поддержке и контролировании кода на макроассемблере.

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

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

AQ29 писал(а):часто важна скорость, что хорошо реализуется в макроассемблере.
Что значит часто? По мне, когда она нужна - тогда и делаем ассемблерную вставку. Получается ~1-2% всего кода, если, конечно не весь проект из сотни строк.
AQ29 писал(а):Не вижу проблем в поддержке и контролировании кода на макроассемблере.
Расскажите. Я действительно не в курсе. Для C я знаю множество автоматизированных средств контроля за надежностью и безопасностью кода. Наиболее распостранены MISRA, PVS, ITS и т.п.
С поддержкой тоже не понятно. Разве 10 библиотек для 10 архитектур менее проблематично поддерживать, чем одну C библиотеку для этих же 10 архитектур?

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

Добавлено: Вс дек 04, 2016 12:40:08
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

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

Добавлено: Вс дек 04, 2016 13:57:58
Z_h_e
Ваш код не смотрел.
Не знаю для всех ли AVR, но в протеусе прерывание по совпадению в нормальном режиме счетчика не работает (не помню на каком МК выяснил). Включаешь СТС - работает.

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

Добавлено: Вс дек 04, 2016 14:10:43
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

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

Добавлено: Вс дек 04, 2016 14:45:28
Jetetex
спасибо за подсказку, помогло

А в прерывании забыл убрать после предыдущего эксперимента )

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

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

Библиотека у меня, как уже писал, только для АВР. Что-то иногда добавить по мелочи или подкорректировать - это не проблема.
Вот когда понадобится мощный библиотечный элемент, а его у меня нет, тогда, конечно, того...
Но, во-первых, такое бывает редко, во-вторых, думаю, такой созданный элемент будет более оптимален для решаемой задачи, в-третьих, создание элементов — увлекательное занятие.

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

Добавлено: Пн дек 05, 2016 22:19:38
Jetetex
кто знает как узнать обьем данных, которые будут загружены в МК из HEX файла, сгенерированого TavrAsm.

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

Добавлено: Вт дек 06, 2016 04:01:43
akl
Как вариант, загрузить в программатор
СпойлерИзображение

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

Добавлено: Чт дек 15, 2016 12:52:16
Z_h_e
akl, добрый день. У меня есть к Вам вопрос, но Вы отключили личные сообщения. Можно как-то с Вами связаться?

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

Добавлено: Чт дек 15, 2016 13:22:20
akl
Вопрос решен. Удалил.

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

Добавлено: Вт дек 27, 2016 22:05:03
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]

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

Добавлено: Ср дек 28, 2016 00:16:10
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

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

Добавлено: Ср дек 28, 2016 04:39:42
akl
Лучше чем в самом AVR200 вряд ли кто напишет.
AVR200_MULT.txt
(728 байт) 150 скачиваний

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

Добавлено: Ср дек 28, 2016 21:08:43
dmitriy131313
akl писал(а):Лучше чем в самом вряд ли кто напишет.
Тут конечно не поспоришь. Заново изобретать велосипед нет смысла. Но всё же с кодом разобраться хочется. В аппноте подробно расписан алгоритм, но отсутствует разъяснение логики действий. Хотелось бы увидеть хотя бы формулу по котой ведётся расчёт. Если кто знает, был бы благодарен за помощь!

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

Добавлено: Ср дек 28, 2016 21:22:11
WiseLord
Возьмите два числа в двоичном виде и умножьте их столбиком - как в школе, только в двоичной системе. Вот именно это в коде и реализуется.

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

Добавлено: Сб янв 14, 2017 12:06:04
FreshMan

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

.macro	outi
	ldi	r16,@1
	out	@0,r16
.endm
что такое @1 и @0 ?

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

Добавлено: Сб янв 14, 2017 14:03:09
Пока_без_кота
Параметры макроса. Первый (@0), и второй (@1).

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

Добавлено: Вс янв 15, 2017 21:44:42
Dim-k12
Привет форумчанам!
Пока только курю форумы и даташиты, поэтому нужно мнение тех, кто в теме.
Имеется давний проект https://www.drive2.ru/b/1561303/
Вот накарябал код, но надо идти дальше
Вопрос как реализовать контроль переменного напряжения поступающего на вывод МК?
Как прерывание по изменению состояния вывода или измерять ацп?
Нужно начать процесс регулирования только после того, как генератор раскрутится, т.е с обмотки статора начнет поступать напряжение.

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

Добавлено: Пт янв 20, 2017 13:45:56
FreshMan
какая разница между этими формами записи ?

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

out	_SFR_IO_ADDR(USICR), r24

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

out	USICR, r24