a_skr,Молодчик только я бы немного по другому оформил
Код: Выделить всё
#include <avr/io.h>
#include <avr/delay.h>
int main(void)
{
uint8_t* ptr_ddrb = (uint8_t*)&DDRB; //Тут чтобы не забивать голову константами адресов
volatile uint8_t* ptr_portb = (uint8_t*)&PORTB;//И ptr_, чтобы было понятно, что это указатель
*ptr_ddrb = 0xFF;
}
Кстати в файле sfr_defs.h Вот что прописано
Код: Выделить всё
iomx8.h
#define PORTB _SFR_IO8 (0x05)
sfr_defs.h
#ifndef __SFR_OFFSET
/* Define as 0 before including this file for compatibility with old asm
sources that don't subtract __SFR_OFFSET from symbolic I/O addresses. */
# if __AVR_ARCH__ >= 100
# define __SFR_OFFSET 0x00
# else
# define __SFR_OFFSET 0x20
# endif
#endif
#if _SFR_ASM_COMPAT
#define _SFR_IO8(io_addr) ((io_addr) + __SFR_OFFSET)
#else /* !_SFR_ASM_COMPAT */
#define _SFR_IO8(io_addr) _MMIO_BYTE((io_addr) + __SFR_OFFSET)
#endif /* !_SFR_ASM_COMPAT */
#define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr))<<< Вот аналогичное объявление :)
Обращение к регистрам производится через абсолютный адрес.
Jack_A писал(а):Тут немножко вольное обращение с терминологией привело к недопониманию. "Относительный адрес" - это вольная интерпретация автора объяснения. Есть номер регистра в области ввода-вывода ( конечно, можно назвать его и "относительным", но это понятие многозначно : относительно указателя, отнсительно счетчика команд * ) -- и есть его абсолютный адрес в общем пространстве [ РОН - I/O - память ] .
Простите запамятовал, сейчас посмотрел еще раз- в скобках абсолютный, то есть нумерация начинается после РОН 32,33, и тд.
Под относительным имел ввиду тот, что без скобок те начинается с нуля относительно последнего РОН нумерация ну или относительно начала I/O секции
