diff DDSBes.c @ 0:d9aae7d7f2c6

Import
author Daniele Nicolodi <daniele.nicolodi@obspm.fr>
date Tue, 03 Jul 2012 10:38:59 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DDSBes.c	Tue Jul 03 10:38:59 2012 +0200
@@ -0,0 +1,193 @@
+#include <utility.h>
+#include <cvirte.h>		/* Needed if linking in external compiler; harmless otherwise */
+#include <userint.h>
+#include "DDSBes.h"
+#include <ansi_c.h>
+#include <gpib.h>
+
+#define PPORT	0x378
+#define PPCTRL	PPORT+2
+#define UPDate	0x040
+#define nWR	0x080
+#define MReset	0x0C0
+#define tempo   20
+
+// Private functions, hence declared as static ...
+
+static int delai(int t) {
+	int j ;
+	for (j=0;j<t; j++) ;
+	return(0) ;
+}
+
+
+static int Strb_adress(unsigned char ad) {
+	outp(PPCTRL,0x08) ;
+	outp(PPORT,ad) ;
+	outp(PPCTRL,0x09) ;
+	delai(tempo) ;
+	outp(PPCTRL,0x08) ;
+    delai(tempo); 
+	return(0) ;
+}
+
+static int Strb_data(unsigned char da) {
+	outp(PPCTRL,0x00) ;
+	outp(PPORT,da) ;   
+	outp(PPCTRL,0x01) ;
+	delai(tempo) ;
+	outp(PPCTRL,0x00) ;
+	delai(tempo) ;
+	return(0) ;
+}
+
+static int Strb_nWrite(void) {
+	outp(PPCTRL,0x08) ;
+	outp(PPORT,nWR) ;
+	outp(PPCTRL,0x09) ; 
+	delai(tempo) ;
+	outp(PPCTRL,0x08) ;
+	delai(tempo) ; 
+	return(0) ;   
+}
+
+static int Strb_Update(void) {
+	outp(PPCTRL,0x08) ;
+	outp(PPORT,UPDate) ;
+	outp(PPCTRL,0x09) ;
+	delai(tempo) ;
+	outp(PPCTRL,0x08) ;
+	delai(tempo) ;
+	return(0) ;
+}
+
+static int Strb_MReset(void) {
+	outp(PPCTRL,0x08) ;
+	outp(PPORT,MReset) ;
+	outp(PPCTRL,0x09) ;
+	delai(tempo) ;
+	outp(PPCTRL,0x08) ;
+	delai(tempo) ;
+	return(0) ;
+}
+
+// Public functions
+
+void DDSBes_Initialize(DDSBes_Data * Instance) {
+	Strb_MReset();
+	/* 0 dans 0x1F => update clock externe */
+	Strb_data(0x00);
+	Strb_adress(0x1F);
+	Strb_nWrite();
+	
+	return ;
+}
+
+void DDSBes_Close(DDSBes_Data * Instance){
+
+	return ;
+}
+
+void DDSBes_SetClockFrequency(DDSBes_Data * Instance, double clock_frequency){
+	
+	int fPLL  ;
+	unsigned char oPLL;
+	
+	fPLL = 1;
+	if(fPLL==1 || (fPLL>3 && fPLL<21)) { 
+		Instance->ClockFrequency = clock_frequency*fPLL;
+		if (Instance->ClockFrequency>300.0e6) {
+			Instance->ClockFrequency = 300.0e6 ;
+		}
+	}
+
+	if (fPLL==1) oPLL=0x60 ; 
+	else {
+		if (Instance->ClockFrequency>=2e8) oPLL=(unsigned char)(0x40 + fPLL) ;
+		else oPLL= (unsigned char)fPLL ;
+	}
+
+	Strb_data(oPLL);
+	Strb_adress(0x1E);
+	Strb_nWrite();
+	
+	return ;
+}
+
+void DDSBes_SetFrequency(DDSBes_Data * Instance, double frequency){
+
+	double pas ;
+	double reste ;
+	double coeff;
+	double fdiv[7];
+	double p[6];
+	
+	int i;
+	
+	unsigned char o[6];
+	
+	fdiv[6]=pow(2.0,48.0);
+	fdiv[5]=pow(2.0,40.0);
+	fdiv[4]=pow(2.0,32.0);
+	fdiv[3]=pow(2.0,24.0);
+	fdiv[2]=65536.0;
+	fdiv[1]=256.0;
+	fdiv[0]=1.0;
+	
+	coeff=fdiv[6]/Instance->ClockFrequency;
+	pas=coeff*frequency;
+	reste=pas;
+
+	for (i=5;i>0;i--){
+		p[i]=(reste/fdiv[i]);
+		reste=fmod(pas,fdiv[i]);
+	}
+	p[0]=reste;
+
+	for (i=5;i>=0;i--){
+		o[i]=(unsigned char) p[i];
+	}
+
+	/* frequence (6 octets) */
+	Strb_adress(0x04);Strb_data(o[5]);Strb_nWrite();
+	Strb_adress(0x05);Strb_data(o[4]);Strb_nWrite();
+	Strb_adress(0x06);Strb_data(o[3]);Strb_nWrite();
+	Strb_adress(0x07);Strb_data(o[2]);Strb_nWrite();
+	Strb_adress(0x08);Strb_data(o[1]);Strb_nWrite();
+	Strb_adress(0x09);Strb_data(o[0]);Strb_nWrite();
+
+	Strb_Update();
+	
+	// store in Instance->Frequency the real frequency generated by the DDS 
+	// (and not "frequency", which is only the requested frequency and might differ by as much as ClockFrequency/2^48
+	Instance->Frequency = Instance->ClockFrequency/fdiv[6]
+		*(fdiv[5]*o[5]+fdiv[4]*o[4]+fdiv[3]*o[3]+fdiv[2]*o[2]+fdiv[1]*o[1]+fdiv[0]*o[0]) ;
+	
+	
+	
+	return ;
+}
+
+
+void DDSBes_SetAmplitude(DDSBes_Data * Instance, int amplitude) {
+	unsigned char a[2];
+
+	if (amplitude > 0 && amplitude < 4096){ 
+		a[1]=(unsigned char)(amplitude>>8);
+		a[0]=(unsigned char)floor(fmod(amplitude,256.0));
+		Instance->Amplitude = amplitude ;
+		} 
+		
+	/* nibble fort adresse=0x21 data=a[1] */
+	Strb_data(a[1]);
+	Strb_adress(0x21);
+	Strb_nWrite();
+	/* octet faible adresse=0x22  data=a[0] */
+	Strb_data(a[0]);
+	Strb_adress(0x22);
+	Strb_nWrite();
+	/* mise a jour */
+	Strb_Update();
+
+	return ;
+}