Hallo !
Ich habe grade eine Schaltung entworfen , mit der ich Spannungen mit dem 12 Bit AD Wandler AD7476 messen kann.
Dieser wird über die SPI Schnittstelle betrieben und besitzt lediglich die MISO Leitung , Mosi fehlt da der Wandler nur einen Kanal besitzt (und somit das CommandByte entfällt)
Sobald die Chip Select Leitung auf low gezogen wird ,soll der Wandler beginnen, mit der vorher am µC (Atmega16) eingestellten/erzeugten SCK Frequenz, Daten zu übertragen.
Leider funzt es aber nicht richtig , die MISO Leitung ist zwar 16 Takte lang auf Low gezogen bei der Übertragung , aber enthält keine Daten ( 16 Takte = 4 leere Bits + 12 AD Wandler Bits) .
Als Referenz Spannung habe ich im übrigen eine 4.096 Volt Quelle benutzt, da das lästiges Umrechnen erspart (4,096 V / 4096 Werte bei 12 Bit Auflösung).

Das Problem wird vermutlich der SPI Code sein , da ich auf dem GEbiet SPI Bus Neuling bin , bitte ich euch mal einen blick drauf zu werfen , ob der Code auch korrekt ist ...

Code:
uint16_t adwert;
// ----------
// Init
// ----------
void spi_init(void)
{
  // Init wie in AppNote
  SPCR 	&= ~(1 << SPE);			// disable SPI
  DDRB 	|= (1 << PB4);			// SS output
  PORTB |= (1 << PB4);			// SS high
  SPCR 	|= (1 << MSTR) | (1 << SPE) ;	// master; enable SPI; 
  
  // datarate, mode3, MSB first, SCK auf FCPU /128
  SPCR &= ~( (1 << DORD)); 
  SPCR |=  (1 << CPOL) |(1 << CPHA)| (1 << SPR1) | (1 << SPR0);
  DDRB |= (1 << PB5) | (1 << PB7);		// SCK & MOSI -> output          
  DDRB &= ~(1 << PB6);			      		// MISO -> input	
   
}

uint8_t spi_putc( uint8_t data )
{
    // Sendet ein Byte
    SPDR = data;
   
    // Wartet bis Byte gesendet wurde
    while( !( SPSR & (1<<SPIF) ) )
        ;
   
    return SPDR;
}
uint16_t ADREAD(void)
{
    adwert =0;
   
   
    // /CS des AD7476 auf Low ziehen
    PORTB &= ~(1<<PB4);
   
    
    adwert |= (spi_putc(0xAA)<<8);
    adwert |= spi_putc(0x00); 
   
    // /CS Leitung wieder freigeben
    PORTB |= (1<<PB4);
   
    return adwert;
}
vielen DANK im Vorraus
der braini :O)