; ******************************** ; Frequenzübergabe an DDS nach Appnote AN-621 von Analog Device ; 32Bit Frequenzwort = (f_out / DDS-Takt) * 0xFFFFFFFF ; f_out = (32Bit Frequenzwort / 0xFFFFFFFF ) * DDS-Takt ;Ports: ; Fynch, Sdata, Sclk (vom DDS AD9835) an den Port des Mikoroproz ;Synonyme für den DDS-Chip .equ Fsync = PC0 ;Freigabe für DDS-Chip .equ Sdata = PC1 ;Daten für DDS-Chip .equ Sclk = PC2 ;Clocksignal für DDS-Chip .equ stpg = 0b11111000 ;00000000 ;bereitet den DDS auf die Aufnahme des 32 Bit Frequenzwortes vor und deaktiviert den DDS .equ endepg = 0b11000000;00000000 ;schließt die Aufnahme des 32 Bit Frequenzwortes ab und aktiviert den DDS wieder .equ H_MSB = 0b00110011 ;definiert Zielregister für das erste Viertel des 32 Bit Frequenzwortes(+ die ersten 8Bit der Frequenz) .equ L_MSB = 0b00100010 ;definiert Zielregister für das zweite Viertel des 32 Bit Frequenzwortes(+ die zweiten 8Bit der Frequenz) .equ H_LSB = 0b00110001 ;definiert Zielregister für das dritte Viertel des 32 Bit Frequenzwortes(+ die dritten 8Bit der Frequenz) .equ L_LSB = 0b00100000 ;definiert Zielregister für das vierte Viertel des 32 Bit Frequenzwortes(+ die letzten 8Bit der Frequenz) ;Register: ; temp ; temporäres register ; temp2 ; temporäres register2 ; Freq1_H ; Register, welches das erste Low-Byte (erste 8 Bit), d.h. erste Viertel des 32 Bit Frequenzwortes enthält ; Freq1_L ; Register, welches das erste High-Byte (zweite 8 Bit), d.h. zweite Viertel des 32 Bit Frequenzwortes enthält ; Freq2_H ; Register, welches das zweite Low-Byte (dritte 8 Bit), d.h. dritte Viertel des 32 Bit Frequenzwortes enthält ; Freq2_L ; Register, welches das zweite High-Byte (vierte 8 Bit), d.h. vierte Viertel des 32 Bit Frequenzwortes enthält ; Initialisierung des DDS-Chips sbi PortC,Fsync ;Freigabe für DDS-Chip, low-aktiv cbi PortC,Sdata ;Daten für DDS-Chip sbi PortC,Sclk ;Clocksignal für DDS-Chip ; zum Test wie in der App_note 5Mhz bei Clk von 25MHz = einem Hexwert von 0x33333333 = binärwert 0b0011 0011 0011 0011 0011 0011 0011 0011 ldi Freq1_H,0b00110011 ; Register, welches das erste Low-Byte (erste 8 Bit), d.h. erste Viertel des 32 Bit Frequenzwortes enthält ldi Freq1_L,0b00110011 ; Register, welches das erste High-Byte (zweite 8 Bit), d.h. zweite Viertel des 32 Bit Frequenzwortes enthält ldi Freq2_H,0b00110011 ; Register, welches das zweite Low-Byte (dritte 8 Bit), d.h. dritte Viertel des 32 Bit Frequenzwortes enthält ldi Freq2_L,0b00110011 ; Register, welches das zweite High-Byte (vierte 8 Bit), d.h. vierte Viertel des 32 Bit Frequenzwortes enthält rcall dds DDS: DDS_Startt: ;DDS-Chip bereit machen für Aufnahme der Daten cbi PortC,Fsync ;Freigabe für DDS-Chip, low-aktiv. Bereit Daten (erste 16 Bit) zu empfangen ldi temp,0 ;Schleifenzähler auf Null setzen ldi temp2,stpg ;8-Bit Kombination einladen DDS_Start: ;Vorbereitung für Datenempfang, DDS sleepmode sbi PortC,Sclk ;Clocksignal für DDS-Chip setzen rol temp2 ;Register über Carry-Bit schieben brcs setzen ;Springe wenn in Carry 1 brcc ruecksetzen;Springe wenn in Carry 0 DDSStart: inc temp ;Schleifenzähler um eins hochzählen cbi PortC,Sclk ;Clocksignal für DDS-Chip rücksetzten = Datenübernahme CPI temp,8 ;Vergleiche Schleifenzähler, ob 8 Bits durchgelaufen sind breq DDS_Startt1 rjmp DDS_Start setzen: sbi PortC,Sdata ;setzt Datenbit rjmp DDSStart ruecksetzen: cbi PortC,Sdata ;löscht Datenbit rjmp DDSStart DDS_Startt1: ;Vorbereitung für Datenempfang, DDS sleepmode , letzten 8 Bit alle low ldi temp,0 ;Schleifenzähler auf Null setzen cbi PortC,Sdata ;lösche zur Sicherheit Datenbit DDS_Start1: sbi PortC,Sclk ;Clocksignal für DDS-Chip setzen inc temp ;Schleifenzähler um eins hochzählen nop cbi PortC,Sclk ;Clocksignal für DDS-Chip rücksetzten = Datenübernahme CPI temp,8 ;Vergleiche Schleifenzähler, ob 8 Bits durchgelaufen sind breq Datenn1 rjmp DDS_Start1 Datenn1: sbi PortC,Fsync ;Abschluß der übergabe der ersten 16 bit für DDS-Chip, low-aktiv. sbi PortC,Sclk ;Clocksignal für DDS-Chip setzen ldi temp,0 ;Schleifenzähler auf Null setzen ldi temp2,H_MSB ;8-Bit Kombination einladen cbi PortC,Fsync ;Freigabe für DDS-Chip, low-aktiv. Bereit Daten (zweite 16 Bit) zu empfangen Daten1: ;senden 1.Datenpaket (erste 8-Bit = Zielregister im DDS) sbi PortC,Sclk ;Clocksignal für DDS-Chip setzen rol temp2 ;Register über Carry-Bit schieben brcs setzen1 ;Springe wenn in Carry 1 brcc ruecksetzen1;Springe wenn in Carry 0 Dat1: inc temp ;Schleifenzähler um eins hochzählen cbi PortC,Sclk ;Clocksignal für DDS-Chip rücksetzten = Datenübernahme CPI temp,8 ;Vergleiche Schleifenzähler, ob 8 Bits durchgelaufen sind breq Datenn11 rjmp Daten1 setzen1: sbi PortC,Sdata ;setzt Datenbit rjmp Dat1 ruecksetzen1: cbi PortC,Sdata ;löscht Datenbit rjmp Dat1 Datenn11: sbi PortC,Sclk ;Clocksignal für DDS-Chip setzen ldi temp,0 ;Schleifenzähler auf Null setzen mov temp2,Freq1_H ;8-Bit Kombination einladen DDS_Freq1_L Daten11: ;senden 1.Datenpaket (zweite 8-Bit = erstes Frequenzwort) sbi PortC,Sclk ;Clocksignal für DDS-Chip setzen rol temp2 ;Register über Carry-Bit schieben brcs setzen11 ;Springe wenn in Carry 1 brcc ruecksetzen11;Springe wenn in Carry 0 Dat11: inc temp ;Schleifenzähler um eins hochzählen cbi PortC,Sclk ;Clocksignal für DDS-Chip rücksetzten = Datenübernahme CPI temp,8 ;Vergleiche Schleifenzähler, ob 8 Bits durchgelaufen sind breq Datenn2 rjmp Daten11 setzen11: sbi PortC,Sdata ;setzt Datenbit rjmp Dat11 ruecksetzen11: cbi PortC,Sdata ;löscht Datenbit rjmp Dat11 Datenn2: sbi PortC,Fsync ;Abschluß der Übergabe der zweiten 16 bit für DDS-Chip, low-aktiv. sbi PortC,Sclk ;Clocksignal für DDS-Chip setzen ldi temp,0 ;Schleifenzähler auf Null setzen ldi temp2,L_MSB ;8-Bit Kombination einladen cbi PortC,Fsync ;Freigabe für DDS-Chip, low-aktiv. Bereit Daten (zweite 16 Bit) zu empfangen Daten2: ;senden 2.Datenpaket (erste 8-Bit = Zielregister im DDS) sbi PortC,Sclk ;Clocksignal für DDS-Chip setzen rol temp2 ;Register über Carry-Bit schieben brcs setzen2 ;Springe wenn in Carry 1 brcc ruecksetzen2;Springe wenn in Carry 0 Dat2: inc temp ;Schleifenzähler um eins hochzählen cbi PortC,Sclk ;Clocksignal für DDS-Chip rücksetzten = Datenübernahme CPI temp,8 ;Vergleiche Schleifenzähler, ob 8 Bits durchgelaufen sind breq Datenn22 rjmp Daten2 setzen2: sbi PortC,Sdata ;setzt Datenbit rjmp Dat2 ruecksetzen2: cbi PortC,Sdata ;löscht Datenbit rjmp Dat2 Datenn22: sbi PortC,Sclk ;Clocksignal für DDS-Chip setzen ldi temp,0 ;Schleifenzähler auf Null setzen mov temp2,Freq1_L;8-Bit Kombination einladen Daten22: ;senden 2.Datenpaket (zweite 8-Bit = zweites Frequenzwort) sbi PortC,Sclk ;Clocksignal für DDS-Chip setzen rol temp2 ;Register über Carry-Bit schieben brcs setzen22 ;Springe wenn in Carry 1 brcc ruecksetzen22;Springe wenn in Carry 0 Dat22: inc temp ;Schleifenzähler um eins hochzählen cbi PortC,Sclk ;Clocksignal für DDS-Chip rücksetzten = Datenübernahme CPI temp,8 ;Vergleiche Schleifenzähler, ob 8 Bits durchgelaufen sind breq Datenn3 rjmp Daten22 setzen22: sbi PortC,Sdata ;setzt Datenbit rjmp Dat22 ruecksetzen22: cbi PortC,Sdata ;löscht Datenbit rjmp Dat22 Datenn3: sbi PortC,Fsync ;Abschluß der Übergabe der dritten 16 bit für DDS-Chip, low-aktiv. sbi PortC,Sclk ;Clocksignal für DDS-Chip setzen ldi temp,0 ;Schleifenzähler auf Null setzen ldi temp2,H_LSB ;8-Bit Kombination einladen cbi PortC,Fsync ;Freigabe für DDS-Chip, low-aktiv. Bereit Daten (erste 16 Bit) zu empfangen Daten3: ;senden 3.Datenpaket (erste 8-Bit = Zielregister im DDS) sbi PortC,Sclk ;Clocksignal für DDS-Chip setzen rol temp2 ;Register über Carry-Bit schieben brcs setzen3 ;Springe wenn in Carry 1 brcc ruecksetzen3;Springe wenn in Carry 0 Dat3: inc temp ;Schleifenzähler um eins hochzählen cbi PortC,Sclk ;Clocksignal für DDS-Chip rücksetzten = Datenübernahme CPI temp,8 ;Vergleiche Schleifenzähler, ob 8 Bits durchgelaufen sind breq Datenn33 rjmp Daten3 setzen3: sbi PortC,Sdata ;setzt Datenbit rjmp Dat3 ruecksetzen3: cbi PortC,Sdata ;löscht Datenbit rjmp Dat3 Datenn33: sbi PortC,Sclk ;Clocksignal für DDS-Chip setzen ldi temp,0 ;Schleifenzähler auf Null setzen mov temp2,Freq2_H;8-Bit Kombination einladen Daten33: ;senden 3.Datenpaket (zweite 8-Bit = drittes Frequenzwort) sbi PortC,Sclk ;Clocksignal für DDS-Chip setzen rol temp2 ;Register über Carry-Bit schieben brcs setzen33 ;Springe wenn in Carry 1 brcc ruecksetzen33;Springe wenn in Carry 0 Dat33: inc temp ;Schleifenzähler um eins hochzählen cbi PortC,Sclk ;Clocksignal für DDS-Chip rücksetzten = Datenübernahme CPI temp,8 ;Vergleiche Schleifenzähler, ob 8 Bits durchgelaufen sind breq Datenn4 rjmp Daten33 setzen33: sbi PortC,Sdata ;setzt Datenbit rjmp Dat33 ruecksetzen33: cbi PortC,Sdata ;löscht Datenbit rjmp Dat33 Datenn4: sbi PortC,Fsync ;Abschluß der Übergabe der dritten 16 bit für DDS-Chip, low-aktiv. sbi PortC,Sclk ;Clocksignal für DDS-Chip setzen ldi temp,0 ;Schleifenzähler auf Null setzen ldi temp2,L_LSB ;8-Bit Kombination einladen cbi PortC,Fsync ;Freigabe für DDS-Chip, low-aktiv. Bereit Daten (zweite 16 Bit) zu empfangen Daten4: ;senden 4.Datenpaket (erste 8-Bit = Zielregister im DDS) sbi PortC,Sclk ;Clocksignal für DDS-Chip setzen rol temp2 ;Register über Carry-Bit schieben brcs setzen4 ;Springe wenn in Carry 1 brcc ruecksetzen4;Springe wenn in Carry 0 Dat4: inc temp ;Schleifenzähler um eins hochzählen cbi PortC,Sclk ;Clocksignal für DDS-Chip rücksetzten = Datenübernahme CPI temp,8 ;Vergleiche Schleifenzähler, ob 8 Bits durchgelaufen sind breq Datenn44 rjmp Daten4 setzen4: sbi PortC,Sdata ;setzt Datenbit rjmp Dat4 ruecksetzen4: cbi PortC,Sdata ;löscht Datenbit rjmp Dat4 Datenn44: sbi PortC,Sclk ;Clocksignal für DDS-Chip setzen ldi temp,0 ;Schleifenzähler auf Null setzen mov temp2,Freq2_L ;8-Bit Kombination einladen Daten44: ;senden 2.Datenpaket (zweite 8-Bit = viertes Frequenzwort) sbi PortC,Sclk ;Clocksignal für DDS-Chip setzen rol temp2 ;Register über Carry-Bit schieben brcs setzen44 ;Springe wenn in Carry 1 brcc ruecksetzen44;Springe wenn in Carry 0 Dat44: inc temp ;Schleifenzähler um eins hochzählen cbi PortC,Sclk ;Clocksignal für DDS-Chip rücksetzten = Datenübernahme CPI temp,8 ;Vergleiche Schleifenzähler, ob 8 Bits durchgelaufen sind breq DDS_Stopp rjmp Daten44 setzen44: sbi PortC,Sdata ;setzt Datenbit rjmp Dat44 ruecksetzen44: cbi PortC,Sdata ;löscht Datenbit rjmp Dat44 DDS_Stopp: ;Datenübernahme beenden sbi PortC,Fsync ;Abschluß der Übergabe der vierten 16 bit für DDS-Chip, low-aktiv. sbi PortC,Sclk ;Clocksignal für DDS-Chip setzen ldi temp,0 ;Schleifenzähler auf Null setzen ldi temp2,endepg ;8-Bit Kombination einladen cbi PortC,Fsync ;Freigabe für DDS-Chip, low-aktiv. Bereit Daten (letzten 16 Bit) zu empfangen DDS_Stop: ;Vorbereitung für Datenempfang sbi PortC,Sclk ;Clocksignal für DDS-Chip setzen rol temp2 ;Register über Carry-Bit schieben brcs setzensp ;Springe wenn in Carry 1 brcc ruecksetzensp;Springe wenn in Carry 0 DDSStop: inc temp ;Schleifenzähler um eins hochzählen cbi PortC,Sclk ;Clocksignal für DDS-Chip rücksetzten = Datenübernahme CPI temp,8 ;Vergleiche Schleifenzähler, ob 8 Bits durchgelaufen sind breq DDS_Stopp1 rjmp DDS_Stop setzensp: sbi PortC,Sdata ;setzt Datenbit rjmp DDSStop ruecksetzensp: cbi PortC,Sdata ;löscht Datenbit rjmp DDSStop DDS_Stopp1: ;DDS-Chip wieder aufwecken, letzten 8 Bit alle low ldi temp,0 ;Schleifenzähler auf Null setzen cbi PortC,Sdata ;lösche zur Sicherheit Datenbit DDS_Stop1: sbi PortC,Sclk ;Clocksignal für DDS-Chip setzen inc temp ;Schleifenzähler um eins hochzählen nop cbi PortC,Sclk ;Clocksignal für DDS-Chip rücksetzten = Datenübernahme CPI temp,8 ;Vergleiche Schleifenzähler, ob 8 Bits durchgelaufen sind breq DDS_Weiter rjmp DDS_Stop1 DDS_Weiter: sbi PortC,Fsync ;Abschluß der Übergabe der Datenstoppsequenz 16 bit für DDS-Chip, low-aktiv. sbi PortC,Sclk ;Clocksignal für DDS-Chip setzen ret ; Ende Frequenzübergabe an DDS ; ********************************