H8

H8について

本ページは、基本的にH8/3694(Tiny)についての記述になります。秋月のH8/3694Fキットが使いやすい。
回路図サンプル

H8開発環境

オフィシャルな環境としては、ルネサスのHEW
趣味開発としては、GCC Developer Liteが良い

H8/Tiny@GCCでは実数計算(float)がおかしい?
(double)でキャストするか、整数×1000などで対応した方がよいかも


LEDチカチカ

LED:サンプル

外部割り込み

irq:サンプル

I2C

I2C:サンプル

A/Dコンバータ

ADC:サンプル

Timer

TimerVとAのサンプル
Timer:サンプル

UART

UART:サンプル
UART(これはH8/3048F用):サンプル



外部割込み

//-----------------------
// 割り込み設定 初期化
//-----------------------
IO.PMR1.BIT.IRQ1=1; /* P15をIRQ1にセット */ 
IEGR1.BIT.IEG1=0; /* IRQ1の立ち下がりエッジを検出 */
IRR1.BIT.IRRI1=0; /* IRQ1割込み要求フラグをクリア */ 
IENR1.BIT.IEN1=1; /* IRQ1割込み許可 */ 

void int_irq1(void)
{ 
 IRR1.BIT.IRRI1=0;
 IENR1.BIT.IEN1=0;
 IENR1.BIT.IEN1=1; /* IRQ1割込み許可 */
 
 // IO.PDR8.BIT.B7 =0; // ここに処理
}

TimerA

//-----------------------
// タイマA設定 初期化
//-----------------------
TA.TMA.BYTE=0x18;       /* オーバーフロー周期1秒 */
IRR1.BIT.IRRTA=0;       /* タイマーA割込みフラグのリセット */
IENR1.BIT.IENTA=1;      /* タイマーA割込みを利用可能にする */

void int_timera(void)     /* タイマーA割込み関数 */
{
 IRR1.BIT.IRRTA=0;
 if(onoff==1){
   IO.PDR8.BIT.B7 =0;
   onoff=0;
 }else{
   IO.PDR8.BIT.B7=1;
   onoff=1;
 }
}

IRQ(外部割込み)

//-----------------------
// 割り込み設定 初期化
//-----------------------
IO.PMR1.BIT.IRQ1=1; /* P15をIRQ1にセット */ 
IEGR1.BIT.IEG1=0; /* IRQ1の立ち下がりエッジを検出 */
IRR1.BIT.IRRI1=0; /* IRQ1割込み要求フラグをクリア */ 
IENR1.BIT.IEN1=1; /* IRQ1割込み許可 */

void int_irq1(void)
{ 
 DI;
 IRR1.BIT.IRRI1=0;
 IENR1.BIT.IEN1=0;
 IENR1.BIT.IEN1=1; /* IRQ1割込み許可 */
 
 IO.PDR8.BIT.B7 =0;
 EI;
}

H8/3694のI2C

#define EX1_SEL		0x02					// extra i2c
#define RTC_SEL		0x01					// real time clock

// ポートイニシャライズ
void I2C_Init(void){
	IO.PDR5.BIT.B6 = 0;					// P56,P57がI2C用のバスライン
	IO.PDR5.BIT.B7 = 0;					// P56,P57のデータは0にしておく
	IO.PCR5 = IO.PCR5 & 0x3F;				// I2CでEEPROMを使う場合 P56,P57を入力に設定しておく
}

unsigned char I2C_ReadByte( unsigned short adrs ,unsigned char slave_adrs) {
   unsigned char data;

   TEEPROM eep = {ep256k, slave_adrs, adrs};
   if(slave_adrs == RTC_SEL){
       eep.MemSize = ep2k;
   }
   EEPROM_ByteRead (&eep, (_BYTE *)&data);

   return(data);
}

unsigned char I2C_WriteByte( unsigned short adrs , unsigned char wr_data ,unsigned char slave_adrs) {

   TEEPROM eep = {ep256k, slave_adrs, adrs};
   if(slave_adrs == RTC_SEL){
       eep.MemSize = ep2k;
   }
//    eep.MAddr = adrs;

   EEPROM_ByteWrite (&eep, wr_data);
   return(0);
}

int RTC_GetSeconds(void) {
	unsigned char dat;

	dat = I2C_ReadByte( 0x02,RTC_SEL );
return ((dat >> 4) & 0x07) * 10 + (dat & 0x0f);
}

int RTC_GetMinutes(void) {
	unsigned char dat;

	dat = I2C_ReadByte( 0x03,RTC_SEL );
	return ((dat >> 4) & 0x07) * 10 + (dat & 0x0f);
}

int RTC_GetHours(void) {
	unsigned char dat;

	dat = I2C_ReadByte( 0x04,RTC_SEL );
	return ((dat >> 4) & 0x03) * 10 + (dat & 0x0f);
} 

int RTC_GetDays(void) {
	unsigned char dat;

	dat = I2C_ReadByte( 0x05,RTC_SEL );
	return ((dat >> 4) & 0x03) * 10 + (dat & 0x0f);
} 

int RTC_GetWeekends(void) {
	unsigned char dat;

	dat = I2C_ReadByte( 0x06,RTC_SEL );
	return(dat & 0x07);
} 

int RTC_GetMonths(void) {
	unsigned char dat;

	dat = I2C_ReadByte( 0x07,RTC_SEL );
	return ((dat >> 4) & 0x01) * 10 + (dat & 0x0f);
} 

int RTC_GetYears(void) {
	unsigned char dat;

	dat = I2C_ReadByte( 0x08,RTC_SEL );
	return ((dat >> 4) & 0x0f) * 10 + (dat & 0x0f);
} 

void RTC_SetSeconds(int dat) {
	I2C_WriteByte( 0x02 , (((dat / 10 ) << 4) + (dat % 10)) & 0x7f , RTC_SEL );
} 

void RTC_SetMinutes(int dat) {
	I2C_WriteByte( 0x03 , (((dat / 10 ) << 4) + (dat % 10)) & 0x7f , RTC_SEL );
}

void RTC_SetHours(int dat) {
	I2C_WriteByte( 0x04 , (((dat / 10 ) << 4) + (dat % 10)) & 0x3f , RTC_SEL );
}

void RTC_SetDays(int dat) {
	I2C_WriteByte( 0x05 , (((dat / 10 ) << 4) + (dat % 10)) & 0x3f , RTC_SEL );
}

void RTC_SetWeekends(int dat) {
	I2C_WriteByte( 0x06 , dat & 0x07 , RTC_SEL );
}

void RTC_SetMonths(int dat) {
	I2C_WriteByte( 0x07 , (((dat / 10 ) << 4) + (dat % 10)) & 0x7f , RTC_SEL );
}

void RTC_SetYears(int dat) {
	I2C_WriteByte( 0x08 , ((dat / 10 ) << 4) + (dat % 10) , RTC_SEL );
}

H8/3694

#include <3694.h>
#include <stdio.h>

// 今までの記述とのある程度の互換性を保つためのマクロ
#define rs_init     SCI3_INIT
#define rs_rx_buff  SCI3_IN_DATA_CHECK
#define rs_tx_buff  SCI3_OUT_DATA_CHECK
#define rs_rx_purge SCI3_IN_DATA_CLEAR
#define rs_tx_purge SCI3_OUT_DATA_CLEAR
#define rs_putc     SCI3_OUT_DATA
#define rs_puts     SCI3_OUT_STRING
#define rs_putsb    SCI3_OUT_STRINGB
#define rs_getc     SCI3_IN_DATA
#define rs_gets     SCI3_IN_STRING
#define rs_printf   SCI3_PRINTF

void init();
char txb[10], rxb[10], buf[15];             // RS-232C 通信用グローバル変数

int main()
{
 //int  ch;
 //int  adv, intp, decip;
 //char rx_data;
 unsigned char c = 0x00;
 int  cnt = 0;
 int  flg = 0;
  
 DI;                                     // 割り込み不許可
 init();                                 // H8/3664F 初期化
 EI;                                     // 割り込み許可
 
 // 正常起動メッセージの表示
 SCI3_OUT_STRING ("H8/3694F RS232 test \n");  //文字列送信関数
 IO.PDR8.BIT.B0 = 1;
 
 do {
     if (rs_rx_buff () > 0) {      // 受信バッファ確認
       c = rs_getc ();             // 1文字受信

       // SCI3.SSR3.BIT.TRDE = 0x00;
       // SCI3.SSR.BIT.RDRF = 0x00;
     	//  rs_putc (c+1);   // 1文字受信待ち & ホストへエコーバック

       SCI3_OUT_DATA(c);
       if (c == 164)
        {
         SCI3_OUT_DATA(0x00);
         SCI3_OUT_DATA(0x1E);
         SCI3_OUT_DATA(0x86);
         SCI3_OUT_DATA(0x8E);
         SCI3_OUT_DATA(0xC7);
         SCI3_OUT_DATA(0x0F);
         SCI3_OUT_DATA(0x5A);
         SCI3_OUT_DATA(0xFF);
         SCI3_OUT_DATA(0x08);
       
         cnt = 0;

       }  
     }
          c = 0x00;                                        
     //if (c == 12) IO.PDR8.BIT.B1 = 1;
     //SCI3_PRINTF ("%d",7);
     //c = 12;
     //SCI3_OUT_DATA(c);
 }while(1);
 
 return 0;
}


void init()
{
 // H8/3664F 初期化処理
 IO.PMR1.BYTE=0x00;                 // 全て0にセットし、ポート使用に 設定 0000 0000
 IO.PCR1=0xFF;                      // 全て1にセットし、出力に設定 1111 1111 
                                    // PCRレジスタは IO.PCR1.BYTE 記述でない!
 IO.PUCR1.BYTE=0x00;                // 全て0にセットし、プルアップなし
 
 IO.PCR8 = 0xFF;                    // LED用ポートの設定 全1セット、出力に設定 

 //SCI3.SCR3.BYTE = 0x30;   // 
 //SCI3.SCR3.BIT.TE = 1;   // 送信許可
 //SCI3.SCR3.BIT.RE = 1;   // 受信許可
 //SCI3.SSR.BYTE  &= 0x80;
 //SCI3.SMR.BYTE   = 0x00;
 
 SCI3_INIT(br9600, txb, sizeof(txb), rxb, sizeof(rxb));       // RS-232C通信の初期化;
}


H8ライタ(3048F用)製作における注意点

  • RS232Cレベル変換のICのコンデンサ(0.1uか1.0uFかなど)に注意する(通常は2番ピンが+10V、6番ピンが-10V近くになっているはず)
  • 上記コンデンサの接続注意
  • VppとMD2ラインに+12Vをかける際、H8本体に電源(+5V)が供給されていること(そうしないとH8が壊れる可能性大)
  • USB-RS232C変換ケーブルだと駄目なケースがあるので、PCのCOMポートを使うとよい
  • 通信速度は、環境によるが19200bps以下が安定して書き込める
  • H8が壊れるとめちゃめちゃH8が熱くなる(電流0.3Aとか、正常時は0.08Aとか)
最終更新:2016年03月03日 22:44