Страница 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 вот отсюда -
тынц Это ж об AT
XmegaA
Хотя и про 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 к Вашим услугам
Каким образом?
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
в вашем коде "сюда" будет выполняться
ВСЕГДА, а "туда" - иной раз перед "сюда"