Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ошибка операции __swap_nibbles ?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
SZ0
IAR C/C++ Compiler for AVR 5.11B/W32 (5.11.2.5)
В следующем коде __swap_nibbles выполняется ошибочно:

Код
    132           buffer = byte;    //передача младших битов 3-0
   \   00000034   2F10               MOV     R17, R16
    133           __swap_nibbles(buffer);//обмен битов
   \   00000036   2F21               MOV     R18, R17
   \   00000038   9522               SWAP    R18
    134           buffer &= lcd_mask;    //выделим старшие биты 7-4 сбросив остальные
   \   0000003A   7F10               ANDI    R17, 0xF0
    135           LCD_PORT &= ~lcd_mask;    //сбросим биты на шине данных ЖКИ
   \   0000003C   91200105           LDS     R18, 261
   \   00000040   702F               ANDI    R18, 0x0F
   \   00000042   93200105           STS     261, R18


Как видим, обмен битов происходит в другом регистре. А buffer используется дальше, нисколько не изменённый swap. Как исправить такое?
AHTOXA
Не вижу, где используется buffer.
SZ0
Цитата(AHTOXA @ Aug 22 2008, 19:04) *
Не вижу, где используется buffer.


Код
    136           LCD_PORT |= buffer;    //вывод 3-0 битов на шину ЖКИ
   \   00000046   91200105           LDS     R18, 261
   \   0000004A   2B21               OR      R18, R17
   \   0000004C   93200105           STS     261, R18
Палыч
А, Вы уверены что __swap_nibbles() - это процедура, а не функция? Наверное, нужно написать
buffer= __swap_nibbles(buffer);
SZ0
Цитата(Палыч @ Aug 22 2008, 19:30) *
А, Вы уверены что __swap_nibbles() - это процедура, а не функция? Наверное, нужно написать
buffer= __swap_nibbles(buffer);


Вы правы, функция lol.gif

Можно ещё так сделать:

Код
    134           buffer = buffer << 4;
   \   00000036   9512               SWAP    R17
   \   00000038   7F10               ANDI    R17, 0xF0
    135          
    136           buffer = __swap_nibbles(buffer);
   \   0000003A   2F21               MOV     R18, R17
   \   0000003C   9522               SWAP    R18
   \   0000003E   2F12               MOV     R17, R18
Maik-vs
Цитата(SZ0 @ Aug 22 2008, 18:12) *
Вы правы, функция lol.gif

Можно ещё так сделать:

Код
    134           buffer = buffer << 4;
   \   00000036   9512               SWAP    R17
   \   00000038   7F10               ANDI    R17, 0xF0
    135          
    136           buffer = __swap_nibbles(buffer);
   \   0000003A   2F21               MOV     R18, R17
   \   0000003C   9522               SWAP    R18
   \   0000003E   2F12               MOV     R17, R18


Ух ты. А без двух лишних mov сделать никак? Типа swap r17 07.gif
Палыч
Цитата(Maik-vs @ Aug 25 2008, 13:49) *
Ух ты. А без двух лишних mov сделать никак? Типа swap r17 07.gif
Подозреваю, что нужно включить оптимизацию...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.