Цитата(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