|
ATxmega64A1def.inc, непонятки |
|
|
|
Oct 13 2011, 19:44
|

Гуру
     
Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106

|
Вот к примеру регистр период RTC в файле ATxmega64A1def.inc обьявлен так: Код .equ RTC_PER = 1034 // Period Register 1034 это десятичное значение адреса младшего байта регистра RTC_PER. А каким образом Atmel предлагает доступ к старшему байту? RTC_PER+1 чтоли??? И почему сразу не обьявить вот так например: Код .equ RTC_PERL = 1034 // Period Register .equ RTC_PERH = 1035
|
|
|
|
|
Oct 13 2011, 22:03
|
Участник

Группа: Участник
Сообщений: 73
Регистрация: 4-05-08
Пользователь №: 37 272

|
Цитата(ILYAUL @ Oct 14 2011, 00:02)  Смысл один - два раза по одному адресу- младшим вперёд по разным адресам
|
|
|
|
|
Oct 13 2011, 22:16
|

Гуру
     
Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106

|
Цитата(ILYAUL @ Oct 14 2011, 00:37)  Младший торчит во временном всё это время . Попробуй обмануть. Мне тоже не понравилось Это типа проц стал 16-ти разрядным??? Цитата(Юрий_СВ @ Oct 14 2011, 01:03)  по разным адресам Действительно по разным!!! Т.е. записывая что-то в старщий адрес я записываю и в младший!!! А что в младшем ХЗ. Красота!!!
|
|
|
|
|
Oct 13 2011, 22:20
|
Участник

Группа: Участник
Сообщений: 73
Регистрация: 4-05-08
Пользователь №: 37 272

|
Цитата(zombi @ Oct 13 2011, 22:44)  Вот к примеру регистр период RTC в файле ATxmega64A1def.inc обьявлен так: Код .equ RTC_PER = 1034 // Period Register 1034 это десятичное значение адреса младшего байта регистра RTC_PER. А каким образом Atmel предлагает доступ к старшему байту? RTC_PER+1 чтоли??? И почему сразу не обьявить вот так например: Код .equ RTC_PERL = 1034 // Period Register .equ RTC_PERH = 1035 в iox32a4.h описано так: Код /* Real-Time Counter */ typedef struct RTC_struct { register8_t CTRL; /* Control Register */ register8_t STATUS; /* Status Register */ register8_t INTCTRL; /* Interrupt Control Register */ register8_t INTFLAGS; /* Interrupt Flags */ register8_t TEMP; /* Temporary register */ register8_t reserved_0x05; register8_t reserved_0x06; register8_t reserved_0x07; _WORDREGISTER(CNT); /* Count Register */ _WORDREGISTER(PER); /* Period Register */ _WORDREGISTER(COMP); /* Compare Register */ } RTC_t;
#define RTC (*(RTC_t *) 0x0400) /* Real-Time Counter */
/* RTC - Real-Time Counter */ #define RTC_CTRL _SFR_MEM8(0x0400) #define RTC_STATUS _SFR_MEM8(0x0401) #define RTC_INTCTRL _SFR_MEM8(0x0402) #define RTC_INTFLAGS _SFR_MEM8(0x0403) #define RTC_TEMP _SFR_MEM8(0x0404) #define RTC_CNT _SFR_MEM16(0x0408) #define RTC_PER _SFR_MEM16(0x040A) #define RTC_COMP _SFR_MEM16(0x040C)
|
|
|
|
|
Oct 14 2011, 01:52
|
Участник
  
Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695

|
Цитата(zombi @ Oct 14 2011, 07:16)  Это типа проц стал 16-ти разрядным??? ... Т.е. записывая что-то в старщий адрес я записываю и в младший!!! А что в младшем ХЗ. Красота!!! Если бы не было временного регистра... Например, работает 16-бит счётчик: 00FE, 00FF, 0100, 0101, 0102, ... Программа начинает читать значение, когда в нём 00FF. in R1,TCNT1H in R0,TCNT1L в регистрах получим R1:R0 = 0000 пробуем по другому: in R0,TCNT1L in R1,TCNT1H в регистрах получим R1:R0 = 01FF Тоже самое и записью, если записывать в работающий таймер/счётчик. Из ADC нельзя прочитать только младший байт, ит.д. Временный регистр нужен для атомарного доступа к 16-бит регистрам по 8-бит шине. И появился этот регистр не в xMega,Mega или Tiny, он уже был в AVR AT90Sxxxx в прошлом веке.
|
|
|
|
|
Oct 14 2011, 07:15
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
QUOTE (Юрий_СВ @ Oct 14 2011, 02:03)  по разным адресам Вот так комманды проканывают: CODE ldi r16,0x55 ldi r17,0xAA sts RTC_PER,r16 sts RTC_PER,R17 nop А вот так нет: CODE ldi r16,0x55 ldi r17,0xAA sts RTC_PERL,r16 sts RTC_PERH,R17 nop Ошибка компиляции. Но и это ещё не всё - временный регистр доступен в свободном плавании - и в него можно писать и читать напрямую
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Oct 14 2011, 07:51
|

Гуру
     
Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106

|
Цитата(ae_ @ Oct 14 2011, 04:52)  in R1,TCNT1H in R0,TCNT1L в регистрах получим R1:R0 = 0000
пробуем по другому: in R0,TCNT1L in R1,TCNT1H в регистрах получим R1:R0 = 01FF Спасибо за лекцию. Но результат чтения также будет зависеть и от того чем тактируется счётчик. И речь не о принципе доступа 8-битного процессора к 16-битным регистрам. Речь о том что адрес старшего байта физически существует,описан в DS но никак не обьявлен. А тем что атмельцы обьявили адрес только младшего байта они врядли добьются атомарности поскольку при желании всёравно можно нарушить последовательность чт/зп. Цитата(ILYAUL @ Oct 14 2011, 10:15)  А вот так нет: Код ldi r16,0x55 ldi r17,0xAA sts RTC_PERL,r16 sts RTC_PERH,R17 nop Ошибка компиляции. Обьявите RTC_PERL/H и всё проканает.
|
|
|
|
|
Oct 14 2011, 09:24
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
QUOTE (zombi @ Oct 14 2011, 13:06)  Странно. Уменя всё и пишет и работает. Вы так их объявили? CODE .equ RTC_PERL = 0x42A .equ RTC_PERH = 0x42B
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Oct 14 2011, 09:53
|

Гуру
     
Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106

|
Цитата(ILYAUL @ Oct 14 2011, 12:24)  Вы так их объявили? Код .equ RTC_PERL = 0x42A .equ RTC_PERH = 0x42B Шо то не тот адрес. Я просто добавил пару строк к ATxmega64A1def.inc Код .equ RTC_PERL = 1034 // Period Register Low .equ RTC_PERH = 1035 // Period Register High Вот так пишу: Код .SET RTC_period =1023 ; init_RTC: ldi RTMPA, low(RTC_period) sts (RTC_PERL),RTMPA ldi RTMPA,high(RTC_period) sts (RTC_PERH),RTMPA ...
|
|
|
|
|
Oct 14 2011, 10:16
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
QUOTE (zombi @ Oct 14 2011, 13:53)  Шо то не тот адрес. Я просто добавил пару строк к ATxmega64A1def.inc CODE .equ RTC_PERL = 1034 // Period Register Low .equ RTC_PERH = 1035 // Period Register High Заработало. Но вот как верить людям , я брал адреса отсюда QUOTE (ILYAUL @ Oct 14 2011, 14:06)  Заработало. Но вот как верить людям , я брал адреса отсюда Можно ещё и так CODE ldi R16,0xBB sts RTC_TEMP,R16 sts RTC_PERH,R17
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|