Forum: Mikrocontroller und Digitale Elektronik AD9850 macht Probleme


von Stefan S. (chiefeinherjar)


Lesenswert?

Hallo zusammen!
So langsam ist mir das ganze echt peinlich, dass ich folgendes Anliegen 
ins Forum tragen muss:
Sowohl ich, als auch ein Kollege haben jeweils ein AD9850-Modul gekauft 
(unterschiedliche Versandhäuser, gleiche Module: 
http://www.arduino-projekte.de/index.php?n=70) und jeweils unabhängig 
voneinander den Code für einen Atmega32 in C geschrieben.

Programmiert wurde mit JTAG ICE 3, AVR Studio 6.2 und dem STK500 mit 
einem Atmega32.

Bei mir hatte es funktioniert (bei mir ist es schon mittlerweile ein 
Jahr her), bei ihm nicht. Konkretes Fehlerbild ließ sich, nach Angaben 
meines Kollegen zuverlässig reproduzieren:
- Wird nur eine Frequenz übergeben, reagiert das Modul gar nicht. Wird 
eine zweite Frequenz danach (natürlich mit Verzögerung) übergeben, wird 
nur die zweite Frequenz übernommen.

- Wird eine Frequenz übergeben und dann auf dem Board ein Mal auf 
"Reset" gedrückt, wird die Frequenz übernommen. Drückt man nun erneut 
auf "Reset" bekommt man wieder nur eine Flatline. Ein erneuter Reset 
führt wieder zu einem Signal. Im Grunde wie ein "An/Aus"-Schalter... o.O

- Drückt man bei AVR-Studio auf "Start Debugging" bzw. "Start without 
Debugging" wird die Frequenz nicht übernommen. Drückt man auf "Stop 
Debugging" wird die Frequenz übernommen.


Nach Fehlersuche beim Code, Verkabelung und Jumpern verzweifle ich so 
langsam.
Jumper sind so gesteckt, dass der serielle-Modus aktiviert ist.
Bild der gesamten Verkabelung folgt morgen.

Ich wette ich habe einfach nur "Tomaten auf den Augen" und bin blind 
für das Offensichtliche... Und ich bin eher geneigt dem Code die Schuld 
zu geben, als dem Modul. Wenn das Bild schlecht aussieht ist gewöhnlich 
auch der Maler daran Schuld und nicht der Pinsel...


Wie dem auch sei, nachfolgend der auf das Wesentliche reduzierte Code:
1
#define F_CPU 8000000      // CPU 8Mhz
2
#define DDS_CLOCK 125000000   // DDS 125Mhz
3
4
#define RESET PB3
5
#define FQ_UD PB2
6
#define DATA PB5
7
#define W_CLK PB7
8
9
10
#include <avr/io.h>
11
#include <util/delay.h>
12
13
14
15
void IO_init(){
16
  DDRB = 0xFF;  // PORTB Output
17
  PORTB=0x00;
18
  //_delay_ms(10);
19
}
20
21
void SPI_init()
22
{
23
  SPCR&=~(1<<SPIE);  // Interrupt disable
24
  
25
  SPCR|=(1<<DORD);  // Data order LSB first
26
  SPCR|=(1<<MSTR);  //SPI Master
27
  SPCR&=~(1<<CPOL);  //SPIClock  is low when idle
28
  SPCR&=~(1<<CPHA);  //Clock phase leading edge sample trailing edge setup
29
  SPCR|= 0x01; //Clock Rate: f osc/64
30
  SPCR|=(1<<SPE);  // SPI enable
31
}
32
33
34
35
char ui_SPI_SendAndReceiveByte(char cData_out)
36
{
37
  SPDR=cData_out; // Start transmission
38
  while(!(SPSR & (1<<SPIF))); // wait to complete
39
  return SPDR;
40
}
41
42
void send_Bytes(uint32_t freq){
43
  PORTB |= (1<<FQ_UD); //Über den Puls an dieser Stelle lässt sich streiten, bei mir hat es sowohl mit, als auch ohne Puls funktioniert, sofern ich mich recht erinnere...
44
  PORTB &=~(1<<FQ_UD);
45
  
46
  union {
47
    uint32_t frequ;
48
    uint8_t freqbyte[5];  
49
  }sendbyte;
50
  
51
  sendbyte.frequ = freq;
52
  sendbyte.freqbyte[4] = 0x00;
53
  
54
  for(uint8_t i = 0; i < 5; i++){
55
    ui_SPI_SendAndReceiveByte(sendbyte.freqbyte[i]);
56
  }
57
  
58
  PORTB = PORTB| (1<<FQ_UD);
59
  PORTB &=~(1<<FQ_UD);
60
}
61
62
void DDS_reset(){
63
  //Reset-Sequenz besteht aus einem Puls am RESET-Pin, gefolgt von einem Puls am W_CLK-Pin und einem Puls am FQ_UD-Pin für den Serial-Mode
64
  PORTB = PORTB | (1<<RESET);
65
  PORTB = PORTB & (~(1<<RESET));
66
  
67
  PORTB |= (1<<W_CLK);
68
  PORTB &= ~(1<<W_CLK);
69
  
70
  PORTB |= (1<<FQ_UD);
71
  PORTB &= ~(1<<FQ_UD);
72
}
73
74
75
uint32_t Bitfrequenz(int frequency){
76
  uint32_t tuning_word = (frequency * 4294967296LL) / DDS_CLOCK;
77
  return tuning_word;
78
} 
79
80
81
82
int main(void)
83
{
84
  IO_init();
85
  SPI_init();
86
  DDS_reset();
87
  
88
  send_Bytes(Bitfrequenz(5000));
89
90
    
91
    while(1)
92
    {
93
    }
94
}

: Bearbeitet durch User
von ArduinoQuäler (Gast)


Lesenswert?

Stefan Schmidt schrieb:
1
uint32_t Bitfrequenz(int frequency)
2
{
3
   uint32_t tuning_word = (frequency * 4294967296LL) / DDS_CLOCK;
4
   return tuning_word;
5
}

Das läuft dir gnadenlos über (frequency * 4294967296LL).

Zudem kannst du als Argument nur bis 32767 (Hz) als Argument
übergeben. Ob das so beabsichtigt ist?

Wenn man das alles sauber ausnutzen will muss man wohl mit
uint64 rechnen.

von Jonas B. (jibi)


Lesenswert?

>- Drückt man bei AVR-Studio auf "Start Debugging" bzw. "Start without
>Debugging" wird die Frequenz nicht übernommen. Drückt man auf "Stop
>Debugging" wird die Frequenz übernommen.


Sind die Optimierungslevel (Debug und Release) gleich?

Gruß J

: Bearbeitet durch User
von lrep (Gast)


Lesenswert?

Ich vermute, daß niemand diesen Code nach Fehlern durchsuchen wird, aber 
wenn das gleiche Programm auf dem einen Rechner funktioniert und auf dem 
anderen nicht, handelt es sich wahrscheinlich um ein Hardwareproblem.

Fotos das Aufbaus könnten hilfreich sein, aber vorab vermute ich schon 
mal, dass zu lange Strippen und vernachlässigte Masseverbindungen Schuld 
sind.

von Stefan S. (chiefeinherjar)


Lesenswert?

Bei den Optimierungen haben wir alle Variationen/Kombinationen 
ausprobiert.

Nun, MEIN Code, der vom Inhalt identisch ist hatte damals 
funktioniert.

ArduinoQuäler schrieb:
> Zudem kannst du als Argument nur bis 32767 (Hz) als Argument
> übergeben. Ob das so beabsichtigt ist?
>
> Wenn man das alles sauber ausnutzen will muss man wohl mit
> uint64 rechnen.

Warum muss man das mit uint64 rechnen? - Das Frequenzwort ist auch nur 
32 Bit lang. Unabhängig davon sollten dann zumindest 5 kHz tadellos 
funktionieren...

: Bearbeitet durch User
von Jonas B. (jibi)


Lesenswert?

Wie lange brauch eigentlich das 9850 Modul zum starten? Eventuell ist 
das noch nicht bereit?

GRuß JOnas

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.