/* Start user code for function. Do not edit comment generated here */#include<stdint.h>#include<stdbool.h>externvolatileboolgMILLISECONDS_TIMER_EVENT_OCCURRED_FLAG;externvolatileint8_tgROTATION_COUNTER;/* End user code. Do not edit comment generated here */
クリックして展開し、詳細を表示
タイマユニット /src/cg_src/r_cg_tau_user.c
C
/* Start user code for include. Do not edit comment generated here */#include<stdbool.h>/* End user code. Do not edit comment generated here */
/* Start user code for global. Do not edit comment generated here */volatileboolgMILLISECONDS_TIMER_EVENT_OCCURRED_FLAG=false;//
#define INITIAL_TIMER_EVENT_FLAGS (0xFFU)
volatilestaticuint8_tgTIMER_EVENT_FLAGS=INITIAL_TIMER_EVENT_FLAGS;//
#define MIN_ROTATION_COUNT (-90)
#define MAX_ROTATION_COUNT (90)
volatileint8_tgROTATION_COUNTER=0;//
staticinlinevoidcountup_rotation_counter(void){if(gROTATION_COUNTER<MAX_ROTATION_COUNT){gROTATION_COUNTER++;}}//
staticinlinevoidcountdown_rotation_counter(void){if(gROTATION_COUNTER>MIN_ROTATION_COUNT){gROTATION_COUNTER--;}}#define ENCORDER_B_BIT (P0_bit.no0)
#define ENCORDER_A_BIT (P0_bit.no1)
#define ENCORDER_AB_BIT (P0 & 3)
volatilestaticuint8_tgCAPTURED_ENCORDER=0U;//
staticvoidsample_encoder(void){staticconstint8_tdir[]={0,1,-1,0,-1,0,0,1,1,0,0,-1,0,-1,1,0};staticint8_ti;int8_tn;i=(i<<2)+ENCORDER_AB_BIT;n=dir[i&15];if(n<0){countdown_rotation_counter();}elseif(n>0){countup_rotation_counter();}}staticvoidcapture_encorder(void){gCAPTURED_ENCORDER=(gCAPTURED_ENCORDER<<2)|ENCORDER_AB_BIT;gCAPTURED_ENCORDER&=15;switch(gCAPTURED_ENCORDER){case0x7:countup_rotation_counter();break;case0xd:countdown_rotation_counter();break;default:break;}}/* End user code. Do not edit comment generated here */
クリックして展開し、詳細を表示
C
staticvoid__nearr_tau0_channel2_interrupt(void){/* Start user code. Do not edit comment generated here */sample_encoder();// タイマー割り込みを8分周する
gTIMER_EVENT_FLAGS<<=1;if(gTIMER_EVENT_FLAGS==0U){gMILLISECONDS_TIMER_EVENT_OCCURRED_FLAG=true;gTIMER_EVENT_FLAGS=INITIAL_TIMER_EVENT_FLAGS;}/* End user code. Do not edit comment generated here */}
クリックして展開し、詳細を表示
/src/cg_src/r_cg_main.c
C
/* Start user code for include. Do not edit comment generated here */#include<string.h>#include<stdint.h>#include<stdbool.h>/* End user code. Do not edit comment generated here */
クリックして展開し、詳細を表示
C
/* Start user code for global. Do not edit comment generated here */// I2C LCD (AE-AQM1602A) のターゲット(スレーブ)アドレス
#define AQM1602A_I2C_TARGET_ADDRESS (0x3e)
// I2C LCD (AE-AQM1602A) 用送信バッファ
#define I2C_SEND_BUFFER_SIZE (2U)
staticuint8_tgI2C_SEND_BUFFER[I2C_SEND_BUFFER_SIZE];// 1ミリ秒 × multiply 遅延
voiddelay_milliseconds(uint16_tmultiply){while(multiply-->0U){gMILLISECONDS_TIMER_EVENT_OCCURRED_FLAG=false;while(!gMILLISECONDS_TIMER_EVENT_OCCURRED_FLAG){HALT();}R_WDT_Restart();}}// ミリ秒delay
staticinlinevoiddelay(uint16_tmilliseconds){delay_milliseconds(milliseconds);}// I2C LCD (AE-AQM1602A)にコマンドを送信する
voidAQM1602A_send_command(constuint8_tcommand_byte){gI2C_SEND_BUFFER[0]=0x00;gI2C_SEND_BUFFER[1]=command_byte;R_IICA0_Master_Send(AQM1602A_I2C_TARGET_ADDRESS<<1,gI2C_SEND_BUFFER,I2C_SEND_BUFFER_SIZE,128U);delay(10);}// I2C LCD (AE-AQM1602A)に1文字送信する
voidAQM1602A_send_data(constuint8_tbyte){gI2C_SEND_BUFFER[0]=0x40;gI2C_SEND_BUFFER[1]=byte;R_IICA0_Master_Send(AQM1602A_I2C_TARGET_ADDRESS<<1,gI2C_SEND_BUFFER,I2C_SEND_BUFFER_SIZE,128U);delay(1);}// I2C LCD (AE-AQM1602A)に文字列を送信する
voidAQM1602A_puts(constchar*p){while(*p){AQM1602A_send_data(*p++);}}// I2C LCD (AE-AQM1602A) クリアディスプレイ
voidAQM1602A_clear_display(void){AQM1602A_send_command(0x01);// clear display
delay(10);}// I2C LCD (AE-AQM1602A) ホーム(左上)に移動する
voidAQM1602A_return_home(void){AQM1602A_send_command(0x02);// return home
delay(10);}// I2C LCD (AE-AQM1602A)の初期化
voidAQM1602A_init(void){AQM1602A_send_command(0x38);// function set
delay(20);AQM1602A_send_command(0x39);// function set
delay(20);AQM1602A_send_command(0x14);// internal osc frequency
delay(20);AQM1602A_send_command(0x7A);// contrast lower
delay(20);AQM1602A_send_command(0x54);// contrast higher / icon / power
delay(20);AQM1602A_send_command(0x6C);// follower control
delay(20);//
AQM1602A_send_command(0x38);// function set
delay(20);AQM1602A_send_command(0x01);// clear display
delay(20);AQM1602A_send_command(0x0C);// display on
delay(20);}// 値を文字列にする
voidto_string(char*dst,int16_tvalue){if(value<0){*dst++='-';value=-value;}else{*dst++=' ';}uint8_txs[5];int8_tidx=0;do{xs[idx++]='0'+value%10;value=value/10;}while(idx<sizeof(xs)&&value!=0);while(--idx>=0){*dst++=xs[idx];}*dst='\0';}staticvoidset_servo_angle(int8_tdegrees){if(degrees<-90||90<degrees){return;}// PWM出力の周期
uint16_tpwm_period=(TDR00H<<8|TDR00L)+1;//
// SG-90 / SG-92R
// center: 1.45ms (on duty) / 20ms(period) * 100 = 7.25%
// -90 deg: 0.5ms (on duty) / 20ms(period) * 100 = 2.5%
// 90 deg: 2.4ms (on duty) / 20ms(period) * 100 = 12.0%
//
constfloatcenter=1.45f/20.0f;floaton_duty;if(degrees==0){on_duty=center;}else{on_duty=center+((2.4f-0.5f)/20.0f)*(float)degrees/180.0f;}//
uint16_ttdr=pwm_period*on_duty;TDR01H=tdr>>8;TDR01L=tdr&0xFF;}/* End user code. Do not edit comment generated here */
クリックして展開し、詳細を表示
C
voidmain(void){R_MAIN_UserInit();/* Start user code. Do not edit comment generated here */// 100ms待つ
delay(100);// LCDの初期化
AQM1602A_init();// 1行目
AQM1602A_puts("RL78 R5F10Y47ASP");//
gROTATION_COUNTER=0;while(1U){// 2行目
charmessage[17];strcpy(&message[0],"Angle = ");to_string(&message[8],gROTATION_COUNTER);strncat(message," deg ",5);//
AQM1602A_send_command(0x80|0x40);// アドレス設定
AQM1602A_puts(message);//
set_servo_angle(gROTATION_COUNTER);delay(100);}/* End user code. Do not edit comment generated here */}
クリックして展開し、詳細を表示
C
staticvoidR_MAIN_UserInit(void){/* Start user code. Do not edit comment generated here */R_TAU0_Channel0_Start();R_TAU0_Channel2_Start();EI();/* End user code. Do not edit comment generated here */}
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. Please attribute the source, use non-commercially, and maintain the same license.
コメント