Hallo.. Ich habe vor, einen AD9833 DDS Baustein mit einem AT89C5131A-UM anzusteuern. Nur leider kommt aus dem AD9833 nichts brauchbares heraus. Hat jemand vielleicht nen Beispielcode wie man die Daten in den AD9833 schicken muss? Ich habs jetzt so gemacht:
1 | void SetzeFrequenz(long int Steuerwort) |
2 | {
|
3 | long int steuerwort; |
4 | SPCON = 0x92; //Initialisierung SPI, SPIEn = 0, Baudrate Flc/128; Master=1; |
5 | SPCON |= 0x40; //SPIEn=1 |
6 | |
7 | //Reset durchführen nach einschalten
|
8 | fsync = 0; |
9 | Warte10Us(100); |
10 | steuerwort = 0x0100; //0000 0001 0000 0000 |
11 | SendeDatenSPI(steuerwort); //Sende 16Bit Steuerwort |
12 | fsync = 1; |
13 | Warte10Us(10); |
14 | |
15 | //Controlword: Register einstellen, 28 Bit Modus (14 Bit Low und 14 Bit High senden) Reset aktiv
|
16 | fsync = 0; |
17 | Warte10Us(100); |
18 | steuerwort = 0x2100; //0010 0001 0000 0000 |
19 | SendeDatenSPI(steuerwort); //Sende 16Bit Steuerwort |
20 | fsync = 1; |
21 | Warte10Us(10); |
22 | |
23 | //Sende LSB zu Freq 0 Register
|
24 | fsync = 0; |
25 | Warte10Us(100); |
26 | steuerwort = (codewort & 0x00003FFF); //LSB maskieren |
27 | steuerwort |= 0x4000; //Steuerregister maskieren -> FREQ0 Register schreiben |
28 | SendeDatenSPI(steuerwort); //Sende untere 14 Bit des Codeworts + Steuerbit |
29 | fsync = 1; |
30 | Warte10Us(10); |
31 | |
32 | //Sende MSB zu Freq0 Register
|
33 | fsync = 0; |
34 | Warte10Us(100); |
35 | codewort >>=14; |
36 | steuerwort = (codewort & 0x00003FFF); //MSB maskieren |
37 | steuerwort |= 0x4000; // Steuerregister maskieren -> FREQ0 Register schreiben |
38 | SendeDatenSPI(steuerwort); //Sende obere 14 Bit des Codeworts + Steuerbit |
39 | fsync = 1; |
40 | Warte10Us(10); |
41 | |
42 | //Phase Register
|
43 | fsync = 0; |
44 | Warte10Us(100); |
45 | steuerwort = 0xC000; //1100 0000 0000 0000 |
46 | SendeDatenSPI(steuerwort); //Sende obere 14 Bit des Codeworts + Steuerbit |
47 | fsync = 1; |
48 | Warte10Us(10); |
49 | |
50 | //Reset = 0
|
51 | fsync = 0; |
52 | Warte10Us(100); |
53 | steuerwort = 0x0000; //0000 0000 0000 0000 |
54 | SendeDatenSPI(steuerwort); //Sende 16Bit Steuerwort |
55 | fsync = 1; |
56 | Warte10Us(10); |
57 | }
|
58 | |
59 | void SendeDatenSPI(long int spi_wort) //Sende Daten per Hardware-SPI-Schnittstelle |
60 | {
|
61 | //Variablen
|
62 | int spi_wort_high, spi_wort_low, spsta_temp; |
63 | //Zuweisungen
|
64 | spi_wort_high = spi_wort >> 8; //SPI-Wort 8 Bits nach rechts schieben HByte -> LByte |
65 | spi_wort_high &= 0x00FF; //Datenwort maskieren mit 0000 0000 1111 1111 |
66 | spi_wort_low = (spi_wort & 0x00FF); //Datenwort maskieren mit 0000 0000 1111 1111 |
67 | |
68 | |
69 | //Senden
|
70 | |
71 | //Sende High-Byte in SPDAT-Register
|
72 | SPDAT=spi_wort_high; |
73 | do
|
74 | {
|
75 | spsta_temp = (SPSTA & 0x80); //Maskiere SPSTA-Register auf Bit 7(SPIF) |
76 | }while (spsta_temp != 0x80); //Frage SPSTA-Register auf SPFI Flag ab |
77 | Warte10Us(200); |
78 | |
79 | //Sende Low-Byte in SPDAT-Register
|
80 | SPDAT=spi_wort_low; |
81 | do
|
82 | {
|
83 | spsta_temp = (SPSTA & 0x80); //Maskiere SPSTA-Register auf Bit 7(SPIF) |
84 | }while (spsta_temp != 0x80); //Frage SPSTA-Register auf SPFI Flag ab |
85 | }
|
Es kommt jedoch nur ein unbrauchbares Signal aus dem Vout heraus.. Hab ich was falsch programmiert oder kann das an der Hardware liegen? MfG