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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Серый_
Опытный кот
Сообщения: 708
Зарегистрирован: Пт ноя 30, 2007 14:40:44

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

Сообщение Серый_ »

Спс. Опробирую. P. s. опробовал пока на дебагинге = работает. Нечто близкое к гениальному! :)
Реклама
Аватара пользователя
Vicont
Прорезались зубы
Сообщения: 201
Зарегистрирован: Пт июл 25, 2008 14:09:04
Откуда: Зауралье
Контактная информация:

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

Сообщение Vicont »

Мяу, товарищи! :)
Только что читал книгу Юрия Ревича "'Практическое программирование микроконтроллеров Atmel AVR на языке ассемблера" о локальных и глобальных переменных:
Изображение

Программный код, приведенный в листинге 6.15, вызвал у мя некоторое недоумение.
Согласно логике автора, сначала значения 2-х переменных сохраняются в стеке, потом вызывается подпрограмма, и сразу после этого, сохраненные ранее значения вынимаются из стека, и присваиваются двум соответствующим локальным переменным.
НО! Насколько я понимаю, при вызове подпрограммы, в стеке должно еще сохраниться значение адреса следующей команды за "вызывалкой". Таким образом, переменной var_loc2 вместо значения var_2 должен присвоиться адрес строки "pop var_2", а переменной var_loc1 вместо значения var_1 должен присвоиться var_2, и далее путаница продолжится...

Так вот, товарищи, подскажите, пожалуйста, это я чего-то недопонимаю, или автор столь умной книжки ошибся ??? :roll:
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Vicont писал(а):Так вот, товарищи, подскажите, пожалуйста, это я чего-то недопонимаю, или автор столь умной книжки ошибся ??? :roll:
вы не ошиблись. выбросьте эту книжку! если в не есть такие ошибки - мало ли что там еще будет "рекомендовано"?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

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

Сообщение Jack_A »

Да, код - бред сивой кобылы. Хотя это не значит, что через стек нельзя принимать/передавать параметры. Но это делается не таким тупым способом, как в примере, а с определенными плясками. Наверно, овчинка не стоит... Лучше договориться самому с собой о порядке использования для этих целей группы регистров. :)
В языках высокого уровня на РС так действительно делается, но там совсем другая архитектура.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ks0
Прорезались зубы
Сообщения: 232
Зарегистрирован: Чт фев 28, 2013 14:16:10

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

Сообщение ks0 »

Jack_A писал(а):Лучше договориться самому с собой о порядке использования для этих целей группы регистров. :)
Листал книжку Цифровая схемотехника и архитектура компьютера /Дэвид М. Харрис и Сара Л. Харрис/ (распространяется в сети бесплатно), понравилось как организованы регистры в описываемой архитектуре MIPS. Их также более 30 шт, но они имеют более осмысленные названия, говорящие об их использовании.

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

Название       Номер              Назначение
$0               0              Константный нуль
$at              1              Временный регистр для нужд ассемблера
$v0–$v1         2–3             Возвращаемые функциями значения
$a0–$a3         4–7             Аргументы функций
$t0–$t7         8–15            Временные переменные
$s0–$s7         16–23           Сохраняемые переменные
$t8–$t9         24–25           Временные переменные
$k0–$k1         26–27           Временные переменные операционной системы (ОС)
$gp             28              Глобальный указатель (англ.: global pointer)
$sp             29              Указатель стека (англ.: stack pointer)
$fp             30              Указатель кадра стека (англ.: frame pointer)
$ra             31              Регистр адреса возврата из функции
Т.е, например при вызове подпрограммы аргументы помещаются в регистры a0-a3, и результаты будет в v0-v1. В регистрах t8-t9 значения могут быть потеряны, но в s0-s7 обязаные быть сохранены. Все это, конечно условность, но зато как продумано! Если много писать на ассемблере для авр, то я бы и там переопределения (.def) сделал.
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15553
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Так обычно и делается. 8)
Однако...
Обычно в программе несколько различных модулей. Хорошо, если их можно "раскидать" по уже имеющимся регистрам с однозначной привязкой.
А вот в случае, когда прийдется одному регистру в разных подпрограммах разные задачи (и соответственно имена) давать последуют некоторые сложности (зависит от компилятора).
Если у ячейки ОЗУ в принципе может быть несколько символических имен, то у регистра в регистровом файле только одно (или undet потребуется для АВР).
Так что модель разметки - это весьма творческое дело и зависит как от личных предпочтений, так и от конкретной архитектуры МК и потребных в конструкции ресурсов. Плюс особенности применяемого компилятора учитывать надо.
Я как-то попытался попробовать эту тему поглубже копнуть (в своем "монологе") предложил на обсуждение вот такой набросок http://radiokot.ru/forum/download/file.php?id=204531... но ответов не обнаружилось пока.
:beer:
Реклама
Аватара пользователя
Vicont
Прорезались зубы
Сообщения: 201
Зарегистрирован: Пт июл 25, 2008 14:09:04
Откуда: Зауралье
Контактная информация:

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

Сообщение Vicont »

Товарищи, всем спасибо за советы!
Приятно сознавать, что мя правильно понимаю некоторые из особенностей работы AVR - это вдохновляет на новые свершения. :)
Подобные книжки буду читать с осторожностью, ведь альтернатив на русском языке об ассемблере для AVR довольно мало. :(
ks0 писал(а):понравилось как организованы регистры в описываемой архитектуре MIPS. Их также более 30 шт, но они имеют более осмысленные названия, говорящие об их использовании.
Интересный прием. Ко мне порой тоже приходили подобные мысли, чтобы в одних регистрах хранились аргументы для функций, в других временные значения, а в третьих - результаты. НО! Если вовремя выполнения какой-нибудь функции случайным образом сработает какое-нибудь прерывание, которое будет работать с теми же регистрами, то произойдет сбой программы. Конечно, во время выполнения такой функции все прерывания можно запретить, но если функция громоздкая, то прерывание можно просто проморгать. :roll:

Конечно, у архитектуры MIPS в этом плане больше возможностей, ведь ее разрядность может быть от 32-х до 64-х бит. На АВР если функция простая, чтобы задать исходные значения, может хватить 2-х регистров, а если функция сложная, то от 3 до 6. В MIPS для тех же самых целей может хватить 1 - 2 регистра.

Jack_A, Вы правы, тут сложнее всего самому с собой договориться... :beer:
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

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

Сообщение Jack_A »

Я выделил себе группу регистров, которые использовал для передачи параметров и в подпрограммах их не использовал . При крайней необходимости в подпрограмме сохранял их в стеке. А в главной программе можно с ними делать что угодно, только к моменту вызова п/п оттуда все забрать. Остается проблема вложенных п/п . Но тут стек нам в помощь.
Еще неплохой, я считаю, метод - передавать в п/п указатель на область ОЗУ, где лежат входные параметры и куда складывать выходные.
Насчет прерываний. Правила хорошего программирования рекомендуют сохранять в стеке все используемые в обработчике регистры, тогда прерывание никаких бед не натворит. А запрещать его - в крайних, критически важных по времени случаях, например - запись в EEPROM.
Аватара пользователя
Vicont
Прорезались зубы
Сообщения: 201
Зарегистрирован: Пт июл 25, 2008 14:09:04
Откуда: Зауралье
Контактная информация:

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

Сообщение Vicont »

Jack_A писал(а): использовал для передачи параметров...
Что Вы под этим подразумеваете? :roll:
Jack_A писал(а):Правила хорошего программирования рекомендуют сохранять в стеке все используемые в обработчике регистры, тогда прерывание никаких бед не натворит.
Семен Семеныч! :facepalm:
А ведь и правда, оказывается, всё гениальное - просто!
Спасибо. Обязательно учту в будущем этот прием. :)
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Сообщение СКАЗОЧНИК »

Jack_A писал(а):рекомендуют сохранять в стеке все используемые в обработчике регистры, тогда прерывание никаких бед не натворит.
Вот, кто бы что не говорил, а у Ревича, даже с его косяками, это есть и написано. )))) Просто, действительно, надо читать вдумчиво и все проверять.
Станислав
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15553
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Очепятки в разумных пределах у всех возможны. 8)
Насчет стека...
У ПИКова семейства есть его подвид - так называемый быстрый(теневой) стек.
В АВРке также подобный прием возможен - переброс пары регистров (нескольких пар) из полнофункциональной части в младший блок регистрового файла - все равно там с непосредственными данными работать неудобно, а как хранилище -весьма подходяще.
:roll:
Аватара пользователя
Серый_
Опытный кот
Сообщения: 708
Зарегистрирован: Пт ноя 30, 2007 14:40:44

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

Сообщение Серый_ »

Vicont писал(а):на русском языке об ассемблере для AVR довольно мало. :(
Изображение :)
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

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

Сообщение Jack_A »

Vicont писал(а):
Jack_A писал(а): использовал для передачи параметров...
Что Вы под этим подразумеваете? :roll:
Я ничего не подразумеваю - это общепринятые понятия в программировании. В подпрограмму(функцию) передаются аргументы - параметры, которые нужно обработать ( по значению или по ссылке - это не принципиально ). Заканчивая работу, функция в определенное место возвращает вычисленное значение, подпрограмма - одно или несколько значений. В общем случае она может изменять только значение глобальных переменных, в этом случае выходных параметров может и не быть.
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Сообщение СКАЗОЧНИК »

Елки, прочитал уже 60 страниц книги Белова (см. выше), очень нравится. Не сильно подробно, но вполне доступно, логично и последовательно подается информация.
Спасибо, что рекомендовали. :beer:
Купил бы в бумажном варианте, но в местном ПродалитЪе нету, а заказывать мне лень... :)))
Станислав
Аватара пользователя
alex38779
Потрогал лапой паяльник
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32
Контактная информация:

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

Сообщение alex38779 »

ни как не могу улететь в прерывание. мяу :(

мега8, аврстудия, прерывание от таймера Т0
флаг I стоит, TOIE0 тоже.

вот вектор и обработчик прерывания

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

	; птчк взлитай------------------------------
	.org $00
	; старт основной программы------------------
	rjmp Start
	; вектора прерываний------------------------	
	.org $01 ; External Interrupt Request 0
		reti
	.org $02 ; External Interrupt Request 1
		reti
	.org $03 ; Timer/Counter2 Compare Match
		reti
	.org $04 ; Timer/Counter2 Overflow
		reti
	.org $05 ; Timer/Counter1 Capture Event
		reti
	.org $06 ; Timer/Counter1 Compare Match A
		reti 
	.org $07 ; Timer/Counter1 Compare Match B
		reti
	.org $08 ; Timer/Counter1 Overflow
		reti
	.org $09 ; Timer/Counter0 Overflow
		rjmp ovf_tim0
	.org $0a ; Serial Transfer Complete
		reti
	.org $0b ; USART, Rx Complete
		reti
	.org $0c ; USART Data Register Empty
		reti
	.org $0d ; USART, Tx Complete
		reti
	.org $0e ; ADC Conversion Complete
		reti
	.org $0f ; EEPROM Ready
		reti
	.org $10 ; Analog Comparator
		reti
	.org $11 ; 2-wire Serial Interface
		reti
	.org $12 ; Store Program Memory Ready
		reti
	.org INT_VECTORS_SIZE ; конец таблицы прерываний
	;обработка прерываний------------------------------
ovf_tim0:
	ldi r17, $ff
	reti
настройка таймера:

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

   .equ tim0_tccr0 = (1<<CS01)
	.equ tim0_tcnt  = $60
	.equ tim0_timsk = (1<<TOIE0) ; 
и перед главным циклом программы:

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

   ldi r16, tim0_tccr0 
	out TCCR0, r16
	ldi r16, tim0_tcnt
	out TCNT0, r16
	ldi r16, tim0_timsk	
	out TIMSK, r16
	sei	
шо может быть не так?
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Да, вроде, всё так. Ниже показывается, что каждые 1281/1287 тактов идёт изменение выводов порта B
Спойлер

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

	.INCLUDE "m8def.inc"

   .equ tim0_tccr0 = (1<<CS01)
   .equ tim0_tcnt  = $60
   .equ tim0_timsk = (1<<TOIE0) ;    ; птчк взлитай------------------------------

   .org $00
   ; старт основной программы------------------
   rjmp Start
   ; вектора прерываний------------------------   
   .org $01 ; External Interrupt Request 0
      reti
   .org $02 ; External Interrupt Request 1
      reti
   .org $03 ; Timer/Counter2 Compare Match
      reti
   .org $04 ; Timer/Counter2 Overflow
      reti
   .org $05 ; Timer/Counter1 Capture Event
      reti
   .org $06 ; Timer/Counter1 Compare Match A
      reti
   .org $07 ; Timer/Counter1 Compare Match B
      reti
   .org $08 ; Timer/Counter1 Overflow
      reti
   .org $09 ; Timer/Counter0 Overflow
      rjmp ovf_tim0
   .org $0a ; Serial Transfer Complete
      reti
   .org $0b ; USART, Rx Complete
      reti
   .org $0c ; USART Data Register Empty
      reti
   .org $0d ; USART, Tx Complete
      reti
   .org $0e ; ADC Conversion Complete
      reti
   .org $0f ; EEPROM Ready
      reti
   .org $10 ; Analog Comparator
      reti
   .org $11 ; 2-wire Serial Interface
      reti
   .org $12 ; Store Program Memory Ready
      reti
   .org INT_VECTORS_SIZE ; конец таблицы прерываний
   ;обработка прерываний------------------------------
ovf_tim0:
	OUT	TCNT0,R18
;   ldi r17, $ff
   IN	R16,PORTB
   EOR	R16,R17
   OUT	PORTB,R16
   reti


START:
	LDI	XH,HIGH(RAMEND)
	OUT	SPH,XH
	LDI	XL,LOW(RAMEND)
	OUT	SPL,XL

	LDI	R17,$FF
	OUT	DDRB,R17

   ldi r16, tim0_tccr0
   out TCCR0, r16
   ldi r18, tim0_tcnt
   out TCNT0, r18
;   ldi r16, tim0_tcnt
;   out TCNT0, r16
   ldi r16, tim0_timsk   
   out TIMSK, r16
   sei   

	RJMP	PC
.EXIT
Аватара пользователя
alex38779
Потрогал лапой паяльник
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32
Контактная информация:

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

Сообщение alex38779 »

Может авр студия погнала? У меня 6 версии, попробую 5 скачать и проверить.

Так и было, в 5 версии все заработало..
Аватара пользователя
alex38779
Потрогал лапой паяльник
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32
Контактная информация:

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

Сообщение alex38779 »

Помогите с алгоритмом, на си было два цикла, была переменная bool и вокруг нее плясали циклы. true - первый цикл, false - второй. кнопка рулила этой переменной, переключая циклы.
как на асме сделать подобное?

Вот нагородил что то, но думаю не правильно все таки сделал. Может как то использовать регистр, либо флаг T например. Как вообще можно заменить булевый тип в асме?

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

MainLoop:
	; вызываем программы
menu:
	in temp, PIND
	sbrc temp, 0	
	rjmp start_auto
	nop
	nop
	nop
	rjmp menu
start_auto:
	in temp, PIND
	sbrc temp, 0	
	rjmp menu
	nop
	nop
	nop
	nop
	rjmp start_auto
	rjmp MainLoop
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

alex38779 писал(а): in temp, PIND
sbrc temp, 0
Можно использовать 1 команду

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

sbic PIND, 0
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Может так?

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

MainLoop:
   ; вызываем программы
menu:
   SBIS PIND,0   
   rjmp start_auto
   adiw r24, $a		;эта команда работает с регистровыми парами R25:R24, X, Y, Z
;   adiw r16, $a
   nop
   nop
   nop
   rjmp menu
start_auto:
   SBIC PIND,0   
   rjmp menu
   nop
   nop
   nop
   nop
   rjmp start_auto
;   rjmp MainLoop

.EXIT
Ответить

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