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

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Аватара пользователя
Сообщения: 107
Зарегистрирован: Ср авг 05, 2015 19:34:20

Сообщение siimao »

Ух ты!!! Я и не знал, но очень в этом нуждался.
Спасибо всем за ответы!
Alexeyslav, а где в AVR Studio задаются параметры компиляции (скомпилированный с/без отладочными данными)
Реклама
Открыл глаза
Сообщения: 55
Зарегистрирован: Вс май 03, 2015 15:05:58

Сообщение Feruz »

Здравствуйте!
Мега128А, 7372800 Гц, таймер в режиме СТС (№4), делитель 1024, должен переключать порт PB5(OC1A) с частотой 1 Гц (OCR1A=3599). Протеус кажет период что-то 4.4 мс, вместо положенной 1 с. Что не так? Опять прибабах протеуса?

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

	ldi r_temp, (0<<COM1A1)|(1<<COM1A0)|(0<<WGM11)|(0<<WGM10)
	out TCCR1A, r_temp

	ldi r_temp, 0x0F
	out OCR1AL, r_temp

	ldi r_temp, 0x0E
	out OCR1AH, r_temp

	ldi r_temp, (0<<WGM13)|(1<<WGM12)|(1<<CS12)|(0<<CS11)|(1<<CS10)
	out TCCR1B, r_temp
Добавлено after 15 minutes 26 seconds:
О Боги, каюсь, грешен! Сначала же надо записывать старший а затем младший регистры сравнения!
Реклама
akl
Друг Кота
Сообщения: 4472
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

16-разрядные регистры таймеров должны заносить в порядке старший-младший

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

   ldi r_temp, 0x0E
   out OCR1AH, r_temp

   ldi r_temp, 0x0F
   out OCR1AL, r_temp

   ldi r_temp, (0<<COM1A1)|(1<<COM1A0)|(0<<WGM11)|(0<<WGM10)
   out TCCR1A, r_temp

;   ldi r_temp, 0x0F
 ;  out OCR1AL, r_temp

  ; ldi r_temp, 0x0E
   ;out OCR1AH, r_temp

   ldi r_temp, (0<<WGM13)|(1<<WGM12)|(1<<CS12)|(0<<CS11)|(1<<CS10)
   out TCCR1B, r_temp

Открыл глаза
Аватара пользователя
Сообщения: 63
Зарегистрирован: Пн апр 20, 2015 14:00:32

Сообщение Мяукните! »

Сделал стартовый комплект на чистом ассемблере. Для компиляции используются утилиты GCC. Для написания программ - только ваш любимый блокнот! :)
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 3342
Зарегистрирован: Ср янв 02, 2013 08:37:35

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

[uquote="Demiurg",url="/forum/viewtopic.php?p=3301945#p3301945"]Ерундой болтать изволите. Вдобавок позиционируете себя как не новичок, но вышло ровно наеборот.[/uquote]
Читать не пробовал внимательней?
Demiurg писал(а):1 - никакого сравнения регистров авр с другими мк. Аккумуляторы на других мк.
Не понял, что ты хочешь донести.
Demiurg писал(а):2 - любые регистры можно испрользовать где хочешь, как хочешь. Главное, что ты понимаешь, что делаешь. И учитываем, что у младших регистров ограничения по командам.
Я разве писал, что их нельзя использовать?
Demiurg писал(а):3 - Порядок сохранения регистров в прерываний произвольный, вот как тебе на душу ляжет. Главное правило, как правильно сохранять SREG и порядок восстановления регистров.
Вот тут ты не прав… главное правило как я уже писал: всегда первым в стек сохраняется регистр r16, а вот все последующие уже не имеют упорядоченного значения. Так как если не использовать это правило, то данные регистра r16 будут утеряны.
Demiurg писал(а):4 - Сохранять и восстанавливать нужно только те регистры, которые используются в обработчике прерывания.
Я об этом и писал... читай внимательней.
Реклама
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

Сообщение dgrett »

Да прав Demiurg, прав.. Чем R16 такой особенный?
Имел он ввиду, что нет аккумулятора в AVR,это ж не Z80
Я всё-всё узнAю и стану профессором.
Реклама
akl
Друг Кота
Сообщения: 4472
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Мяукните! Ассемблер AVR самодостаточен и не нуждается в сторонней поддержке.
ASM_M328P.zip
Загрузить .asm в блокнот - сделать изменения - сохранить - вызвать .bat - полученный .hex и .eep записать в камень.
Друг Кота
Сообщения: 3342
Зарегистрирован: Ср янв 02, 2013 08:37:35

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

[uquote="dgrett",url="/forum/viewtopic.php?p=3304606#p3304606"]Да прав Demiurg, прав..[/uquote]
Я не настаиваю… вам профессионалам виднее…
Чем R16 такой особенный?
Он не особенный… дело в компиляторах.
Имел он ввиду, что нет аккумулятора в AVR,это ж не Z80
Где я писал, что он у AVR есть!? :facepalm: Вопрос риторический…
Это не хвост, это антенна
Сообщения: 1495
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

АСУ писал(а):...
Все написанное вами раскрывает следующее: вы натягиваете сову на авр. У вас какие-то свои представления об этих МК, притом сопоставляющие с теми, с какими работали до авр. Также ваше недопонимание родило неверные правила работы с регистрами авр. Поясняю: у авр есть младшие регистры, r0-r15; старшие r16-r31. Их разница только в том, что с младшими регистрами не все инструкции действуют. Порядок сохранения и восстановления может быть абсолютно произвольный. Вообще покуй. Главное - последовательность действий.

Особое внимание нужно уделить регистрам r0 и r1. Во-первых, в r0 могут считываются данные из памяти программ. Во-вторых, в этих регистрах загружается результат при операции умножения.

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

//========
push r2 // Если этот регистр участвует в программе.
in r2, SREG
push r2
//bla-bla
pop r2
out SREG, r2
pop r2
reti // или ret, если не нужны прерывания.
//========

//========
push r16 // Если этот регистр участвует в программе.
in r16, SREG
push r16
// bla-bla
pop r16
out SREG, r16
pop r16
reti // или ret, если не нужны прерывания.
//========

//========
// Можно вообще так:
.def RSREG = r5 // И использовать этот регистр для сохранения восстановления SREG

in RSREG, SREG
//bla-bla
out SREG, RSREG
reti // или ret, если не нужны прерывания.
//========

//========
push r31
push r17
push r16
push r19
in r19, SREG
push r19
// bla-bla
pop r19
out SREG, r19
pop r19
pop r16
pop r17
pop r31
reti // или ret, если не нужны прерывания.
//========
Контактная информация:
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

Сообщение dgrett »

АСУ,вот здесь, слово КАК - не в счёт[uquote="АСУ",url="/forum/viewtopic.php?p=3301171#p3301171"][uquote="Гефестион",url="/forum/viewtopic.php?p=3301130#p3301130"]сначала никак не хотела работать, поскольку я пробовал регистры R16, R17, R18.[/uquote]
Регистр r16 и r17 у AVR используются как аккумулятор… для новичков их использование не рекомендуется. Тебе нужно взять в привычку при любом прерывании сохранять в стек значения регистров r16, r17 и SREG, а при выходе из прерывания возвращать из стека сохраненные значения этих регистров. Небольшой нюанс при сохранении заключается в следующем: всегда первым сохраняется регистр r16 все последующие не имеют упорядоченного значения. Извлекаются значения из стека строго в обратной последовательности (r16 последним). Таким же образом поступают и с теми регистрами, которые используются как в основном теле программы, так и задействованы в теле прерывания.[/uquote]
Я всё-всё узнAю и стану профессором.
Друг Кота
Сообщения: 3342
Зарегистрирован: Ср янв 02, 2013 08:37:35

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

[uquote="Demiurg",url="/forum/viewtopic.php?p=3304674#p3304674"]...[/uquote]
Если не уловили суть сказанного, то можно было бы просто переспросить, а не надувать щёки… всё тобой изложенное не является секретной информацией… я выше уже объяснил, что дело не в самом регистре, а в компиляторе… впрочем не важно... я не настаиваю.

Добавлено after 3 minutes 44 seconds:
[uquote="dgrett",url="/forum/viewtopic.php?p=3304685#p3304685"]АСУ,вот здесь, слово КАК - не в счёт[/uquote]
Понятно… :facepalm:
Это не хвост, это антенна
Сообщения: 1495
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

[uquote="АСУ",url="/forum/viewtopic.php?p=3304687#p3304687"]...[/uquote]
Щеки как раз вы надули. Типа вы не новичок. И написали так как вы понимаете, но не так как есть. Раздувать дальше спор и писькомеряние нет смысла.
Контактная информация:
Друг Кота
Сообщения: 3342
Зарегистрирован: Ср янв 02, 2013 08:37:35

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

[uquote="Demiurg",url="/forum/viewtopic.php?p=3304696#p3304696"]Щеки как раз вы надули. Типа вы не новичок.[/uquote]
Пусть будет по твоему, раз тебе так легче… я не программист, потому амбиций никаких… могу быть и новичком – меня это не задевает.

ЗЫ. А суть заключалась в следующем… чтобы сохранить регистр SREG в стек, необходимо дополнительно использовать рабочий регистр… как «правило» большинство используют регистр r16… тем самым его же могу использовать и в теле основной программы или в подпрограммах… если программа большая то отслеживать это проблематично… я поступаю проще, при сохранении регистра SREG в стек использую всегда только r16… предварительно сохранив его же значения в стек. Мне это помогает не наступать на грабли…
Это не хвост, это антенна
Сообщения: 1495
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

SREG вы можете сохранять в любой регистр, также отвести специальный регистр только для этой задачи. Второй метод нельзя использовать, если в обработчике прерывании вы разрешаете прерывания. В этом случае только через стек, либо если позволяет, для одного обработчика один регистр, для другого обработчика другой. Сохранение SREG в регистр уменьшает размер программы и количество тактов на обработку прерывания. 2 такта против 6.
Также нужно помнить, что в обработчике нужно сохранять только те регистры, которые используются в основном цикле.
Есть еще такой способ. Для обработчика прерывания использовать только свои регистры. Это также экономит память программ и такты. Но тут зависит от задачи и кол-ва используемых регистров.
Последний раз редактировалось Demiurg Пт фев 09, 2018 11:48:55, всего редактировалось 1 раз.
Контактная информация:
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

Сообщение dgrett »

Просто IN [НЕИСПОЛЬЗУЕМЫЙ РЕГИСТР],SREG
Неужто все-все регистры задействованы? И в стек пихать его необязательно
Я всё-всё узнAю и стану профессором.
akl
Друг Кота
Сообщения: 4472
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Можно вообще не сохранять SREG, если использовать в обработчике команды, не трогающие оный.
Это не хвост, это антенна
Сообщения: 1495
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

akl писал(а):Можно вообще не сохранять SREG, если использовать в обработчике команды, не трогающие оный.
Тоже верно.
Контактная информация:
Открыл глаза
Аватара пользователя
Сообщения: 63
Зарегистрирован: Пн апр 20, 2015 14:00:32

Сообщение Мяукните! »

[uquote="akl",url="/forum/viewtopic.php?p=3304610#p3304610"]Мяукните! Ассемблер AVR самодостаточен и не нуждается в сторонней поддержке.[/uquote]
Возможно.. Для крошечных программок. Но avrasm это заброшенный проект. И таких проектов много. Вопросов к нему то же много. Если вы напишете программу в десятки тысяч строк, то сойдёте с ума. Метки на русском недопустимы.

avrasm не понимает русские имена файлов. Не разрешает пробелы в именах. Думаю это далеко не все подводные камни... То же самое и в keil.

GCC ассемблер - это единая среда для многих ядер. Весьма развитая. И это здорово упрощает работу.
Контактная информация:
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт сен 10, 2015 06:59:03
Откуда: Гродно, BY

Сообщение trofim2 »

Покажи описание на GCC ассемблер.
Ответить

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