/****************************************************************************

     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

}