Перейти к содержанию

Какой-то странный код генерирует Atmel Studio 7


rmatveev

Рекомендуемые сообщения

Пытаюсь скомпелировать несложный код с опросом бита ADIF (бит запроса прерывания от АЦП) в регистре ADCSRA и вот что получается в коде:

		if((ADCSRA & (1<<ADIF)) != 0){
 628:	0a e7       	ldi	r16, 0x7A	; 122
 62a:	10 e0       	ldi	r17, 0x00	; 0
		ADCSRA |= 1<<ADIF;
		if((ADMUX&0b00001111) == ADCH_OUT){
 62c:	0f 2e       	mov	r0, r31
 62e:	fc e7       	ldi	r31, 0x7C	; 124
 630:	ef 2e       	mov	r14, r31
 632:	f1 2c       	mov	r15, r1
 634:	f0 2d       	mov	r31, r0
		temp1 = ((ADCH<<8) + ADCL)*100/205;
 

Как видно, никаким ветвлением и не пахнет :(

Пробовал разные варианты оптимизации - никаких принципиальных изменений (кроме O0, но там код вылезает из памяти). Соответственно, код не работает.

Что я сделал не так?

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Освежу тему: я тут попробовал поисследовать то, как описаны регистры в стандартных хедерах, которые были в стандартной инсталляции Atmel Studio (iom48pa):

		PORTD++;
 67a:	8b b1       	in	r24, 0x0b	; 11
 67c:	8f 5f       	subi	r24, 0xFF	; 255
 67e:	8b b9       	out	0x0b, r24	; 11
		ADCSRA++;
 680:	f8 01       	movw	r30, r16
 682:	80 81       	ld	r24, Z
 684:	8f 5f       	subi	r24, 0xFF	; 255
 686:	80 83       	st	Z, r24
		_SFR_IO8(0x7A)++;
 688:	f7 01       	movw	r30, r14
 68a:	80 81       	ld	r24, Z
 68c:	8f 5f       	subi	r24, 0xFF	; 255
 68e:	80 83       	st	Z, r24
		_SFR_MEM8(0x7A)++;
 690:	f8 01       	movw	r30, r16
 692:	80 81       	ld	r24, Z
 694:	8f 5f       	subi	r24, 0xFF	; 255
 696:	80 83       	st	Z, r24

Как можно видеть - с PORTD (в хедере определяется как _SFR_IO8) компилятор работает правильно. А вот с ADCSRA (в хедере _SFR_MEM8) - нет: используются инструкции LD и ST вместо IN и OUT.

Причем, даже если я прямо в коде укажу регистр через _SFR_IO8 (как и PORTD), то это не помогает. Вероятно, это связано с тем, что PORTD находится в нижней памяти, а ADCSRA - в верхней, насколько я помню - там есть различия в доступе, в частности, к нижним SFR регистрам есть побитный доступ.

Нет ли у вас идей что я делаю не так? Либо может быть некорректно работает компилятор и что с этим делать? Либо регистры описаны неверно и как их тогда описать правильно?

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

1 hour ago, rmatveev said:

Вероятно, это связано с тем, что PORTD находится в нижней памяти, а ADCSRA - в верхней

in и out работают с адресами меньше 0x40. Поэтому компилятор использует разные коды для доступа к регистрам PORTD и ADCSRA.

Выше похоже в регистр r16 загружается 0х7А.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...