Страница 274 из 399

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

Добавлено: Пн апр 25, 2016 01:22:21
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
Присвоение ячейкам ОЗУ символьных имен предполагает их использование. Сейчас в программе почему-то используется абсолютные адреса, к тому же находящиеся вне области адресов имеющегося ОЗУ.

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

Добавлено: Пн апр 25, 2016 12:28:30
Z_h_e
Я пока товарищу alex38779 немного объяснял про стек, сам понял как работает обратил внимание, что на некоторых русских ресурсах пишут что при изменении SPL блокируются прерывания на 4 такта. В симуляторе Atmel Studio 6 этому я подтверждения не увидел. Есть где-то подтверждение этому в первоисточниках?

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

Добавлено: Пн апр 25, 2016 13:12:37
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.

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

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

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

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

Вообще конечно, вряд ли возникнет необходимость менять указатель стека по ходу программы, а если возникнет, то лучше ручками запретить прерывания, но все же, верно ли утверджение о блокировке до 4 тактов или это как всегда, один умник сморозил, а остальные ресурсы копируют?

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

Добавлено: Пн апр 25, 2016 14:26:28
dgrett
PUSH, POP тоже меняет SP. Так и в этом случае тоже?

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

Добавлено: Пн апр 25, 2016 15:04:57
Demiurg
Так, стоп. Не собирайте все в кучу. push pop занимает по 2 такта. Это операции со стеком. Про 4 такта при записи в SPL лично я слышу впервые. Хотя с AVR работаю достаточно долго и изучил вдоль и поперек. Уточню, отпишусь.

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

Добавлено: Пн апр 25, 2016 15:06:14
Z_h_e
Да я вот тоже впервые. Чушь наверное какая-то.

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

Добавлено: Пн апр 25, 2016 19:08:21
Demiurg
Скорее всего, здесь неточности перевода. Пусть автор написанного приведет источник.
Проверку можно сделать. Но если честно лениво. Я от асма уже несколько лет как отошел. Нужно написать программу с выводом на ЖКИ дисплей, семисегментник. Запускаем таймер без делителей, пишем в SPL. Сразу же после команды записи в SPL считать значение таймера и вывести на дисплей.
Стоп, речь идет о отключении прерываний. Хм... И так как на время записи в SPL, то хрен ты как-либо считаешь флаги...
Вполне возможно это справедливо для ранних моделей AVR.
Боюсь, тут нужно обращаться напрямую к ATMEL.

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

Добавлено: Вт апр 26, 2016 05:06:00
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

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

Добавлено: Ср апр 27, 2016 09:35:46
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.

Если прерывание происходит во время инструкции выполняющейся несколько тактов, то эта инструкция завершается прежде чем начинается обработка прерывания.
Т.е. прерывания не запрещаются, а просто не обрабатываются во время исполнения инструкции.
Обработка прерывания начинается по фронту тактового сигнала только "между" инструкциями процессора.

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

Добавлено: Ср апр 27, 2016 16:16:50
Demiurg
Kavka писал(а):...
Это уже похоже на правду. Баловство со стеком считаем критической секцией, потому сохраняем SREG, запрещаем прерывания, работаем со стеком, потом восстанавливаем SREG.

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

Добавлено: Пн май 16, 2016 21:15:14
Buckwheat
Привет. Кто-нибудь linux пользуется? В чем код пишете, и, главное, как отлаживаете? Есть какой-нибудь годный туториал по настройке того же eclipse или можно что-нибудь менее изощренное использовать?

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

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

Писать можно хоть в Kate. Компиляторов непосредственно под линукс как минимум два - avra и gcc-шный. Диалекты чуток отличаются. Можно avrasm2.exe из под wine запускать если сильно хочется.
Программаторы и МК любые, которые понимаются uisp-ом и avrdude-ом.
Отладкой и симуляторами пока не заморачивался - подсказать особо ничего не могу.

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

Добавлено: Чт май 26, 2016 19:32:14
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
Сам еще только с малой частью команд знаком, надеюсь подскажете.

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

Добавлено: Чт май 26, 2016 23:23:13
ILYAUL
Команда sbic к Вашим услугам

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

Добавлено: Пт май 27, 2016 09:52:48
KyPA
ILYAUL писал(а):Команда sbic к Вашим услугам
Каким образом?

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

Добавлено: Пт май 27, 2016 10:27:16
Engineer_Keen
командами SBIC\SBIS можно проверить текущее состояние входа, и если оно "0" - пропустить дальнейшую проверку, а если оно = "1", то смотреть ранее считанное состояние, которое предварительно где-то сохранили, например в T-бите статусного регистра, тогда воспользовавшись командами BRTS\BRTC можно если оно было "0" перейти в нужную вам подпрограмму. А вообще эту задачу можно решить полностью аппаратно, с помощью прерываний INT0-INT1, если они конечно еще не заняты.

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

Добавлено: Пт май 27, 2016 13:45:25
ILYAUL
KyPA писал(а):
ILYAUL писал(а):Команда sbic к Вашим услугам
Каким образом?

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

Sbic Portx,Pinx
rcall туда
rcall сюда

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

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

gaw.ru

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

Этих материалов вполне достаточно для самостоятельного изучения.

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

Добавлено: Пт май 27, 2016 14:12:54
ARV
ILYAUL писал(а):

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

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