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

Обсуждаем контроллеры компании Atmel.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 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
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 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
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 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
Друг Кота
Сообщения: 3868
Зарегистрирован: Пт янв 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
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

ILYAUL писал(а):

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

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

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

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

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