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 | }
|