виртуальный порт работает в микроконтроллере atmega, возможно?

Поскольку я не смог найти весь порт в своем дизайне, но я хочу, чтобы моя программа стала единообразной (когда я меняю контакты, мне нужно только изменить этот массив), поэтому я хочу создать виртуальный порт, определив их в массив. При работе я хочу установить каждый из этих виртуальных контактов в цикле. Это точно так же, как приведенные ниже коды макросов (конечно, я могу определить 2 массива отдельно для портов и контактов). Длина массива (контактов) является переменной (возможно, 2/3/4 контакта) перед компиляцией, но это не важно.

unsigned char bitorder[]={PORTC,6,PORTD,2};
    foreach i,j in (bitorder){
        asm SBI i,j
        // some delay or operation here
        asm CBI i,j
    }

Если это возможно? использовать функцию или макрос? или указатель на операцию указателя?


person eexpress    schedule 06.02.2013    source источник
comment
Я действительно не понимаю, что вы пытаетесь сделать здесь. Вы пытаетесь настроить двумерный массив, а затем выполнить итерацию по нему? C не имеет функциональности типа foreach.   -  person Vicky    schedule 06.02.2013


Ответы (1)


Это возможно, но только взяв адрес порта, как в следующем коде:

#define PINS_COUNT  2
volatile uint8_t *  ports[PINS_COUNT] = {&PORTB, &PORTD};
uint8_t pins[PINS_COUNT] = {1, 2};
int i;
for (i=0; i<PINS_COUNT; i++) {
    *ports[i] |= pins[i];  //
    /* do something */
    *ports[i] &= ~pins[i];
}

Вы можете поместить указатели портов и выводы в один и тот же массив, но помните, что указатели ATmega имеют разрядность 16 бит. Я уверен, что есть способы сделать это и в сборке, но, поскольку вопрос был помечен как «C», я предполагаю, что вы ищете решение C.

person angelatlarge    schedule 09.03.2013