mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega 16, SPI, DA-Wandler funktionunsfähig


Autor: Rob E. (dancer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo liebes Forum,

ich bin neu im Forum und habe folgendes Problem:

Mein Ziel ist es mit einem Atmega 16 einen Seriellen DA-Wandler über SPI 
anzusteuern.
Der DA Wandler ist der AD5304.

Die Funktionen hab ich analog zu beiden Datenblätter erstellt.
Jedoch bekomme ich am Ausgang vom uC keine Signale (gemessen mit Oszi)

Hier der Code:
void spi_init(void)   //SPI Schnittstelle aktivieren für DA-Wandlung
{                  
  DDRB=(1<<PB4) | (1<<PB5) | (1<<PB7);  //DD_MOSI, DD_SCK als Ausgänge setzten PB4 für CS als Ausgang setzten
  SPCR= 0x5B;  //SPI Enable; Master; Prescaler 128  
  PORTB |=(1<<PB4);     //PB4 auf 1 Setzten - DA Wandler Low Aktiv
}

void geschw(char Data1, char Data2)//Daten zu DA-Wandler schicken
{  
PORTB &= ~(1 << PB4);  //PIN PB4 auf 0 (DA-Wandler emfangsbereit) 
SPDR=Data1;    //ersten 8 Bit schicken
while (!(SPSR & (1<<SPIF))) {};  //warten bis Daten versendet
SPDR=Data2;                  //2. Byte schicken
while (!(SPSR & (1<<SPIF))) {};  //warten bis Daten versendet
PORTB |=(1<<PB4);  //DA Wandler Empfang ausschalten
}


Simuliert habe ich das ganze im AVR Studio auch schon, dort liegen die 
passenden Signale am PINB Register an und nicht am PORTB Register.

Habe ich jetzt irgendwo einen Denkfehler ?!

Danke im voraus
Grüße
Rob

Autor: Harald (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zeig mal Deine Hauptschleife.

Autor: Rob E. (dancer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
int main(void)
{
  DDRD=0x01;    //Spannungsversorgung (für Testzwecke)
  PORTD=0x01;
    
  uint8_t e=0b01111111;
  uint8_t f=0b11110000;

  spi_init();
  geschw(e,f);
  
  while(1)
  {  geschw(e,f);
    _delay_ms(1000);
        }

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
0x5B... Du hast möglicherweise Bit CPOL und CPHA verwechselt.
void spi_init(void)   //SPI Schnittstelle aktivieren für DA-Wandlung
{
  // DD_MOSI, DD_SCK als Ausgänge setzten 
  // PB4 für CS als Ausgang setzten                  
  DDRB=(1<<PB4) | (1<<PB5) | (1<<PB7);  

  // SPI Enable; Master; Prescaler 128
  // CPOL=0,CPHA=1: Mode 2 
  // vgl. AD5304/AD5314/AD5324 to 68HC11/68L11 Interface
  // in AD5304_5314_5324.pdf
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<CPHA)|(1<<SPR1)|(1<<SPR0);

  // SPI Interrupt Flag löschen
  {
    uint8_t dummy;
    dummy = SPSR; 
    dummy = SPDR;
  }

  PORTB |=(1<<PB4);     //PB4 auf 1 Setzten - DA Wandler Low Aktiv
}

> Jedoch bekomme ich am Ausgang vom uC keine Signale (gemessen mit Oszi)

Mindestens am PB4 müsstest du ein Signal bekommen. Wenn das nicht der 
Fall ist, wird weder spi_init() noch geschw() aufgerufen. Dann hängt der 
Atmega16 vielleicht im RESET. Das könnte dann ein Watchdog-Problem sein, 
aber nix grundsätzliches mit SPI.

Autor: Rob E. (dancer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich bin jetzt schon einen Schritt weiter gekommen, die SPI 
funktioniert mittlerweile Tadellos. Hab einen neuen Atmega16 rein. Ka 
evtl hab ich den alten durchgebrannt.

Das mit CPOL und CPHA hab ich mir auch schon gedacht. Aber Laut 
Datenblatt liest der DA Wandler bei einer Fallenden Flanke, was wiederum 
laut Oszi passen sollte.

Ich bekomme am Ausgang des DA-Wandlers jedoch absolut keine Regung. Ich 
weiß nicht woran es sonst liegen könnte. Hab den DA zum 4ten mal neu 
eingelötet (bzw. neuen eingelötet) , auf Lötbrücken durch gepiept. 
Nichts, sonst passt an der Hardware auch alles. Es sind keine Lötbrücken 
drin und die Signale kommen Richtig am DA-Wandler an.

Ich bin ratlos...

EVTL sende ich einfach die Flaschen Daten an den DA. Wobei ich auch da 
schon sämtliche Optionen getestet hab.

Irgendwo überseh ich etwas....

Aber danke für deine Antwort.
Grüße
Rob

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei

  uint8_t e=0b01111111;
  uint8_t f=0b11110000;

Wäre lt. Datenblatt

A1 A0 => 01: DAC B
/PD   => 1: kein Powerdown
/LDAC => 1: Only addressed input register is updated. There is
no change in the content of the DAC registers.

Aufgrund des Double-Buffered Interface aus Input Shift Register und 
DAC Register, würde ich mich mit dem /LDAC näher befassen.

Im ersten Schritt würde ich die Doppelpufferung umgehen und mal dies 
senden:

  uint8_t e=0b01101111;
  //             ^
  uint8_t f=0b11110000;

ADD: Prima Sache das mit den Links Datenblättern im Forum. Lob an 
Andreas!

Autor: Rob E. (dancer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab die Polarität wie von dir vorgeschlagen abgeändert. Und Das LDAC 
auf 0 gezogen ändert jedoch beide male nichts...

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann bin ich auf dem gleichen Stand wie du: ratlos ;-(

REFIN am DAC hängt nicht unabsichtlich auf GND oder ist unabsichtlich 
unbeschaltet, sondern hängt korrekt an einer Spannungsquelle (zur Not an 
Vdd 5V)?

In welchem Zustand befindet sich der DAC, wieviel Strom zieht der DAC 
und ändert das sich in Abhängigkeit von Zeit (Power Up) und SPI 
Befehlen? Im Normalmodus sollte es im Ruhezustand ja 600 µA bei 5V sein 
und im Power down Modus 200 nA (bei 5V)

Hast du Tools (z.B. Logikanalysator) um dir die SPI Übertragung 
anzusehen? Hast du schon mit der Datenrate experimentiert?

Autor: Rob E. (dancer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also Problem gelöst.

mein Code von Anfang war richtig ...
Das Problem war das mir der AD5304 (SMD Beinchen Abstand 0,5mm) kaputt 
ging, (Lötbrücke) und beim wieder neu verlöten, habe ich die 
Datenleitung mit der Clock Leitung vertauscht....

Er funktioniert nun wunderbar.

Danke für deine Antworten.

Grüße
Rob

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.