H8について
本ページは、基本的にH8/3694(Tiny)についての記述になります。秋月のH8/3694Fキットが使いやすい。
回路図サンプル
H8開発環境
H8/Tiny@GCCでは実数計算(float)がおかしい?
(double)でキャストするか、整数×1000などで対応した方がよいかも
LEDチカチカ
外部割り込み
I2C
A/Dコンバータ
Timer
UART
外部割込み
//-----------------------
// 割り込み設定 初期化
//-----------------------
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