|
xmega RAMPn-регистры |
|
|
|
 |
Ответов
|
Apr 28 2012, 03:55
|
Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Apr 28 2012, 19:38
|
Гуру
     
Группа: Свой
Сообщений: 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 то на асме вполне возможно оный использовать просто как дополнительные рег. хранения. Можно бы, но похоже их нет.
|
|
|
|
|
Apr 29 2012, 10:40
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 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 означает, что С-компилятор про регистр знает и будет инициализировать при соответствующих операциях, сохранять/восстанавливать в прерываниях. А при отсутствии регистр физически может существовать, может и нет — может зависеть даже от ревизии кристалла.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Apr 29 2012, 11:15
|
Гуру
     
Группа: Свой
Сообщений: 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 означает, что С-компилятор про регистр знает и будет инициализировать при соответствующих операциях, сохранять/восстанавливать в прерываниях. А при отсутствии регистр физически может существовать, может и нет — может зависеть даже от ревизии кристалла. Наверное так.
|
|
|
|
|
Apr 29 2012, 11:40
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 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
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|