Страница 1 из 1

R16...R31 в памяти XMEGA

Добавлено: Пн июл 25, 2011 11:53:54
mackerel
Братцы! Очень срочно понадобились адреса регистров в ATxmega128A1.
Работаю под IAR. Почему-то в ATxmega128A1.h нашёл только первые 15 из них (GPIO0...15). А где же R16...R31???
Или я чего-то не понимаю.
Помогите!

Re: R16...R31 в памяти XMEGA

Добавлено: Пн июл 25, 2011 13:07:15
mackerel
Неужели никто не знает???

Re: R16...R31 в памяти XMEGA

Добавлено: Пн июл 25, 2011 13:20:05
avreal
Всё, забудьте. R0..R31 в Xmega не адресуются как память, как это было у остальных AVR.
А GPIO -- это другое. Таких регистров по одному-два-три и у свежих "обычных" AVR-ок есть, доступны для in/out и, что приятно, для размещения глобальных битовых флагов под sbi/cbi/sbis/sbic, так как с байтами в ОЗУ AVR8 такого не умеют.

Re: R16...R31 в памяти XMEGA

Добавлено: Пн июл 25, 2011 13:37:45
mackerel
avreal писал(а):Всё, забудьте. R0..R31 в Xmega не адресуются как память, как это было у остальных AVR.
А GPIO -- это другое. Таких регистров по одному-два-три и у свежих "обычных" AVR-ок есть, доступны для in/out и, что приятно, для размещения глобальных битовых флагов под sbi/cbi/sbis/sbic, так как с байтами в ОЗУ AVR8 такого не умеют.
Пипец, до чего дошли... :(
А как тогда быть при использовании ассемблерной функции, возвращающей что-нибудь? (Если байт, то он возвращается в R16). Ну, нет, в принципе, понятно, всё будет работать, но компилятор ругнётся, если чисто формально не написать что-то вроде return XXX; где XXX - это тот самый R16, или его содержимое, перенесённое в память... Возня, однако...

Re: R16...R31 в памяти XMEGA

Добавлено: Пн июл 25, 2011 22:14:03
mackerel
Братцы, ещё просьба...
Чтобы новую тему не создавать, здесь отпишу:
Никто не может подарить файлик для IAR - ATxmega128A1.h посвежее? А то лажа какая-то, в частности, с ADC - структура в заголовочном не соответствует приведенной в описании (калибровочные байты - точно, может, и ещё чего). Задолбался сегодня, такой бред намеряется. Вообще этот ADC, по отзывам, не подарок, а тут ещё, блин, это. И деваться некуда, в срок до позавчера нужно изделие сдавать.

Re: R16...R31 в памяти XMEGA

Добавлено: Вт июл 26, 2011 09:15:20
avreal
Я с IAR практически не работаю, у меня какой-то kick-start живёт.
В нём

Код: Выделить всё

/*
 --------------------------------------------------------------------------
 --             - ATxmega128A1.h -
 --
 --     This file declares the internal register addresses for ATxmega128A1.
 --
 --     Used with IAR System's iccAVR and aAVR.
 --
 --     Copyright Atmel Corporation 2008. All rights reserved.
 --
 --------------------------------------------------------------------------
*/

...

/** @addtogroup adc Analog/Digital Converter
 *  @{
 */

/// ADC Channel
typedef struct ADC_CH_struct {
	register8_t CTRL; ///< Control Register
	register8_t MUXCTRL; ///< MUX Control
	register8_t INTCTRL; ///< Channel Interrupt Control
	register8_t INTFLAGS; ///< Interrupt Flags
	WORDREGISTER(RES); ///< Channel Result
	register8_t reserved_0x6; ///< reserved
	register8_t reserved_0x7; ///< reserved
} ADC_CH_t;	

/// Analog-to-Digital Converter
typedef struct ADC_struct {
	register8_t CTRLA; ///< Control Register A
	register8_t CTRLB; ///< Control Register B
	register8_t REFCTRL; ///< Reference Control
	register8_t EVCTRL; ///< Event Control
	register8_t PRESCALER; ///< Clock Prescaler
	register8_t reserved_0x05; ///< reserved
	register8_t INTFLAGS; ///< Interrupt Flags
	register8_t TEMP; ///< Temporary register
	register8_t reserved_0x08; ///< reserved
	register8_t reserved_0x09; ///< reserved
	register8_t reserved_0x0A; ///< reserved
	register8_t reserved_0x0B; ///< reserved
	WORDREGISTER(CAL); ///< Calibration Value
	register8_t reserved_0x0E; ///< reserved
	register8_t reserved_0x0F; ///< reserved
	WORDREGISTER(CH0RES); ///< Channel 0 Result
	WORDREGISTER(CH1RES); ///< Channel 1 Result
	WORDREGISTER(CH2RES); ///< Channel 2 Result
	WORDREGISTER(CH3RES); ///< Channel 3 Result
	WORDREGISTER(CMP); ///< Compare Value
	register8_t reserved_0x1A; ///< reserved
	register8_t reserved_0x1B; ///< reserved
	register8_t reserved_0x1C; ///< reserved
	register8_t reserved_0x1D; ///< reserved
	register8_t reserved_0x1E; ///< reserved
	register8_t reserved_0x1F; ///< reserved
	ADC_CH_t CH0; ///< ADC Channel 0
	ADC_CH_t CH1; ///< ADC Channel 1
	ADC_CH_t CH2; ///< ADC Channel 2
	ADC_CH_t CH3; ///< ADC Channel 3
} ADC_t;	

/** @} */
С документацией вроде бы совпадает.

Re: R16...R31 в памяти XMEGA

Добавлено: Вт июл 26, 2011 22:26:19
mackerel
Спасибо огромное!!!


Уф...
Всё получилось.
Именно в калибровке было дело, с правильной структурой заработало (сам её подправил, а потом убедился в своей правоте благодаря приведенному фрагменту).
Хотя, сам ADC - та ещё пакость. В режиме несимметричного входа вблизи опорного напряжения очень паршиво работает. Перевёл в дифференциальный - вроде, лучше.

Ещё раз спасибо!