/****************************************************************************
H8/300H Tiny Series -H8/3664-
RECVE.C
H8タイニーシリーズ リモコンテストプログラム
クロック周波数 16MHz
転送速度2400BPS
Program By H.shigemitsu
****************************************************************************/
#include <stdio.h>
#include <JNU2.h>
#define UART_BRG 207 /* 2400baud (CPU=16MHz) */
#define USN unsigned
#define SW0 P14
#define SW1 P15
#define M1_CW P50
#define M1_CCW P51
#define M2_CW P52
#define M2_CCW P53
#define PWM_1 P82
#define PWM_2 P83
USN char USRF0; /*User Flag Erea*/
#define USRF0_BIT (*(struct BIT *)&USRF0)
#define USRF0_0 USRF0_BIT.b0
#define USRF0_1 USRF0_BIT.b1
#define USRF0_2 USRF0_BIT.b2
#define USRF0_3 USRF0_BIT.b3
#define USRF0_4 USRF0_BIT.b4
#define USRF0_5 USRF0_BIT.b5
#define USRF0_6 USRF0_BIT.b6
#define USRF0_7 USRF0_BIT.b7
/* 関数定義 */
void main(void);
void sio(int data);
void interrupt sioint(void);
void ini_sio(void);
char rceve(void);
void wait(int cunt);
void dat_rceve(char d);
void pwm_up();
void pwm_dwn();
char rcve_dat,rf_dat,ck_dat;
USN int i,grb_dat;
/************************************************************/
/* Main Program */
/************************************************************/
void main(void)
{
PMR1=0x02; /*P1 I/O Set TXD SET */
PCR8 = 0x0f ; /* P8 0,1,2,3 OUT */
PMR5=0x00; /* P5 I/O Set */
PCR5=0x0F ; /* P5 0-3 OUT */
TMRW = 0x80; /* CTS=H */
TCRW = 0xb6; /* GRAでカウンタクリア 16MHz/8=2M TOB=1 TOC=1 */ USRF0 =0;
GRA = 40000; /* GRAを40000に設定2MHz*1/40000=50Hz=20mS*/
PWMB=0;PWMC=0; /*PWM出力OFF*/
PWMB=1;PWMC=1; /*FTIOB PWM OUT*/
GRB = 10000; /*40000*/
GRC = 10000; /*40000*/
ini_sio() ; /* SIO初期化 */
grb_dat=10000;
USRF0_1=1;
while(1){
rcve_dat = rceve();
SCR=0x00; /* 各種受信エラークリア */
if(rcve_dat == 'D'){
sio(rcve_dat); //test
rf_dat = rceve();
ck_dat = rceve();
if(rf_dat == ck_dat){
dat_rceve(rf_dat);
}
}
}
}
void pwm_up(){
grb_dat=grb_dat+200;
if(grb_dat > 40000) grb_dat=40000;
GRB = grb_dat;GRC = grb_dat;
wait(5000); //wait 5mS
}
void pwm_dwn(){
grb_dat=grb_dat-200;
if(grb_dat < 10000) grb_dat=10000;
GRB = grb_dat;GRC = grb_dat;
wait(5000); //wait 5mS
}
void dat_rceve(char d){
switch(d){
case '0': //前進 左
M1_CW = 1 ;
M1_CCW = 0 ;
M2_CW = 0 ;
M2_CCW = 0 ;
break;
case '1'://前進 直進
M1_CW = 1 ;
M1_CCW = 0 ;
M2_CW = 1;
M2_CCW = 0 ;
break;
case '2'://前進 右
M1_CW = 0 ;
M1_CCW = 0 ;
M2_CW = 1 ;
M2_CCW = 0 ;
break;
case '3'://PWM DWN
pwm_dwn();
break;
case '4'://PWM UP
pwm_up();
break;
case '5'://後退 左
M1_CW = 0 ;
M1_CCW = 1 ;
M2_CW = 0 ;
M2_CCW = 0 ;
break;
case '6'://後退 直進
M1_CW = 0 ;
M1_CCW = 1 ;
M2_CW = 0 ;
M2_CCW = 1;
break;
case '7'://後退 左
M1_CW = 0 ;
M1_CCW = 0 ;
M2_CW = 0 ;
M2_CCW = 1;
break;
case '9'://ブレーキ
M1_CW = 1 ;
M1_CCW = 1 ;
M2_CW = 1 ;
M2_CCW = 1 ;
break;
default:
break;
}
}
/* データ送信 */
void sio(int data){
int tem_dat;
TE=1; /* 送信動作許可 */
TDR=data; /* 送信データを送信バッファーに転送 */
for (;TEND == 0;); /* 送信バッファー空になるまで待つ */
TDRE=0;
TE=0 ; /* 送信動作禁止 */
}
/* データ受信 */
char rceve(void){
char ch;
RDRF=0; /* RDRF クリア */
ch=RDR; /* 受信データ転送*/
return (ch);
}
/* シリアル通信イニシャライズ */
void ini_sio(void){
PMR11 = 1;
SCR3 = 0; /* clear all flags */
SMR = 0; /* Ascnc, 8bit, NoParity, (Even), stop1, 1/1 */
BRR = UART_BRG; /* ボーレート */
RE = 1; /* Receve Enable */
}
void wait(int cunt)
{
_asm MOV.W \cunt,R0
_asm loop1:
_asm NOP
_asm NOP
_asm NOP
_asm NOP
_asm NOP
_asm DEC #1,R0
_asm BNE loop1
}