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

 
 
 
Reply to this topicStart new topic
> xmega RAMPn-регистры
_Артём_
сообщение Apr 27 2012, 22:25
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Здраствуйте.
Не понимаю такой момент:
cpu - xmega192/256 A3, соответственно ОЗУ только внутренния.
С RAPMZ - понятно: может использоваться для адресации флеш по адресам большим 64кБ.
А что с RAMPX, RAMPY и RAMPD?
Они реализованы?
И что ими тогда можно адресовать?

Спасибо.
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Apr 28 2012, 03:55
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



1. RAMPX, RAMPY - тоже самое, что и RAMPZ, с инструкциями LD/LDD/ST/STD - для доступа к SRAM памяти >64К при косвенной адресации
Код
ldi r29,$05
ldi r28,$00
ld r2,Y+

Т.е. если RAMPY=0, то будет прочитана ячейка $500,
если RAMPY=1, то будет прочитана ячейка $10500

При ресете RAMPZ=RAMPY=RAMPX=0 - то есть указывают на нижние 64К

2. Отличие RAMPZ, от RAMPX и RAMPY - в том что RAMPZ:Z используется в инструкциях ELPM/SPM для доступа к Flash-памяти

Код
ldi ZL, byte3(Table_1<<1); Initialize Z-pointer
out RAMPZ, ZL
ldi ZH, byte2(Table_1<<1)
ldi ZL, byte1(Table_1<<1)
elpm r16, Z+; Load constant from Program
; memory pointed to by RAMPZ:Z (Z is r31:r30)

Здесь можно использовать только RAMPZ:Z

3. RAMPD - аналогично, но с инструкциями LDS/STS для прямой адресации
Код
lds r2,$400

Т.е. если RAMPD=0, то будет прочитана ячейка $400,
если RAMPD=2, то будет прочитана ячейка $20400

При ресете RAMPD=0 - то есть указывает на нижние 64К

4. есть еще EIND (Extended Indirect Register) - предлагаю с ним разобраться самому в качестве домашнего задания

P.S. Если интерфейса внешней памяти у кристалла нет, то инструкции скорее всего не отработают. Хотя регистры скорее всего есть, т.к. ядро у семейств А1,А3 и А4 одно и тоже

Сообщение отредактировал alexeyv - Apr 28 2012, 04:33
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Apr 28 2012, 12:39
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(alexeyv @ Apr 28 2012, 06:55) *
1. RAMPX, RAMPY - тоже самое, что и RAMPZ, с инструкциями LD/LDD/ST/STD - для доступа к SRAM памяти >64К при косвенной адресации

P.S. Если интерфейса внешней памяти у кристалла нет, то инструкции скорее всего не отработают. Хотя регистры скорее всего есть, т.к. ядро у семейств А1,А3 и А4 одно и тоже


В том и вопрос, что памяти 8/16/32кБ и внешней нет. Значит RAMPX/D/Y бесполезны. Если вообще реализованы.
Go to the top of the page
 
+Quote Post
zombi
сообщение Apr 28 2012, 17:16
Сообщение #4


Гуру
******

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



Цитата(_Артём_ @ Apr 28 2012, 15:39) *
Значит RAMPX/D/Y бесполезны. Если вообще реализованы.

Думаю нужно проверять на конкретных чипах.
С удовольствием проверил бы, но у меня к сожалению в наличии только xmega-XXX-A1 crying.gif
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Apr 28 2012, 17:30
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(zombi @ Apr 28 2012, 20:16) *
Думаю нужно проверять на конкретных чипах.
С удовольствием проверил бы, но у меня к сожалению в наличии только xmega-XXX-A1 crying.gif


Ну проверять то нужно, но что это даст?
Допустим RAMPY реализован и вопрос уже в том использует ли его компилятор и зачем?
Go to the top of the page
 
+Quote Post
zombi
сообщение Apr 28 2012, 17:41
Сообщение #6


Гуру
******

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



Цитата(_Артём_ @ Apr 28 2012, 20:30) *
Допустим RAMPY реализован и вопрос уже в том использует ли его компилятор и зачем?

Про компиляторы не скажу, исключительно на асме калякаю.
А если RAMPY реализован в моделях A2,3,4 то на асме вполне возможно оный использовать просто как дополнительные рег. хранения.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Apr 28 2012, 19:38
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Такой код для проверки:
Код
#if defined(__HAS_RAMPD__)
    PORTA.OUTSET=1;
#endif
#if defined(__HAS_RAMPY__)
    PORTA.OUTSET=2;
#endif
#if defined(__HAS_RAMPX__)
    PORTA.OUTSET=4;
#endif
#if defined(__HAS_RAMPZ__)
    PORTA.OUTSET=8;
#endif


Выполнилась только последняя строчка.
Вывод - из RAMP-ов только Z есть в наличии что логично.

Цитата(zombi @ Apr 28 2012, 20:41) *
А если RAMPY реализован в моделях A2,3,4 то на асме вполне возможно оный использовать просто как дополнительные рег. хранения.

Можно бы, но похоже их нет.

Go to the top of the page
 
+Quote Post
zombi
сообщение Apr 29 2012, 09:18
Сообщение #8


Гуру
******

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



Цитата(_Артём_ @ Apr 28 2012, 22:38) *
Такой код для проверки:
Код
#if defined(__HAS_RAMPD__)
    PORTA.OUTSET=1;
#endif

Не думаю что отсутствие описания __HAS_RAMPD__ является гарантией его физического отсутсвия.

Абсолютно во всех файлах DEF avrasm2 для XMEG есть вот такое описание регистров CPU:
Код
;***************************************************************************
;** CPU - CPU Registers
;***************************************************************************
.equ CPU_CCP = 52        // Configuration Change Protection
.equ CPU_RAMPD = 56        // Ramp D
.equ CPU_RAMPX = 57        // Ramp X
.equ CPU_RAMPY = 58        // Ramp Y
.equ CPU_RAMPZ = 59        // Ramp Z
.equ CPU_EIND = 60        // Extended Indirect Jump
.equ CPU_SPL = 61        // Stack Pointer Low
.equ CPU_SPH = 62        // Stack Pointer High
.equ CPU_SREG = 63        // Status Register

Для достоверной проверки нужно туда чтонить записать,прочитать и сравнить.
Скорее всего они есть во всех иксмегах.
Но влияет ли на что нибудь запись в них не нулевого значения в чипах у которых sram<64kB нужно проверять.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Apr 29 2012, 10:40
Сообщение #9


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(_Артём_ @ Apr 28 2012, 22:38) *
Такой код для проверки:
А вот на avr-gcc это делается проще
Код
$ echo | avr-cpp -dM -mmcu=atxmega128a1 | grep HAVE | sort
#define __AVR_HAVE_EIJMP_EICALL__ 1
#define __AVR_HAVE_ELPM__ 1
#define __AVR_HAVE_ELPMX__ 1
#define __AVR_HAVE_JMP_CALL__ 1
#define __AVR_HAVE_LPMX__ 1
#define __AVR_HAVE_MOVW__ 1
#define __AVR_HAVE_MUL__ 1
#define __AVR_HAVE_RAMPD__ 1
#define __AVR_HAVE_RAMPX__ 1
#define __AVR_HAVE_RAMPY__ 1
#define __AVR_HAVE_RAMPZ__ 1
#define __AVR_HAVE_SPMX__ 1

Я думаю, что наличие соответствующего define означает, что С-компилятор про регистр знает и будет инициализировать при соответствующих операциях, сохранять/восстанавливать в прерываниях.
А при отсутствии регистр физически может существовать, может и нет — может зависеть даже от ревизии кристалла.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Apr 29 2012, 11:15
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(ReAl @ Apr 29 2012, 13:40) *
А вот на avr-gcc это делается проще
Код
$ echo | avr-cpp -dM -mmcu=atxmega128a1 | grep HAVE | sort

Это команда?
Куда её подавать?

Цитата(ReAl @ Apr 29 2012, 13:40) *
Я думаю, что наличие соответствующего define означает, что С-компилятор про регистр знает и будет инициализировать при соответствующих операциях, сохранять/восстанавливать в прерываниях.
А при отсутствии регистр физически может существовать, может и нет — может зависеть даже от ревизии кристалла.

Наверное так.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Apr 29 2012, 11:40
Сообщение #11


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(_Артём_ @ Apr 29 2012, 14:15) *
Это команда? Куда её подавать?
Это четыре команды, соединённые в цепочку, выход (stdout) предыдущей подаётся на вход (stdin) следующей через трубу | (pipe)
Набрать в командной строке (это часто даже быстрее, чем IDE-шка запускается).

Даём AVR-С-шному препроцессору на вход пустой файл, задаём тип контроллера и просим показать все defin-ы, которые у препроцессора в таблицах живут.
Потом вы-grep-аем из этого строки, имеющие в себе подстроку HAVE
И сортируем в алфавитном порядке.

Можно так:
Код
$ echo "#include <avr/io.h>" | avr-cpp -dM -mmcu=atxmega128a1|sort|less

Тогда увидим все define для данного контроллера от компилятора как такового и из avr/io.h по цепочке в глубину.
Код
#define ACA_AC0CTRL _SFR_MEM8(0x0380)
#define ACA_AC0MUXCTRL _SFR_MEM8(0x0382)
#define ACA_AC0_vect_num 68
#define ACA_AC0_vect _VECTOR(68)
....
#define XH r27
#define XL r26
#define XRAMEND EXTERNAL_SRAM_END
#define XRAMSIZE EXTERNAL_SRAM_SIZE
#define XRAMSTART EXTERNAL_SRAM_START
#define YH r29
#define YL r28
#define ZH r31
#define ZL r30


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

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

 


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


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