- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 2 von 2

Thema: AD7476 SPI

  1. #1

    AD7476 SPI

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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)

  2. #2

    ...

    PS :
    die Zeile
    adwert |= (spi_putc(0xAA)<<;

    muss natürlich

    adwert |= (spi_putc(0x00)<<;

    geschrieben sein

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests