You can do this with an Uno, provided it has nothing else to do. I would
program it low-level, skipping the Arduino core since, as you said,
digitalWrite()
would be too slow for this application.
Here is my proposed approach: read the 4-bit input from one port, use a look-up table to translate it to an 8-bit output, and write that output to another port. I would use PORTD (pins 0–7) for the output, as it is the only full 8-bit port on the Uno, then the first bits of PORTB (pins 8–11) for the input:
/* Translation look-up table (dummy example). */
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; // set port B as input
DDRD = 0xff; // set port D as output
for (;;) {
uint8_t input = PINB & 0x0f; // grab the lowest 4 bits
PORTD = lut[input]; // set the output
}
}
I compiled and disassembled this code to count the CPU cycles: the main loop takes 10 cycles per iteration. Given that the Uno is clocked at 16 MHz, this is one update of the output every 0.625 μs.
- 45.1k
- 4
- 42
- 81