реклама на сайте
подробности

 
 
> Регистры сравнения через указатель, iar avr Compiler V6.12.1.50500
Ga_ry
сообщение Jul 8 2018, 12:47
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 494
Регистрация: 23-06-09
Из: Полтава, UA
Пользователь №: 50 579



Здравствуйте, почему не работает такой код, что я еще не дописал?
Вверху глобальной переменной OCR инициализирован массив, которому присвоены адреса 6-ти регистров сравнения атмега48, а внизу процедура (цикл убрал) в которой по циклу необходимо присваивать значения в выбранный регистр.
Если имя массива и есть указатель на массив, то почему нижняя строка идет как ошибка?
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
megajohn
сообщение Jul 8 2018, 19:32
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



Цитата(Ga_ry @ Jul 8 2018, 16:47) *
Здравствуйте, почему не работает такой код, что я еще не дописал?


вот такой код в иаре компилится и должен работать
unsigned char volatile* ocr_arr[] = { &OCR0A, &OCR0B };
*ocr_arr[0] = *ocr_arr[1] = 12;



--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Jul 9 2018, 03:21
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Цитата(megajohn @ Jul 8 2018, 22:32) *
вот такой код в иаре компилится и должен работать
unsigned char volatile* ocr_arr[] = { &OCR0A, &OCR0B };
*ocr_arr[0] = *ocr_arr[1] = 12;
Какой-то у нас разный IAR. Тут ошибка. Адресное пространство неверно выбрано.
Цитата
Internal Error: [TaInstr::TaInstr]: Illegal instruction: 68 ( OUT 0x48, R16)


Тогда уж правильно вот так
Код
uint8_t volatile __io * const ocr_arr[] = {&OCR0A, &OCR0B };
*ocr_arr[0] = *ocr_arr[1] = 12;
=======================================

//   16 *ocr_arr[0] = *ocr_arr[1] = 12;  
        LDI     R16, 12
        OUT     0x28, R16
        OUT     0x27, R16


Не уверен что это будет работать, вот смотрите. Держу пари, вы не этого хотели.
Код
uint8_t volatile __io * ocr_arr[] = {&OCR0A, &OCR0B, &OCR1AL, &OCR1BL, &OCR2A, &OCR2B };
for(uint8_t i=0; i<6; i++)  *ocr_arr[i] = i;
=============================================================

        MOVW    R19:R18, R27:R26
        SBIW    R29:R28, 6
//   15 uint8_t volatile __io * ocr_arr[] = {&OCR0A, &OCR0B, &OCR1AL, &OCR1BL, &OCR2A, &OCR2B };
        MOVW    R17:R16, R29:R28
        LDI     R30, LOW(`?<Constant {(uint8_t volatile __io *)(&OCR0A),`)
        LDI     R31, (`?<Constant {(uint8_t volatile __io *)(&OCR0A),`) >> 8
        LDI     R20, 6
        LDI     R21, 0
        RCALL   ?ML_FLASH_SRAM_16EC_16_L07
//   16 for(uint8_t i=0; i<6; i++)  *ocr_arr[i] = i;
        LDI     R17, 0
        MOVW    R27:R26, R29:R28
        LDI     R16, 6
??main_0:
        LD      R30, X+
        LDI     R31, 0
        ST      Z, R17
        INC     R17
        DEC     R16
        BRNE    ??main_0


И вообще, зачем эти извращения? Если нужно записать шесть регистров, то проще и быстрее просто записать эти шесть регистров. Ну не десятки их в конце концов. Прочувствуйте разницу.
Код
OCR0A = 0; OCR0B = 1; OCR1AL = 2; OCR1BL = 3; OCR2A = 4; OCR2B = 5;
=================================================

        LDI     R16, 0
        OUT     0x27, R16
        LDI     R16, 1
        OUT     0x28, R16
        LDI     R16, 2
        STS     _A_OCR1A, R16
        LDI     R16, 3
        STS     _A_OCR1B, R16
        LDI     R16, 4
        STS     _A_OCR2A, R16
        LDI     R16, 5
        STS     _A_OCR2B, R16


PS: Хотя, если поиграться с расположением массива, то можно немного выиграть. Но всё равно, не торт. И 100% уверенности что записи попадут куда надо нет.
Код
static uint8_t volatile __io * const ocr_arr[] = {&OCR0A, &OCR0B, &OCR1AL, &OCR1BL, &OCR2A, &OCR2B };
for(uint8_t i=0; i<6; i++)  *ocr_arr[i] = i;

========================================
        LDI     R17, 0
        LDI     R26, LOW(??ocr_arr)
        LDI     R27, (??ocr_arr) >> 8
        LDI     R16, 6
        LDI     R31, 0
??main_0:
        LD      R30, X+
        ST      Z, R17
        INC     R17
        DEC     R16
        BRNE    ??main_0
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 9 2018, 07:29
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (VladislavS @ Jul 9 2018, 06:21) *
Какой-то у нас разный IAR. Тут ошибка. Адресное пространство неверно выбрано.
Да ладно! Весь ввод-вывод живет в том же адресном пространстве, что и ОЗУ. Если __io - это расширение для доступа командами IN/OUT, то не нужно через него пытаться лезть к OCR - потому что часть OCR просто не доступна через это адресное пространство.

Читайте внимательно текст ошибки: это внутренняя ошибка компилятора, то есть программисты что-то не предусмотрели внутри компилятора, надо сообщить им и ждать более новой версии.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Jul 9 2018, 08:20
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Цитата(Сергей Борщ @ Jul 9 2018, 10:29) *
Если __io - это расширение для доступа IN/OUT, то не нужно через него пытаться лезть к OCR - потому что часть OCR просто не доступна через это адресное пространство.

С __io компилятор сам разбирается где IN, а где STS использовать. Смотрите листинг. Без него, по идее, всё должно как ОЗУ трактоваться, но компилятор попытался OUT воткнуть и обломался.

Цитата(Сергей Борщ @ Jul 9 2018, 10:29) *
Читайте внимательно текст ошибки: это внутренняя ошибка компилятора, то есть программисты что-то не предусмотрели внутри компилятора, надо сообщить им и ждать более новой версии.
Версия последняя.
Go to the top of the page
 
+Quote Post
aiwa
сообщение Jul 9 2018, 14:08
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Цитата(VladislavS @ Jul 9 2018, 11:20) *
С __io компилятор сам разбирается где IN, а где STS использовать. Смотрите листинг. Без него, по идее, всё должно как ОЗУ трактоваться, но компилятор попытался OUT воткнуть и обломался.

Безусловно это внутренняя ошибка IAR. Даже листинг смотреть не стоит достаточно посмотреть на сообщение:
Illegal instruction: 68 ( OUT 0x48, R16)
IAR пытается оформить команду ввода-вывода OUT, но почему-то адрес операнда модифицирует для выполнения команды работы с памятью: 0x28 -> 0x48, поэтому и испытывает крайний внутренний дискомфорт. Правильная команда вывода должна быть OUT 0x28, R16.


Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Ga_ry   Регистры сравнения через указатель   Jul 8 2018, 12:47
- - Jenya7   Цитата(Ga_ry @ Jul 8 2018, 18:47) Здравст...   Jul 8 2018, 13:44
|- - Ga_ry   Цитата(Jenya7 @ Jul 8 2018, 16:44) уберит...   Jul 8 2018, 14:12
- - technik-1017   OCR это не РЕГИСТРЫ сравнения, а ПОРТЫ, вы пытаете...   Jul 8 2018, 14:45
- - VladislavS   Если вы хотите элементы массива использовать как а...   Jul 8 2018, 14:53
- - Ga_ry   Цель - 6 аппаратных каналов шим. Присваивая опреде...   Jul 8 2018, 15:35
|- - VladislavS   Цитата(Ga_ry @ Jul 8 2018, 18:35) SFR_B_R...   Jul 8 2018, 16:49
- - Ga_ry   VladislavS, Вы можете дать код который будет работ...   Jul 8 2018, 17:25
- - VladislavS   Нет, я сейчас не занимаюсь AVR. Просто по старой п...   Jul 8 2018, 17:27
- - Ga_ry   VladislavS, понятно, спасибо. Это у меня и так раб...   Jul 8 2018, 17:59
- - VladislavS   Да блин, ну я же цитату с документации не зря прив...   Jul 8 2018, 18:02
- - Ga_ry   Извиняюсь, цитату я как раз пропустил читаю с теле...   Jul 8 2018, 18:54
|- - VladislavS   Цитата(Ga_ry @ Jul 8 2018, 21:54) Это точ...   Jul 8 2018, 18:59
- - Ga_ry   idx1 глоб. 8 бит без знака   Jul 8 2018, 19:17
- - technik-1017   если я не ошибаюсь, то каналы ШИМ в mega48 имеют р...   Jul 8 2018, 19:37
- - Ga_ry   megajohn, спасибо, заработало! Цитата(technik...   Jul 8 2018, 19:41


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 23:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.01472 секунд с 7
ELECTRONIX ©2004-2016