; ********************************
; 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
; ********************************