Всем привет! Вот, на старости лет лет решил освоить программирование микроконтроллеров...
Попробовал себя в AvrStudio на асме - вроде все нормально. Решил освоить и С. Полазив по интернету остановил свой выбор на IAR. Методом научного тыка вроде разобрался с настройками. Но в один прекрасный момент вылезла такая проблема.
Суть в следующем:
Изголяюсь с камнем ATtiny45, а конкретно с его USI под TWI. Все вроде бы нормально, все получается, а вот когда я захотел прикрутить к TWI прерывания вылезла непонятка. В симуляторе начали вылазить ошибки о выходе куда-то за пределы кода. Подозрение пало на инициализацию векторов. IAR вектора инициализирует двухбайтовыми командами. Смотрю в даташит по ATtiny45. Вижу следующее:
Код
9.1 Interrupt Vectors in ATtiny25/45/85
The interrupt vectors of ATtiny25/45/85 are described in Table 9-1below.
Table 9-1. Reset and Interrupt Vectors
=========================================================================
Vector No. Program Address Source Interrupt Definition
=========================================================================
1 0x0000 RESET External Pin, Power-on Reset,
Brown-out Reset, Watchdog Reset
2 0x0001 INT0 External Interrupt Request 0
3 0x0002 PCINT0 Pin Change Interrupt Request 0
4 0x0003 TIMER1_COMPA Timer/Counter1 Compare Match A
5 0x0004 TIMER1_OVF Timer/Counter1 Overflow
6 0x0005 TIMER0_OVF Timer/Counter0 Overflow
7 0x0006 EE_RDY EEPROM Ready
8 0x0007 ANA_COMP Analog Comparator
9 0x0008 ADC ADC Conversion Complete
10 0x0009 TIMER1_COMPB Timer/Counter1 Compare Match B
11 0x000A TIMER0_COMPA Timer/Counter0 Compare Match A
12 0x000B TIMER0_COMPB Timer/Counter0 Compare Match B
13 0x000C WDT Watchdog Time-out
14 0x000D USI_START USI START
15 0x000E USI_OVF USI Overflow
If the program never enables an interrupt source, the Interrupt Vectors are not used, and regular
program code can be placed at these locations. The most typical and general program setup for
the Reset and Interrupt Vector Addresses in ATtiny25/45/85 is shown in the program example
below.
Как видно - везде выравнивание вроде как на байт. Смотрю в заголовочный файл IAR для ATtiny45 и вижу следующее:
Код
/* NB! vectors are specified as byte addresses */
#define RESET_vect (0x00) /* External Pin, Power-on Reset, Brown-out Reset,
Watchdog Reset */
#define INT0_vect (0x02) /* External Interrupt Request 0 */
#define PCINT0_vect (0x04) /* Pin Change Interrupt Request 0 */
#define TIM1_COMPA_vect (0x06) /* Timer/Counter1 Compare Match A */
#define TIM1_OVF_vect (0x08) /* Timer/Counter1 Overflow */
#define TIM0_OVF_vect (0x0A) /* Timer/Counter0 Overflow */
#define EE_RDY_vect (0x0C) /* EEPROM Ready */
#define ANA_COMP_vect (0x0E) /* Analog Comparator */
#define ADC_vect (0x10) /* ADC Conversion Complete */
#define TIM1_COMPB_vect (0x12) /* Timer/Counter1 Compare Match B */
#define TIM0_COMPA_vect (0x14) /* Timer/Counter0 Compare Match A */
#define TIM0_COMPB_vect (0x16) /* Timer/Counter0 Compare Match B */
#define WDT_vect (0x18) /* Watchdog Time-out */
#define USI_START_vect (0x1A) /* USI START */
#define USI_OVF_vect (0x1C) /* USI Overflow */
Вижу выравнивание на слово. Начинаю тормозить...
Лезу в инклуды асма AvrStudio - вижу следующее:
Код
; ***** INTERRUPT VECTORS ************************************************
.equ INT0addr = 0x0001 ; External Interrupt 0
.equ PCI0addr = 0x0002 ; Pin change Interrupt Request 0
.equ OC1Aaddr = 0x0003 ; Timer/Counter1 Compare Match 1A
.equ OVF1addr = 0x0004 ; Timer/Counter1 Overflow
.equ OVF0addr = 0x0005 ; Timer/Counter0 Overflow
.equ ERDYaddr = 0x0006 ; EEPROM Ready
.equ ACIaddr = 0x0007 ; Analog comparator
.equ ADCaddr = 0x0008 ; ADC Conversion ready
.equ OC1Baddr = 0x0009 ; Timer/Counter1 Compare Match B
.equ OC0Aaddr = 0x000a ; Timer/Counter0 Compare Match A
.equ OC0Baddr = 0x000b ; Timer/Counter0 Compare Match B
.equ WDTaddr = 0x000c ; Watchdog Time-out
.equ USI_STARTaddr = 0x000d ; USI START
.equ USI_OVFaddr = 0x000e ; USI Overflow
Потихоньку начинаю офигевать...
Решил посмотреть что видно в дизассемблере AvrStudio - увидел вот это:
Код
---- Test_3.asm -----------------------------------------------------------------------------------
47: rjmp RESET ; Reset Handler
+00000000: C00E RJMP PC+0x000F Relative jump
48: reti ; rjmp EXT_INT0; IRQ0 Handler
+00000001: 9518 RETI Interrupt return
49: reti ; rjmp PCINT0; PCINT0 Handler
+00000002: 9518 RETI Interrupt return
50: reti ; rjmp TIM1_COMPA; Timer1 CompareA Handler
+00000003: 9518 RETI Interrupt return
51: reti ; rjmp TIM1_OVF; Timer1 Overflow Handler
+00000004: 9518 RETI Interrupt return
52: reti ; rjmp TIM0_OVF; Timer0 Overflow Handler
+00000005: 9518 RETI Interrupt return
53: reti ; rjmp EE_RDY; EEPROM Ready Handler
+00000006: 9518 RETI Interrupt return
54: reti ; rjmp ANA_COMP; Analog Comparator Handler
+00000007: 9518 RETI Interrupt return
55: reti ; rjmp ADC; ADC Conversion Handler
+00000008: 9518 RETI Interrupt return
56: reti ; rjmp TIM1_COMPB; Timer1 CompareB Handler
+00000009: 9518 RETI Interrupt return
57: reti ; rjmp TIM0_COMPA;
+0000000A: 9518 RETI Interrupt return
58: reti ; rjmp TIM0_COMPB;
+0000000B: 9518 RETI Interrupt return
59: reti ; rjmp WDT;
+0000000C: 9518 RETI Interrupt return
60: reti ; rjmp USI_START;
+0000000D: 9518 RETI Interrupt return
61: reti ; rjmp USI_OVF;
+0000000E: 9518 RETI Interrupt return
@0000000F: RESET
73: RESET: ldi r16, low(RAMEND) ; Main program start
+0000000F: E50F LDI R16,0x5F Load immediate
74: ldi r17, high(RAMEND); Tiny45/85 also has SPH
+00000010: E011 LDI R17,0x01 Load immediate
75: out SPL, r16 ; Set Stack Pointer to top of RAM
+00000011: BF0D OUT 0x3D,R16 Out to I/O location
76: out SPH, r17 ; Tiny45/85 als has SPH
+00000012: BF1E OUT 0x3E,R17 Out to I/O location
Каждая команда занимает слово, но адресация почему то идет как побайтная. Вот тут я приехал.
Вот может кто нибудь прояснить эту ситуацию? А то у меня уже мозги кипят.
================================================================================
И еще вопрос. IAR не генерит код(кроме области векторов) если в опциях не подключена никакая библиотека. А мне надо заставить компилятор генерить код без подключения библиотек. Исходников стандартных библиотек в моем IAR нет, только скомпилированные. Можно ли как-то заставить IAR генерить код без подключения библиотек? Или может у кого-то есть эти исходники? Поделитесь плиз? Я догадываюсь, что исходники есть наверное в инсталяторе IAR, но как их вытянуть оттуда пока не знаю. Наверное нужна более дорогая лицензия.