[H8-ML(1490)] Re: [H8-ML(1486)] for文での出力ポートの操作
From: "Henry Sugimoto of OB." <ob_henry@xxxxxxxxxxxxxxxx>
Date: 2001年12月20日(木)09時06分28秒
> for (i=0; i<8; i++) {
>     PBDR.BIT.B7 = 0;  // 立ち下がり
>     PBDR.BIT.B7 = 1;  // 立ち上がり
> }

 H8ですと広いROMエリア、ネコの額程のRAMエリアで、ROM領域
 の広さを勘案すれば、LOOPを利用する場合、シーケンスが複雑
 でなければ意味を持たないのでは? この例では、動いている平
 文で問題解決とするのが正解ですね。 プログラムを書くのが楽
 だから、LOOPにしたいってんだったら、一寸問題ですね。

 LOOP自身の誤動作に関しては、アセンブラーを吐き出すのが、最
 初の一歩。 でなければ、逆アセンブラー の結果を見ましょう。

 日立H8C、SHCでは、この件に関して、問題発生を経験していませ
 ん。   以下の93C46 書き込みは安定していますが、SH2では
 OP=0でコンパイルしないと、動かない事が有ります。 H8では
 動きますけど。

#define ulong unsigned long
#define vuchar volatile unsigned char

// ************ I/O Address ***************************************
#define CR_N   (*(vuchar *)0xc00300)  // Control Register
#define MEM    (*(vuchar *)0xc00301)  // Intr Status

short int write_93c46(short int ad,short int dt)
{ short int si;
 unsigned char uc,uc0;
 int i;

 CR_N=(unsigned char)0xc0;      // Page 0,Program 93C46
 MEM =(unsigned char)0x84;      //    CK
 MEM =(unsigned char)0x88;      // CS,  ,0
 MEM =(unsigned char)0x8c;      // CS,CK,0
 MEM =(unsigned char)0x8a;      // CS,  ,1
 MEM =(unsigned char)0x8e;      // CS,CK,1
 MEM =(unsigned char)0x88;      // CS,  ,0
 MEM =(unsigned char)0x8c;      // CS,CK,0
 MEM =(unsigned char)0x88;      // CS,  ,0
 MEM =(unsigned char)0x8c;      // CS,CK,0

 for(i=0;i<6;i++)
 { MEM=(unsigned char)0x8a;     // CS,  ,1
  MEM=(unsigned char)0x8e;     // CS,CK,1
 }
 MEM =(unsigned char)0x88;      // CK,  ,
 MEM =(unsigned char)0x80;      //   ,  ,

 MEM =(unsigned char)0x88;      // CS,  ,0
 MEM =(unsigned char)0x8c;      // CS,CK,0
 MEM =(unsigned char)0x8a;      // CS,  ,1
 MEM =(unsigned char)0x8e;      // CS,CK,1
 MEM =(unsigned char)0x88;      // CS,  ,0
 MEM =(unsigned char)0x8c;      // CS,CK,0
 MEM =(unsigned char)0x8a;      // CS,  ,1
 MEM =(unsigned char)0x8e;      // CS,CK,1

 for(i=0;i<6;i++)
 { if(0 !=(32 & ad))
  { MEM=(unsigned char)0x8a;    // CS,  ,1
   MEM=(unsigned char)0x8e;    // CS,CK,1
  }
  else
  { MEM=(unsigned char)0x88;    // CS,  ,0
   MEM=(unsigned char)0x8c;    // CS,CK,0
  }
  ad=ad << 1;
 }

 for(i=0;i<16;i++)
 { if(0 !=(0x8000 & dt))
  { MEM=(unsigned char)0x8a;    // CS,  ,1
   MEM=(unsigned char)0x8e;    // CS,CK,1
  }
  else
  { MEM=(unsigned char)0x88;    // CS,  ,0
   MEM=(unsigned char)0x8c;    // CS,CK,0
  }
  dt=dt << 1;
 }

 MEM =(unsigned char)0x88;      // CS,  ,0
 MEM =(unsigned char)0x80;      //   ,  ,0
 MEM =(unsigned char)0x88;      // CS,  ,0

 for(i=0;i<8000;i++)
 { uc0=MEM;         // Read Ready Status
  if(0 !=(uc0 & 1))
  { MEM=(unsigned char)0x80;    //   ,  ,0
   CR_N=(unsigned char)0;
   return(0);
  }
 }
 MEM=(unsigned char)0x80;      //   ,  ,0
 CR_N=(unsigned char)0;
 return(-1);
}                                             杉本

横浜市 緑区 東本郷 6-17-1-602
オンボード  Tel: 045-473-7678
URL:www02.so-net.ne.jp/~ob_henry



スレッド概略
[1486(R)](起点)
 └[表示中]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]