DA-Wandler MAX5354 über SPI

OP #433676
Lesenswert?
• ▲
▼
Hallo zusammen,
ich bin gerade dabei mit einem Mega8 den MAX5354 (DA-Wandler) über SPI 
(habe noch keine Erfahrungen mit dem Bus) anzusteuern. Doch das 
funktioniert nicht so wie es sollte.

Hier erstmal der Code:
1
#include <stdlib.h>
2
#include <avr/io.h>
3

4
#define MOSI   PB3
5
#define SCK  PB5
6
#define MISO   PB4
7
#define SS  PB2
8

9
void SPI_Master_TransmitInit(void)
10
{
11
  /* Set MOSI, SS and SCK output, all others input */
12
  DDRB |= (1<<MOSI) | (1<<SCK) | (1<<SS);
13
  DDRB &= ~(1<<MISO);
14
  PORTB |= (1<<SS);
15
  /* Enable SPI, Master, f = FCPU/16 */
16
  SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0);
17
}
18

19
void SPI_MasterTransmit(unsigned long daten, unsigned long daten1)
20
{
21
  PORTB &= ~(1<<SS);
22
  SPDR = daten;
23
  while(!(SPSR & (1<<SPIF))); // warte bis Byte gesendet
24
  SPDR = daten1;
25
  while(!(SPSR & (1<<SPIF))); // warte bis Byte gesendet
26
  PORTB |=(1<<SS);
27
}
28

29
int main (void)
30
{  
31
  SPI_Master_TransmitInit();
32
  SPI_MasterTransmit(00010000, 00001000);
33

34
  return 0;
35
}

Der binär Code von SPI_Transmit sollte (wenn ich das laut Datenblatt 
richtig verstehe) heißen, dass am Ausgang 1/2*Vref anliegen sollten, bei 
5V wären das dann 2.5V. Doch es liegen immer (egal was für einen Wert 
ich da übergebe) ca. 1.0-1.2 V an.

Woran liegt das?
Hardwaremäßig sollte alles passen.

Ich wäre für Hilfen sehr dankbar.

Gruß Stefan
Gast #433685
Lesenswert?
• ▲
▼
>SPI_MasterTransmit(00010000, 00001000);

Ich bezweifle, dass der GCC (binäre) Zahlen in diesem Format unterstützt 
- vor allem ohne markierendes Präfix.
Du meinst damit vermutlich:
SPI_MasterTransmit(0x10, 0x08);


>void SPI_MasterTransmit(unsigned long daten, unsigned long daten1)

Die SPI-Daten können eh nur 8bit breit sein - unsigned char reicht 
völlig.
OP #433734
Lesenswert?
• ▲
▼
Danke für die Antwort!

Jetzt seh ich den dummen Fehler auch!

entweder schreib ich
SPI_MasterTransmit(0b00010000, 0b00001000);
oder eben
SPI_MasterTransmit(0x10, 0x08);

Jetzt funktionierts auch, jedoch hab ich immer nur 5V an OUT
und wenn ich 2 mal 0x00 sende, dann wieder die 1.2V

Das verstehe ich dabei nicht, auch wenn ich Vref ändere auf z.B 3.3V 
habe ich noch immer 5V

Wie ist das möglich? Ist da etwas an meiner Hardware falsch?
muss ich den AD-Wandler belasten, damit da die programmierte Spannung 
anliegt?

Gruß
Stefan

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.