Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Пользуемся указателями на порты и другие регистры
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
torik
Всем привет. Что-то я затупил...

Создаю структуру:

Код
typedef struct {
    unsigned int* VS;
} fz_hard;


Инициализирую:

Код
    fz_hard fz;                                                //создаем FZ
    fz.VS = &PORTB;


Получаем предупреждение компилятора:
Цитата
Warning [359] D:\project\kvs_28\kvs_28.c; 61.15 illegal conversion between pointer types


Смотрю на симуляторе. Вместо адреса порта 0x0f81 видим адрес 0x0081, т.е. потеряли старший байт.

Как устранить и как вообще передать в функцию в качестве параметра ссылку, указатель на порт?
xemul
Цитата(torik @ Jun 22 2009, 16:47) *
Всем привет. Что-то я затупил...

Компилятору в хидере сказано, что:
Код
volatile near unsigned char    PORTB        @ 0xF81;

, и он огорчается на несоответствие типов.
Цитата
Смотрю на симуляторе. Вместо адреса порта 0x0f81 видим адрес 0x0081, т.е. потеряли старший байт.

Обзовите VS правильно, и все получится.
Цитата
Как устранить и как вообще передать в функцию в качестве параметра ссылку, указатель на порт?

как обычно
Код
void foo(volatile near unsigned char *);
typedef struct {
   volatile near unsigned char *VS;
} fz_hard;

fz_hard fz;
fz.VS = &PORTB;
foo(fz.VS);
torik
Да, ругаться перестал. Но значение fz.VS остается 0х0081 вместо 0х0f81. Результат чтения *fz.VS, соответственно = 0, хотя в PORTB записано значение... Компилятор автоматически сыграет банками? Но тогда почему результат неверный?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.