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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Z_h_e писал(а):Правда мне непонятно почему в формуле 1024, а не 1023.
Может, потому что так оно и есть?.

Любые значения в диапазоне [0..1) - это 0, [1..2) - это 1, ..., [1023..1024) - это 1023, всё выше - тоже 1023.

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

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

Сообщение Z_h_e »

Возьмем для примера гипотетическое АЦП 2х разрядное (просто на нем нагляднее будет) .
Пускай ИОН 5 В. АЦП выдало код 3. По аналогии считаем 2^2/3*5=6,67В. Плохая математика получается. Конечно чем больше разрядность, тем менее это заметно.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
Jetetex
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср окт 15, 2014 12:45:46
Откуда: Анапа

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

Сообщение Jetetex »

Чисто в порядке бреда - может потому что "0" тоже может быть результатом измерения, отсюда имеем 1024, скажем так, варианта
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

Конечно 0 может быть результатом АЦП. Но я специально привел пример 2х разрядного АЦП, чтобы было понятно что я тут считаю не так с математикой.
В реале, для 10 битного АЦП, да еще и при шумящем младшем бите (это в лучшем случае) - это не имеет особого значения. Просто считайте меня занудой :).
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3158621#p3158621"]Возьмем для примера гипотетическое АЦП 2х разрядное (просто на нем нагляднее будет) .
Пускай ИОН 5 В. АЦП выдало код 3. По аналогии считаем 2^2/3*5=6,67В. Плохая математика получается. Конечно чем больше разрядность, тем менее это заметно.[/uquote]
Что-то я не совсем понял, что это Вы посчитали.

Формула по аналогии будет ADC = Vin/Vref * 2^2, откуда Vin = ADC * Vref / (2^2)

В нашем гипотетическом случае Vin = ADC * 5 / 4. (Vin = ADC * 5 / 3, если брать 2^2-1).

Как по мне, первая картинка, под первую формулу, правильнее:

Изображение
Аватара пользователя
FeCat
Прорезались зубы
Сообщения: 211
Зарегистрирован: Пт окт 21, 2011 14:39:31

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

Сообщение FeCat »

Может не совсем в тему, но...
Пишу на с, asm не знаю совершенно, не могу понять почему ATMega32, во время выполнения программы, как будто виснет. Если во время "зависания" была включена отладка и нажать останов, то останавливается вот тут:

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

--- No source file -------------------------------------------------------------
0000037E  LSL R30		Logical Shift Left 
0000037F  ROL R31		Rotate Left Through Carry 
00000380  LPM R0,Z+		Load program memory and postincrement 
00000381  LPM R31,Z		Load program memory 
00000382  MOV R30,R0		Copy register 
00000383  IJMP 		Indirect jump to (Z) 
00000384  CLI 		Global Interrupt Disable 
00000385  RJMP PC-0x0000		Relative jump                           // вот тут получается останов
00000386  NOP 		Undefined 
00000387  NOP 		Undefined 
00000388  NOP 		Undefined 
00000389  NOP 		Undefined 
0000038A  NOP 		Undefined 
0000038B  NOP 		Undefined 
0000038C  NOP 		Undefined 
0000038D  NOP 		Undefined 
0000038E  NOP 		Undefined 
0000038F  NOP 		Undefined 
00000390  NOP 		Undefined 
00000391  NOP 		Undefined 
00000392  NOP 		Undefined 
Правильно ли я понимаю, что "RJMP PC-0x0000" это, что то вроде перехода по адресу относительно команды, а т.к. параметр нулевой, получается переход на саму себя, т.е. вечный while(1)?
Т.к. перед этим стоит CLI - глобальный запрет прерываний, вся эта петрушка вероятно из-за какого то аппаратного сбоя в МК или программе, это своеобразный стоп работы(максимизация ошибки). В самой программе ничего такого нет, т.е. это компиллятор по умолчанию добавляет(Atmel Studio 7.0)?
Если отбросить железные проблемы, то почему такое может происходить?
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

По мне,
FeCat писал(а):это компиллятор по умолчанию добавляет
в конце программы, а вот косвенный переход по адресу в указателе Z выбрасывает в заадресное пространство mega32. Как вариант, компилируете для камня с адресным пространством >32к.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

[uquote="FeCat",url="/forum/viewtopic.php?p=3158782#p3158782"]...[/uquote]
Этот кусок аварийный. Если какой-нибудь сбой, незапланированное прерывание, то программа уйдет на выполнение этого кода. Глобальный запрет прерываний, cli и rjmp PC+0 - глухое зацикливание программы. Возможно у вас включено какое-то прерывание, а обработчика нет. Компилятор в таких случаях автоматом делает такие программные заглушки.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Demiurg писал(а):Возможно у вас включено какое-то прерывание, а обработчика нет. Компилятор в таких случаях автоматом делает такие программные заглушки.
avr-gcc в этом случае не зацикливает программу, а перебрасывает её на нулевой вектор, т.е. выполняет пересброс.

avr-gcc автоматически генерирует последовательность cli; jmp PC - 0; только в одном месте: там, где происходит выход из main.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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

Сообщение Z_h_e »

WiseLord писал(а):Как по мне, первая картинка, под первую формулу, правильнее:
Не надо было приводить даже такие картинки, в ДШ есть график на котором указано что Vref выше 0x3FF. И формулу расчета я не пытался оспаривать, как сделали разрабы камня, так и надо считать. Просто мои зачерепные опилки желают, чтобы максимум АЦП соответствовал опоре.
WiseLord писал(а):Что-то я не совсем понял, что это Вы посчитали.
Что тут может быть непонятного, хрень какую-то насчитал я. :oops: Хотел показать, что код АЦП не будет соотвествовать ИОН никогда и показал :)) .

Добавлено after 8 minutes 29 seconds:
ARV писал(а):avr-gcc в этом случае не зацикливает программу, а перебрасывает её на нулевой вектор, т.е. выполняет пересброс.
Можно вставить обработчик по умолчанию ISR(__vector_default), но он же тоже не циклит, если сам это не сделаешь.
FeCat писал(а):Если отбросить железные проблемы, то почему такое может происходить?
А Вы запустите в симуляторе код и в окне дизассемблера должно быть указано к какому участку исходного кода соответствует машинный.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

ARV писал(а):в одном месте: там, где происходит выход из main.
И где же у нас выход из майн? Если майн вызывается.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Demiurg писал(а):И где же у нас выход из майн?
я пометил место, где он :)))

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

int main(void){
   
} <<<< вот где-то тут
если посмотреть листинг, который генерирует avr-gcc, то можно увидеть ОБЯЗАТЕЛЬНО такой (не считая адресов, конечно) кусочек:

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

  32:	14 d0       	rcall	.+40     	; 0x5c <main>
  34:	19 c0       	rjmp	.+50     	; 0x68 <_exit>

; что-то там всякое


00000068 <_exit>:
  68:	f8 94       	cli

0000006a <__stop_program>:
  6a:	ff cf       	rjmp	.-2      	; 0x6a <__stop_program>

обратите внимание на вход в main и выход из него

Добавлено after 9 minutes 57 seconds:
Кстати, вот другой кусочек, поясняющий, как avr-gcc обслуживает прерывания, для которых нет обработчика (bad_interrupt):

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

00000000 <__vectors>:
   0:	12 c0       	rjmp	.+36     	; 0x26 <__ctors_end>
   2:	19 c0       	rjmp	.+50     	; 0x36 <__bad_interrupt>
   4:	18 c0       	rjmp	.+48     	; 0x36 <__bad_interrupt>
   6:	17 c0       	rjmp	.+46     	; 0x36 <__bad_interrupt>
   8:	17 c0       	rjmp	.+46     	; 0x38 <__vector_4>
   a:	15 c0       	rjmp	.+42     	; 0x36 <__bad_interrupt>
   c:	14 c0       	rjmp	.+40     	; 0x36 <__bad_interrupt>
   e:	13 c0       	rjmp	.+38     	; 0x36 <__bad_interrupt>
  10:	12 c0       	rjmp	.+36     	; 0x36 <__bad_interrupt>
  12:	11 c0       	rjmp	.+34     	; 0x36 <__bad_interrupt>
  14:	10 c0       	rjmp	.+32     	; 0x36 <__bad_interrupt>
  16:	0f c0       	rjmp	.+30     	; 0x36 <__bad_interrupt>
  18:	0e c0       	rjmp	.+28     	; 0x36 <__bad_interrupt>
  1a:	0d c0       	rjmp	.+26     	; 0x36 <__bad_interrupt>
  1c:	0c c0       	rjmp	.+24     	; 0x36 <__bad_interrupt>
  1e:	0b c0       	rjmp	.+22     	; 0x36 <__bad_interrupt>
  20:	0a c0       	rjmp	.+20     	; 0x36 <__bad_interrupt>
  22:	09 c0       	rjmp	.+18     	; 0x36 <__bad_interrupt>
  24:	08 c0       	rjmp	.+16     	; 0x36 <__bad_interrupt>

00000026 <__ctors_end>:
  26:	11 24       	eor	r1, r1
  28:	1f be       	out	0x3f, r1	; 63
  2a:	cf e5       	ldi	r28, 0x5F	; 95
  2c:	d4 e0       	ldi	r29, 0x04	; 4
  2e:	de bf       	out	0x3e, r29	; 62
  30:	cd bf       	out	0x3d, r28	; 61
  32:	14 d0       	rcall	.+40     	; 0x5c <main>
  34:	19 c0       	rjmp	.+50     	; 0x68 <_exit>

00000036 <__bad_interrupt>:
  36:	e4 cf       	rjmp	.-56     	; 0x0 <__vectors>
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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

Сообщение Demiurg »

ARV писал(а):...
Вы не учитываете одну очень важную вещь. И это говорит о том, что вы не ассемблерщик. Пусть даже и так, вы обязаны заглядывать в дизасм. Иначе как вы оцениваете работу МК в тяжелых случаях.

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

   rcall main
Подсказка. Main вызван, а стек сорван.
Последний раз редактировалось Demiurg Ср авг 09, 2017 16:21:38, всего редактировалось 1 раз.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

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

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

Сообщение Demiurg »

Z_h_e писал(а):...
ARV писал(а):avr-gcc автоматически генерирует последовательность cli; jmp PC - 0; только в одном месте: там, где происходит выход из main.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

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

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

Сообщение ARV »

ща буду спорить :evil:
Demiurg писал(а):вы не ассемблерщик. Пусть даже и так, вы обязаны заглядывать в дизасм. Иначе как вы оцениваете работу МК в тяжелых случаях
как бы я вам дизасм и привел в качестве подтверждения своих слов. а ассемблер у меня занимает ровно ту нишу, которую и должен - помогает в особо тяжких случаях, а в остальных полагаюсь на Си. перерос я ассемблер...
Demiurg писал(а):Подсказка. Main вызван, а стек сорван
за подсказку спасибо, но теперь подскажите по подсказке: в каком именно месте срывается стек при вызове main? напоминаю код:

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

00000026 <__ctors_end>:
  26:   11 24          eor   r1, r1
  28:   1f be          out   0x3f, r1   ; 63
  2a:   cf e5          ldi   r28, 0x5F   ; 95
  2c:   d4 e0          ldi   r29, 0x04   ; 4
  2e:   de bf          out   0x3e, r29   ; 62
  30:   cd bf          out   0x3d, r28   ; 61
  32:   14 d0          rcall   .+40        ; 0x5c <main>
  34:   19 c0          rjmp   .+50        ; 0x68 <_exit>
если вы вдруг забыли, то порт 0x3e это SPH, а 0x3d - SPL.
Z_h_e писал(а):пока ARV изучает основы AVR
:beer:
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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

Сообщение Demiurg »

ARV писал(а):...
В том-то и дело, что стек может сорвать в любой момент. Незапланированное прерывание может быть включено в любой момент. Это может быть ошибка программиста. Сбой по питанию. Именно по этой причине делается переход на такой кусок код. Отключается глобально прерывание и глухое зацикливание. Если watchdog не включен, мк наглухо зависнет. Если включен, то мк зависнет до сработки сторожевого таймера.
Аватара пользователя
FeCat
Прорезались зубы
Сообщения: 211
Зарегистрирован: Пт окт 21, 2011 14:39:31

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

Сообщение FeCat »

akl
Demiurg
ARV
Z_h_e

Спасибо, что откликнулись. Нашёл ошибку... в железе ). Фьюз CKOPT не запрограммировал. В результате на макетке ловил помеху раз в несколько минут.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Demiurg писал(а):Незапланированное прерывание может быть включено в любой момент. Это может быть ошибка программиста. Сбой по питанию. Именно по этой причине делается переход на такой кусок код.
вы о чем вообще говорите? AVR систему исключений (exception) не поддерживает, и запланировать переход на какую-то заглушку в случае незапланированного "срыва стека" невозможно.

я же говорю только о факте: avr-gcc генерирует кусочек кода с запретом прерываний и вечным циклом только в одном месте - после завершения main (туда же передается управление по стандартной функции exit). в качестве обработки необслуживаемых прерываний avr-gcc пересбрасывает программу. оба эти утверждения я сопроводил доказательствами в виде кусков листинга из-под avr-gcc.
ничего иного я не говорил.

если я вас не правильно понял - поясните, что вы имеете ввиду.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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