Atmega8 a převodník AD7710

Nenapsal jsi, co se Ti na tom nedaří. Jestli komunikace nebo nesmyslný data. Pokud se Ti vrací nesmyslný data, viděl bych problém tady :

Data z převodníku jsou B23,…,B0. Jenže Ty je do r ukládáš B7,…,B0,B15,…,B8,B23,…,B16, protože :
do r uložíš bity B23-B16
přečteš bity B15-B8, posuneš je o 8 pozic doleva a přidáš k r
přečteš bity B7-B0, posuneš je o 16 pozic doleva a přidáš k r

Správně by to měo být takhle :

unsigned long read_spi_data() { unsigned long r = 0UL; while(!(SPSR & _BV(SPIF))); r |= SPDR; while(!(SPSR & _BV(SPIF))); r <<= 8; r |= SPDR; while(!(SPSR & _BV(SPIF))); r <<= 8; r |= SPDR; return r; }

do r uložíš bity B23-B16
otočíš r o 8 bitů doleva
přečteš bity B15-B8 a přidáš k r
otočíš r o 8 bitů doleva
přečteš bity B7-B0 a přidáš k r