C Atmega8 und AD9850 DDS

Hallo Ralf,

mir ist noch was aufgefallen.

Mach mal in der SendByte Funktion aus


CodeBox C
data>>1;

dies


CodeBox C
data = data>>1;


Dirk :ciao:

Da sonst die aktuelle Position nicht gespeichert wird, richtig?
Also wird data immer um ein bit nach rechts geschoben..... Von Bit 1 nach Bit 0.....
Bringt aber auch nichts.....ob das Ding ein Fake ist? Vorgestern hat das Ding einen sauberen 1 MHz-Sinus geliefert.... wie und warum ? Keine Ahnung... eher zufällig.... Kommt nicht direkt aus China..... da wundert mich ja nichts mehr......

Es tut sich was ! Wenn auch sporadisch.......
Das Signal steht in keinem Zusammenhang mit dem Programm.... unabhängig der programmierten Frequenz, generiert das Ding einen sauberen Sinus im Megahertzbereich.......
 
Zuletzt bearbeitet:
Da sonst die aktuelle Position nicht gespeichert wird, richtig?
Also wird data immer um ein bit nach rechts geschoben..... Von Bit 1 nach Bit 0.....
Ja genau.

Das wird schon funktionieren, irgendwas stimmt eben noch nicht. Ich mach mir da nochmal Gedanken, im Moment komme ich aber leider nicht dazu.
 
Ja genau.

Das wird schon funktionieren, irgendwas stimmt eben noch nicht. Ich mach mir da nochmal Gedanken, im Moment komme ich aber leider nicht dazu.

Hi Dirk,
kein Stress... eilt nicht....
hab' gerade dem AD5850 mit dem Weller gedroht......was für ein Gefrickel.... es scheint nun zu funktionieren......
nur ist die Frequenz doppelt so groß wie die Sollfrequenz..... da hängts wohl noch an der Bitschupserei......

So jetzt aber.....


CodeBox C
#include <avr/io.h>
#define F_CPU 1000000UL // 1 MHz


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




#define AD9850_PORT     PORTC
#define AD9850_DIR     DDRC

#define AD9850_DATA    PC0     //   Gelb     - connect to serial data load pin (DATA)
#define AD9850_CLK     PC1     //   Orange   - connect to AD9850 module word load clock pin (CLK)
#define AD9850_FQ_UD   PC2       //   Grün     - connect to freq update pin (FQ)
#define AD9850_RESET   PC3      //   Blau
#define AD9850_IR     PC4       //   Braun




#define DDS_CLOCK 125000000
void AD9850_Init (void);
void AD9850_SendByte (uint8_t data);
void AD9850_SendFrequency (uint32_t freq);
int32_t frequency;



void AD9850_wait(void)
{
_delay_us(5);
}

void AD9850_Init (void)
{
  
  // CLK, FQ_UD, RESET, DATA: Low
  // CLK, FQ_UD, RESET, DATA: Output  
  AD9850_PORT &= ~((1<<AD9850_CLK) | (1<<AD9850_FQ_UD) | (1<<AD9850_RESET) | (1<<AD9850_DATA));
  AD9850_DIR |=  (1<<AD9850_CLK) | (1<<AD9850_FQ_UD) | (1<<AD9850_RESET) | (1<<AD9850_DATA);
  AD9850_wait();
  
  // Reset Pulse
  AD9850_PORT |= (1<<AD9850_RESET);
AD9850_wait();

  AD9850_PORT &= ~(1<<AD9850_RESET);  
AD9850_wait();
  
  // CLK Pulse
  AD9850_PORT |= (1<<AD9850_CLK);
AD9850_wait();

  AD9850_PORT &= ~(1<<AD9850_CLK);  
AD9850_wait();
  
  // FQ_UD Pulse
  AD9850_PORT |= (1<<AD9850_FQ_UD);  // Enable serial mode
AD9850_wait();
  AD9850_PORT &= ~(1<<AD9850_FQ_UD);  
AD9850_wait();
}




void AD9850_SendFrequency(uint32_t freq)
{


  
  
  // 32Bit Frequency

  AD9850_SendByte((uint8_t) freq);
  AD9850_SendByte((uint8_t) (freq>>8));  
  AD9850_SendByte((uint8_t) (freq>>16));  
  AD9850_SendByte((uint8_t) (freq>>24));  
  AD9850_SendByte((uint8_t) (0b00000000));  


  
  // 8Bit Control, PowerDown, Phase
AD9850_wait();
  
  // FQ_UD Pulse: Update
  AD9850_PORT |= (1<<AD9850_FQ_UD);
AD9850_wait();
  AD9850_PORT &= ~(1<<AD9850_FQ_UD);  
AD9850_wait();
  
}



void AD9850_SendByte (uint8_t data)
{
  
  uint8_t i = 8;
  
  do
  {
  
  if (data & 1)
  {
  AD9850_PORT |= (1<<AD9850_DATA);  // Data high
  } else {
  AD9850_PORT &= ~(1<<AD9850_DATA);  // Data low
  }
  
  // Clock
//AD9850_wait();

  AD9850_PORT |= (1<<AD9850_CLK);
AD9850_wait();
  AD9850_PORT &= ~(1<<AD9850_CLK);  
AD9850_wait();

  
  i--;
  data = (data>>1);
  
  } while (i>0);
  
}













int main (void)
{
  
  
    
  // Initialisierungen
  
AD9850_Init();
frequency = 40000000;
AD9850_SendFrequency((frequency * pow(2, 32)) / DDS_CLOCK);
  
  while(1)
  {
  
  
  
  }
  
}


Und was zeigt der Zähler an ? Juhu ! 40 MHz !!!!!
Nur bei NF-Werten weicht der Wert ab......
Ich vermute, dass ich einen Filter nachschalten muss.... obwohl der Sinus sauber aussieht....
 
Zuletzt bearbeitet:
Und was zeigt der Zähler an ? Juhu ! 40 MHz !!!!!
:party:

Cool.

Zu dem Fehler bei niedrigeren Frequenzen habe ich leider keine Idee.

Du könntest nun mal dein AD9850_wait() verringern oder gleich ganz entfernen.

Dirk :ciao:
 
Ja, die minimalen Timings scheinen weitgehend im einstelligen Nanosekundenbereich zu liegen - schneller als ein AVR (normalerweise) taktet...
 
Ja, die minimalen Timings scheinen weitgehend im einstelligen Nanosekundenbereich zu liegen - schneller als ein AVR (normalerweise) taktet...

Hallo Dirk,
hallo LatodaC,
es scheint alles soweit zu laufen.
Euch an dieser Stelle vielen Dank !!!!!
Die miese chinesische Lötkunst hatte die Aufgabe nochmal um ein viefaches potenziert.
Nach einem Imax B6 Akkulader Fake mit Lötfehler, dreister Palagiatskunst, kam ein Signalgenerator mit Display.... dieser sollte eigentlich bis in den MHz-Bereich gehen....
drin steckt lediglich ein Atmega64 ohne ein AD95xx.... bei 1kHz ist Schluss mit schönem Sinus.....
Und nun das AD9850-Modul zum Nachlöten......
Gut was solls...... es läuft....
Nun gehts an die Steuerung.... ob über RS232 oder Bedienelemente direkt am Board....
Ich lade den fertigen Code dokumentiert später hoch..... vielleicht kann ihn jemand gebrauchen...

Gruß und Dank
Ralf
 
  • Like
Reaktionen: LotadaC

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)