DAC Steuerung mittels SPI

Gast #5320
Lesenswert?
• ▲
▼
Hallo,

ich habe meinen 8535 mit einem TLC5620 (4x8bit DAC, serieller transfer) 
verbunden und habe folgendes Problem: mit codevision compiler kompiliert 
funktioniert der Transfer, die selbe Routine mit avr-gcc funktioniert 
nicht. codevision hat eine eingebaute spi funktion (hardware), diese 
habe ich dann in avr-gcc nachgebildet. Leider funktionierts aber nicht, 
ich hoffe, irgendjemand findet vielleicht den Fehler.


#define SPI_MASTER_SETUP() 
outp(BV(SPIE)|BV(SPE)|BV(MSTR)|BV(SPR0)),SPCR);

void SPI_send(uint8_t data)  {
      outp(data,SPDR);
      loop_until_bit_is_set(SPSR,7);
      inp(SPDR);
}

void send_dac(uint8_t dac, uint8_t val)
{
      sbi(PORTB,PB4); //load_dac=1;
      if (dac>3) dac=3;
      SPI_send(dac*2); // send first dac selector
      delay_us(4);
      SPI_send(val); // give the dac the needed value;
      cbi(PORTB,PB4); //load_dac=0;
      delay_us(8);
      sbi(PORTB,PB4); //load_dac=1;
}

load_dac ist der PB4, der die Aktualisierung beim DAC erzeugt (LOAD), 
der DAC läuft im Load controlled mode (LDAC=low), LOAD muss nach senden 
der Daten kurz (mind. 250 ns) auf low gehen.

sei() folgt dann im Hauptprogramm


Marco Lehmann
Gast #5321
Lesenswert?
• ▲
▼
Ich hab mal das datasheet des TLC5620 angehängt, falls jemand mal 
reinsehen möchte. Ich werde heute nochmal den codevision avr 
installieren und mir mal den assembler output der funktionierenden 
Version ansehen. Vielleicht habe ich was übersehen.

ach ja, delay_us macht nichts anderes, als nops auszuführen (je 2 pro us 
bei 7,... MHz Takt)
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren