Go to the Home Page
micro computer
Renesas RX210
hwsetup.c
#include "iodefine.h"
/*-------------------------------------------------------------------------------
関数名 : set_main_clk
内容 : CPU CLOCK の初期化
引数 : 無し
戻値 : 無し
更新日 : 2017/08/16
-------------------------------------------------------------------------------*/
void set_main_clk(void){
unsigned int i;
// クロック発生 ( HOCO 50MHz発振 )
SYSTEM.PRCR.WORD = 0xA507; //①プロテクト解除
SYSTEM.VRCR = 0x00; //②VRCRレジスタに0x00を書き込む
SYSTEM.HOCOCR2.BYTE = 0x03; //③50MHzを選択
SYSTEM.HOCOWTCR2.BYTE = 0x03; //④発振安定待機時間の設定(9216cyc)
SYSTEM.HOCOCR.BYTE = 0x00; //⑤HOCOを動作
for( i = 0 ; i<1750 ; i++ ); //⑥発振安定待機時間(350μs)
// 動作電力制御モード/クロック分周比/システムクロック切換え
SYSTEM.OPCCR.BYTE = 0x00; //⑦動作電力制御モード設定(高速動作モード)
while( SYSTEM.OPCCR.BIT.OPCMTSF );//⑧動作電力制御モード遷移完了待ち
SYSTEM.SCKCR.LONG = 0x10821115; //⑨内部クロック分周比を設定
while( SYSTEM.SCKCR.LONG!=0x10821115);//⑩内部クロック分周比の書き換え完了待ち
SYSTEM.SCKCR3.WORD = 0x0100; //⑪システムクロックを切り替え(HOCO)
SYSTEM.PRCR.WORD = 0xA500; //⑫プロテクト設定
}
/*-------------------------------------------------------------------------------
関数名 : set_IRQ1
内容 : IRQ1 の初期化
引数 : 無し
戻値 : 無し
更新日 : 2025/02/13
-------------------------------------------------------------------------------*/
void set_IRQ1(void){
IEN(ICU,IRQ1)=0;
//ICU.IER[0x08].BIT.IEN1=1
IPR(ICU,IRQ1)=15;
//ICU.IPR[65].BIT.IPR=15;
ICU.IRQFLTE0.BIT.FLTEN1=0;
ICU.IRQFLTC0.BIT.FCLKSEL1=3;
PORT3.PDR.BIT.B1=0;
MPC.PWPR.BIT.B0WI=0;
MPC.PWPR.BIT.PFSWE=1;
MPC.P31PFS.BIT.ISEL=1;
MPC.PWPR.BIT.PFSWE=0;
MPC.PWPR.BIT.B0WI=1;
PORT3.PMR.BIT.B1=1;
ICU.IRQCR[1].BIT.IRQMD=1;
IR(ICU,IRQ1)=0;
//ICU.IR[65].BIT.IR=0;
ICU.IRQFLTE0.BIT.FLTEN1=1;
IEN(ICU,IRQ1)=1;
//ICU.IER[0x08].BIT.IEN1=1;
}
/*-------------------------------------------------------------------------------
関数名 : set_IRQ3
内容 : IRQ3 の初期化
引数 : 無し
戻値 : 無し
更新日 : 2025/02/14
-------------------------------------------------------------------------------*/
void set_IRQ3(void){
IEN(ICU,IRQ3)=0;
//ICU.IER[0x08].BIT.IEN1=1
IPR(ICU,IRQ3)=15;
//ICU.IPR[65].BIT.IPR=15;
ICU.IRQFLTE0.BIT.FLTEN3=0;
ICU.IRQFLTC0.BIT.FCLKSEL3=3;
PORT3.PDR.BIT.B3=0;
MPC.PWPR.BIT.B0WI=0;
MPC.PWPR.BIT.PFSWE=1;
MPC.P33PFS.BIT.ISEL=1;
MPC.PWPR.BIT.PFSWE=0;
MPC.PWPR.BIT.B0WI=1;
PORT3.PMR.BIT.B3=1;
ICU.IRQCR[3].BIT.IRQMD=1;
IR(ICU,IRQ3)=0;
//ICU.IR[65].BIT.IR=0;
ICU.IRQFLTE0.BIT.FLTEN3=1;
IEN(ICU,IRQ3)=1;
//ICU.IER[0x08].BIT.IEN1=1;
}
void set_CMT0(void){
SYSTEM.PRCR.WORD=0xA502;
SYSTEM.MSTPCRA.BIT.MSTPA15=0;
SYSTEM.PRCR.WORD=0xA500;
ICU.IER[3].BIT.IEN4=0;
ICU.IPR[4].BIT.IPR=1;
CMT0.CMCR.BIT.CKS=3;
CMT0.CMCNT=0;
CMT0.CMCOR=48827;
CMT0.CMCR.BIT.CMIE=1;
ICU.IER[3].BIT.IEN4=1;
}
void set_DA(void){
SYSTEM.PRCR.WORD=0xA502;
SYSTEM.MSTPCRA.BIT.MSTPA19=0;
SYSTEM.PRCR.WORD=0xA500;
MPC.PWPR.BIT.B0WI=0;
MPC.PWPR.BIT.PFSWE=1;
MPC.P03PFS.BYTE=0x80;
MPC.P05PFS.BYTE=0x80;
MPC.PWPR.BIT.PFSWE=0;
MPC.PWPR.BIT.B0WI=1;
DA.DADR0=0x0000;
DA.DADR1=0x0000;
DA.DACR.BYTE=0xFF;
}
void set_AD(void){
SYSTEM.PRCR.WORD=0xA502;
SYSTEM.MSTPCRA.BIT.MSTPA17=0;
SYSTEM.PRCR.WORD=0xA500;
MPC.PWPR.BIT.B0WI=0;
MPC.PWPR.BIT.PFSWE=1;
MPC.P40PFS.BYTE=0x80;
MPC.PWPR.BIT.PFSWE=0;
MPC.PWPR.BIT.B0WI=1;
S12AD.ADANSA.BIT.ANSA0=1;
S12AD.ADCSR.BIT.ADCS=2;
S12AD.ADCSR.BIT.ADST=0x01;
}
void set_SCI0(void){
SYSTEM.PRCR.WORD=0xA502;
SYSTEM.MSTPCRB.BIT.MSTPB31=0;
SYSTEM.PRCR.WORD=0xA500;
SCI0.SCR.BYTE=0x00;
IEN(SCI0,ERI0)=0;//append
IEN(SCI0,RXI0)=0;//append
PORT2.PDR.BIT.B1=0;
PORT2.PDR.BIT.B0=1;
MPC.PWPR.BIT.B0WI=0;
MPC.PWPR.BIT.PFSWE=1;
MPC.P21PFS.BYTE=0x0A;
MPC.P20PFS.BYTE=0x0A;
MPC.PWPR.BIT.PFSWE=1;
MPC.PWPR.BIT.B0WI=0;
PORT2.PMR.BIT.B1=1;
PORT2.PMR.BIT.B0=1;
SCI0.SMR.BIT.CKS=0;
SCI0.SCR.BIT.CKE=0;
SCI0.SMR.BIT.STOP=0;
SCI0.SMR.BIT.PM=0;
SCI0.SMR.BIT.PE=0;
SCI0.SMR.BIT.CHR=0;
SCI0.SMR.BIT.CM=0;
SCI0.BRR=80;
IPR(SCI0,)=15;//append
SCI0.SCR.BIT.RIE=1;//append
SCI0.SCR.BIT.TE=1;
SCI0.SCR.BIT.RE=1;
SCI0.SSR.BIT.ORER=0;//append
SCI0.SSR.BIT.FER=0;//append
SCI0.SSR.BIT.PER=0;//append
IEN(SCI0,ERI0)=1;//append
IEN(SCI0,RXI0)=1;//append
}
void set_ADT(void){
unsigned int i;
SYSTEM.PRCR.WORD=0xa502;
SYSTEM.MSTPCRA.BIT.MSTPA17=0;
SYSTEM.MSTPCRB.BIT.MSTPB8=0;
SYSTEM.PRCR.WORD=0xa500;
IEN(S12AD,S12ADI0)=1;
IPR(S12AD,S12ADI0)=1;
S12AD.ADANSA.WORD=0x0000;
S12AD.ADANSB.WORD=0x0000;
S12AD.ADEXICR.BIT.OCS=0;
S12AD.ADEXICR.BIT.TSS=1;
S12AD.ADCSR.BIT.ADCS=0;
S12AD.ADCSR.BIT.ADIE=1;
S12AD.ADSSTRT=113;
S12AD.ADSTRGR.BIT.TRSA=10;
S12AD.ADCSR.BIT.TRGE=1;
S12AD.ADCSR.BIT.EXTRG=0;
TEMPS.TSCR.BIT.PGAEN=0;
TEMPS.TSCR.BIT.TSEN=0;
TEMPS.TSCR.BIT.PGAGAIN=3;
TEMPS.TSCR.BIT.TSEN=1;
for(i=0;i<5000000;i++);
TEMPS.TSCR.BIT.PGAEN=1;
}
/*-------------------------------------------------------------------------------
関数名 : hw_setup
内容 : ハードウェアセットアップ用関数
引数 : 無し
戻値 : 無し
更新日 : 2017/08/16
-------------------------------------------------------------------------------*/
void HardwareSetup(void){
set_main_clk(); // クロック設定
set_IRQ1();
set_IRQ3();
set_CMT0();
set_DA();
set_AD();
set_SCI0();
set_ADT();
return;
}
intprg.c
void Excep_CMT0_CMI0(void){ Call_CMT0(); }
void Excep_ICU_IRQ1(void){ IRQ1_get(); }
void Excep_ICU_IRQ3(void){ IRQ3_get(); }
void Excep_S12AD_S12ADI0(void){S12ADI0_Temp(); }
void Excep_SCI0_ERI0(void){ intr_err_receive();}
void Excep_SCI0_RXI0(void){ intr_receive();}
main.c
#include "iodefine.h"
#include "LCD.h"
#include "stdio.h"
#define BUFSIZE 32
typedef struct{
unsigned short rPos;
unsigned short wPos;
unsigned char buf[BUFSIZE];
}stSIO;
stSIO mRev;
extern void HardwareSetup(void);
unsigned short val;
unsigned char sval;
unsigned short ad_val=0;
char AD_end;
char send_buff[20]={0};
char sendbuff[4]={0};
char c_in[2]={' '};
int rcevflag=0;
void IRQ1_get(void){
PORT1.PODR.BIT.B4^=1;
}
void IRQ3_get(void){
PORT1.PODR.BIT.B6^=1;
}
void Call_CMT0(void){
PORT1.PODR.BIT.B7^=1;
}
void send_char(char as_data[]){
while(*as_data!='\0'){
SCI0.TDR=*as_data;//transmit data to tera
while(SCI0.SSR.BIT.TEND==0){}
as_data++;
}
}
void intr_receive(void){
mRev.buf[mRev.wPos++]=SCI0.RDR;
if(mRev.wPos>=BUFSIZE){
mRev.wPos=0;
}
}
void intr_err_receive(void){
unsigned char i=0;
SCI0.SCR.BIT.RIE=0;
i=SCI0.SSR.BIT.ORER;
i=SCI0.SSR.BIT.FER;
i=SCI0.SSR.BIT.PER;
i++;
SCI0.SSR.BIT.ORER=0;
SCI0.SSR.BIT.FER=0;
SCI0.SSR.BIT.PER=0;
SCI0.SCR.BIT.RIE=1;
}
void S12ADI0_Temp(void){
AD_end=1;
ad_val=S12AD.ADTSDR;
}
char new_word[2]={' '};
char old_word[2]={' '};
void main(void)
{
int data=0;
int cnt=0;
int i=0;
int ad_add=0;
int add_data[8]={0};
int move_cnt=0;
char ad_buf[8]={0};
unsigned short temp=0;
sval=0x30;
LCD_init();
#if 1
PORT1.PODR.BIT.B4=1;
PORT1.PODR.BIT.B6=1;
PORT1.PODR.BIT.B7=1;
PORT1.PDR.BIT.B4=1;
PORT1.PDR.BIT.B6=1;
PORT1.PDR.BIT.B7=1;
CMT.CMSTR0.WORD=0x0001;
HardwareSetup();
#endif
#if 0
while(1){}
#endif
#if 0
while(1){
data+=10;
DA.DADR0=data;
timer(100);
}
#endif
#if 0
while(1){
val=S12AD.ADDR0;
}
#endif
#if 0
while(1){
SCI0.TDR=sval;
sval++;
while(SCI0.SSR.BIT.TEND==0){}
timer(100);
}
#endif
#if 0
while(1){
val=S12AD.ADDR0;
sprintf(send_buff,"AD=%04d \r\n", val);
send_char(send_buff);
timer(500);
}
#endif
#if 0
while(1){
new_word[0]=c_in[0];
LCD_cursor(1);
LCD_write(c_in[0]);
timer(100);
if(new_word[0]!=old_word[0]){
send_char(new_word);
}
old_word[0]=new_word[0];
}
#endif
#if 0
while(1){
while(rcevflag==1){
send_char(c_in);
rcevflag=0;
if(cnt==0){LCD_cursor(1);}
if(cnt==8){LCD_cursor(2);}
LCD_write(c_in[0]);
cnt++;
if(cnt==16){cnt=0;}
}
}
#endif
#if 0
while(1){
if(mRev.rPos!=mRev.wPos){
sendbuff[0]=mRev.buf[mRev.rPos++];
send_char(sendbuff);
if(cnt==0)LCD_cursor(1);
if(cnt==8)LCD_cursor(2);
LCD_write(sendbuff[0]);
cnt++;
if(cnt==16)cnt=0;
if(sendbuff[0]=='0'){
sendbuff[0]=0x13;
send_char(sendbuff);
send_char("*STOP*");
timer(2000);
send_char("=ON=");
sendbuff[0]=0x11;
send_char(sendbuff);
}
if(mRev.rPos>=BUFSIZE){mRev.rPos=0;}
}
}
#endif
#if 0
while(1){
timer(500);
TEMPS.TSCR.BIT.PGAEN=1;
while(TEMPS.TSCR.BIT.PGAEN==1);
ad_val=S12AD.ADTSDR;
temp=((ad_val-1580)/18)+23;
sprintf(ad_buf,"%04d",temp);
send_char(ad_buf);
send_char("\r\n");
LCD_cursor(1);
LCD_struct(ad_buf);
}
#endif
#if 1
while(1){
if(AD_end){
AD_end=0;
timer(500);
TEMPS.TSCR.BIT.PGAEN=1;
}
switch(move_cnt){
case 0:
add_data[0]=ad_val;
break;
case 1:
add_data[1]=ad_val;
break;
case 2:
add_data[2]=ad_val;
break;
case 3:
add_data[3]=ad_val;
break;
case 4:
add_data[4]=ad_val;
break;
case 5:
add_data[5]=ad_val;
break;
case 6:
add_data[6]=ad_val;
break;
case 7:
add_data[7]=ad_val;
move_cnt=-1;
break;
default:
break;
}
move_cnt++;
ad_add=0;
for(i=0;i<8;i++){
ad_add+=add_data[i];
}
ad_add>>=3;
sprintf(ad_buf,"%04d",ad_add);
LCD_cursor(1);
LCD_struct(ad_buf);
}
#endif
}
LCD.c
#include "iodefine.h"
/*----------------------------------------------------------
関数名 : timer
内容 : 1msxdelay秒のソフトウェアタイマ
引数 : delayの整数値
戻値 : 無し
更新日 : 2024/04/01
------------------------------------------------------------*/
void timer(int delay){//1ms x delay
int i,j;
for( i=0; i>4;//上位4bit
code_e(code_4b);
code_4b = code & 0x0F;//下位4bit
code_e(code_4b);
}
/*----------------------------------------------------------
関数名 : chara_w
内容 : 4ビットの文字コード書込み
引数 : 4ビット・文字コード
戻値 : 無し
更新日 : 2024/04/01
------------------------------------------------------------*/
void chara_w(char chara_h){//4ビットデータの文字コード書込み
PORTH.PODR.BYTE =chara_h;//1行目1文字
PORTJ.PODR.BIT.B1=1;//RS:hight(DR)
PORTJ.PODR.BIT.B3=1;//E:hight(書込み)
timer(1);//1ms_wait;
PORTJ.PODR.BIT.B3=0;//E:Low(書込み終了)
timer(1);//1ms_wait;
}
/*----------------------------------------------------------
関数名 : LCD_write
内容 : 文字コード(8ビット)の書込み
引数 : 文字コード(8ビット)
戻値 : 無し
更新日 : 2024/04/01
------------------------------------------------------------*/
void LCD_write(char LCD_char){//1文字コード転送
char chara_4b;
chara_4b = (LCD_char & 0xF0) >>4;//上位4bit
chara_w(chara_4b);
chara_4b = LCD_char & 0x0F;//下位4bit
chara_w(chara_4b);
}
/*----------------------------------------------------------
関数名 : LCD_init
内容 : LCDの初期化,ポートJ,Hの出力端子設定
引数 : 無し
戻値 : 無し
更新日 : 2024/04/01
------------------------------------------------------------*/
void LCD_init(void){
int i;
//出力データの設定
PORTH.PODR.BYTE =0x0F;//PH0-3:1
PORTJ.PODR.BIT.B1 =1;//PJ1(RS):1
PORTJ.PODR.BIT.B3 =0;//PJ3(E):0
//出力端子に設定
PORTH.PDR.BYTE |=0x0F;//PH0-3:OUT
PORTJ.PDR.BIT.B1 =1;//PJ1(RS):OUT
PORTJ.PDR.BIT.B3 =1;//PJ3(E):OUT
//LCD初期化シーケンス
timer(40);//40ms_wait
for(i=0; i<3; i++){
//1.FuctionSet 8bitI/F-set(0x3)3回設定
code_e(0x03);//FuctionSet(DL=1:8bitI/F)
}
//2.FuctionSet 4bitI/F-set(0x2)
code_e(0x02);////FuctionSet(DL=1:4bitI/F)
//①.FuctionSet 4bitI/F-set+2行表示/5x8ドット(0x28)
code_w(0x28);//FuctionSet(DL=1:4bitI/F)
//(N=1:2行表示.F=1:5x8ドット)
//②.FuctionSet 4bitI/F-set+2行表示/5x8ドット(0x28)
code_w(0x28);//FuctionSet(DL=1:4bitI/F)
//(N=1:2行表示.F=1:5x8ドット)
//③.DisplayON/OFFcontrol 表示ON/カーソルON/ブリンクOFF(0x0E)
code_w(0x0E);//DisplayON/OFFcontro
//(D=1:表示ON,C=1:カーソルON,B=0:ブリンクOFF)
//④.Display Clear(表示クリア)(0x01)
code_w(0x01);;//Display Clear(表示クリア)
timer(2);//2ms_wait;
//⑤.EntryModeSet インクリメント/表示をシフトさせない(0x06)
code_w(0x06);//EntryModeSet
//(I/D=1:インクリメント,S=0:表示をシフトしない)
//初期化終了
}
/*----------------------------------------------------------
関数名 : LCD_struct
内容 : 文字列の表示
引数 : 文字列("abc")
戻値 : 無し
更新日 : 2024/04/01
------------------------------------------------------------*/
void LCD_struct(const char *str){//文字列表示
int i=0;
while(*str != '\0'){//文字列
LCD_write(*str);//1文字表示
str++;//次の文字アドレス設定
i++;
if(i==8){//8文字以上は表示せず
break;
}
}
}
/*----------------------------------------------------------
関数名 : LCD_cursor
内容 : 表示位置の設定
引数 : 1:1行目1文字目,2:2行目の1文字目
戻値 : 無し
更新日 : 2024/04/01
------------------------------------------------------------*/
void LCD_cursor(int cur){//1:1行目,2:2行目の1文字目
if(cur == 1){//1行目
code_w(0x80);//1行目1文字目
}
if(cur == 2){//2行目
code_w(0xC0);//1行目1文字目
}
}
LCD.h
void timer(int delay);//1ms x delay
void code_e(char code_h);//4ビットデータのインストラクション書込み
void code_w(char code);//1バイト-インストラクション書込み
void chara_w(char chara_h);//4ビットデータの文字コード書込み
void LCD_write(char LCD_char);//1文字コード転送
void LCD_init(void);//LCD初期化
void LCD_struct(const char *str);//文字列表示
void LCD_cursor(int cur);//1:1行目,2:2行目の1文字目