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

 
 
> IAR и AvrStudio, расхождения в описаниях чипов
uSoft
сообщение May 9 2010, 14:05
Сообщение #1





Группа: Новичок
Сообщений: 2
Регистрация: 11-04-09
Пользователь №: 47 524



Всем привет! Вот, на старости лет лет решил освоить программирование микроконтроллеров...
Попробовал себя в 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, но как их вытянуть оттуда пока не знаю. Наверное нужна более дорогая лицензия.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 3)
SysRq
сообщение May 9 2010, 18:29
Сообщение #2


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



В datasheet'ах Atmel для AVR адресация памяти с исполняемым кодом (flash) дана в словах (WORD, 2 байта). То же и в дизассемблере AVR Studio.

Цитата
The ATtiny25/45/85 contains 2/4/8K byte On-chip In-System Reprogrammable Flash memory for program storage. Since all AVR instructions are 16 or 32 bits wide, the Flash is organized as 1024/2048/4096 x 16.
Go to the top of the page
 
+Quote Post
SSerge
сообщение May 9 2010, 23:07
Сообщение #3


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

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(uSoft @ May 9 2010, 21:05) *
Вот может кто нибудь прояснить эту ситуацию? А то у меня уже мозги кипят.

Поясняю:
То ли по недомыслию, то ли от недостатка опыта AVR-овцы в своей студии сгородили огород с байтной/словной адресацией.

IAR-овцы, для которых AVR не единственный процессор с которым им приходится иметь дело, не долго думая выпрямили эту кривизну подогнав всё под общий знаменатель.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
uSoft
сообщение May 10 2010, 17:17
Сообщение #4





Группа: Новичок
Сообщений: 2
Регистрация: 11-04-09
Пользователь №: 47 524



Спасибо. Вроде разобрался. И с прерываниями и с особенностями архитектуры.Теперь будем грызть таймеры. smile.gif
Go to the top of the page
 
+Quote Post

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

 


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


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