Forum: Compiler & IDEs Funktion macht nicht das was sie soll: Rechenproblem


von Peter Mayer (Gast)


Lesenswert?

Hallo,

ich habe hier ein DDS IC von Analog Devices AD9959 Datenblatt unter 
http://www.analog.com/UploadedFiles/Data_Sheets/AD9959.pdf ), das ich 
probiere anzusteuern. Es läuft auch alles soweit, bis auf die Phase. In 
der ersten Funktion berechne ich den Registerinhalt nach der Formel
Phase = (Registerinhalt / (2^14)) * 360° (nach Registerinhalt 
umgestellt)

ch(1|2)phase ist zwischen 0...3600 (per UART Ausgabe geprüft) und ein 
unsigned int, Variable typ ist unsigned char und entweder 4 oder 7, der 
PHASE_OFFSETT ist aktuell noch auf 0 gestellt (wollte ich ausmessen)
1
  // Registerinhalt
2
  unsigned long long dds_register = 0;
3
  [...]
4
  // Phase Kanal 1 oder 2
5
  else if ((typ == 4) || (typ == 7))
6
  {
7
    // Phase für Kanal 1?
8
    if (typ == 4)
9
    {
10
      // 2 hoch 14 = (1ULL << 14)
11
      dds_register = ch1_phase * (1ULL << 14) / (360 * 10);
12
    }
13
    // Kanal 2
14
    else
15
    {
16
      // 2 hoch 14 = (1ULL << 14)
17
      dds_register = (ch2_phase + PHASE_OFFSETT) * (1ULL << 14) / (360 * 10);
18
    }
19
    // auf Überschreitung des Maximalwerts prüfen und evtl. begrenzen
20
    if (dds_register > (1ULL << 14))
21
    {
22
      // auf Maximalwert begrenzen
23
      dds_register = (1ULL << 14);
24
    }
25
  }

In einer zweiten Funktion nehme ich dann den errechneten Registerinhalt 
und schreibe ihn via SPI ans DDS-IC:
1
  // Registerinhalt
2
  char byte1register = 0;
3
  char byte2register = 0;
4
  // Registerinhalt berechnen
5
  byte1register = (char) ((dds_register >> 8) & 0x3F);
6
  byte2register = (char) (dds_register & 0xFF);
7
  [...]
8
  // Channel Phase Offset Word zum Beschreiben auswählen
9
  SPI_MasterTransmit (0x05);
10
  // Phase senden
11
  SPI_MasterTransmit (byte1register);
12
  SPI_MasterTransmit (byte2register);
13
  [...]

Auf dem SPI kann ich allerdings nur folgendes empfangen:
Phase von 1800 => 0x05 0x00 0x90
Phase von 0900 => 0x05 0x00 0x90
Phase von 2700 => 0x05 0x00 0x90
Phase von 0300 => 0x05 0x55 0x90
Phase von 0600 => 0x05 0xAA 0x90
Phase von 0000 => 0x05 0x00 0x90

Was geht da wo und warum schief?
Wenn ihr Fragen habt und mehr Infos braucht: fragt ruhig.
Ansonsten freue ich mich über Tipps.

Gruß,

Peter

von Peter Mayer (Gast)


Lesenswert?

Nachtrag:
SPI_MasterTransmit ist die SPI Funktion aus dem Atmel Datenblatt zum 
senden als Master:
1
void SPI_MasterTransmit(char cData)
2
{
3
/* Start transmission */
4
SPDR = cData;
5
/* Wait for transmission complete */
6
while(!(SPSR & (1<<SPIF)))
7
;
8
}

Gruß,

Peter

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.