H8

「H8」の編集履歴(バックアップ)一覧はこちら

H8」(2016/03/03 (木) 22:44:22) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

*H8について 本ページは、基本的にH8/3694(Tiny)についての記述になります。秋月のH8/3694Fキットが使いやすい。 [[回路図サンプル>http://www13.atwiki.jp/usonx?cmd=upload&act=open&pageid=17&file=SCHEMATIC1_CtrlBox.pdf]] *H8開発環境 オフィシャルな環境としては、ルネサスのHEW 趣味開発としては、[[GCC Developer Lite>http://www.besttechnology.co.jp/modules/knowledge/?GCC%20Developer%20Lite]]が良い H8/Tiny@GCCでは実数計算(float)がおかしい? (double)でキャストするか、整数×1000などで対応した方がよいかも ---- *LEDチカチカ LED:[[サンプル>http://www13.atwiki.jp/usonx?cmd=upload&act=open&pageid=17&file=LED.zip]] *外部割り込み irq:[[サンプル>http://www13.atwiki.jp/usonx?cmd=upload&act=open&pageid=17&file=irq.zip]] *I2C I2C:[[サンプル>http://www13.atwiki.jp/usonx?cmd=upload&act=open&pageid=17&file=I2C.zip]] *A/Dコンバータ ADC:[[サンプル>http://www13.atwiki.jp/usonx?cmd=upload&act=open&pageid=17&file=adc.zip]] *Timer TimerVとAのサンプル Timer:[[サンプル>http://www13.atwiki.jp/usonx?cmd=upload&act=open&pageid=17&file=Timer.zip]] *UART UART:[[サンプル>http://www13.atwiki.jp/usonx?cmd=upload&act=open&pageid=17&file=UART.zip]] UART(3048F):[[サンプル>http://www13.atwiki.jp/usonx?cmd=upload&act=open&pageid=17&file=sci1.zip]] ---- *外部割込み //----------------------- // 割り込み設定 初期化 //----------------------- 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とか)
*H8について 本ページは、基本的にH8/3694(Tiny)についての記述になります。秋月のH8/3694Fキットが使いやすい。 [[回路図サンプル>http://www13.atwiki.jp/usonx?cmd=upload&act=open&pageid=17&file=SCHEMATIC1_CtrlBox.pdf]] *H8開発環境 オフィシャルな環境としては、ルネサスのHEW 趣味開発としては、[[GCC Developer Lite>http://www.besttechnology.co.jp/modules/knowledge/?GCC%20Developer%20Lite]]が良い H8/Tiny@GCCでは実数計算(float)がおかしい? (double)でキャストするか、整数×1000などで対応した方がよいかも ---- *LEDチカチカ LED:[[サンプル>http://www13.atwiki.jp/usonx?cmd=upload&act=open&pageid=17&file=LED.zip]] *外部割り込み irq:[[サンプル>http://www13.atwiki.jp/usonx?cmd=upload&act=open&pageid=17&file=irq.zip]] *I2C I2C:[[サンプル>http://www13.atwiki.jp/usonx?cmd=upload&act=open&pageid=17&file=I2C.zip]] *A/Dコンバータ ADC:[[サンプル>http://www13.atwiki.jp/usonx?cmd=upload&act=open&pageid=17&file=adc.zip]] *Timer TimerVとAのサンプル Timer:[[サンプル>http://www13.atwiki.jp/usonx?cmd=upload&act=open&pageid=17&file=Timer.zip]] *UART UART:[[サンプル>http://www13.atwiki.jp/usonx?cmd=upload&act=open&pageid=17&file=UART.zip]] UART(これはH8/3048F用):[[サンプル>http://www13.atwiki.jp/usonx?cmd=upload&act=open&pageid=17&file=sci1.zip]] ---- *外部割込み //----------------------- // 割り込み設定 初期化 //----------------------- 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とか)

表示オプション

横に並べて表示:
変化行の前後のみ表示: