Funktioniert es?
MfG Hannes
Druckbare Version
Funktioniert es?
MfG Hannes
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 … =(
Vielleicht doch erst mal mit Software-SPI probieren. Das funktioniert ganz einfach mit einer For-Next Schleife:
Das ganze dann halt in C umgeschrieben.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
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?
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
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");
Dort habe ich das Senden des ( 0x38, 0x0, 0x1 ) realisiert.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 */}
}
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
Ah okay. Also Pseudo-Code. Danke für die Aufklärung. Hab mich schon gefragt, ob ich mich vllt für die falsche Sprache entschieden habe =)
So Leute. Ich bin das Ganze noch mal von Grundauf angegangen und habe auch die Hardware nochmal überprüft. Es war ein Tricky Hardwarefehler den ich mir da selber eingebrockt habe. Da die beiden Teile uC und DAC auf verschiedenen Boards platziert sind war ein Verbinder zwischen diesen und auf dem Board des DAC war der MOSI mit dem MISO vertauscht. Somit konnte nichts ankommen.
Somit ist das Ganze gelöst und der Code funktioniert! Ich hoffe der Code hilft vllt anderen Leuten weiter, die sich mit dem Thema beschäftigen.
Gesendet wird nun mit folgenden Einstellungen:
MSB first, SPI Mode 0, Speed CLK/128 in der Reihenfolge High, Mid, Low
Vielen vielen Dank für eure Hilfe!
Sehr schön wenn es jetzt funktioniert.
MfG Hannes