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

Обсуждаем контроллеры компании Atmel.
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

даже когда вызываю через rcall, все ровно кидает в начало.
Если выход из подпрограммы по RET, то вход в оную по RCALL (CALL), при этом внутри п/п, как Вам уже писали, не должно быть смещения указателя стека. Если, ни жить ни быть, хотите сохранить в стеке, что-то сделать и вспомнить прежнее содержимое, не нужно оформлять п/п. В крайнем случае, при многократном обращении, оформить макросами.
Спойлер

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

 main:
;   rjmp staskSave
 staskSave:
   push r16
   push r17
   push r18
   push r19
   push r20
   push r21
   push r22
   push r23
   push r24
   push r25
   push r26
   push r27
   push r28
   push r29
   push r30
   push r31

;   ret
   ;число в оперативку
   ldi YL, low(1234)
   ldi YH, high(1234)   
   ld r16, Y+
   ld r17, Y+
   ldi XL, byte1(596)
   ldi XH, byte2(596)
   st Y+, XH
   st Y+, XL
   ;разложение на разряды
   ;rjmp todigit   
;   rjmp staskLoad
;   rjmp main
 

 staskLoad:
   pop r31
   pop r30
   pop r29
   pop r28
   pop r27
   pop r26
   pop r25
   pop r24
   pop r23
   pop r22
   pop r21
   pop r20
   pop r19
   pop r18
   pop r17
   pop r16

   rjmp main
Присвоение ячейкам ОЗУ символьных имен предполагает их использование. Сейчас в программе почему-то используется абсолютные адреса, к тому же находящиеся вне области адресов имеющегося ОЗУ.
Реклама
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

Я пока товарищу alex38779 немного объяснял про стек, сам понял как работает обратил внимание, что на некоторых русских ресурсах пишут что при изменении SPL блокируются прерывания на 4 такта. В симуляторе Atmel Studio 6 этому я подтверждения не увидел. Есть где-то подтверждение этому в первоисточниках?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Из DS на ATtiny2313
Interrupt Response Time
The interrupt execution response for all the enabled AVR interrupts is four clock cycles minimum. After four clock cycles the program vector address for the actual interrupt handling routine is executed. During this four clock cycle period, the Program Counter is pushed onto the Stack. The vector is normally a jump to the interrupt routine, and this jump takes three clock cycles. If an interrupt occurs during execution of a multi-cycle instruction, this instruction is completed
before the interrupt is served. If an interrupt occurs when the MCU is in sleep mode, the interrupt execution response time is increased by four clock cycles. This increase comes in addition to the start-up time from the selected sleep mode.
A return from an interrupt handling routine takes four clock cycles. During these four clock cycles, the Program Counter (two bytes) is popped back from the Stack, the Stack Pointer is incremented by two, and the I-bit in SREG is set.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

Но это не то, это время реакции на событие. Вот цитата отсюда.
"Чтобы предотвратить сбой в выполнении программы при программном обновлении указателя стека, операция записи в SPL приводит к автоматическому отключению прерываний на время выполнения до четырех инструкций или до следующей операции записи в память ввода-вывода."
Откуда ноги растут я не знаю.

Предположим возникло некое событие по которому разрешено прерывание. Согласно Вашей цитате из даташит и моему разумению, сразу сохраняется счетчик команд на стек за 4 такта и переход в подпрограмму за 3 такта (видимо с учетом времени выполнения команды RJMP в таблице векторов), итого 7 тактов.

Если верить сомнительному утверждению об автоматическом отключении прерывания при изменении SPL, то получается, если событие возникло одновременно с изменением этого регистра, то время реакции увеличится до следующей операции записи в память, но не более чем на 4 такта.

Вообще конечно, вряд ли возникнет необходимость менять указатель стека по ходу программы, а если возникнет, то лучше ручками запретить прерывания, но все же, верно ли утверджение о блокировке до 4 тактов или это как всегда, один умник сморозил, а остальные ресурсы копируют?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Эиком - электронные компоненты и радиодетали
dgrett
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

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

Сообщение dgrett »

PUSH, POP тоже меняет SP. Так и в этом случае тоже?
Я всё-всё узнAю и стану профессором.
Реклама
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

Так, стоп. Не собирайте все в кучу. push pop занимает по 2 такта. Это операции со стеком. Про 4 такта при записи в SPL лично я слышу впервые. Хотя с AVR работаю достаточно долго и изучил вдоль и поперек. Уточню, отпишусь.
Реклама
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

Да я вот тоже впервые. Чушь наверное какая-то.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

Скорее всего, здесь неточности перевода. Пусть автор написанного приведет источник.
Проверку можно сделать. Но если честно лениво. Я от асма уже несколько лет как отошел. Нужно написать программу с выводом на ЖКИ дисплей, семисегментник. Запускаем таймер без делителей, пишем в SPL. Сразу же после команды записи в SPL считать значение таймера и вывести на дисплей.
Стоп, речь идет о отключении прерываний. Хм... И так как на время записи в SPL, то хрен ты как-либо считаешь флаги...
Вполне возможно это справедливо для ранних моделей AVR.
Боюсь, тут нужно обращаться напрямую к ATMEL.
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Z_h_e писал(а):...Чушь наверное какая-то.
Проверил на макете с помощью такой программы. 50кГц, что в SLEEP, что с записью в SPL переменного значения или RAMEND, как формировались так и продолжали формироваться точно. По мне, не надо никуда обращаться, а изучать первоисточники.
Спойлер

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

;проба вывода на PB0...3 и PB4...7 противофазных импульсов частоты 50кГц

	.INCLUDE "tn2313def.inc"

.equ	Fo=8000000

.CSEG
.ORG 0x0000
;	LDI	R25,LOW(RAMEND)
;	OUT	SPL,R25

	SBI	ACSR,ACD

;	LDI	R20,1<<SE
;	OUT	MCUCR,R20

	SER	R22
	OUT	DDRB,R22
	OUT	DDRD,R22
	RJMP	START
;***********************************
T0_COMPA:
	OUT	PORTB,R24
	RETI
.ORG 0x000D
	RJMP	T0_COMPA
.ORG 0x000E
T0_COMPB:
	NOP
	OUT	PORTB,R23
	RETI
;***********************************
START:
	LDI	R23,0b11110000
	LDI	R24,0b00001111
	LDI	R16,Fo/50000-1
	OUT	OCR0A,R16
	LDI	R16,Fo/50000/2
	OUT	OCR0B,R16

	LDI	R16,0b00000011			; режим FAST PWM 7 
	OUT	TCCR0A,R16

	LDI	R16,0b00001001
	OUT	TCCR0B,R16				; Fo/1 режим FAST PWM 7

	LDI	R16,1<<OCIE0A|1<<OCIE0B
	OUT	TIMSK,R16
	OUT	TIFR,R16

	SEI
	LDI	R25,LOW(RAMEND)
;********************
WAIT:
	OUT	SPL,R25
	SUBI	R25,1
	CPI	R25,$70
	BRSH	WAIT
	RJMP	WAIT-1
;	SLEEP
;	RJMP	WAIT
.EXIT
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

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

Сообщение Kavka »

Z_h_e писал(а):отсюда.
"Чтобы предотвратить сбой в выполнении программы при программном обновлении указателя стека, операция записи в SPL приводит к автоматическому отключению прерываний на время выполнения до четырех инструкций или до следующей операции записи в память ввода-вывода."
Приведённая ссылка на раздел 3.8 вот отсюда - тынц Это ж об ATXmegaA
Хотя и про X-меги я такого не нашёл (плохо искал?).

А про обычные атмеги... Дока на мегу32a, раздел "7.7.1 Interrupt Response Time" (время реакции на прерывание). Далее вольный перевод...
The interrupt execution response for all the enabled AVR interrupts is four clock cycles minimum.
After four clock cycles the program vector address for the actual interrupt handling routine is executed.
During this four clock cycle period, the Program Counter is pushed onto the Stack.

Отклик на прерывание всех разрешённых прерываний составляет минимум 4 цикла (периода тактового сигнала).
После этих 4 циклов исполняется команда находящаяся по адресу вектора активного прерывания. (исполняется "вектор")
За эти 4 цикла счётчик команд задвигается в стек.

Минимум 4 такта будет только когда прерывание возникает во время инструкции длительностью 1 такт.

The vector is normally a jump to the interrupt routine, and
this jump takes three clock cycles.

"Вектор" обычно представляет собой переход на процедуру обработки прерывания, и этот переход занимает 3 цикла тактового сигнала.
Т.е. уход в процедуру обработки это ещё 2-3 такта (RJMP или JMP).

Дальше самое интересное.
If an interrupt occurs during execution of a multi-cycle instruction, this instruction
is completed before the interrupt is served.

Если прерывание происходит во время инструкции выполняющейся несколько тактов, то эта инструкция завершается прежде чем начинается обработка прерывания.
Т.е. прерывания не запрещаются, а просто не обрабатываются во время исполнения инструкции.
Обработка прерывания начинается по фронту тактового сигнала только "между" инструкциями процессора.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

Kavka писал(а):...
Это уже похоже на правду. Баловство со стеком считаем критической секцией, потому сохраняем SREG, запрещаем прерывания, работаем со стеком, потом восстанавливаем SREG.
Аватара пользователя
Buckwheat
Родился
Сообщения: 6
Зарегистрирован: Вс сен 13, 2015 11:09:10

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

Сообщение Buckwheat »

Привет. Кто-нибудь linux пользуется? В чем код пишете, и, главное, как отлаживаете? Есть какой-нибудь годный туториал по настройке того же eclipse или можно что-нибудь менее изощренное использовать?
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

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

Сообщение Kavka »

Buckwheat, есть. И даже не то чтобы пользуется, даже работает под линуксом :)))
Лично у меня вот это дало первой строчкой вот это. :)
Вот это первая часть из серии от уважаемого ARV. Пусть не под линукс, но про Eclipse.
Ищите и найдёте

Писать можно хоть в Kate. Компиляторов непосредственно под линукс как минимум два - avra и gcc-шный. Диалекты чуток отличаются. Можно avrasm2.exe из под wine запускать если сильно хочется.
Программаторы и МК любые, которые понимаются uisp-ом и avrdude-ом.
Отладкой и симуляторами пока не заморачивался - подсказать особо ничего не могу.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
KyPA
Открыл глаза
Сообщения: 76
Зарегистрирован: Пт май 28, 2010 10:26:08

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

Сообщение KyPA »

Добрый вечер. Нужно реализовать операцию с битами двух регистров, соответственно таблице истинности:
1,1=0
0,0=0
1,0=1
0,1=0
или импликации
1,1=1
0,0=1
1,0=0
0,1=1
В общем хочу опрашивать входящие сигналы, и вызывать подпрограмму, если один из входов смениться с 0 на 1.
Камешек: Atmega8
Сам еще только с малой частью команд знаком, надеюсь подскажете.
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

Команда sbic к Вашим услугам
Аватара пользователя
KyPA
Открыл глаза
Сообщения: 76
Зарегистрирован: Пт май 28, 2010 10:26:08

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

Сообщение KyPA »

ILYAUL писал(а):Команда sbic к Вашим услугам
Каким образом?
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

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

Сообщение Engineer_Keen »

командами SBIC\SBIS можно проверить текущее состояние входа, и если оно "0" - пропустить дальнейшую проверку, а если оно = "1", то смотреть ранее считанное состояние, которое предварительно где-то сохранили, например в T-бите статусного регистра, тогда воспользовавшись командами BRTS\BRTC можно если оно было "0" перейти в нужную вам подпрограмму. А вообще эту задачу можно решить полностью аппаратно, с помощью прерываний INT0-INT1, если они конечно еще не заняты.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

KyPA писал(а):
ILYAUL писал(а):Команда sbic к Вашим услугам
Каким образом?

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

Sbic Portx,Pinx
rcall туда
rcall сюда
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

ILYAUL писал(а):...
Это бесполезная трата времени. Если товарищ поленился купить скачать книги по МК AVR, то объяснять что-либо дальше просто бесполезно. Начнет долбить по малейшим вопросам не затрудняясь искать ответы самостоятельно.

gaw.ru

Вольфганг Трамперт "AVR-RISC микроконтроллеры фирмы ATMEL"
Джон Мортон "Микроконтроллеры AVR. Вводный курс"

Этих материалов вполне достаточно для самостоятельного изучения.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

ILYAUL писал(а):

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

Sbic Portx,Pinx
rcall туда
rcall сюда
в вашем коде "сюда" будет выполняться ВСЕГДА, а "туда" - иной раз перед "сюда"
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Ответить

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