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

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

Добавлено: Пн фев 25, 2013 14:08:52
ahtyng
Здравствуйте, есть у кого-нибудь примеры на stm32 написанные на ассемблере(понимаю конечно, что не в тему малость ARM, а на AVR все таки, но может есть у когнить)? И посоветуйте пожалуйста литературу по Keil и ассемблеру(обучалка которая здесь на сайте не катит, какой-то другой там асм).

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

Добавлено: Пн фев 25, 2013 14:14:18
ibiza11

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

Добавлено: Пн фев 25, 2013 18:04:28
Kavka
Gudd-Head писал(а):Думаю, если заполнять маску наоборот единицами, то получим нужный порядок. Но можно и этим обойтись.
Достаточно байты обрабатывать в обратном порядке.
Тут как раз так и показано http://radiokot.ru/forum/viewtopic.php? ... 5#p1589625

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

Добавлено: Пн фев 25, 2013 18:34:46
afz
zero648 писал(а):
afz писал(а):А как принято делать двухбайтовые счетчики? Вот мне понадобилось в таймерном прерывании 2400 Гц отсчитать секунду. Я, как на нормальных системах, загрузил в пару регистров 2400 (hi , low), но что-то мне подсказало заглянуть в описание команды DEC. Ага, так и ждал подляны: DEC не взводит бит C. Ну и как прикажете считать? Нет, конечно, мне не составило труда посчитать в одном регистре 100 и во втором 24, но это удобный частный случай, а понадобись посчитать простое число, не влезающее в один регистр, хотя бы 2437 и как тогда принято делать?
Тогда принято первый младший брать с остатком, а старший так и останется, в вашем случае превый младший брать 137, старший 24, остальные младшие грузить по 100, итого 137*1+100*23=2437
О! А вот это - хорошее решение. Я же чувствовал, что что-то такое должно быть - так вот оно! Спасибо!
Kavka писал(а):В данном случае (проверка на равенство нулю) никакой разницы:
cpi r1,0
tst r1
or r1,r1
Ой! CPI R1,0 ? Я же не зря в прошлый раз поправил...

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

Добавлено: Вт фев 26, 2013 10:22:12
Gudd-Head
Kavka писал(а):Достаточно байты обрабатывать в обратном порядке.
Кстати, если кому интересно зачем нужен такой код: http://radiokot.ru/forum/viewtopic.php?f=20&t=85804

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

Добавлено: Вт фев 26, 2013 12:46:02
afz
Только что наткнулся, в отладчике, студия 4.19,8-я Мега. Разрешил ADC, - в ADSRA взвел биты ADEN, ADIE и прескалер 127, в ADMUX выбрал канал 0, "левое" представление и опорник 2.56, ADSC не взводил, иду отладчиком по программе, выполняю команду SLEEP, сам собой взводится бит ADSC и запускается преобразование. Это баг, или фича? Сходу что-то не нашел...

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

Добавлено: Вт фев 26, 2013 12:50:36
Gudd-Head
afz писал(а):выполняю команду SLEEP
Какой конкретно SLEEP? Есть специальный режим для снижения шумов АЦП:
ДАТАШИТ писал(а):22.6 ADC Noise Canceler
The ADC features a noise canceler that enables conversion during sleep mode to reduce noise induced from the CPU core and other I/O peripherals. The noise canceler can be used with ADC Noise Reduction and Idle mode. To make use of this feature, the following procedure should be used:
1. Make sure that the ADC is enabled and is not busy converting. Single Conversion mode must be selected and the ADC conversion complete interrupt must be enabled.
2. Enter ADC Noise Reduction mode (or Idle mode). The ADC will start a conversion once the CPU has been halted.

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

Добавлено: Вт фев 26, 2013 13:06:48
afz
Уже нашел. Idle, в нем тоже делается запуск. Блин, теперь изобретай, как оцифровать сигнал по таймеру - с одной стороны говорят, что у первого преобразования плохая точность, и 25 тактов вместо 13, то есть включить ADC надо заранее, а с другой стороны как прикажете ждать таймер до запуска АЦП? Вероятно, придется в цикле...

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

Добавлено: Вт фев 26, 2013 13:41:58
Alexeyslav
уберите условие "ADC conversion complete interrupt must be enabled." прерывание разрешить уже по таймеру непосредственно перед запуском преобразования.

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

Добавлено: Вт фев 26, 2013 15:59:55
afz
Увы, отладчик утверждает, что ADC ввсе равно запускается. Это значит, что "вздремнув" до таймерного прерывания, я буду вынужден или принять результат ADC, полученный в момент засыпания для ожидания таймера, или очищать ADC вручную, и потом уже запускать его. То есть, конечно, как вариант, пойдет: обработали таймер - засыпаем, АЦП стартует, но прерывания по концу преобразования не дает, новое таймерное прерывание, обрабатываем таймер, снимаем данные АЦП, очищаем его вручную, снова спим + запуск АЦП. Если заниматься только этим - пойдет, а вот развитой многозадачности, увы, не выйдет. Да, фича не совсем приятная и, увы, неотключаемая.

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

Добавлено: Вт фев 26, 2013 18:02:20
Gudd-Head
Known issues на стимулятор и ваш камень читали? Вполне возможно это его глюк.

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

Добавлено: Ср фев 27, 2013 10:21:03
afz
На камень читал, но давно, на симулятор не читал, но подозреваю, что все правильно, это не баг, это фича!

Собственно, с первой задачей я справился, таймерная оцифровка вполне идет - прерывания от АЦП запрещены, SLEEP, выданный по завершении таймерной задачи, запускает АЦП, по следующему таймерному прерыванию снимаю данные и очищаю бит ADIF, далее новый SLEEP и вперед! Проверил в железе, всё ОК! А вот что делать со второй задачей, пока думаю. Надо измерить напряжение в сети 220, в попугаях, я планировал взять переменку с трансформатора (с моста), через резисторы, один конец завести на аналоговый компаратор, ловить уровень возле нуля, в этот момент на втором конце будет максимум, его через делитель на АЦП, и вперед. Но увы, таймер клокает асинхронно от сети, поэтому возможны накладки. Придется, скорее всего, делать таймер высокочастотным (сначала я планировал 150 Гц), чтобы по прерыванию от АК отметиться, а в следующем таймерном прерывании запустить АЦП. То есть, конечно, можно еще приостановить таймер (Sleep Mode ADC Noise Canceler), но тогда таймер будет врать...

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

Добавлено: Ср фев 27, 2013 13:29:49
Alexeyslav
Выпрями переменку... одним диодом достаточно. Либо реализовать УВХ аппаратно - детектор нуля, аналоговый ключ, конденсатор. После ключа на конденсаторе будет всегда последний максимум, причем уже не переменное а постоянное напряжение.

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

Добавлено: Ср фев 27, 2013 14:20:07
afz
Выпрямлял, даже двумя. Делитель для АЦП 30к / 3к или что-то в этом духе, точно уже не помню, 1 мкФ емкость, пульсация 15%. Можно, конечно, поставить 100 мкФ, но будет долго разряжаться при реальном падении. Вот и думаю... В принципе, если частота таймерных прерываний будет несколько кГц (у меня легко получилось 2.4 кГц), берем с моста оба конца переменки, один, через резистор с 4.7-В стабилитроном заводим на компаратор, сравниваем с нулём, второй, через делитель, на АЦП. Получив прерывание от компаратора (это значит, что на этом проводе сейчас мгновенный минимум) взводим флажок, получив таймерное прерывание (это, максимум, через 417 мкс, сетевой синус за это время почти не изменися), при стоящем флажке запускаем АЦП, и вот он максимум в этом периоде сети. Делитель для АЦП все равно нужен, дополнительных деталей - один резистор и один стабилитрон, а не огород с УВХ на 50 Гц.

Добавлено через 2 часа
По дороге домой поразмыслил и решил попробовать вообще обойтись без дополнительной аппаратуры: если цифровать 50-Гц синус с частотой 2400 Гц, то можно банально отследить максимум и этого должно хватить.

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

Добавлено: Пт мар 01, 2013 14:15:42
SmarTrunk
Подскажите, пожалуйста:
Как лучше оформлять программу на ассемблере для AVR, для лучшей читаемости? Самые простые вопросы: Большими буквами писать или маленькими? Делать отступы, для оформления, или нет, табуляцией или пробелами?

Может, есть какие-то средства, помогающие в оформлении? Нет ли такого в AVR-studio 5 или 6?

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

Добавлено: Пт мар 01, 2013 14:20:22
Gudd-Head
Я делаю так

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

sbi PORTB, 2;				подтягиваем порт с кнопкой питания
ldi tmp, 0b00001111;		PC0...PC3 на вывод — шина данных
out DDRC, tmp;				
Т.е. спец.регистры и их биты большими буквами, остальное маленькими. Ну, ещё метки большими.
Отсупы делаю где небольшие циклы крутятся. Все отступы табуляцией.

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

Добавлено: Пт мар 01, 2013 14:28:03
unalex
главное чтобы команды имели равный отступ слева(идин или 2 табулятора) можно и больше, если label не помещается в этот промежуток, а начинать писать команды с новой строки не хочется

заглавными ли прописными - дело вкуса

отступы проще делать табуляцией, меньше нажатий клавиш, да и код ровнее будет

обычно в текстовых редакторах для программистов имеется функция "autoindent" которая при переходе на новую строку делает нужный отступ

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

putc_USART1:
		push r19			;Save r19
		lds r19, UCSR1A		;Load UCSR1A
		sbrs r19, UDRE1		;Check transmit buffer
		rjmp putc_USART1	;if empty -> loop
		sts UDR1, r24		;else -> send data from r24
		pop r19				;restore r19
		ret

getc_USART1:
		push r20			;Save r20
		lds r20, UCSR1A		;Load UCSR1A
		sbrs r20, RXC1		;Check receive buffer
		rjmp getc_USART1	;if empty -> loop
		lds r24, UDR1		;else -> save data to r24
		pop r20				;Restore r20
		ret
парсер немного корявит - комментарии тоже находятся на одной линии

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

Добавлено: Пт мар 01, 2013 15:35:49
ploop
отступы проще делать табуляцией, меньше нажатий клавиш, да и код ровнее будет
Но сохранять в файл пробелами. Надо смотреть настройки редактора, чтобы умел табы пробелами заменять.
Я пользуюсь Sublime Text 2 с плагином подсветки синтаксиса AVR ASM
парсер немного корявит - комментарии тоже находятся на одной линии
Вот это пример использования настоящих табов вместо пробелов. На форум вставить уже проблемы :)
Gudd-Head писал(а):Я делаю так

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

sbi PORTB, 2;				подтягиваем порт с кнопкой питания
ldi tmp, 0b00001111;		PC0...PC3 на вывод — шина данных
out DDRC, tmp;				
Т.е. спец.регистры и их биты большими буквами, остальное маленькими. Ну, ещё метки большими.
Отсупы делаю где небольшие циклы крутятся. Все отступы табуляцией.
Аналогично.

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

Добавлено: Пт мар 01, 2013 16:16:00
afz
Я первым делом перестраиваю Студию на табуляцию в 8 пробелов (в 3-й - 4-й Студии - Tools - Options - Editor, Tab Width).
Комментарии стараюсь писать погуще, через один или несколько табов, причем точку с запятой ставлю уже после табов. Комментарий влезает, обычно, в одну-две строки, а действие бывает длиннее, так я продолжаю колонку точек с запятыми до окончания действия. Следующее действие комментирую на один таб правее или левее. Подобный стиль позволяет вспомнить подробности даже через несколько лет.

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

Добавлено: Пт мар 01, 2013 17:48:12
SmarTrunk
Спасибо большое. Буду думать и пробовать.

А в AVR Studio версий 4, 5 или 6 есть ли какая-то встроенная помощь в оформлении? Или лучше писать в чем-то другом, может, в "Sublime Text 2 с плагином подсветки синтаксиса AVR ASM"