- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 10 von 23

Thema: ATmega > DAC (SPI Problem)

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.091
    Du hast zwar das falsche DB vom DAC gepostet, habe aber das richtige schon gefunden. Du hast das DB vom AD5624 nicht vom 5624R gepostet.

    Ich habe im DB vom Atmega geschaut. Laut diesem DB steht das CPHA Bit für die Phase der Clockimpulse (Rising oder Falling Edge). Du hast dieses Bit auf 1 gestellt, laut DB ist das für rising edge. Beim DAC steht aber drinnen das die Daten bei falling edge übernommen werden. Versuche einmal in der Init Routine das CPHA auf 0 zu schalten (bzw lassen).

    Hier ist das richtige DB vom DAC http://www.analog.com/static/importe...644R_5664R.pdf

    MfG Hannes

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    20.08.2011
    Beiträge
    18
    Okay. Das habe ich nun versucht.

    Mein SPI schaut wie folgt aus:

    Code:
    void SPI_MasterInit(void) {
    	// Set /SS, MOSI and SCK output, all others input 
    	DDRB = (1<<PB2)|(1<<PB3)|(1<<PB5);				// SS, MOSI, CLK are Outputs
    	//PORTB &= ~(1<<PB2);								// LED on (PB2 low)
    	
    	DDRC = (1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4);		// SPI::SS1...4 outputs
    	PORTC = (1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4);	// all high
    	// Enable SPI, Master, MSB first, SPI Mode 1, set clock rate fck/128
    	SPCR |= (1<<SPE) | SPI_MSB_1 | (1<<MSTR) | SPI_MODE_0 | SPI_SPEED_128;
    }
    Code:
    void SPI_MasterSend(char high, char mid, char low) {
    	
    	PORTB |= (1<<PB2);				// SS is set high, effects that LED is off				
    	cli();
    	_delay_us(5);
    	SPDR = high; 
    	while(!(SPSR & (1<<SPIF)));
    	SPDR = mid; 
    	while(!(SPSR & (1<<SPIF)));
    	SPDR = low; 
    	while(!(SPSR & (1<<SPIF)));
    	_delay_us(5);
    	sei();
    	PORTB &= ~(1<<PB2);				// SS is set low, effects that LED is on
    }
    Code:
    void SPI_Master_to_DAC_send(uint8_t mode, uint8_t dac, uint16_t wert) {
    	
    	uint8_t byte_high = 0x0;
    	uint8_t byte_mid = 0x0;
    	uint8_t byte_low = 0x0;
    	char dac_buf[128];					// Buffer für Konsolenausgabe-String
    
    	switch( mode ) 
    	{ 							
    		case 0: byte_high |= 0x0; break;	// write to input register n
    		case 1: byte_high |= 0x8; break;	// update dac register n	
    		case 2: byte_high |= 0x10; break;	// write to input register n, update all
    		case 3: byte_high |= 0x18; break;	// write to and update dac channel n
    	}
    	switch( dac ) 
    	{ 								
    		case 0: byte_high |= DAC_A; break;
    		case 1: byte_high |= DAC_B; break;
    		case 2: byte_high |= DAC_C; break;
    		case 3: byte_high |= DAC_D; break;
    		case 4: byte_high |= DAC_ALL; break;
    	}
    
    	byte_mid = (wert>>4);
    	byte_low = (wert<<4);
    
    	PORTC &= ~(1<<PC1);
    	SPI_MasterSend( byte_high, byte_mid, byte_low );
    	PORTC |= (1<<PC1);
    	sprintf( dac_buf, "## SYSTEM ## DAC Data send (%d)(%d[%d][%d])\n\r", byte_high,wert,byte_mid,byte_low);
    	UART_puts(dac_buf);
    }
    Code:
    #define SPI_MODE_0		( (0<<CPOL) | (0<<CPHA) )
    #define SPI_MODE_1		( (0<<CPOL) | (1<<CPHA) )
    #define SPI_MODE_2		( (1<<CPOL) | (0<<CPHA) )
    #define SPI_MODE_3		( (1<<CPOL) | (1<<CPHA) )
    #define SPI_MSB_1		( (0<<DORD) )
    #define SPI_LSB_1		( (1<<DORD) )
    #define SPI_SPEED_64	( (1<<SPR1) | (0<<SPR0) )
    #define SPI_SPEED_128	( (1<<SPR1) | (1<<SPR0) )

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.091
    Funktioniert es?

    MfG Hannes

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    20.08.2011
    Beiträge
    18
    Nein. Es funktioniert so leider nicht.

    Ist die Bytereihenfolge korrekt? Ich sende ja nun High, Mid, Low jeweils mit MSB zuerst. Auf dem Oszi schaut es so ja auch gut aus. Aber ist es das, was der Shiftregister erwartet? Habe eben mal Low, Mid, High mit LSB versucht, mit gleichem Ergebnis … =(

  5. #5
    Moderator Roboter Genie
    Registriert seit
    26.08.2004
    Beiträge
    1.228
    Vielleicht doch erst mal mit Software-SPI probieren. Das funktioniert ganz einfach mit einer For-Next Schleife:
    Code:
    Reset SYNC
    Pause
    
    For i = 23 to 0 Step -1
    Set SCLK
    MOSI-Pin = Datenword.i
    Pause
    Reset SCLK
    Pause
    Next i
    
    Set SYNC
    Set SCLK
    Das ganze dann halt in C umgeschrieben.

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    20.08.2011
    Beiträge
    18
    Diese Sprache habe ich ja noch nie gesehen. Und sie stellt mich vor 2 Schwierigkeiten: Wie setze in den SCLK und wie kann ich ein 24bit Wort erstellen, das ich bitweise durchlaufen kann? Und kann ich diesen SoftwareSPI auch auf die HardwareSPI Pins legen?

  7. #7
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.091
    Die interne Referenz des DAC musst du einschalten, da sie Standartmäßig auf 0 (= Aus) geschaltet ist. Das bedeutet du musst entweder eine ext. Referenz anschließen oder die interne einschalten. Ich sehe nirgends die Commandos für das einschallten der int. Referenz.
    Sende einmal 0x38, 0x00, 0x01

    MfG Hannes

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    20.08.2011
    Beiträge
    18
    Sry Hannes, hatte ich nicht gepostet.

    Code:
    #define AD5624_REF_ON	1
    Code:
    	cli();
    	UART_init();
    	UART_puts("## INIT ## UART initialisiert\n\r");
    	//PWM_init();
    	//UART_puts("## INIT ## PWM initialisiert\n\r");
    	SPI_MasterInit();
    	UART_puts("## INIT ## SPI Master initialisiert\n\r");
    
    	AD5624_reset(1);
    	_delay_ms(200);
    	AD5624_ref_setup(AD5624_REF_ON);
    	_delay_ms(200);
    	AD5624_LDAC(4);
    	_delay_ms(200);
    	AD5624_power_down(0,4);
    	_delay_ms(400);
    	UART_puts("## INIT ## DAC powered normal mode (0)(all DAC)\n\r");
    	
    	UART_puts("## INIT ## Initialisierung abgeschlossen\n\r");
    	sei();
    	UART_puts("## INIT ## Interrupts eingeschaltet\n\n\r");
    Code:
    void	AD5624_ref_setup( uint8_t state )
    {
    	if ( state == 0 )						// internal reference off
    	{
    		PORTC &= ~(1<<PC4);
    		SPI_MasterSend(0x38, 0x0, 0x0);
    		PORTC |= (1<<PC4);
    		UART_puts("## INIT ## DAC internal ref off\n\r");
    	}
    	else if ( state == 1 )					// internal reference on
    	{
    		PORTC &= ~(1<<PC4);
    		SPI_MasterSend(0x38, 0x0, 0x1);
    		PORTC |= (1<<PC4);
    		UART_puts("## INIT ## DAC internal ref on\n\r");
    	}
    	else {/* Fehlerausgabe an Host */}
    }
    Dort habe ich das Senden des ( 0x38, 0x0, 0x1 ) realisiert.

  9. #9
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.091
    Der Post von Bastiuniversal ist gepostet worden als ich geschrieben habe. Deswegen eine Erklährung erst jetzt. Diese Sprache wie Bastiuniversal geschrieben hat gibt es nicht. Dises Struktur soll nur verdeutlichen wie das Programm bzw der Ablauf aussieht.

    Du kannst die Software SPI an jeden Pin legen den du willst, also auch auf die Hardware SPI Pins. Du musst nur die Hardware SPI ausschalten.

    MfG Hannes

Ähnliche Themen

  1. ATMEGA 8 - Problem!
    Von mikro-VIIV im Forum AVR Hardwarethemen
    Antworten: 4
    Letzter Beitrag: 30.10.2008, 13:02
  2. PWM problem mit Atmega 8
    Von Enterprise im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 22.08.2008, 00:56
  3. I2C/TWI und ATmega 8 Problem
    Von cpinkle im Forum Elektronik
    Antworten: 2
    Letzter Beitrag: 25.10.2006, 20:02
  4. ATMEGA 128 SPI Problem
    Von schmidtkoe im Forum AVR Hardwarethemen
    Antworten: 4
    Letzter Beitrag: 01.10.2006, 19:23
  5. Atmega 16 Problem
    Von Ringo im Forum Elektronik
    Antworten: 10
    Letzter Beitrag: 07.05.2005, 18:42

Berechtigungen

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

Solar Speicher und Akkus Tests