PIC18 Чтение / запись данных при разделении по портам

Из-за конструктивных ограничений у меня есть адресная строка для контроллера памяти, разделенная на 3 разных порта PIC 18F4550. Отображение:

#define A0 PORTBbits.RB2
#define A1 PORTBbits.RB3
#define A2 PORTBbits.RB4
#define A3 PORTBbits.RB5
#define A4 PORTAbits.RA0
#define A5 PORTAbits.RÄ1
#define A6 PORTAbits.RÄ2
#define A7 PORTAbits.RÄ3
#define A8 PORTAbits.RÄ4
#define A9 PORTAbits.RÄ5
#define A10 PORTEbits.RE0
#define A11 PORTEbits.RE1
#define A12 PORTEbits.RE2

Я хотел бы получить доступ к этому как к одной переменной ADDRESS и попытался использовать объединение для этого, но просто получил `` Синтаксическую ошибку '' с:

union
{
        struct
        {
            A0 :1;
            A1 :1;
            A2 :1;
            A3 :1;
            A4 :1;
            A5 :1;
            A6 :1;
            A7 :1;
            A8 :1;
            A9 :1;
            A10 :1;
            A11 :1;
            A12 :1;
        };
} ADDRESS;

Как мне это сделать?


person Ali Lown    schedule 31.03.2011    source источник
comment
Нет, это никогда не сработает - для этого нельзя использовать профсоюз. Какое бы решение вы ни придумали, я боюсь, оно будет уродливым. Возможно, вам понадобится один или несколько макросов или функций для преобразования между адресами и различными битами порта.   -  person Paul R    schedule 01.04.2011
comment
Итак, как я и подозревал, потребуется немного сдвига и маскировки. Я пойду завтра и отправлю ответ.   -  person Ali Lown    schedule 01.04.2011


Ответы (1)


Это будет непросто, если ввод / вывод, который вы используете, хешируется в несколько портов.

Единственное упрощение, которое вы можете сделать, - распределить свою память по страницам, доступ к которым осуществляется по трем различным адресным блокам:

lowAddr will be RB2:RB5
midAddr will be RA0:RA5
highAdd will be RE0:RE2

Было бы предпочтительнее иметь больший кусок для части с низким адресом, чтобы страницы памяти могли быть больше. Здесь у вас будет всего 16 байтовых страниц.

Следовательно, вы можете определить структуру битового поля для управления вашей памятью в виде единой переменной.

struct {
   uint16 lowAddr : 4;
   uint16 midAddr : 6;
   uint16 highAddr : 3;
   uint16 : 3;
} memoryAddr;

Таким образом, вы можете более эффективно обрабатывать обновление порта, как для portB:

LATB &= 0xFF ^ (3 << 2);
LATB |= memoryAddr.lowAddr << 2;
person greydet    schedule 31.03.2011
comment
Обычно я пишу напрямую в PORTB, в чем преимущество использования регистров LATB вместо этого? - person Ali Lown; 01.04.2011
comment
@Ali вы найдете хороший ответ на этот вопрос по следующей ссылке: stackoverflow.com/questions/2623428/ - person greydet; 02.04.2011