Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как заставить IAR AVR генерить SBI/CBI?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Yellow Tiger
Знакомлюсь с IAR'ом, не могу понять, как заставить его работать с линиями GPIO с помощью инструкций SBI/CBI.
Код типа :
Код
        PORTG_Bit3 = 1;
        PORTG_Bit3 = 0;

транслируется вместо SBI/CBI в тройки инструкций LDS | ANDI(ORI) | STS :
Код
        LDS     R16, 101
        ANDI    R16, 0xF7
        STS     101, R16
        LDS     R16, 101
        ORI     R16, 0x08
        STS     101, R16


От оптимизации, похоже, не зависит (пробовал уровни "NO" и "High, for siZe").
В референсе по компилятору ничего на эту тему не нашел, в инете тоже. Но ведь должен быть способ?

_______________________
IAR C/C++ Compiler V6.10
Сергей Борщ
А попадает ли порт G в адреса, с которыми могут работать SBI, CBI? Судя по адресу 101 в вашем листинге - не попадают.
_Артём_
Цитата(Yellow Tiger @ May 31 2012, 20:05) *
Знакомлюсь с IAR'ом, не могу понять, как заставить его работать с линиями GPIO с помощью инструкций SBI/CBI.
_______________________
IAR C/C++ Compiler V6.10

Не надо его заставлять он и сам генерит если может:
Код
128:          PORTC|=1;
+00000294:   9AA8        SBI       0x15,0         Set bit in I/O register
129:          PORTG|=1;
+00000295:   91000065    LDS       R16,0x0065     Load direct from data space
+00000297:   6001        ORI       R16,0x01       Logical OR with immediate
+00000298:   93000065    STS       0x0065,R16

Но порт G доступен только как адрес в ОЗУ (например так в М128).
Yellow Tiger
Да, это я с перепугу, прошу пардону. :о)))

Задумал я, в качестве знакомства с IAR'ом, переписать его SFR-определения так, чтобы обращения к битам регистров выглядели привычным для меня образом - rUCSR0A.UDRE0 (перехожу-то с CV-Avr), вот и разбегаются глаза от большого количества новостей. А на самом деле всё действительно работает:
Код
  ;            while ( !(rUCSR0A.UDRE0) )
   9B5D               SBIS    0x0B, 0x05
   CFFE               RJMP    ??_putchar_0



  ;                rUCSR0A.UDRE0 = 1;
   9A5D               SBI     0x0B, 0x05
  ;                rUCSR0A.UDRE0 = 0;
   985D               CBI     0x0B, 0x05


Сергей, Артём, прошу прощения за ложную тревогу. (Ведь говаривала мне мама - "Сначала выспись!" sm.gif)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.