www.mikrocontroller.net

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


Autor: Peter Mayer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)
  // Registerinhalt
  unsigned long long dds_register = 0;
  [...]
  // Phase Kanal 1 oder 2
  else if ((typ == 4) || (typ == 7))
  {
    // Phase für Kanal 1?
    if (typ == 4)
    {
      // 2 hoch 14 = (1ULL << 14)
      dds_register = ch1_phase * (1ULL << 14) / (360 * 10);
    }
    // Kanal 2
    else
    {
      // 2 hoch 14 = (1ULL << 14)
      dds_register = (ch2_phase + PHASE_OFFSETT) * (1ULL << 14) / (360 * 10);
    }
    // auf Überschreitung des Maximalwerts prüfen und evtl. begrenzen
    if (dds_register > (1ULL << 14))
    {
      // auf Maximalwert begrenzen
      dds_register = (1ULL << 14);
    }
  }

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

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

Autor: Peter Mayer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag:
SPI_MasterTransmit ist die SPI Funktion aus dem Atmel Datenblatt zum 
senden als Master:
void SPI_MasterTransmit(char cData)
{
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)))
;
}

Gruß,

Peter

Beitrag #2096990 wurde von einem Moderator gelöscht.

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.