Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ATxmega64A1def.inc
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
zombi
Вот к примеру регистр период 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

ILYAUL
3.11 Accessing 16-bit Registers
The AVR data bus is 8 bits wide, and so accessing 16-bit registers requires atomic operations.
These registers must be byte-accessed using two read or write operations. 16-bit registers are
connected to the 8-bit bus and a temporary register using a 16-bit bus.
For a write operation, the low byte of the 16-bit register must be written before the high byte. The
low byte is then written into the temporary register. When the high byte of the 16-bit register is
written, the temporary register is copied into the low byte of the 16-bit register in the same clock
cycle.
Ну и так далее. Смысл один - два раза по одному адресу- младшим вперёд
zombi
Цитата(ILYAUL @ Oct 14 2011, 00:02) *
Ну и так далее. Смысл один - два раза по одному адресу- младшим вперёд

Шото это както напрягает.
А если мне надо только старший (или только младший) байт менять?
Не покидает чувство, что хоть что-то, но всётаки без твоего участия делают.
ILYAUL
QUOTE (zombi @ Oct 14 2011, 01:23) *
Шото это както напрягает.
А если мне надо только старший (или только младший) байт менять?
Не покидает чувство, что хоть что-то, но всётаки без твоего участия делают.

Ну друже , это к разработчикам ATMELя - вот так они придумали. В регистр RTC_PER они попадают одновременно в момент записи старшей половинки и ни как иначе. Младший торчит во временном всё это время . Попробуй обмануть. Мне тоже не понравилось
Юрий_СВ
Цитата(ILYAUL @ Oct 14 2011, 00:02) *
Смысл один - два раза по одному адресу- младшим вперёд

по разным адресам
zombi
Цитата(ILYAUL @ Oct 14 2011, 00:37) *
Младший торчит во временном всё это время . Попробуй обмануть. Мне тоже не понравилось

Это типа проц стал 16-ти разрядным???


Цитата(Юрий_СВ @ Oct 14 2011, 01:03) *
по разным адресам

Действительно по разным!!!
Т.е. записывая что-то в старщий адрес я записываю и в младший!!! А что в младшем ХЗ. Красота!!!
Юрий_СВ
Цитата(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)
ae_
Цитата(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 в прошлом веке.
ILYAUL
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

Ошибка компиляции.

Но и это ещё не всё - временный регистр доступен в свободном плавании - и в него можно писать и читать напрямую
zombi
Цитата(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 и всё проканает.
ILYAUL
QUOTE (zombi @ Oct 14 2011, 11:51) *
Обьявите RTC_PERL/H и всё проканает.

Не врубился/ Объявил - не пишет
zombi
Цитата(ILYAUL @ Oct 14 2011, 11:08) *
Не врубился/ Объявил - не пишет

Странно. Уменя всё и пишет и работает.
ILYAUL
QUOTE (zombi @ Oct 14 2011, 13:06) *
Странно. Уменя всё и пишет и работает.

Вы так их объявили?

CODE
.equ RTC_PERL = 0x42A
.equ RTC_PERH = 0x42B
zombi
Цитата(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
  ...
ILYAUL
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
zombi
Цитата(ILYAUL @ Oct 14 2011, 13:16) *
я брал адреса отсюда

А это откуда? чья картинка?
ILYAUL
QUOTE (zombi @ Oct 14 2011, 14:18) *
А это откуда? чья картинка?

Студио
zombi
Цитата(ILYAUL @ Oct 14 2011, 13:18) *
Студио

biggrin.gif Отказался от оной ещё с AT90S...
Тут с багами самих чипов разобраться бы а не студию тестить
ILYAUL
QUOTE (zombi @ Oct 14 2011, 14:24) *
biggrin.gif Отказался от оной ещё с AT90S...
Тут с багами самих чипов разобраться бы а не студию тестить

А они молчат по поводу errat-ы - наверное сами не понимают , что написали biggrin.gif smile3046.gif
zombi
Цитата(ILYAUL @ Oct 14 2011, 10:15) *
Вот так комманды проканывают:
Код
ldi r16,0x55
ldi    r17,0xAA
sts RTC_PER,r16
sts RTC_PER,R17
nop

А у меня так не работает.
Т.е. подряд две записи по одному адресу не пишут регистр периода laughing.gif
ILYAUL
Dear Customer,
Please try with the following assembly code snippet
Code:
CODE
;start of code
.include "ATxmega64A1def.inc"
.equ RTC_BASE_ADDR = 0x0400
.equ RTC_TEMP_REG_OFFSET_ADDR = 0x04
.equ RTC_CNT_LOW_REG_OFFSET_ADDR = 0x08
.equ RTC_CNT_HIGH_REG_OFFSET_ADDR = 0x09
Start:
ldi r16,0x55
ldi r17,0xAA
;to write into 16 bit register
cli
sts RTC_BASE_ADDR +RTC_TEMP_REG_OFFSET_ADDR,r16
sts RTC_BASE_ADDR +RTC_CNT_HIGH_REG_OFFSET_ADDR,r17
sei
ldi r16,0x33
ldi r17,0x66
;to read from 16 bit register
cli
lds r16, RTC_BASE_ADDR +RTC_CNT_LOW_REG_OFFSET_ADDR
lds r17, RTC_BASE_ADDR +RTC_TEMP_REG_OFFSET_ADDR
sei
;end of code

Please refer "Section: 3.11: Accessing 16 bit Registers" (Page Number:12)
in the Xmega A manual.

Please refer "Section : Peripheral Module Address Map" (Page Number:58) to
get the peripheral base address (for example 0x0400 for RTC) of ATxmega64A1
device in the datasheet.

Please refer "Section 17.4 RTC : Register Summary" (Page Number : 196) to
get the RTC registers address (for example base address 0x0400 + offset
address 0x04 = 0x0404 for RTC TEMP register) in the Xmega A manual.

The XmegaA manual and ATxmega64A1 device datasheet is available at the
following path (under "datasheets" section)

http://www.atmel.com/dyn/products/product_...mp;part_id=4297

The above address definitions have been included in "ATxmega64A1def.inc"
file also.For example RTC base address has been defined in the
"ATxmega64A1def.inc" file (as .equ RTC_base = 0x0400)under "ALL MODULE BASE
ADRESSES" section.

Hope this helps.Sorry for the inconvenience.
Best Regards,
Vijay Jayaraman K
Atmel Technical Support Team
zombi
Ага. т.е. советуют через базовый адрес+смещение и temp. ок. понятно.
А нафига тогда обьявлен абсолютный адрес младшего байта регистра периода : .equ RTC_PER = 1034 // Period Register?
И вовсе не обьявлен адрес старшего байта.
ILYAUL
QUOTE (zombi @ Oct 19 2011, 14:33) *
Ага. т.е. советуют через базовый адрес+смещение и temp. ок. понятно.
А нафига тогда обьявлен абсолютный адрес младшего байта регистра периода : .equ RTC_PER = 1034 // Period Register?
И вовсе не обьявлен адрес старшего байта.

Похоже , что они писали *.inc второпях
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.