Быстрый цифровой ввод-вывод

digital digitalwrite digital-in

У меня есть устройство, программируемое через 8-битную цифровую параллельную шину. Я хотел бы, чтобы Arduino переводил параллельный 4-битный вывод существующего устройства на 8-битный, намеренно уменьшая результат. К сожалению, я не могу просто использовать самые значащие биты, так как хочу изменить размер шага. Идея состоит в том, чтобы использовать Arduino, который готовит 4 цифровых входных бита, а затем вычисляет необходимые 8-битные выходные данные, которые он выводит на 8-битную шину. Однако это должно быть так же быстро, как 1 us. Возможно ли это с Arduino? Если да, то какую плату посоветуете? Думаю, я не могу использовать команду digitalWrite, так как это будет слишком медленно. Есть предложения?

, 👍1


1 ответ


Лучший ответ:

3

Вы можете сделать это с помощью Uno, если ему больше нечего делать. Я бы запрограммируйте его на низком уровне, пропуская ядро Arduino, поскольку, как вы сказали, digitalWrite() будет слишком медленным для этого приложения.

Вот мой предложенный подход: прочитать 4-битный ввод с одного порта, использовать справочную таблицу, чтобы перевести ее в 8-битный вывод и записать этот вывод в другой порт. Я бы использовал PORTD (контакты 0–7) для вывода, как есть. единственный полноценный 8-битный порт на Uno, затем первые биты PORTB (пины 8–11) для ввода:

/* Таблица поиска перевода (фиктивный пример). */
const uint8_t lut[16] = {
    0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
    0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff
};

int main() {
    DDRB = 0x00;  // установить порт B в качестве входа
    DDRD = 0xff;  // устанавливаем порт D в качестве выхода
    for (;;) {
        uint8_t input = PINB & 0x0f;  // взять младшие 4 бита
        PORTD = lut[input];  // устанавливаем вывод
    }
}

Я скомпилировал и дизассемблировал этот код для подсчета циклов процессора: основной Цикл занимает 10 циклов на итерацию. Учитывая, что Uno тактируется при 16 МГц это одно обновление вывода каждые 0,625 мкс.

,

хороший ответ ... голосую за усилия, @jsotola

Большое спасибо за подробный ответ и тестирование. Еще один вопрос из любопытства: означает ли это, что если я выберу Arduino Zero, он будет (48 МГц / 16 МГц) в 3 раза быстрее, а Due (84 МГц / 16 МГц) — в 5 раз быстрее?, @P. Egli

@P.Egli: Re: «_if I go for Arduino Zero [...]_»: Нет. Эти Arduino используют архитектуру ARM, которая полностью отличается от архитектуры AVR Uno. Приведенный выше код не может быть тривиально перенесен на них. AVR достаточно прост, чтобы вы могли подсчитать циклы процессора, просто взглянув на листинг сборки. Я сомневаюсь, что ядра ARM Zero и Due находятся на таком уровне простоты., @Edgar Bonet