/***********************************************************************/
/* */
/* FILE :control_AD9851_4.c */
/* DATE :Tue, Nov 15, 2005 */
/* DESCRIPTION :Main Program */
/* CPU TYPE :Other */
/* */
/* This file is generated by Renesas Project Generator (Ver.4.0). */
/* */
/***********************************************************************/

#include <stdio.h>
#include <string.h>
#include "sfr_r815.h"

//for AD9851

#define RESET p3_4 
#define D7 p3_3
#define W_CLK p1_0
#define FQ_UD p1_1
#define high 1 
#define low 0

// for LCD display

#define E p1_3
#define R_W p1_2
#define RS p4_5




//for AD9851 

void set_FastCLK(void);
void set_terminals(void); //port設定
void reset_DDS(void);
void send_data(void);

float DDS_data;
unsigned long data,freq; 
unsigned int i;

//for LCD display

void initialize_LCD(void);
void lcd_cmd(void);
void lcd_data(unsigned char);
//void lcd_cmd4(unsigned char c);
void busy_check(void);
void lcd_write_str(unsigned char* );
void set_comma(unsigned long );
void locate(unsigned char ,unsigned char);


unsigned char result[12]=""; 
unsigned char com={'.'} ;


//for Push_SW

#define up p4_7
#define down p4_6

void up_sw_pushed(void);
void down_sw_pushed(void);

void main()
{

set_FastCLK();
set_terminals();
p1=0x00;

initialize_LCD();
freq=1000000; //10MHz

set_comma(freq ); //10MHzで、0.633mS費やす

lcd_write_str("A=");
lcd_write_str(result);
lcd_write_str("Hz");

set_terminals();
reset_DDS();
//freq=1000000; //初期値=1.1MHz

DDS_data=28.63341769*freq; //DDS_data=設定値 28.6334177

data=(unsigned long)DDS_data; //data=DDS_dataを32ビット整数値に変換したもの
send_data();

while(1)
{
if( !up ) up_sw_pushed();
if( !down ) down_sw_pushed();

}

}

void set_FastCLK(void)
{
prc0=1;
hra00=1;
cm06=0;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
hra01=1;
ocd2=1;
prc0=0;
}
//for AD9851

void set_terminals()
{
//出力に設定
pd1=0xFF;
pd3_3=pd3_4=pd3_5=pd3_5=pd3_7=pd4_5=1;
//入力に設定 (ハードで、Pull_Upされている)
//pd4_6=pd4_7=0; 不要なり
}

void reset_DDS()
{
RESET=high; //RESET
for(i=0;i<13000;i++);
RESET=low;

W_CLK=high; //serial設定
W_CLK=low;
FQ_UD=high;
FQ_UD=low;
}



void send_data()
{
for(i=0;i<32;i++)
{
if(data & 0x01) D7=high;
else D7=low;
W_CLK=high;
W_CLK=low;
data=data >>1;
}

D7=high; //クロック6倍モード指定
W_CLK=high;
W_CLK=low;
D7=low; //logic 0
W_CLK=high;
W_CLK=low;
D7=low; //power down=no
W_CLK=high;
W_CLK=low;
for(i=0;i<5;i++) //位相制御 位相=0;
{
D7=low;
W_CLK=high;
W_CLK=low;
}
FQ_UD=high;
FQ_UD=low;

}
//for LCD

void initialize_LCD()

for(i=0;i<13000;i++); //21mS

p1=0x30; //DB7-4 0011
R_W=0;
RS=0;
E=1;
asm("nop"); //need 0.4uS OK? simulate 0.5uS OK
asm("nop");
asm("nop");
asm("nop"); 
asm("nop");
E=0;

for(i=0;i<6300;i++); //10.2mS

p1=0x30; //DB7-4 0011
R_W=0;
RS=0;
E=1;
asm("nop"); //need 0.4uS OK? simulate 0.5uS OK
asm("nop");
asm("nop");
asm("nop"); 
asm("nop");
E=0;

for(i=0;i<200;i++); //over 200uS

p1=0x30; //DB7-4 0011
R_W=0;
RS=0;
E=1;
asm("nop"); //need 0.4uS OK? simulate 0.5uS OK
asm("nop");
asm("nop");
asm("nop"); 
asm("nop");
E=0; //set 8bit interface

busy_check(); 
p1=0x20; //DB7-4 0010
lcd_cmd(); //set interface to 4-bit

busy_check(); 

p1=0x20; //2lines 5x7 character 
lcd_cmd();
p1=0x80;
lcd_cmd();

busy_check();
p1=0x00; //Display off
lcd_cmd(); 
p1=0x80;
lcd_cmd();

busy_check();
p1=0x00; //clear Display
lcd_cmd();
p1=0x10;
lcd_cmd();

busy_check();
p1=0x00; //Entry mode set
lcd_cmd();
p1=0x60; //DB7-4=0110
lcd_cmd();

busy_check();
p1=0x00; //Display ON
lcd_cmd();
p1=0xE0; //DB7-4=1110 no blink
lcd_cmd();
busy_check(); //cmdは、busy_checkして終わる事

}

void lcd_cmd()
{
R_W=0;
RS=0;
E=1;
asm("nop"); //need 0.4uS OK? simulate 0.5uS OK
asm("nop");
asm("nop");
asm("nop");
asm("nop"); 
E=0;
}

void busy_check()
{
unsigned char test_bit=0;
pd1=0x0F; //port1 DB7-4 direction = read

check:

R_W=1; //read
RS=0;
E=1;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
E=0;
test_bit=p1; //上位ビットの取り込み

R_W=1; //read
RS=0;
E=1;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
E=0;
//p1=下位ビットは、取り込み だけ、使わない
test_bit=test_bit>>7;
if( test_bit ) goto check;

pd1=0xff; //p1 DB7-4 direction = write 

}

void lcd_data( unsigned char c)
{
p1=c; //上位送信
R_W=0;
RS=1;
E=1;
asm("nop"); 
asm("nop");
asm("nop");
asm("nop"); 
asm("nop");
E=0; 

p1=c<<4; //下位送信
R_W=0;
RS=1;
E=1;
asm("nop"); 
asm("nop");
asm("nop");
asm("nop"); 
asm("nop");
E=0; 
busy_check(); //check busy_check
}

void lcd_write_str(unsigned char* c)
{

while(*c !=0x00)
{
lcd_data(*c);
busy_check();
c++;
}

}
/*void lcd_cmd4(unsigned char c)
{
p1 = c ;
lcd_cmd();
p1 = p1<<4;
lcd_cmd();
busy_check(); //必ずbusy_checkして終わる
}*/

void set_comma(unsigned long x) //simulate=722uS
{
unsigned char str[10]="";

*result=0x00; //clear result[]
sprintf(str,"%10lu",x);

for (i=0;i<10;i++)
{
strncat(result,str+i,1);
if( ( !(i % 3) ) && ( *(str+i) !=0x20 ) && (i !=9) ) strncat(result, &com ,1);
}

}

void locate(unsigned char gyou ,unsigned char retsu)
{
p1 = 0x80 + (gyou - 1)*0x40 + retsu-1 ;
lcd_cmd();
p1 = p1<<4;
lcd_cmd();
busy_check(); //必ずbusy_checkして終わる

}

void up_sw_pushed() //pull_upされている
{
for(i=0;i<20000;i++); //チャタリング防止用
if( up ) return;
for(i=0;i<20000;i++); //チャタリング防止用
if( up ) return;
freq +=1000000;

set_comma(freq ); //10MHzで、0.633mS費やす

p1=0x00;
lcd_cmd(); //clear
p1=0x10;
lcd_cmd();
busy_check();

//clear LCD

lcd_write_str("A=");
lcd_write_str(result);
lcd_write_str("Hz"); 
locate(2,1);
lcd_write_str("up ");
set_terminals();
DDS_data=28.63341769*freq; //DDS_data=設定値 
data=(unsigned long)DDS_data; //data=DDS_dataを32ビット整数値に変換したもの
send_data();

while( !up ); //これを入れると、1プッシュで、1つしか、上がらない。外すと、連続してupする
//連続して上げる場合、waitで、スピードを調整する
locate(2,1);
lcd_write_str(" ");



void down_sw_pushed()
{
}