Цитата(Xenia @ Aug 16 2009, 11:03)

Код, предложенный ReAl, можно сделать быстрее, если в качестве переменной cod_1 использовать не ячейку памяти
Так по условиям задачи в пределах байта сохранять в памяти не нужно, это же не в побитном прерывании идёт, а циклом на основном уровне. Так что всё будет и так хорошо.
Код
uint8_t read_byte()
{
uint8_t cod_1;
uint8_t i = 8;
do {
PORTB |= 0x08;
cod_1 <<= 1;
if( PINB & 0x02 )
cod_t |= 0x01;
PORTB &= ~0x08;
} while( --i);
return cod_1;
}
avr-gcc -Os -S
Код
.global read_byte
.type read_byte, @function
read_byte:
ldi r25,lo8(8)
.L3:
sbi 37-0x20,3
lsl r24
sbic 35-0x20,1
ori r24,lo8(1)
.L2:
cbi 37-0x20,3
subi r25,lo8(-(-1))
brne .L3
ret
Даже CLK симметричным и без дрожания выходит - по 5 циклов процессора 0/1 независимо от вводимых данных :-)
Всё равно за аппаратным SPI не угнаться...