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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> ATxmega64A1def.inc, непонятки
zombi
сообщение Oct 13 2011, 19:44
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 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

Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Oct 13 2011, 21:02
Сообщение #2


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

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



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.
Ну и так далее. Смысл один - два раза по одному адресу- младшим вперёд

Сообщение отредактировал IgorKossak - Oct 14 2011, 06:43
Причина редактирования: Бездумное цитирование


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
zombi
сообщение Oct 13 2011, 21:23
Сообщение #3


Гуру
******

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



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

Шото это както напрягает.
А если мне надо только старший (или только младший) байт менять?
Не покидает чувство, что хоть что-то, но всётаки без твоего участия делают.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Oct 13 2011, 21:37
Сообщение #4


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

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



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

Ну друже , это к разработчикам ATMELя - вот так они придумали. В регистр RTC_PER они попадают одновременно в момент записи старшей половинки и ни как иначе. Младший торчит во временном всё это время . Попробуй обмануть. Мне тоже не понравилось


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Юрий_СВ
сообщение Oct 13 2011, 22:03
Сообщение #5


Участник
*

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



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

по разным адресам
Go to the top of the page
 
+Quote Post
zombi
сообщение Oct 13 2011, 22:16
Сообщение #6


Гуру
******

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



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

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


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

Действительно по разным!!!
Т.е. записывая что-то в старщий адрес я записываю и в младший!!! А что в младшем ХЗ. Красота!!!
Go to the top of the page
 
+Quote Post
Юрий_СВ
сообщение Oct 13 2011, 22:20
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 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)
Go to the top of the page
 
+Quote Post
ae_
сообщение Oct 14 2011, 01:52
Сообщение #8


Участник
***

Группа: Свой
Сообщений: 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 в прошлом веке.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Oct 14 2011, 07:15
Сообщение #9


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

Группа: Свой
Сообщений: 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

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

Но и это ещё не всё - временный регистр доступен в свободном плавании - и в него можно писать и читать напрямую


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
zombi
сообщение Oct 14 2011, 07:51
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 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 и всё проканает.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Oct 14 2011, 08:08
Сообщение #11


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

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



QUOTE (zombi @ Oct 14 2011, 11:51) *
Обьявите RTC_PERL/H и всё проканает.

Не врубился/ Объявил - не пишет


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
zombi
сообщение Oct 14 2011, 09:06
Сообщение #12


Гуру
******

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



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

Странно. Уменя всё и пишет и работает.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Oct 14 2011, 09:24
Сообщение #13


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

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



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

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

CODE
.equ RTC_PERL = 0x42A
.equ RTC_PERH = 0x42B


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
zombi
сообщение Oct 14 2011, 09:53
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 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
  ...
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Oct 14 2011, 10:16
Сообщение #15


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

Группа: Свой
Сообщений: 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


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post

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

 


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


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