/***********************************************************************/
/* */
/* 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()
{
}