Forum: Mikrocontroller und Digitale Elektronik Mega8 SPI --> DAC


von Tobias M. (thunderstruck)


Lesenswert?

Hallo!

Ich beschäftige mich seit ein paar Wochen erstmalig mit AVRs. Habe mir 
dazu das Pollin-Board und nen Mega8 besorgt. Bis jetzt habe ich auch 
schon einiges wie ADC, LCD, PWM, Timer, Interrupts usw. zum Laufen 
bekommen.

Jetzt wollte ich mich mal an der SPI-Schnittstelle versuchen und habe 
mir dazu einen DAC Typ MCP4902 besorgt um Analogwerte auszugeben. Aber 
ich komme hier jetzt nicht so richtig weiter. Der Mega8 soll als Master 
fungieren, der DAC ist ja eh nur passiv. Wie ist das jetzt mit dem SS- 
und dem SCK-Signalen? Verstehe ich es richtig, dass ich mich hierum in 
meinem Programm im Prinzip nicht kümmern muss, da der Mega8 diese 
automatisch bearbeitet sobald ich etwas in das Daten-Register (SPDR) 
schreibe?


#define F_CPU 16000000

#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
  // Initialisierung SPI
  DDRB |= (1<<DDB2) | (1<<DDB3) | (1<<DDB5);
  SPCR |= (1<<SPE) | (1<<MSTR) | (1<<SPR0);

    while (1)
    {
    SPDR = 0x3F;
    while(!(SPSR & (1<<SPIF)))
    SPDR =0x00;
    while(!(SPSR & (1<<SPIF)))

    _delay_ms(1000);

    SPDR = 0x30;
    while(!(SPSR & (1<<SPIF)))
    SPDR =0x00;
    while(!(SPSR & (1<<SPIF)))

    _delay_ms(1000);
    }
}

Danke schon mal für eure Hilfe.
Tobias

von Michael U. (amiga)


Lesenswert?

Hallo,

SCK, MOSI, MISO bedient die SPI-Hardware. SS ist beim AVR Slave-Select 
und muß bei Betrieb als Master ein Ausgang sein. Den Pin kann man dann 
als I/O frei bedienen. Wenn der Slave einen /CS oder /CE-Pin hat, nit 
man meist SS zum Ansteuern. Das Ansteuern muß man aber im Programm selbt 
erledigen, also z.B. /CS auf Low, SPI-Daten rausschicken, /CS wieder auf 
High. Das sagt aber das Datenblatt des des DAC, was der haben will.

Gruß aus Berlin
Michael

von Kirsch (Gast)


Lesenswert?

Tobias M. schrieb:
> ie ist das jetzt mit dem SS-
> und dem SCK-Signalen? Verstehe ich es richtig, dass ich mich hierum in
> meinem Programm im Prinzip nicht kümmern muss, da der Mega8 diese
> automatisch bearbeitet sobald ich etwas in das Daten-Register (SPDR)
> schreibe?

Nein, das SS must du selber setzten.
Der SS-Pin muss als Ausgang eingestellt sein, selbst wenn du einen 
anderen Pin für Select benutzt.

Der AVR wechselt automatisch in den SPI-Slave Mode, falls der SS-Pin als 
Eingang eingestellt wird und das Signal Low wird.

von Klaus P. (phoenix89)


Lesenswert?

Also, Code sieht schonmal ganz gut aus, wird aber auf den ersten Blick 
nicht fuktionieren :D

Annahme: Der CS-Pin von deinem DAC hängt am /SS Pin des Megas.

Du musst vor einer Kommunikation den CS-Pin auf GND ziehen, sonst denkt 
der DAC sich: "Ach da quatschen 2 auf der Leitung, ich bin jedenfalls 
nicht gemeint.. düdüdü" :D
Nach der Kommunikation wieder auf high setzen (bei einem Slave nicht 
wirklich notwendig, aber ist schöner).

Gut wäre ebenfalls den MISO Pin nochmal auf Eingang zu setzen (In DDRB 
sicher das Bit zu löschen, wer weiß was da grade drin steht).

Das SCK macht dein Atmega selbst.

von Pandur S. (jetztnicht)


Lesenswert?

Fuer den maximalen Lernerfolg empfehle ich zumindest einmal die Pins 
haendisch, per PortIO, nach Datenblatt ansusteuern. Da kann man schoen 
mit dem Oszilloskop kontrollieren was so geht.

von Tobias M. (thunderstruck)


Lesenswert?

Vielen Dank, es läuft. Leuchtet mir jetzt auch ein, dass man SS selbst 
bedienen muss. Wie könnte man schließlich sonst bei mehreren Slaves 
einen bestimmten Slave auswählen.

Gruß Tobias

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.