<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
   <title>PIC,78K,R8,HC(S)08/RS08,AVR,MSP430などのマイコン活用</title>
   <link rel="alternate" type="text/html" href="http://www.eleki-jack.com/mycom2/" />
   <link rel="self" type="application/atom+xml" href="http://www.eleki-jack.com/mycom2/atom.xml" />
   <id>tag:www.eleki-jack.com,2010:/mycom2//4</id>
   <updated>2010-03-12T03:40:59Z</updated>
   <subtitle>PIC,78K,R8,HC08,AVR,MSP430などのマイコン活用</subtitle>
   <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.1</generator>


<entry>
   <title>STM8Sマイコンで作る警報音 (2)</title>
   <link rel="alternate" type="text/html" href="http://www.eleki-jack.com/mycom2/2010/03/stm8s_2_1.html" />
   <id>tag:www.eleki-jack.com,2010:/mycom2//4.4063</id>
   
   <published>2010-03-12T04:49:28Z</published>
   <updated>2010-03-12T03:40:59Z</updated>
   
   <summary> 断続的に鳴らす 　STマイクロエレクトロニクス社（以下ST社）の STM8S-...</summary>
   <author>
      <name>noritan.org</name>
      <uri> http://noritan.org/</uri>
   </author>
   
      <category term="Beeperモジュール" scheme="http://www.sixapart.com/ns/types#category" />
   
      <category term="STM8S" scheme="http://www.sixapart.com/ns/types#category" />
   
      <category term="Timer3モジュール" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="5488" label="Beeper" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="5408" label="STM8S" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="5230" label="STM8S-Discovery" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="5490" label="Timer3" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="1091" label="圧電スピーカ" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://www.eleki-jack.com/mycom2/">
      <![CDATA[<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.eleki-jack.com/mycom2/noritan-stm8s-02-01.jpg"><img alt="STM8S-Discoveryに圧電スピーカをつなぐ" title="STM8S-Discoveryに圧電スピーカをつなぐ" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-02-01-400.jpg" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" width="400" height="300" /></a></span>
<u><strong><big>断続的に鳴らす</big></strong></u>
<p>
　<strong>STマイクロエレクトロニクス社</strong>（以下ST社）の <strong>STM8S-Discovery</strong> に圧電スピーカをつないで，断続的に音を出します．
</p>
]]>
      <![CDATA[<u><big>Timer3モジュールと連携させる</big></u>
<p>
　音を断続的に ON / OFF させるためには， ON と OFF のタイミングを作る必要があります．そこで，以前作成した「LEDチカチカ」プログラムを流用して，「LEDが光り始めるタイミングで音を断続させる」ようにします．
</p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.eleki-jack.com/mycom2/noritan-stm8s-02-17.png"><img alt="LEDの点滅と音の断続の関係" title="LEDの点滅と音の断続の関係" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-02-17-400.png" class="mt-image-center" style="text-align: center; display: block; margin: 0pt auto 20px;" width="400" height="300" /></a></span>
<p>
　上の図のように， LED を駆動する PWM 出力は，タイマの UPDATE イベントで LOW になり， OC2 (Output Compare 2) イベントで HIGH になります．音を断続させるため，これらのイベントのうち， UPDATE イベントだけを監視して，ソフトウェアで音を ON / OFF させます．すると， Beeper モジュールは，1秒間音を出して，1秒間音を止めるという動作を繰り返すようになります．
</p>
<u><big>プロジェクトを作ろう</big></u>
<p>
　方針が決まったら，さっそく，アプリケーションを作成します． <code>"workspace03"</code> というワークスペースを <code>"C:\Projects\STVD\ws03"</code> というフォルダに作成し， <code>"project03"</code> というプロジェクトを <code>"C:\Projects\STVD\ws03\proj03"</code> というフォルダに作成しました．
</p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="ワークスペース・ペイン" title="ワークスペース・ペイン" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-02-18.png" class="mt-image-center" style="text-align: center; display: block; margin: 0pt auto 20px;" width="400" height="300" /></span>
<p>
　次に，ライブラリをリンクします．今回使用するのは， Timer3 モジュールと Beeper モジュールの二つです．リンクしたファイルは，以下のとおりです．
</p>
<table border="1" cellpadding="5" cellspacing="1">
<tbody><tr><th>リンクするファイル</th><th>リンク先</th><th>用途</th></tr>
<tr><td>FWLib\library\inc\stm8s.h</td><td>Include Files</td><td>汎用ヘッダ</td></tr>
<tr><td>FWLib\library\inc\stm8s_beep.h</td><td>Include Files</td><td>Beeper モジュール・ヘッダ</td></tr>
<tr><td>FWLib\library\inc\stm8s_timer3.h</td><td>Include Files</td><td>Timer3 モジュール・ヘッダ</td></tr>
<tr><td>FWLib\library\src\stm8s_beep.c</td><td>Source Files</td><td>Beeper モジュール・ライブラリ</td></tr>
<tr><td>FWLib\library\src\stm8s_timer3.c</td><td>Source Files</td><td>Timer3 モジュール・ライブラリ</td></tr>
</tbody></table>
<p><br />
</p><p>　さらに， <code>"stm8s_conf.h"</code> ファイルをコピーして，コメントになっている二つのマクロ _BEEP と _TIM3 の宣言を非コメント化します．
</p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="_BEEPを非コメント化" title="_BEEPを非コメント化" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-02-10.png" class="mt-image-center" style="text-align: center; display: block; margin: 0pt auto 20px;" width="400" height="300" /></span>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="_TIM3を非コメント化" title="_TIM3を非コメント化" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-02-19.png" class="mt-image-center" style="text-align: center; display: block; margin: 0pt auto 20px;" width="400" height="300" /></span>
<p>
　変更が終わったら， <code>ctrl+S</code> でファイルを保存します．
</p>
<u><big>ソース・コードを書きなおそう</big></u>
<p>
　<code>"main.c"</code> ファイルを以下のように書き換えます．
</p>
<pre style="font-family: monospace;">//**************************************
//
// main.c : 
//  
// Copyright (c) 2010 noritan.org
//
//**************************************

#include "stm8s.h"

//======================================
// Constant declaration
//======================================
#define PERIOD  (62500)         // timer counter period
#define DUTY    (PERIOD/2)      // PWM duty value

//======================================
// Wait for TIM3 update
//======================================
void wait_tim3_update(void) {
  // Wait for TIM3 update
  while (!TIM3_GetFlagStatus(TIM3_FLAG_UPDATE));
  // Clear the update flag
  TIM3_ClearFlag(TIM3_FLAG_UPDATE);
}

//======================================
// Main procedure
//======================================
main()
{
  // Initialize Beeper module.
  BEEP_Init(BEEP_FREQUENCY_1KHZ);
  
  // Initialize Timer3 module.
  TIM3_TimeBaseInit(            // Configure Timebase
    TIM3_PRESCALER_32,          // divide by 32
    PERIOD-1                    // divide by PERIOD
  );
  TIM3_OC2Init(                 // Configure OC2 output
    TIM3_OCMODE_PWM1,           // PWM mode-1 output
    TIM3_OUTPUTSTATE_ENABLE,    // Enable OC2 output
    DUTY,                       // Activated on count DUTY
    TIM3_OCPOLARITY_LOW         // LOW active output
  );
  
  // Start Timer3
  TIM3_Cmd(ENABLE);             // Start the Timer
  
  // Loop forever
  while (1) {
    wait_tim3_update();         // Wait for TIM3 update
    BEEP_Cmd(ENABLE);           // Enable BEEP
    wait_tim3_update();         // Wait for TIM3 update
    BEEP_Cmd(DISABLE);          // Disable BEEP
  }
}
</pre>
<p>
　アプリケーションは，以上で完成です．ビルドして，エラーが発生しないか確認しましょう．
</p>
<u><big>プログラムの解説</big></u>
<p>
　プログラムをちょっとだけ解説します．おおまかな構成は，「LEDチカチカ」プログラムと同じです．そこで，「LEDチカチカ」プログラムとの違いを見ていきます．
</p>
<pre style="font-family: monospace;">//======================================
// Wait for TIM3 update
//======================================
void wait_tim3_update(void) {
  // Wait for TIM3 update
  while (!TIM3_GetFlagStatus(TIM3_FLAG_UPDATE));
  // Clear the update flag
  TIM3_ClearFlag(TIM3_FLAG_UPDATE);
}
</pre>
<p>
 　<code>wait_tim3_update()</code> は， Timer3 モジュールが発する UPDATE イベントを待ち合わせるための関数です． <code>TIM3_GetFlagStatus()</code> 関数で UPDATE イベント・フラグを検出し， <code>while</code> 文でフラグがセットされるまで待ちます．フラグが検出されたら， <code>TIM3_ClearFlag</code> 関数で UPDATE イベント・フラグをクリアして，関数の処理を終えます．
</p>
<pre style="font-family: monospace;">  // Loop forever
  while (1) {
    wait_tim3_update();         // Wait for TIM3 update
    BEEP_Cmd(ENABLE);           // Enable BEEP
    wait_tim3_update();         // Wait for TIM3 update
    BEEP_Cmd(DISABLE);          // Disable BEEP
  }
</pre>
<p>
　無限ループの内部で音を断続させる処理を行っています． Timer3 モジュールの UPDATE イベントが発生するのを待ち， Beeper モジュールをイネーブル・ディセーブルしています． UPDATE イベントは，1秒ごとに発生するので，このループを一周するのに2秒かかることになります．
</p>
<u><big>プログラムを書き込んで，実行しよう</big></u>
<p>
　ハードウェアは，「継続して鳴らす」場合と同じです．そのまま，メニューから「Debug → Start Debugging」を選択し，デバッガを起動します．そして，メニューの「Debug → Run」を選択すると，プログラムの実行が開始されます．
</p>
<div style="text-align: center;">
<object width="480" height="295">
<param name="movie" value="http://www.youtube-nocookie.com/v/YyTpJjB1LdQ&amp;hl=ja_JP&amp;fs=1&amp;rel=0" />
<param name="allowFullScreen" value="true" />
<param name="allowscriptaccess" value="always" />
<embed src="http://www.youtube-nocookie.com/v/YyTpJjB1LdQ&amp;hl=ja_JP&amp;fs=1&amp;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="295">
</object>
</div>
<p><br />
</p><p>　メニューの「Debug → Stop Program」を選択すると，音の断続が停止し，さらに，「Debug → Restart」を選択するとプログラムをリセット直後の状態で停止させます．
</p>

<u><strong><big>参考文献</big></strong></u>
<dl>
<dt>STM8S-DISCOVERY <a href="http://www.st.com/stonline/products/literature/um/16361.pdf">(User Manual UM0817)</a></dt>
<dd>
<strong>STM8S-Discovery</strong>のハードウェアについてのマニュアルです．回路図及びジャンパの設定方法などが記述されています．
</dd>
<dt>STM8S firmware library <a href="http://www.st.com/products/support/micro/files/stm8sfwlib.zip">(stm8fwlib.zip)</a></dt>
<dd>
STM8Sシリーズのペリフェラルを簡単に使用するためのライブラリです．
</dd>
<dt>STM8S microcontroller family <a href="http://www.st.com/stonline/products/literature/rm/14587.pdf">(Reference manual RM0016)</a></dt>
<dd>
STM8Sシリーズのリファレンスマニュアルです．マイコンに内蔵されたペリフェラルの詳細な動作については，このマニュアルに記述されています．
</dd>
<dt>STM8S105xx <a href="http://www.st.com/stonline/products/literature/ds/14771.pdf">(Datasheet STM8S105xx)</a></dt>
<dd>
STM8S105マイコンのデータシートです．このマイコンに固有の情報が記述されてます．
</dd>
</dl>

<div style="text-align: right;">田中範明（noritan.org）</div>
]]>
   </content>
</entry>

<entry>
   <title>HC08マイコンの使い方QY4A編 -《76》外部割り込み（IRQ）（3）</title>
   <link rel="alternate" type="text/html" href="http://www.eleki-jack.com/mycom2/2010/03/hc08qy4a_76irq3.html" />
   <id>tag:www.eleki-jack.com,2010:/mycom2//4.4081</id>
   
   <published>2010-03-11T02:27:15Z</published>
   <updated>2010-03-12T02:54:20Z</updated>
   
   <summary>　HC08スタータ・ボード・キットを使用して、割り込みを使ったプログラムの書き方...</summary>
   <author>
      <name>kawano</name>
      <uri>http://www.cts-net.ne.jp/~kawano-r/</uri>
   </author>
   
      <category term="HC08マイコンの使い方QY4A編" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="4403" label="IRQ" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="5499" label="pragma" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="5500" label="プラグマ" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="5501" label="ベクタ番号" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="1323" label="割り込み" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="5439" label="割り込みベクタ" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="5441" label="割り込み要因" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="5502" label="割り込み関数" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="5463" label="外部割り込み" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://www.eleki-jack.com/mycom2/">
      <![CDATA[　HC08スタータ・ボード・キットを使用して、割り込みを使ったプログラムの書き方を説明します。 今回は <strong><font color="#00a000">C言語</font></strong>（2通り）と <strong><font color="#00a000">ユーザ・モード・モニタ入りマイコン用</font></strong> C言語のサンプル・プログラムを紹介します。<br />　<font color="#ff8000">ほかの割り込み要因を使ったプログラムを作る際にも参考にしてください。</font><br /><br />　<br />
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.eleki-jack.com/mycom2/flow_chart_irq.gif"><img class="mt-image-center" style="display: block; margin: 0px auto 20px; text-align: center;" alt="flow_chart_irq.gif" src="http://www.eleki-jack.com/mycom2/assets_c/2010/03/flow_chart_irq-thumb-360x314.gif" width="360" height="314" /></a></span>
<p align="center">外部割り込み（IRQ） 動作確認プログラムのフローチャート（再掲）</p>]]>
      <![CDATA[<p>　<br />　<a href="http://www.eleki-jack.com/mycom2/2010/03/hc08qy4a_75_irq2.html" target="_blank">前回</a> のフローチャートに沿って作られたプログラムは、次のような動きになります。　</p>
<blockquote>
<p>&nbsp;<font color="#00a000">【 実際の動き 】<br />　HC08スタータ・ボードの電源を入れると、初期設定を終えて待ち状態になる。<br />　クリップ・コードなどを使い IRQ ピンを GND に接触させると LED が点灯する。<br />　プッシュ・スイッチを押すと LED が消灯する。</font></p></blockquote>
<p>　実験の様子は <a href="http://www.eleki-jack.com/mycom2/2010/03/hc08qy4a_75_irq2.html" target="_blank">前回</a> の写真を参考にしてください。<br />　</p>
<p><strong><font color="#0000cc">◆ C言語プログラムを動かしてみる（その１）</font></strong><br />　C言語で書く場合は、二つの書き方が用意されています。 先に断っておきますが、筆者としては<font color="#00a000">これよりも後で紹介する二つ目の書き方のほうがお勧め</font>です。<br />　今から紹介する一つ目の書き方の特徴としては、前回のアセンブリ言語を使った書き方と対比させやすいため、先にもってきました。<br />　一つ目の書き方で書いたものをプロジェクトごと圧縮して <a href="http://micon.arrow.jp/uploads/files/hc08_irq02.zip" target="_blank">hc08_irq02.zip</a> に保存しましたのでご利用ください。 それでは早速、main.c の全文を書き出します。<br />　</p>
<blockquote>
<p>#include &lt;hidef.h&gt;<br />#include "derivative.h"</p>
<p>#define PORT_SW&nbsp;&nbsp;&nbsp;&nbsp; ( PTA_PTA3 )<br />#define PHY_ON&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( 0 )<br />#define PHY_OFF&nbsp;&nbsp;&nbsp;&nbsp; ( 1 )</p>
<p>#define PORT_LED&nbsp;&nbsp;&nbsp; ( PTA_PTA1 )<br />#define LED_ON&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( 0 )<br />#define LED_OFF&nbsp;&nbsp;&nbsp;&nbsp; ( 1 )</p>
<p>void main( void ){<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; <font color="#ff8000">CONFIG2 = 0x40;&nbsp;&nbsp;&nbsp;&nbsp; // IRQピン有効、IRQプルアップ有効<br />&nbsp;&nbsp;&nbsp; INTSCR = 0x04;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // IRQラッチクリア、IRQ割り込み許可</font><br />&nbsp;&nbsp;&nbsp; PORT_LED = LED_OFF;<br />&nbsp;&nbsp;&nbsp; DDRA_DDRA1 = 1;<br />&nbsp;&nbsp;&nbsp; PTAPUE_PTAPUE3 = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; <font color="#ff8000">EnableInterrupts;</font><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; for( ; ; ){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; __RESET_WATCHDOG( );<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( PORT_SW == PHY_ON ){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PORT_LED = LED_OFF;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />}</p>
<p><font color="#ff8000">#pragma TRAP_PROC</font><br />void <font color="#ff8000">_IRQ_Interrupt</font>( void ) {<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; PORT_LED = LED_ON;<br />}<br /></p></blockquote>
<p>　初期設定のところで CONFIG2 に IRQピン機能を有効にするよう書き込んでいます。<br />　個別の割り込み要因の設定ということで、IRQ割り込み関係の設定を行っています。<br />　入出力ポートの設定が済んでから、割り込み許可にしています。<br />　あとはメイン・ループを回り続けます。 先ほどのフローチャートと比べてみてください。<br />　<font color="#ff8000">EnableInterrupts</font>　というのはインクルードしたファイル hidef.h でマクロ定義されていて、組み込みアセンブラで CLI 命令（割り込み許可）が定義されています。 （hidef.h は標準で C:\Program Files\Freescale\CodeWarrior for Microcontrollers V6.x\lib\hc08c\include にあります）<br />　ついでに書いておくと、__RESET_WATCHDOG( ) はderivative.h の中でさらにインクルードされた MC68HC908QY4A.h ヘッダの中で COPクリアを行うコードが定義されています。<br />　割り込み処理の関数名の前には&nbsp;<font color="#ff8000">TRAP_PROC</font> というプラグマ（*1） を書いています。 これにより、この関数の入り口には <font color="#00a000">H レジスタをプッシュ</font>する命令が埋め込まれ、出口には <font color="#00a000">Hレジスタをプル</font>する命令と「<font color="#00a000">割り込みからの復帰</font>」命令が埋め込まれます。<br />　割り込み処理の中身は単純で、LED を点灯させます。</p>
<p>　これだけでは割り込みベクタの設定が済んでいません。 下図を参考にして、パラメータ・ファイル project.prm を開いてください（その2の方法では不要）。<br />　<br />
</p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.eleki-jack.com/mycom2/hc08_irq_project.gif"><img class="mt-image-center" style="display: block; margin: 0px auto 20px; text-align: center;" alt="hc08_irq_project.gif" src="http://www.eleki-jack.com/mycom2/hc08_irq_project-thumb-400x279.gif" width="400" height="279" /></a></span>
<p align="center">パラメータ・ファイルを開いて割り込みベクタを追加する（クリックで拡大）</p>
<p>　<br />　リセット・ベクタの上に、使用する割り込みベクタ <font color="#ff8000">VECTOR 2 _IRQ_Interrupt</font> を追加してください。 <font color="#ff8000">_IRQ_Interrupt</font> というのは先ほどの割り込み関数の関数名で、その先頭アドレスを表しています。 <font color="#ff8000">2</font> というのは IRQ割り込みの <font color="#ff0000">割り込みベクタ番号</font> です。 <a href="http://www.eleki-jack.com/mycom2/2010/02/hc08qy4a_73_1.html" target="_blank">第73回</a> の 「割り込み要因とベクタ・アドレス」 の表を確認してください。</p>
<p>　これで完成です。 念のために動作確認をしておきましょう。<br />　HC08スタータ・ボードを使って QY4Aマイコンに書き込んだら、デバッガ画面を終了して HC08スタータ・ボードの POWERスイッチをオフにします。 ジャンパ類をスタンド・アロンの設定（JP1ショート、JP2ジャンパ・リンクなし、JP3は 1-2間ショート、JP4は 1-2間ショート、VR1は任意） にして、また POWERスイッチをオンしてください。</p>
<p>　クリップ・コードなどを使って PTA2/ IRQ ピンを GNDに接触させると LED が点灯し、プッシュ・スイッチを押すと LED が消灯するはずです。 これで C言語で書いた簡単な割り込みプログラムを動かすことができました。<br />　<br /></p>
<hr>

<p><strong><font color="#0000cc">◆ C言語プログラムを動かしてみる（その２）</font></strong><br />　C言語の二つ目の書き方を紹介します。 <font color="#00a000">こちらのほうが簡単でお勧めです</font>。<br />　二つ目の書き方で書いたものをプロジェクトごと圧縮して <a href="http://micon.arrow.jp/uploads/files/hc08_irq03.zip" target="_blank">hc08_irq03.zip</a> に保存しましたのでご利用ください。 <font color="#ff8000">ほとんど （その１） と同じ</font>ですが、割り込み関数の書き出しのところだけが異なります。</p>
<blockquote>
<p><font color="#ff8000">interrupt 2</font> void _IRQ_Interrupt( void ) {<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; PORT_LED = LED_ON;<br />}<br /></p></blockquote>
<p>　（その１）で記述した #pragma TRAP_PROC は不要です。 その代わり&nbsp;<font color="#ff8000">interrupt 2</font> というおまじないを書いています。 interrupt というのは 「これは割り込み関数です」 ということを示しています。 これにより、この関数の入り口には <font color="#00a000">H レジスタをプッシュ</font>する命令が埋め込まれ、出口には <font color="#00a000">Hレジスタをプル</font>する命令と 「<font color="#00a000">割り込みからの復帰</font>」 命令が埋め込まれます。 関数名は何でもかまいませんが、ほかにならって _○○_interrupt がよいでしょう。<br />　interrupt 2 の 「 <font color="#ff8000">2</font> 」 は、IRQ割り込みの <font color="#ff0000">割り込みベクタ番号</font> です。 <a href="http://www.eleki-jack.com/mycom2/2010/02/hc08qy4a_73_1.html" target="_blank">第73回</a> の 「割り込み要因とベクタ・アドレス」 の表を確認してください。 この書き方なら、これだけで割り込みベクタの設定もできています。 パラメータ・ファイルをいじる必要はありません。 簡単ですね。</p>
<p>　念のために、これも動作確認しておいてください。 手順は先ほどと同じです。<br />　<br /></p>
<hr>

<p><strong><font color="#0000cc">◆ ユーザ・モード・モニタ入りマイコン用 C言語プログラムを動かしてみる</font></strong><br />　ユーザ・モード・モニタ入りマイコンのためのプログラムで割り込みを使用する場合のサンプルをプロジェクトごと圧縮して <a href="http://micon.arrow.jp/uploads/files/hc08_irq03u.zip" target="_blank">hc08_irq03u.zip</a> に保存しましたのでご利用ください。 main.c の主要部分を書き出します。</p>
<blockquote>
<p>//*************************<br />// メイン処理<br />//*************************</p>
<p>void main( void ) {<br />&nbsp;&nbsp;&nbsp; init_hardware( );<br />&nbsp;&nbsp;&nbsp; init_PORT( );<br />&nbsp;&nbsp;&nbsp; <font color="#ff8000">init_IRQ( );</font>&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; <font color="#ff8000">EnableInterrupts;</font><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; for ( ; ; ){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; __RESET_WATCHDOG( );<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( PORT_SW == PHY_ON ){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PORT_LED = LED_OFF;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />}</p>
<p>//*************************<br />// リセット後の初期化処理<br />//*************************</p>
<p>void init_hardware( void ) {<br />&nbsp;&nbsp;&nbsp; <font color="#ff8000">CONFIG2 = 0x40;&nbsp;&nbsp;&nbsp;&nbsp; // IRQピン有効、IRQプルアップ有効</font><br />&nbsp;&nbsp;&nbsp; CONFIG1 = 0x00;&nbsp;&nbsp;&nbsp;&nbsp; // LVI(3V)有効、STOP無効、COP有効<br />&nbsp;&nbsp;&nbsp; OSCTRIM = Optional; <br />}</p>
<p>void init_PORT( void ) {</p>
<p>&nbsp;&nbsp;&nbsp; PTAPUE = 0x08;<br />&nbsp;&nbsp;&nbsp; // DDRA_DDRA0, PTA_PTA0 はアクセス禁止<br />&nbsp;&nbsp;&nbsp; DDRA_DDRA1 = 1;<br />&nbsp;&nbsp;&nbsp; DDRA_DDRA3 = 0;<br />&nbsp;&nbsp;&nbsp; DDRA_DDRA4 = 0;<br />&nbsp;&nbsp;&nbsp; DDRA_DDRA5 = 0;<br />&nbsp;&nbsp;&nbsp; PTA_PTA1 = 1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; PTA_PTA3 = 0;<br />&nbsp;&nbsp;&nbsp; PTA_PTA4 = 0;<br />&nbsp;&nbsp;&nbsp; PTA_PTA5 = 0;<br />&nbsp;&nbsp;&nbsp; PTBPUE = 0x00;<br />&nbsp;&nbsp;&nbsp; PTB&nbsp;&nbsp;&nbsp; = 0x00;<br />&nbsp;&nbsp;&nbsp; DDRB&nbsp;&nbsp; = 0x00;<br />}</p>
<p>void <font color="#ff8000">init_IRQ</font>( void ) {<br />&nbsp;&nbsp;&nbsp; <font color="#ff8000">INTSCR = 0x04;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // IRQラッチクリア、IRQ割り込み許可</font><br />}</p>
<p>//*************************<br />// 割り込み処理<br />//*************************</p>
<p>// A to D Converter<br />#pragma TRAP_PROC<br />void _ADC_Interrupt( void ) {<br />}</p>
<p>// Keyboard Wakeup<br />#pragma TRAP_PROC<br />void _KBD_Interrupt( void ) {<br />}</p>
<p>// Timer Overflow<br />#pragma TRAP_PROC<br />void _TOF_Interrupt( void ) {<br />//&nbsp;&nbsp;&nbsp; TSC = TSC &amp; 0x7F;&nbsp;&nbsp; // TSC を読み込んでから TOF をクリア<br />}</p>
<p>// Timer Channel 1<br />#pragma TRAP_PROC<br />void _TCH1_Interrupt( void ) {<br />//&nbsp;&nbsp;&nbsp; TSC1 = TSC1 &amp; 0x7F;&nbsp;&nbsp; // TSC1 を読み込んでから CH1F をクリア<br />}</p>
<p>// Timer Channel 0<br />#pragma TRAP_PROC<br />void _TCH0_Interrupt( void ) {<br />//&nbsp;&nbsp;&nbsp; TSC0 = TSC0 &amp; 0x7F;&nbsp;&nbsp; // TSC0 を読み込んでから CH0F をクリア<br />}</p>
<p><font color="#ff8000">// IRQ<br />#pragma TRAP_PROC</font><br />void <font color="#ff8000">_IRQ_Interrupt</font>( void ) {<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; PORT_LED = LED_ON;<br />}<br /><br /></p></blockquote>
<p>　外部割り込み（IRQ） に関する部分をオレンジ色で示しました。 もうほとんど説明済みですね。　ユーザ・モード・モニタを使ったプログラムでは、これまでも初期化の部分を別関数にしていたので今回もそうしました（PTA0とDDRA0 がアクセス禁止なので入出力ポートの初期化がどうしても長くなってしまう）。<br />　割り込み関数そのものは上記リストのように最初からすべて用意してあります。 今回は IRQ 割り込みを利用するので、 <font color="#ff8000">_IRQ_Interrupt</font> 関数の中身を記述しました。 割り込み関数の名前は vectors.c でも使用しているので変更しないでください。 なお、割り込みベクタの設定はすでに vectors.c で記述済みです。</p>
<p><br />　動作確認を行うには、ユーザ・モード・モニタ入り QY4A マイコン（KMC908QY4A） を使用します。 詳しくは書籍&nbsp;<a href="http://shop.cqpub.co.jp/hanbai/books/46/46051.html" target="_blank"><font color="#00008b">「試しながら学ぶHC08マイコン入門」</font></a> を参考にしてください。 ただし今回は <font color="#00a000">HC08スタータ・ボードを使用するので、ボード上の 16ピン・マイコン・ソケットにユーザ・モード・モニタ入り QY4A を挿して使います。</font> ジャンパ類のセッティングは連載 <a href="http://www.eleki-jack.com/mycom2/2008/12/hc08qy4a_21r2rda2.html" target="_blank">第21回</a> の後半を参考にしてください（<font color="#ff8000">ACアダプタは必ず 5V を使用。 ジャンパの設定は JP1 ショート、JP2 ショートしない、JP3 なし、JP4　1-2間ショート。 開発が終わって DEBUG ではなく RUN で動かすときは JP2 をショート。</font>）　特殊ケーブルを作る必要はありません。<br />　<br /></p>
<hr>

<p>　いくつかの方法で外部割り込み（IRQ） を使ったプログラムを紹介してきました。 できたことは単純な LED オン・オフですが、これは大きな前進です。 ほかの割り込み要因を使う場合も、ここで説明した内容を当てはめて応用できます。</p>
<p>　最後に IRQ ピンを利用するときのヒントをひとつ。 外部割り込みという機能は、<font color="#00a000">IRQ ピンの入力が非常に敏感</font>です。 普通の入力信号の場合はマイコンの内部的な動作によってクロックに同期してレベルを読み込むのに対し、IRQ ピンは立ち下がりエッジ 1回で有効です。 <font color="#ff8000">クロックに同期しない入力なので、どんなに短いパルス状の信号でも有効</font>なのです。 そこで、あまりにも敏感すぎてノイズで誤動作してしまうという場合は <font color="#00a000">IRQ ピンと GND 間にノイズ吸収用のセラミック・コンデンサを付ける</font>と安定します。 筆者は積層セラミック・コンデンサの 0．01μF とか 0．1μF を付けたことがあります。 覚えておいて損はないでしょう。 <br />
</p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.eleki-jack.com/mycom2/boxing_sch.gif"><img class="mt-image-center" style="display: block; margin: 0px auto 20px; text-align: center;" alt="boxing_sch.gif" src="http://www.eleki-jack.com/mycom2/boxing_sch-thumb-480x208.gif" width="480" height="208" /></a></span>
<p align="center">IRQ と同様に敏感なキーボード割り込みを使った電子回路の例<br />C3 の 0．1μF はノイズ吸収用コンデンサ （クリックで拡大）</p>
<p>&nbsp;</p>
<p>　次回はキーボード割り込み機能の予定です。</p>
<p><br />（*1） プラグマ #pragma というのは C言語のプリプロセッサ命令の一つで、その右に記述する字句の意味をコンパイラごとに決めてよいというものです（ユーザが決めるのではない）。 したがって、例のように #pragma　TRAP_PROC　などと書いた場合、ほかの（CodeWarrior以外の）コンパイラでは意味がわからないということになります。 ANSI 規格では、#pragma に関してはサポートしていないものを無視することになっています（ANSI 規格 6.8.6）。 つまり間違った文を書いてもエラーにならないので、移植の際など注意が必要です（エラーでなく警告を出すものはある）。</p>
<p>　</p>
<p>　『参考文献』<br /><font color="#00008b"><a href="http://shop.cqpub.co.jp/hanbai/books/46/46051.html" target="_blank"><font color="#00008b">「試しながら学ぶHC08マイコン入門」</font></a>&nbsp;</font>（CQ出版）<br />　　第9章　USB-HC08デバッグ・ツールを自作する<br />　　第10章　統合開発環境CodeWarriorを使ってみる<br />　　Appendix F　KMC908QY4Aユーザ・モード・モニタ入りマイコンの知識<br />筆者のホームページ　<a href="http://www.cts-net.ne.jp/%7Ekawano-r/" target="_blank"><font color="#00008b">『マイコン工作の実験室』</font></a> </p>
<p align="right">組み込みエンジニア　KAWANO<br /></p>]]>
   </content>
</entry>

<entry>
   <title>作りながら学ぶPICマイコン入門のフォロー（25）</title>
   <link rel="alternate" type="text/html" href="http://www.eleki-jack.com/mycom2/2010/03/pic25.html" />
   <id>tag:www.eleki-jack.com,2010:/mycom2//4.3990</id>
   
   <published>2010-03-10T04:53:48Z</published>
   <updated>2010-03-10T02:33:08Z</updated>
   
   <summary>アセンブラの代わりにCで動かしてみる（13）　メニューバーの　　　Project...</summary>
   <author>
      <name>kanzaki</name>
      
   </author>
   
      <category term="MPLAB" scheme="http://www.sixapart.com/ns/types#category" />
   
      <category term="PIC" scheme="http://www.sixapart.com/ns/types#category" />
   
      <category term="デバッガ" scheme="http://www.sixapart.com/ns/types#category" />
   
      <category term="作りながら学ぶPICマイコン入門" scheme="http://www.sixapart.com/ns/types#category" />
   
      <category term="書籍フォロー" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="4578" label="HI-TECH C" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://www.eleki-jack.com/mycom2/">
      <![CDATA[<p><font style="font-size: 1.25em;"><strong>アセンブラの代わりにCで動かしてみる（13）</strong></font><br />　メニューバーの<br />　　　Project&gt;Open<br />を選択すると、次に示すように前回保存したプロジェクトが表示されます。</p>
<span style="display: inline;" class="mt-enclosure mt-enclosure-image"><a href="http://www.eleki-jack.com/mycom2/kanzaki/PIC250005.jpg"><img style="text-align: center; margin: 0px auto 20px; display: block;" class="mt-image-center" alt="PIC250005.jpg" src="http://www.eleki-jack.com/mycom2/assets_c/2010/02/PIC250005-thumb-400x310.jpg" width="400" height="310" /></a></span>]]>
      <![CDATA[<div align="left">　表示された、前回のプロジェクトを選択してボタン「開く(O)」をクリックして保存しておいたプロジェクトを開きます。<br />　開いたプロジェクトの各ウィンドウの表示を、<br />　　　メニューバーの<br />　　　　　Window&gt;Tile Vertically<br />を選択して縦のタイルに表示しました。<br />　Watch のウィンドウでは、このプロジェクトで使用しているPORTBとTRISBの値を確認しやすくするために、この二つを上に表示しておきました。<br />　併せてFile RegistersのウィンドウでPORTBを見やすい場所に表示し、バイナリ表示で各ビットのオン、オフの状況が確認しやすいようにしてあります。<br /><br /></div>
<span style="display: inline;" class="mt-enclosure mt-enclosure-image"><a href="http://www.eleki-jack.com/mycom2/kanzaki/PIC250010.jpg"><img style="text-align: center; margin: 0px auto 20px; display: block;" class="mt-image-center" alt="" src="http://www.eleki-jack.com/mycom2/assets_c/2010/02/PIC250010-thumb-400x314.jpg" width="400" height="314" /></a></span>　次に示すPICkit3とテスト回路を接続し、Debugger＞Select ToolでPICkit3を選択します。ブレッドボードにはPICkit3から電源を供給します。<br /><br />
<span style="display: inline;" class="mt-enclosure mt-enclosure-image"><a href="http://www.eleki-jack.com/mycom2/kanzaki/PIC250015.jpg"><img style="text-align: center; margin: 0px auto 20px; display: block;" class="mt-image-center" alt="PIC250015.jpg" src="http://www.eleki-jack.com/mycom2/assets_c/2010/02/PIC250015-thumb-400x285.jpg" width="400" height="285" /></a></span>
<p>　メニューバーのDebugger&gt;Programでデバッグのためのプログラムを書き込み、デバッグのツールバーのStep Intoのボタンを一度クリックします。<br />　次に示すように緑の矢印でCのソースのメインの関数のinit();の場所を示しています。<br /></p>
<span style="display: inline;" class="mt-enclosure mt-enclosure-image"><a href="http://www.eleki-jack.com/mycom2/kanzaki/PIC250020.jpg"><img style="text-align: center; margin: 0px auto 20px; display: block;" class="mt-image-center" alt="PIC250020.jpg" src="http://www.eleki-jack.com/mycom2/assets_c/2010/02/PIC250020-thumb-400x310.jpg" width="400" height="310" /></a></span>　Disassembly Listingのウィンドウでもプログラムの実行場所が緑の矢印で示されていますので、詳細な実行の様子を確認することもできます。<br />　Step Intoのボタンを押すと関数initの中に入ります。まだTRISBレジスタへの書き込みは行われていませんので、0xBFとなっています。<br />
<p>
</p><span style="display: inline;" class="mt-enclosure mt-enclosure-image"><a href="http://www.eleki-jack.com/mycom2/kanzaki/PIC250030.jpg"><img style="text-align: center; margin: 0px auto 20px; display: block;" class="mt-image-center" alt="PIC250030.jpg" src="http://www.eleki-jack.com/mycom2/assets_c/2010/02/PIC250030-thumb-400x310.jpg" width="400" height="310" /></a></span>　次のStep IntoボタンのクリックでTRISBレジスタに0x01が書き込まれます。その結果Watch　ウィンドウのTRISBの値は、0x81になります。<br />　最上位のビットが1になるのは、デバッガがポートB上位ビットのB7、B6を使用しているためと考えられます。
<p>
</p><span style="display: inline;" class="mt-enclosure mt-enclosure-image"><a href="http://www.eleki-jack.com/mycom2/kanzaki/PIC250040.jpg"><img style="text-align: center; margin: 0px auto 20px; display: block;" class="mt-image-center" alt="PIC250040.jpg" src="http://www.eleki-jack.com/mycom2/assets_c/2010/02/PIC250040-thumb-400x310.jpg" width="400" height="310" /></a></span>　Step Intoで1命令実行すると、次に示すようにinit()を抜けだし次に実行するのRB3＝RB0を指し示しています。 押しボタンが押されていませんのでPORTBの最小ビットRB0は1になっています。そのため RB3=RB0を実行してもレジスタの内容は変化しません。<br />
<p>
</p><span style="display: inline;" class="mt-enclosure mt-enclosure-image"><a href="http://www.eleki-jack.com/mycom2/kanzaki/PIC250050.jpg"><img style="text-align: center; margin: 0px auto 20px; display: block;" class="mt-image-center" alt="PIC250050.jpg" src="http://www.eleki-jack.com/mycom2/assets_c/2010/02/PIC250050-thumb-400x310.jpg" width="400" height="310" /></a></span>　RB3=RB0の命令は実行されていませんが、次に示すようにボタンが押されているためRB0は0でWatchウィンドウのPORTBは0x3Eとなっています。次のStep IntoでPB3に0が代入されます。<br /><br />
<span style="display: inline;" class="mt-enclosure mt-enclosure-image"><a href="http://www.eleki-jack.com/mycom2/kanzaki/PIC250060.jpg"><img style="text-align: center; margin: 0px auto 20px; display: block;" class="mt-image-center" alt="PIC250060.jpg" src="http://www.eleki-jack.com/mycom2/assets_c/2010/02/PIC250060-thumb-400x310.jpg" width="400" height="310" /></a></span>　ボタンを押して、Step Intoで次に進みます。次に実行する命令
<p>　　　　RB3=RB0<br />が実行されます。その結果、次に示すようにRB3、RB0が共に0になり、WatchウィンドウのPORTBは0x36となります。</p>
<p>　　 
</p><span style="display: inline;" class="mt-enclosure mt-enclosure-image"><a href="http://www.eleki-jack.com/mycom2/kanzaki/PIC250070.jpg"><img style="text-align: center; margin: 0px auto 20px; display: block;" class="mt-image-center" alt="PIC250070.jpg" src="http://www.eleki-jack.com/mycom2/assets_c/2010/02/PIC250070-thumb-400x310.jpg" width="400" height="310" /></a></span>　PB3に0が代入されますのでLEDが次のように点灯します。<br />　<br />
<span style="display: inline;" class="mt-enclosure mt-enclosure-image"><a href="http://www.eleki-jack.com/mycom2/kanzaki/PIC250085.jpg"><img style="text-align: center; margin: 0px auto 20px; display: block;" class="mt-image-center" alt="PIC250085.jpg" src="http://www.eleki-jack.com/mycom2/assets_c/2010/02/PIC250085-thumb-400x262.jpg" width="400" height="262" /></a></span>　ボタンを押すのを止めて、Step Intoで次に進むと次に示すようにRB0が再び1になっているのが確認できます。<br /><br />
<span style="display: inline;" class="mt-enclosure mt-enclosure-image"><a href="http://www.eleki-jack.com/mycom2/kanzaki/PIC250090.jpg"><img style="text-align: center; margin: 0px auto 20px; display: block;" class="mt-image-center" alt="PIC250090.jpg" src="http://www.eleki-jack.com/mycom2/assets_c/2010/02/PIC250090-thumb-400x310.jpg" width="400" height="310" /></a></span>　このように、Cで書かれたプログラムもMPLAB IDEとPICkit3でオンライン・デバッグができます。<br />　<br />
<div align="right">&lt;神崎康宏&gt;<br /></div><br />
<p></p><br />
<p></p>
<p></p>]]>
   </content>
</entry>

<entry>
   <title>STM8Sマイコンで作る警報音 (1)</title>
   <link rel="alternate" type="text/html" href="http://www.eleki-jack.com/mycom2/2010/03/stm8s_1_1.html" />
   <id>tag:www.eleki-jack.com,2010:/mycom2//4.4062</id>
   
   <published>2010-03-09T01:31:46Z</published>
   <updated>2010-03-09T01:16:31Z</updated>
   
   <summary> 　STマイクロエレクトロニクス社のSTM8-Discovery評価ボードを使っ...</summary>
   <author>
      <name>noritan.org</name>
      <uri> http://noritan.org/</uri>
   </author>
   
      <category term="Beeperモジュール" scheme="http://www.sixapart.com/ns/types#category" />
   
      <category term="STM8S" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="5488" label="Beeper" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="5408" label="STM8S" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="5230" label="STM8S-Discovery" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="1091" label="圧電スピーカ" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://www.eleki-jack.com/mycom2/">
      <![CDATA[<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.eleki-jack.com/mycom2/noritan-stm8s-02-01.jpg"><img alt="STM8S-Discoveryに圧電スピーカをつなぐ" title="STM8S-Discoveryに圧電スピーカをつなぐ" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-02-01-400.jpg" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" width="400" height="300" /></a></span>
<p>
　<a href="http://www.st.com/">STマイクロエレクトロニクス社</a>の<a href="http://www.st.com/stm8s-discovery">STM8-Discovery</a>評価ボードを使って，圧電スピーカから音を出します．さて，どのくらい簡単にできるかな．
</p>
<u><strong><big>継続して鳴らす</big></strong></u>
<p>
　<strong>STマイクロエレクトロニクス社</strong>（以下ST社）の <strong>STM8S-Discovery</strong> に圧電スピーカをつないで，音を出します．
</p>
]]>
      <![CDATA[<u><big>Beeperモジュール</big></u>
<p>
　<strong>STM8S-Discovery</strong> に搭載されている <strong>STM8S105C6</strong> マイコンには，Beeper というモジュールが搭載されています．その名のとおり， BEEP 端子から数kHzの矩形波を出して音を発するためのモジュールです．出力に，圧電スピーカを取り付けると，警報音のように鳴ります．
</p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.eleki-jack.com/mycom2/noritan-stm8s-02-02.png"><img alt="Beeperモジュールの仕組み" title="Beeperモジュールの仕組み" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-02-02-400.png" class="mt-image-center" style="text-align: center; display: block; margin: 0pt auto 20px;" width="400" height="180" /></a></span>
<p>
　出力可能な周波数は， 1kHz, 2kHz, 4kHz から選ぶことができ，周波数の微調整をする機能もついています．まずは，微調整など考えずに，とりあえず，鳴いてもらうことにしましょう．
</p>
<u><big>BEEP端子の機能設定</big></u>
<p>
　Beeper モジュールは， BEEP 端子に矩形波を出力します．ところが，この端子は，出荷時には PD4 または TIM2_CH1 と設定されており， BEEP 端子として使用することができません．
</p>
<p>
　この端子を BEEP 端子として設定するためには，オプション・バイトと呼ばれる特別な場所の不揮発性メモリを書き換える必要があります．オプション・バイトは，特別なメモリなので特別なアプリケーションで書き換えます．
</p>
<p>
　「スタート」メニューから，「すべてのプログラム → ST Toolset → Development Tools → ST Visual Programmer」とたどって， ST社のメモリ書き換えアプリケーションである ST Visual Programmer（以下STVP）を起動します． 
</p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.eleki-jack.com/mycom2/noritan-stm8s-02-03.png"><img alt="マイコンの種類と接続方法を指定する" title="マイコンの種類と接続方法を指定する" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-02-03-400.png" class="mt-image-center" style="text-align: center; display: block; margin: 0pt auto 20px;" width="400" height="200" /></a></span>
<p>
　初期画面に入る前に，マイコンの種類と接続方法を指定します．
</p>
<table border="1" cellpadding="5" cellspacing="1">
<tbody><tr><th>項目名</th><th>選択肢</th></tr>
<tr><td>Hardware （開発ツール）</td><td>ST-LINK</td></tr>
<tr><td>Port （接続ポート）</td><td>USB</td></tr>
<tr><td>Programming mode （接続規格）</td><td>SWIM</td></tr>
<tr><td>Device （マイコンの種類）</td><td>STM8S105x6</td></tr>
</tbody></table>
<p><br />
</p><p>　指定し終わったら， <strong>STM8S-Discovery</strong> 評価ボードを PC に接続して， <strong>OK</strong> ボタンをクリックします．
</p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.eleki-jack.com/mycom2/noritan-stm8s-02-04.png"><img alt="ST Visual Programmerの初期画面" title="ST Visual Programmerの初期画面" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-02-04-400.png" class="mt-image-center" style="text-align: center; display: block; margin: 0pt auto 20px;" width="400" height="300" /></a></span>
<p>
　すると， <strong>STVP</strong> が起動し，初期画面が表示されます．画面なかほどの <strong>OPTION BYTE</strong> タブをクリックすると，オプション・バイトを設定するためのタブが開きます．
</p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="オプションバイト設定タブ" title="オプションバイト設定タブ" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-02-05.png" class="mt-image-center" style="text-align: center; display: block; margin: 0pt auto 20px;" width="400" height="300" /></span>
<p>
　このアプリケーションで機能を設定したいのは， Port D4 です．最初は， "TIM2_CH1" となっています．この "TIM2_CH1" と表示されている部分を右クリックすると，リストが表示されます．
</p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="Port D4 の機能を設定する" title="Port D4 の機能を設定する" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-02-06.png" class="mt-image-center" style="text-align: center; display: block; margin: 0pt auto 20px;" width="400" height="300" /></span>
<p>
　リストの中から， "BEEP" を選びます．そして，メニューバーから「Program → Current Tab」を選択し，オプション・バイトを書きこみます．
</p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="オプションバイトを書き込む" title="オプションバイトを書き込む" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-02-07.png" class="mt-image-center" style="text-align: center; display: block; margin: 0pt auto 20px;" width="400" height="300" /></span>
<p>
　これで，オプション・バイトの書き込みが終わり， "BEEP" 機能が使えるようになりました．
</p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="STVP おわり" title="STVP おわり" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-02-08.png" class="mt-image-center" style="text-align: center; display: block; margin: 0pt auto 20px;" width="400" height="300" /></span>
<p>
メニューバーから「File → Exit」を選択して，操作完了です．
</p>
<blockquote>
<p>
最近の汎用マイコンでは，小さいマイコンに多くの機能を詰め込むために，ひとつのポートに複数の機能を割り当てるのが普通になってきました．そこで，問題になるのが，ポートの機能をいつ決定するかという課題です．設定が遅れると，接続先の回路が誤動作してしまう可能性がありますので，できるだけ速やかに設定する必要があります．また，場合によっては，プルアップ・プルダウン抵抗を追加する必要もあります．
</p>
<p>
ST社の場合には，なるべく早い段階で端子の機能を決定するために，ハードウェアだけで解決する方法を採用したようです．
</p>
<p>
ほかの8ビットマイコンでは，ソフトウェアによって端子の機能を決定する方法が多く見られます．半導体メーカの思想の違いが見られて，非常に興味深いところです．
</p>
</blockquote>
<u><big>プロジェクトを作ろう</big></u>
<p>
　BEEP 端子の設定が終わったら，アプリケーションを作成します．最初は，BEEPを継続して鳴らします． <code>"workspace02"</code> というワークスペースを <code>"C:\Projects\STVD\ws02"</code> というフォルダに作成し， <code>"project02"</code> というプロジェクトを <code>"C:\Projects\STVD\ws03\proj02"</code> というフォルダに作成しました．
</p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="ワークスペース・ペイン" title="ワークスペース・ペイン" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-02-09.png" class="mt-image-center" style="text-align: center; display: block; margin: 0pt auto 20px;" width="400" height="300" /></span>
<p>
　Beeper モジュールを操作するためのライブラリも，前回紹介したファームウェア・ライブラリ（<code>"FWLib"</code>）に含まれています．リンクしたファイルは，以下のとおりです．
</p>
<table border="1" cellpadding="5" cellspacing="1">
<tbody><tr><th>リンクするファイル</th><th>リンク先</th><th>用途</th></tr>
<tr><td>FWLib\library\inc\stm8s.h</td><td>Include Files</td><td>汎用ヘッダ</td></tr>
<tr><td>FWLib\library\inc\stm8s_beep.h</td><td>Include Files</td><td>Beeper モジュール・ヘッダ</td></tr>
<tr><td>FWLib\library\src\stm8s_beep.c</td><td>Source Files</td><td>Beeper モジュール・ライブラリ</td></tr>
</tbody></table>
<p><br />
</p><p>　さらに， <code>"stm8s_conf.h"</code> ファイルをコピーして，コメントになっているマクロ _BEEP の宣言を非コメント化します．
</p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="stm8s_conf.h ファイル" title="stm8s_conf.h ファイル" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-02-10.png" class="mt-image-center" style="text-align: center; display: block; margin: 0pt auto 20px;" width="400" height="300" /></span>
<p>
　変更したら <code>ctrl+S</code> でファイルを保存します．
</p>
<u><big>ソース・コードを書きなおそう</big><br /><br /></u>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.eleki-jack.com/mycom2/noritan-stm8s-02-11.png"><img alt="main.c ファイル" title="main.c ファイル" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-02-11-400.png" class="mt-image-center" style="text-align: center; display: block; margin: 0pt auto 20px;" width="400" height="300" /></a></span>
<p>
<code>"main.c"</code> ファイルを以下のように書き換えます．
</p>
<pre style="font-family: monospace;">//**************************************
//
// main.c : 
//  
// Copyright (c) 2010 noritan.org
//
//**************************************

#include "stm8s.h"

//======================================
// Main procedure
//======================================
main()
{
  // Initialize Beeper module.
  BEEP_Init(BEEP_FREQUENCY_1KHZ);
  BEEP_Cmd(ENABLE);           // Enable BEEP
  while (1);                  // Loop forever
}
</pre>
<p>
　このプログラムで行っていることは， Beeper を1 kHz の音を出力するように初期化して，イネーブルするだけです．あとは，ハードウェアが勝手に音を出すので， CPU は無限ループに入ります．
</p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="ビルドする" title="ビルドする" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-02-12.png" class="mt-image-center" style="text-align: center; display: block; margin: 0pt auto 20px;" width="400" height="300" /></span>
<p>
　アプリケーションは，以上で完成です．ビルドして，エラーが発生しないか確認しましょう．
</p>
<u><big>圧電スピーカをつけよう</big><br /><br /></u>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.eleki-jack.com/mycom2/noritan-stm8s-02-13.png"><img alt="圧電スピーカ周辺の回路図" title="圧電スピーカ周辺の回路図" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-02-13-400.png" class="mt-image-center" style="text-align: center; display: block; margin: 0pt auto 20px;" width="400" height="250" /></a></span>
<p>
　あとは，プログラムを書き込んで実行させるだけですが，ここでハードウェアを準備します．といっても，圧電スピーカを抵抗を介して <strong>STM8S-Discovery</strong> に接続するだけです．圧電スピーカは，<a href="http://akizukidenshi.com/">秋月電子通商</a>で購入した SPT08 を使用しています．
</p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.eleki-jack.com/mycom2/noritan-stm8s-02-14.jpg"><img alt="STM8S-Discoveryに圧電スピーカをつなぐ" title="STM8S-Discoveryに圧電スピーカをつなぐ" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-02-14-400.jpg" class="mt-image-center" style="text-align: center; display: block; margin: 0pt auto 20px;" width="400" height="300" /></a></span>
<p>
　圧電素子は，機械的な衝撃を加えると高い電圧を発生します．抵抗は，その電圧からマイコンを保護するためのものです．
</p>
<u><big>プログラムを書き込んで，実行しよう</big></u>
<p>
　準備ができたら，メニューから「Debug → Start Debugging」を選択し，デバッガを起動します．そして，メニューの「Debug → Run」を選択し，プログラムを実行します．
</p>
<div style="text-align: center;">
<object width="480" height="295">
<param name="movie" value="http://www.youtube-nocookie.com/v/QL34hu0DjGc&amp;hl=ja_JP&amp;fs=1&amp;rel=0" />
<param name="allowFullScreen" value="true" />
<param name="allowscriptaccess" value="always" />
<embed src="http://www.youtube-nocookie.com/v/QL34hu0DjGc&amp;hl=ja_JP&amp;fs=1&amp;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="295">
</object>
</div>
<p><br />
</p><p>　圧電スピーカからは，けっこう大きな音がなりひびきました．音を止めたいときには，メニューの「Debug → Restart」を選択しプログラムをリセット直後の状態で停止させます．
</p>
<div style="text-align: right;">田中範明（noritan.org）</div>
]]>
   </content>
</entry>

<entry>
   <title>78K マイコンでLED温度計　 </title>
   <link rel="alternate" type="text/html" href="http://www.eleki-jack.com/mycom2/2010/03/78k_led_1.html" />
   <id>tag:www.eleki-jack.com,2010:/mycom2//4.4053</id>
   
   <published>2010-03-05T06:02:48Z</published>
   <updated>2010-03-05T07:54:24Z</updated>
   
   <summary>● ソフトウェアの変更とHEXファイルの用意　実用バージョンの製作にともない、ブ...</summary>
   <author>
      <name>yoshida</name>
      
   </author>
   
      <category term="78K" scheme="http://www.sixapart.com/ns/types#category" />
   
      <category term="78KマイコンでLED温度計" scheme="http://www.sixapart.com/ns/types#category" />
   
      <category term="エレキジャックNo.8付録で試す" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="5484" label="Applilet2" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="5486" label="KCEXO3" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="5482" label="京セラキンセキ" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://www.eleki-jack.com/mycom2/">
      <![CDATA[● <b><font style="font-size: 1.25em;">ソフトウェアの変更とHEXファイルの用意</font></b><br />　実用バージョンの製作にともない、ブレッドボードで検証したソフトウェアを完成品として、そのまま78K0/KB2マイコンに書き込めるROMイメージファイル（HEXファイル）にするための変更をしました。<br />　変更個所は、Applilet2内でオンチップ・デバッグの設定を未使用に変更します。同時にオンチップ・デバッグに使用していたOCD1A,OCD1B（P31,P32）ピンが未使用となるため、ポートの設定で該当ピンを出力ポートとして設定し、電位の固定をします。 ]]>
      <![CDATA[<div align="center"><br /></div><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.eleki-jack.com/mycom2/2010/03/04/zu20.jpg"><img alt="zu20.jpg" src="http://www.eleki-jack.com/mycom2/2010/03/04/zu20-thumb-400x338.jpg" class="mt-image-center" style="text-align: center; display: block; margin: 0pt auto 20px;" width="400" height="338" /></a></span><div align="center">図 20オンチップ・デバッグを未使用にする設定<br /></div><div align="center"><br /></div><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.eleki-jack.com/mycom2/2010/03/04/zu21.jpg"><img alt="zu21.jpg" src="http://www.eleki-jack.com/mycom2/2010/03/04/zu21-thumb-400x344.jpg" class="mt-image-center" style="text-align: center; display: block; margin: 0pt auto 20px;" width="400" height="344" /></a></span><div align="center">図 21 未使用になったOCDポートを出力端子として固定する<br /></div><br />&nbsp;　Applilrt2でのこれら変更の後、自動生成されたソース・コードをNECエレクトロニクス マイコン用統合開発環境の“PM+”でビルド設定を“Release Build”に変更してソース・コードをコンパイル・ビルドし、ROM用のオブジェクト・ファイル（a.HEX）を得ます。<br />　得られたROM用のオブジェクトファイルをリリースバージョンとして、” ELT022V100.hex“と名前を変更して保存します。<br /><br />● <b><font style="font-size: 1.25em;">78K/0 ROMライタの製作</font></b><br />　LED温度計に使用する78K0/KB2マイコンに必要なプログラムを書き込む書込み器を製作します。78K0/KB2マイコンの書き込みには本来、NECエレクトロニクス社や同社認定のプログラマを使用するのかもっとも確実ですが、NECエレクトロニクス社では、もっと手軽に78Kマイコンに書き込みができるよう、シリアル・ポートを使用した書き込み回路と書き込みプログラムを提供しています。<br />　これら回路とプログラムを使用した結果については、NECエレクトロニクス社、ならびにCQ出版社、筆者は責任を負いません。みなさんの自己責任でのご使用が条件となりますのでご注意ください。<br /><br />・ <u>基本型ROMライタ</u>（外部クロック使用）<br />　図 22に基本型ROMライタの回路を示します。ROM書込み時にはマイコンへ数MHz程度のクロック供給を必要とします。基本型ROMライタはこのクロック供給に、安定したC-MOS水晶発振モジュールを使用します。<br /><div align="center">　使用した発振モジュールは京セラキンセキ社のKCEXO3という品番で周波数12.0000MHｚの製品です。KCEXO3は内部に分周回路を内蔵していて本回路では基本周波数12.0000MHｚを1/2に分周する設定になっています。したがって、78K/0KB2マイコンへ供給されるクロックは6.0000MHｚとなります。抵抗R1は発振モジュールの分周出力端子（D）よりのクロック信号の波形整形を目的とした抵抗です。発振モジュールの分周出力端子（D）の近くに実装します。<br /></div><br />　U1はシリアル信号のRTSを反転させて78K/0KB2マイコンのリセット信号として利用するためのインバータです。74HCU04のほかに74HC04,74HC14などが使用できます。<br /><br />　ブレッドボードに組み立てた様子を写真 11に示します。<br /><br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.eleki-jack.com/mycom2/2010/03/04/zu22.jpg"><img alt="zu22.jpg" src="http://www.eleki-jack.com/mycom2/2010/03/04/zu22-thumb-400x227.jpg" class="mt-image-center" style="text-align: center; display: block; margin: 0pt auto 20px;" width="400" height="227" /></a></span><div align="center">図 22 基本型ROMライタの回路<br /></div><div align="center"><br /></div><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.eleki-jack.com/mycom2/2010/03/04/p11.jpg"><img alt="p11.jpg" src="http://www.eleki-jack.com/mycom2/2010/03/04/p11-thumb-400x229.jpg" class="mt-image-center" style="text-align: center; display: block; margin: 0pt auto 20px;" width="400" height="229" /></a></span><div align="center">写真 11 ブレッドボードに組み立てた基本型ROMライタ回路<br /></div><br /><div align="right">寺尾 大二<br /></div>]]>
   </content>
</entry>

<entry>
   <title>HC08マイコンの使い方QY4A編 -《75》外部割り込み（IRQ）（2）</title>
   <link rel="alternate" type="text/html" href="http://www.eleki-jack.com/mycom2/2010/03/hc08qy4a_75_irq2.html" />
   <id>tag:www.eleki-jack.com,2010:/mycom2//4.4050</id>
   
   <published>2010-03-05T04:50:19Z</published>
   <updated>2010-03-05T04:35:33Z</updated>
   
   <summary>　HC08スタータ・ボード・キットを使用して、割り込みを使ったプログラムの書き方...</summary>
   <author>
      <name>kawano</name>
      <uri>http://www.cts-net.ne.jp/~kawano-r/</uri>
   </author>
   
      <category term="HC08マイコンの使い方QY4A編" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="4403" label="IRQ" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="5476" label="共有変数" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="5439" label="割り込みベクタ" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="4860" label="割り込みマスク" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="5441" label="割り込み要因" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="5477" label="割り込み要求フラグ" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="5463" label="外部割り込み" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://www.eleki-jack.com/mycom2/">
      <![CDATA[<p>　HC08スタータ・ボード・キットを使用して、割り込みを使ったプログラムの書き方を説明します。 今回と次回で <strong><font color="#00a000">アセンブリ言語</font></strong>、<strong><font color="#00a000">C言語</font></strong>（2通り）、そして <strong><font color="#00a000">ユーザ・モード・モニタ入りマイコン用</font></strong> C言語のサンプル・プログラムをひとつひとつ紹介していきます。<br />　<font color="#ff8000">ほかの割り込み要因を使ったプログラムを作る際にも参考にしてください。<br />　</font></p>
<p>
</p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.eleki-jack.com/mycom2/hc08_starter_board_irq.jpg"><img class="mt-image-center" style="display: block; margin: 0px auto 20px; text-align: center;" alt="hc08_starter_board_irq.jpg" src="http://www.eleki-jack.com/mycom2/hc08_starter_board_irq-thumb-400x335.jpg" width="400" height="335" /></a></span>
<p align="center">外部割り込み（IRQ） の実験のようす<br />PTA2/ IRQ ピンが接続されている JP3 の 2番ピンを GND に接触させる</p>]]>
      <![CDATA[<p>　<br /><strong><font color="#0000cc">◆ 割り込みを利用するプログラムを書く際の注意点</font></strong><br />　最初に、IRQ割り込みに限らず一般的な割り込みを利用する際の注意点を書いておきます。（*1）</p>
<p>　・ 割り込み要因に関する初期設定は、原則として <strong><font color="#ff8000">割り込み禁止期間</font></strong> で行う。<br />　　 割り込み禁止期間とは次のとおり。<br />　　　　1）電源投入から割り込み許可（I フラグ = 0）するまでの間。<br />　　　　2）割り込み許可した後で、一時的に割り込み禁止（I フラグ = 1）してから<br />　　　　　 また割り込み許可（I フラグ = 0）するまでの間。<br />　　　　3）割り込みルーチン実行中。</p>
<p>　・ 割り込み要因に関する初期設定を <strong><font color="#00a000">割り込み許可の期間</font></strong> で行う場合は、次の<br />　　 要領で実施する。<br />　　　　1）割り込み要求フラグをクリアする。 （もし 1 にセットされたままマスクを<br />　　　　　 解除すると、その途端に割り込みが発生してしまう。）<br />　　　　2）割り込み要求フラグをクリアした後で該当する割り込みマスクを解除する。</p>
<p>　・　メイン側のプログラムと割り込みルーチンで<strong><font color="#00a000">共有する変数をなるべく少なく</font></strong><br />　　　する。 メイン側で参照中に割り込みルーチンで勝手に変更されて困るような<br />　　　事態を減らす意図がある。</p>
<p>　・　メイン側のプログラムと割り込みルーチンで<strong><font color="#ff8000">共有する変数が複数バイトに<br />　　　よって意味をもつ場合は、とくに注意が必要</font></strong>。 例えば C言語で 4バイト・サイズ<br />　　　の整数データを割り込みルーチンからメイン側に渡すケースでは、メイン側が<br />　　　2バイト目まで読み取った時点で割り込みが発生すると割り込みルーチンに<br />　　　よって変数の内容を更新される可能性がある。 そうなると、メイン側としては<br />　　　途中で変更されたことに気付かないまま 3バイト目以降を読み取り 4バイト<br />　　　サイズのデータを受け取ったと思ってしまう。 当然これは正しくないデータに<br />　　　なっているのでプログラムの誤動作につながる。<br />　　　回避策の一つには、メイン側でこのようなデータを読み取る直前に割り込み<br />　　　禁止にし、データを読み取った後で割り込み許可に戻すという方法がある。</p>
<p>　・　上記のようなメイン側の<strong><font color="#00a000">割り込み禁止期間は、できるだけ短い時間</font></strong>で済ませる<br />　　　ようにする。 割り込み禁止期間に発生した割り込み要求は、割り込み許可に<br />　　　なるまで待たされてしまうため割り込みルーチンを実行するタイミングが遅く<br />　　　なってしまう。</p>
<p><br /><strong><font color="#0000cc">◆ 外部割り込み（IRQ） を使ったプログラムの動作仕様</font></strong><br />　それでは実験に移りましょう。 外部割り込み（IRQ） の機能が働くことだけ確認できればいいので、下記のような単純な動作仕様で実験してみることにします。 IRQ 割り込みは<font color="#00a000">立ち下がりエッジのみで検出</font>とします。<br />　<br />
</p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.eleki-jack.com/mycom2/flow_chart_irq.gif"><img class="mt-image-center" style="display: block; margin: 0px auto 20px; text-align: center;" alt="flow_chart_irq.gif" src="http://www.eleki-jack.com/mycom2/assets_c/2010/03/flow_chart_irq-thumb-360x314.gif" width="360" height="314" /></a></span>
<p align="center">外部割り込み（IRQ） 動作確認プログラムのフローチャート</p>
<p>　<br />　これまでに出てきたフローチャートと比べると、メイン側のフローチャートとは別に <font color="#ff8000">割り込み処理のフローチャート</font> が存在しているところが特徴的です。 似たような図でサブルーチンのフローチャートがありましたが、サブルーチンの場合はメイン側からの呼び出しが明記されているところが異なります。</p>
<p>　このフローチャートに沿って作られたプログラムは、次のような動きになります。<br />　</p>
<blockquote>
<p>&nbsp;<font color="#00a000">【 実際の動き 】<br />　HC08スタータ・ボードの電源を入れると、初期設定を終えて待ち状態になる。<br />　クリップ・コードなどを使い IRQ ピンを GND に接触させると LED が点灯する。<br />　プッシュ・スイッチを押すと LED が消灯する。</font></p></blockquote>
<p>　クリップ・コードを使って実験しているようすを一番上の写真に示します。<br />　PTA2/ IRQ ピンはマイコンのピンを直接触るのが難しい（隣に接触しそうになる）ため、<font color="#ff8000">JP3 の 2番ピン</font> を利用するとよいです（ジャンパ・リンクを取り付けているときはそのジャンパ・リンクに触れればよい）。 そして、CN3 にジャンパ・ピンを実装している場合は、GND として CN3 の 1番ピンを使うのが簡単です。</p>
<p><br /><strong><font color="#0000cc">◆ アセンブリ言語プログラムを動かしてみる</font></strong><br />　アセンブリ言語で書いたプログラムをプロジェクトごと圧縮したファイルを <a href="http://micon.arrow.jp/uploads/files/hc08_irq01.zip" target="_blank">hc08_irq01.zip</a> として保存しましたのでご利用ください。</p>
<p>　主な部分を下記に抜き出しました。<br />　</p>
<blockquote>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ORG&nbsp;&nbsp;&nbsp; ROMStart</p>
<p>_Startup:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LDHX&nbsp;&nbsp; #RAMEnd+1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; スタック・ポインタ初期化<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TXS<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff8000">LDA&nbsp;&nbsp;&nbsp;&nbsp; #$40&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; IRQピン有効、IRQプルアップ有効<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; STA&nbsp;&nbsp;&nbsp;&nbsp; CONFIG2</font><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff8000">LDA&nbsp;&nbsp;&nbsp;&nbsp; #$04&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; IRQラッチクリア、IRQ割り込み許可<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; STA&nbsp;&nbsp;&nbsp;&nbsp; INTSCR</font><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BSET&nbsp;&nbsp;&nbsp; 1, PTA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; LED OFF<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BSET&nbsp;&nbsp;&nbsp; 1, DDRA<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BSET&nbsp;&nbsp;&nbsp; 3, PTAPUE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; プッシュSW プルアップ有効<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff8000">CLI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 割り込み許可</font></p>
<p>mainLoop:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; feed_watchdog<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BRSET&nbsp;&nbsp; 3, PTA, LP1&nbsp;&nbsp;&nbsp;&nbsp; ; プッシュSW OFFなら LP1へ<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BSET&nbsp;&nbsp;&nbsp; 1, PTA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; プッシュSW ONならLED OFF<br />LP1:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BRA&nbsp;&nbsp;&nbsp; mainLoop</p>
<p>;**************************************************************<br />;* 割り込み処理<br />;**************************************************************<br /><font color="#ff8000">isr_irq</font>:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BCLR&nbsp;&nbsp;&nbsp; 1, PTA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; LED ON<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff8000">RTI</font></p>
<p>;**************************************************************<br />;* 割り込みベクタ<br />;**************************************************************<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff8000">ORG&nbsp;&nbsp; $FFFA<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DC.W&nbsp; isr_irq&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; IRQ</font><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ORG&nbsp;&nbsp; $FFFE<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DC.W&nbsp; _Startup&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; Reset</p></blockquote>
<p>　初期設定のところで CONFIG2 に IRQピン機能を有効にするよう書き込んでいます。<br />　個別の割り込み要因の設定ということで、IRQ割り込み関係の設定を行っています。<br />　入出力ポートの設定が済んでから、割り込み許可にしています。<br />　あとはメイン・ループを回り続けます。 先ほどのフローチャートと比べてみてください。<br />　feed_watchdog　というのはインクルードしたファイル derivative.inc でマクロ定義されていて、COPクリアを行うコードが生成されます。<br />　割り込み処理の中身は単純で、PTA1 を “Ｌ” にして LED を点灯させます。<br />　割り込み処理の最初の命令の前には isr_irq というラベルを付けました。 これにより、isr_irq と書けば割り込みルーチンの先頭アドレスの意味になります。<br />　割り込みルーチンの最後は、割り込みからの復帰命令を置いています。<br />　割り込みベクタとして、$FFFA 番地から 2バイトに渡り isr_irq の値を埋め込んでいます。 なぜ $FFFA 番地なのかは <a href="http://www.eleki-jack.com/mycom2/2010/02/hc08qy4a_73_1.html" target="_blank">第73回</a> の 「割り込み要因とベクタ・アドレス」 の表を見てください。</p>
<p>&nbsp;</p>
<p>　HC08スタータ・ボードを使って QY4Aマイコンに書き込んだら、デバッガ画面を終了して HC08スタータ・ボードの POWERスイッチをOFFにします。 ジャンパ類をスタンド・アロンの設定（JP1ショート、JP2ジャンパ・リンクなし、JP3は 1-2間ショート、JP4は 1-2間ショート、VR1は任意） にして、また POWERスイッチをオンしてください。</p>
<p>　クリップ・コードなどを使って PTA2/ IRQ ピンを GNDに接触させると LED が点灯し、プッシュ・スイッチを押すと LED が消灯するはずです。 これで簡単な割り込みプログラムが動くことが確認できました。</p>
<p><br />　次回はこの続きで、C言語の記述を紹介します。 <br />　<br /></p>
<hr>

<p>（*1） 割り込みを利用する際の注意点としては、ちょっと込み入ったことをやろうとすると<br />　　　出てくる問題で次のようなものもあります。<br />　</p>
<blockquote>
<p>　・　メイン側と割り込みルーチンで<strong><font color="#ff8000">同じアドレスのレジスタをビット操作</font></strong>するときは<br />　　　細心の注意が必要（HC08 マイコンに限った話ではないので念のため）。</p>
<p>&nbsp;<strong><font color="#00a000">【誤動作の例】</font></strong></p>
<p>　　　PTA1 をメイン側で、PTA5 を割り込みルーチンで使用することとする。<br />　　　PTA1 は入力方向、PTA5 は出力方向にしてある。<br />　　　データ・レジスタは PTA1 = 0　としておいて、後から出力方向に変更したとき<br />　　　に “Ｌ” を出そうと考えている。<br />　　　ここで割り込みルーチンによって PTA5 をビット操作で出力した。<br />　　　ところが BSET 命令 BCLR 命令はその時点で 1バイト丸ごと取り込み、<br />　　　目的のビットを変更してからまた書き戻すという動作を自動的に行うため、<br />　　　PTA1 入力ポートが“Ｈ”レベルなら PTA1 データ・ビットは 1 になってしまう。<br />　　　よって、メイン側で PTA1 を出力方向に変更すると “Ｈ”出力となってしまう。</p></blockquote>
<p>　正確に言えば、これは割り込みを使わないプログラムでも起こる現象です。 しかしこの例で割り込みを使わないならば、PTA1 の方向レジスタを出力に切り替える直前で PTA1 データ・ビットを希望の値にすれば問題は起こりません。 やはり割り込みが絡んだときにデバッグが複雑になるのは事実です。</p>
<p>　この例のようなプログラムの動作は、筆者が汎用ポートで <strong><font color="#ff8000">I2C プロトコルのサブセット</font></strong>（下位互換）を実装したときに経験しました。 「こうすればいつも大丈夫」 と言えるほど対策方法が確立していないので 「このときはこうしました」 的な内容になりますが、下記のプログラムが参考になるはずです。　また、このプログラムには <strong><font color="#ff8000">C言語を使って IRQ ピンのレベルを調べる方法</font></strong>（ BIH/ BIL 命令と同様の効果）も含まれています。</p>
<p>　出力電圧可変 62V 30mA 電源装置<br />　<a href="http://micon.arrow.jp/uploads/files/electronics_power_supply.htm" target="_blank">http://micon.arrow.jp/uploads/files/electronics_power_supply.htm</a></p>
<p>　<br />　<br />　『参考文献』<br /><font color="#00008b"><a href="http://shop.cqpub.co.jp/hanbai/books/46/46051.html" target="_blank"><font color="#00008b">「試しながら学ぶHC08マイコン入門」</font></a>&nbsp;</font>（CQ出版）<br />　　第1章　 マイコン電子工作を始めよう<br />　　第10章　統合開発環境CodeWarriorを使ってみる<br />筆者のホームページ　<a href="http://www.cts-net.ne.jp/%7Ekawano-r/" target="_blank"><font color="#00008b">『マイコン工作の実験室』</font></a> </p>
<p align="right">組み込みエンジニア　KAWANO<br /></p>]]>
   </content>
</entry>

<entry>
   <title>STM8Sマイコンを使った最初のアプリケーション (8)</title>
   <link rel="alternate" type="text/html" href="http://www.eleki-jack.com/mycom2/2010/03/stm8s_8.html" />
   <id>tag:www.eleki-jack.com,2010:/mycom2//4.3841</id>
   
   <published>2010-03-02T00:16:44Z</published>
   <updated>2010-03-01T23:48:07Z</updated>
   
   <summary> 実行しよう 　バイナリ・コードができたので，あとは，マイコンに書き込んで実行す...</summary>
   <author>
      <name>noritan.org</name>
      <uri> http://noritan.org/</uri>
   </author>
   
      <category term="STM8S" scheme="http://www.sixapart.com/ns/types#category" />
   
      <category term="ソフト開発環境" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.eleki-jack.com/mycom2/">
      <![CDATA[<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.eleki-jack.com/mycom2/noritan-stm8s-01-01.jpg"><img alt="STM8S-Discovery" title="STM8S-Discovery" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-01-01-400.jpg" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" width="400" height="300" /></a></span>
<u><strong><big>実行しよう</big></strong></u>
<p>
　バイナリ・コードができたので，あとは，マイコンに書き込んで実行するだけです．
</p>
]]>
      <![CDATA[<u><big>デバッガ・インターフェイスを指定する</big></u>
<p>
　<strong>STマイクロエレクトロニクス社</strong>（以下ST社）のマイコンには，デバッグを行うためのインターフェースが何種類か用意されています．評価ボードと接続する前にどの規格のインターフェースを使うのかをあらかじめ指定しておく必要があります．
</p>
<p>
　インターフェースを指定するためには，メニューから「Debug Insturument → Target Settings...」を選択します．
</p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="ターゲット設定" title="ターゲット設定" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-01-53.png" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" width="400" height="200" /></span>
<p>
　すると， <strong>Debug Instrument Settings</strong> というダイアログがあらわれます．
</p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.eleki-jack.com/mycom2/noritan-stm8s-01-54.png"><img alt="ターゲット設定ダイアログ" title="ターゲット設定ダイアログ" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-01-54-400.png" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" width="400" height="350" /></a></span>
<p>
　今回使用するデバッグ・インターフェースは， <strong>STM8S-Discovery</strong> 上に搭載された <strong>ST-Link</strong> を <strong>SWIM</strong> プロトコル経由で使用します．そこで，「デバッグ装置の選択」リストから <strong>Swim ST-Link</strong> を選択します．また，デバッグ終了時に <strong>SWIM</strong> 機能を無効にするためにチェック・ボックスをチェックしました．
</p>
<p>　次は「ターゲット・ポート」ですが， <strong>STM8S-Discovery</strong> の場合，接続ポートは USB しかありません． <code>usb://usb</code> を選択します．
</p>
<p>
　最後のチェック・ボックスをチェックすると，ターゲット接続時に接続するインターフェースを通知してくれます．これもチェックしました．設定が終わったら， <strong>OK</strong> ボタンをクリックして，設定終了です．
</p>
<u><big>マイコンと接続する</big></u>
<p>
　マイコンと接続するためには，メニューから「Debug → Start Debugging」を選択します．
</p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="デバッグ開始メニューアイテム" title="デバッグ開始メニューアイテム" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-01-55.png" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" width="400" height="300" /></span>
<p>
　すると， <strong>Target Selection</strong> ダイアログが出てきます．
</p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="ターゲット選択ダイアログ" title="ターゲット選択ダイアログ" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-01-56.png" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" width="400" height="200" /></span>
<p>
　<strong>Target Selection</strong> ダイアログが出てきたタイミングで， <strong>STM8S-Discovery</strong> を PC の USB ポートに接続します．
</p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="リムーバブル・ディスク表示" title="リムーバブル・ディスク表示" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-01-57.png" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" width="400" height="300" /></span>
<p>
　すると， <strong>STM8S-Discovery</strong> は，マスストレージ・デバイスとして認識されます．そのため， <strong>Explorer</strong> ウィンドウが開くかもしれませんが，構わずに作業を続けます． <strong>Target Selection</strong> ダイアログの <strong>OK</strong> ボタンをクリックすると， <strong>STVD</strong> の画面が，デバッグ・モードに変わります．
</p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.eleki-jack.com/mycom2/noritan-stm8s-01-58.png"><img alt="デバッガ・ウィンドウ" title="デバッガ・ウィンドウ" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-01-58-400.png" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" width="400" height="292" /></a></span>
<p>
　これで，PCとマイコンが <strong>ST-Link</strong> を介して接続されました．接続中， <strong>ST-Link</strong> 上の赤いLEDが点灯し，接続されていることを示します．
</p>
<u><big>Runコマンドを送る</big></u>
<p>
　「LEDチカチカ」プロジェクトも，いよいよ最後のステップです．「デバッガ・ウィンドウ」が表示された時点で，すでにプログラムの書き込みまでが終わっています．メニューの「Debug → Run」を選択します．
</p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="実行メニューアイテム" title="実行メニューアイテム" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-01-59.png" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" width="400" height="300" /></span>
<p>
　すると，プログラムが走り始め，被評価モジュール上の緑のLEDが1秒周期で点滅を始めます．
</p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.eleki-jack.com/mycom2/noritan-stm8s-01-60.jpg"><img alt="点滅するLED" title="点滅するLED" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-01-60-400.jpg" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" width="400" height="300" /></a></span>
<p>
　これで， <strong>STM8S</strong> マイコンを使った最初のアプリケーションは完成です．
</p>
<hr>
<u><strong><big>付録：参考文献</big></strong></u>
<p>
「STM8Sマイコンを使った最初のアプリケーション」で取り上げた，文書と原稿執筆時現在のURLです．リンクが切れていた場合には，該当のWebサイトで文書番号をキーに検索してください．
</p>
<dl>
<dt>STM8S-DISCOVERY <a href="http://www.st.com/stonline/products/literature/um/16361.pdf">(User Manual UM0817)</a></dt>
<dd>
<strong>STM8S-Discovery</strong>のハードウェアについてのマニュアルです．回路図およびジャンパの設定方法などが記述されています．
</dd>
<dt>STM8 SWIM communication protocol and debug module <a href="http://www.st.com/stonline/products/literature/um/14024.pdf">(User manual UM0470)</a></dt>
<dd>
デバッガ・インターフェースである，SWIMに関する情報が書かれたマニュアルです．通常，マイコンを使う上では必要はありません．
</dd>
<dt>Adjustable LED blinking speed using STM8S-DISCOVERY touch sensing key <a href="http://www.st.com/stonline/products/literature/um/16489.pdf">(User manual UM0833)</a></dt>
<dd>
出荷時に<strong>STM8S-Discovery</strong>に搭載されているアプリケーションについてのマニュアルです．
</dd>
<dt>Developing and debugging your STM8S-DISCOVERY application code <a href="http://www.st.com/stonline/products/literature/um/16499.pdf">(User manual UM0834)</a></dt>
<dd>
<strong>STM8S-Discovery</strong>でアプリケーションを開発する際に必要な開発環境と，そのインストールについて記述されたマニュアルです．
</dd>
<dt>STM8S firmware library <a href="http://www.st.com/products/support/micro/files/stm8sfwlib.zip">(stm8fwlib.zip)</a></dt>
<dd>
STM8Sシリーズのペリフェラルを簡単に使用するためのライブラリです．
</dd>
<dt>STM8S microcontroller family <a href="http://www.st.com/stonline/products/literature/rm/14587.pdf">(Reference manual RM0016)</a></dt>
<dd>
STM8Sシリーズのリファレンス・マニュアルです．マイコンに内蔵されたペリフェラルの詳細な動作については，このマニュアルに記述されています．
</dd>
<dt>STM8S105xx <a href="http://www.st.com/stonline/products/literature/ds/14771.pdf">(Datasheet STM8S105xx)</a></dt>
<dd>
STM8S105マイコンのデータシートです．このマイコンに固有の情報が記述されてます．
</dd>
</dl>
<div style="text-align: right;">田中範明（noritan.org）</div>
]]>
   </content>
</entry>

<entry>
   <title>HC08マイコンの使い方QY4A編 -《74》外部割り込み（IRQ）（1）</title>
   <link rel="alternate" type="text/html" href="http://www.eleki-jack.com/mycom2/2010/03/hc08qy4a_74_irq1.html" />
   <id>tag:www.eleki-jack.com,2010:/mycom2//4.4032</id>
   
   <published>2010-03-01T02:31:06Z</published>
   <updated>2010-03-04T04:12:19Z</updated>
   
   <summary>　外部割り込み（IRQ） は、HC08マイコンの IRQ ピンに外部から信号を与...</summary>
   <author>
      <name>kawano</name>
      <uri>http://www.cts-net.ne.jp/~kawano-r/</uri>
   </author>
   
      <category term="HC08マイコンの使い方QY4A編" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="4403" label="IRQ" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="2599" label="シングル割り込み" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="5460" label="ベクタ" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="5461" label="マスク" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="5462" label="割り込み要求" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="5463" label="外部割り込み" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://www.eleki-jack.com/mycom2/">
      <![CDATA[<p>　外部割り込み（IRQ） は、HC08マイコンの IRQ ピンに外部から信号を与えて割り込みを発生させる機能です。 これはマスク可能な（IRQ機能を有効にしておいても禁止できる）割り込みです。<br />　</p>
<p></p>
<span class="mt-enclosure mt-enclosure-image" style="DISPLAY: inline"><a href="http://www.eleki-jack.com/mycom2/qy4a_block_irq.gif"><img class="mt-image-center" style="DISPLAY: block; MARGIN: 0px auto 20px; TEXT-ALIGN: center" height="364" alt="qy4a_block_irq.gif" src="http://www.eleki-jack.com/mycom2/qy4a_block_irq-thumb-400x364.gif" width="400" /></a></span>
<p align="center">マイコンのブロック図 （クリックで拡大）<br />図ではシングル割り込みモジュールと表記されている</p>]]>
      <![CDATA[<p>　<br />　<a href="http://www.eleki-jack.com/mycom2/2008/07/hc08qy4a_3.html" target="_blank">第3回</a> で紹介した QY4A英文データシートでは <font color="#ff8000"><strong>External Interrupt (IRQ)</strong></font>、同じく QC16和文データシートでは <strong><font color="#ff8000">外部割り込み</font></strong> と書かれているもので、どちらも同じものです。 上図で黄色く塗った部分が該当個所になります。グレーのところは説明済みです。</p>
<p>　IRQ 機能は、コンフィギュレーション・レジスタ2（CONFIG2）のIRQEN ビットを 1 にすると有効になります。 CONFIG2 レジスタは 1回だけ書き込みできるレジスタです。（<a href="http://www.eleki-jack.com/mycom2/2009/06/hc08qy4a_53rst.html" target="_blank">第53回</a> 参照）　外部割り込みの検出方法は 「立ち下がりエッジ」&nbsp; または 「立ち下がりエッジ＋Lowレベル」 を選択できます。</p>
<p>　<br /><strong><font color="#0000cc">◆ 外部割り込み（IRQ） に関係する入出力ピン</font></strong><br />　この後実験を交えて使い方を見ていく外部割り込み（IRQ）機能のピンを黄色で示します。　IRQ と書いてある上に線があります。 これは負論理を表していて、信号が “Ｌ” のときにアクティブという意味です。<br />　<br />
</p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img class="mt-image-center" style="display: block; margin: 0px auto 20px; text-align: center;" alt="qy4a_pins_irq.gif" src="http://www.eleki-jack.com/mycom2/qy4a_pins_irq.gif" width="360" height="230" /></span>
<p align="center">ピン機能優先度　<strong><font color="#00a000">高</font></strong>　<u>RST，IRQ，OSC</u> ＞ <u>ADC</u> ＞ <u>TIM</u> ＞ <u>KBI</u> ＞ <u>PORT</u>　<strong><font color="#00a000">低</font></strong></p>
<p>　<br /><strong><font color="#0000cc">◆ 外部割り込み（IRQ） に関係する I/O制御レジスタ</font></strong></p>
<p><strong><font color="#0000cc">IRQ ステータス/ 制御レジスタ（INTSCR）</font></strong><br />　IRQ ステータス/ 制御レジスタ（INTSCR）は、IRQ モジュールの動作の制御と監視を行います。 INTSCR には次の機能があります。<br />・ IRQフラグの状態表示<br />・ IRQラッチのクリア<br />・ IRQ割り込み要求のマスク<br />・ IRQ割り込みピンのトリガ検出方法の制御<br />　<br /></p>
<p>
</p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img class="mt-image-center" style="display: block; margin: 0px auto 20px; text-align: center;" alt="qy4a_register_intscr.gif" src="http://www.eleki-jack.com/mycom2/qy4a_register_intscr.gif" width="460" height="120" /></span>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.eleki-jack.com/mycom2/qy4a_register_intscr.gif"></a></span>
<p><strong><font color="#ff8000">・ IRQF 　IRQ フラグ・ビット</font></strong>　IRQ Flag Bit<br />　この読み出し専用ステータス・ビットは、IRQ 割り込みが待ち状態にあるとき 1 にセットされます。<br />　　1 = IRQ 割り込みが待ち状態にある<br />　　0 = IRQ 割り込みは待ち状態にない</p>
<p>
</p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><strong><font color="#ff8000">・ ACK 　IRQ 割り込み要求アクノリッジ・ビット</font></strong><br />　　　　　　　　　　　　　　　　　　　IRQ Interrupt Request Acknowledge Bit<br />　この書き込み専用ビットに 1 を書き込むと、IRQ ラッチがクリアされます。 ACK を読み出すと常に 0 が読み出されます。</span>
<p>
</p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><strong><font color="#ff8000">・ IMASK 　IRQ 割り込みマスク・ビット</font></strong>　IRQ Interrupt Mask Bit<br />　この読み書き可能なビットに 1 を書き込むと、IRQ 割り込み要求が禁止されます。<br />　　1 = IRQ 割り込み要求を禁止<br />　　0 = IRQ 割り込み要求を許可</span>
<p>
</p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"></span>
<p><strong><font color="#ff8000">・ MODE 　IRQ エッジ/ レベル選択ビット</font></strong>　IRQ Edge/Level Select Bit<br />　この読み書き可能なビットは、IRQ ピンのトリガ検出方法を制御します。<br />　　1 = 立ち下がりエッジおよびLow レベルでIRQ 割り込み要求を検出<br />　　0 = 立ち下がりエッジのみでIRQ 割り込み要求を検出</p>
<p>
</p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><br /><strong><font color="#0000cc">コンフィギュレーション・レジスタ２（CONFIG2）</font></strong><br />　コンフィギュレーション・レジスタ２は <a href="http://www.eleki-jack.com/mycom2/2009/06/hc08qy4a_53rst.html" target="_blank">第53回</a> で取り上げました。 ここでは IRQを利用する際に必要な部分だけを黄色で示してあります。 その他のビットについては第53回を参照してください。<br />　<br /></span>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img class="mt-image-center" style="display: block; margin: 0px auto 20px; text-align: center;" alt="qy4a_register_config2_irq.gif" src="http://www.eleki-jack.com/mycom2/qy4a_register_config2_irq.gif" width="460" height="130" /></span>
<p>　<br /><strong><font color="#ff8000">・ 　IRQPUD　IRQ ピンのプルアップ制御ビット</font></strong>　IRQ Pin Pullup Control Bit<br />　　1 = IRQ ピン有効のとき内部プルアップを接続しない<br />　　0 = IRQ ピン有効のとき内部プルアップをIRQ ピンとVDD の間に接続する</p>
<p><strong><font color="#ff8000">・ 　IRQEN　IRQ ピンの機能選択ビット</font></strong>　IRQ Pin Function Selection Bit<br />　　1 = IRQピンの割り込み要求機能は有効<br />　　0 = IRQピンの割り込み要求機能は無効</p>
<p><br /><strong><font color="#0000cc">◆ 外部割り込み（IRQ） の詳細について</font></strong><br />　IRQ モジュールのブロック図を下記に示します（クリックで拡大）。<br />　<br />
</p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.eleki-jack.com/mycom2/block_irq.gif"><img class="mt-image-center" style="display: block; margin: 0px auto 20px; text-align: center;" alt="block_irq.gif" src="http://www.eleki-jack.com/mycom2/block_irq-thumb-480x256.gif" width="480" height="256" /></a></span>
<p>　<br />　割り込み要因の発生は、IRQ ピンの立ち下がりエッジでIRQ ラッチにラッチされます。 IRQ ベクタ・フェッチ、ACK 操作によるソフトウェア・クリア、またはリセットが実行されると、IRQ ラッチがクリアされます。</p>
<p>　INTSCR レジスタの IMASK ビットが 1 なら、IRQ 割り込み要求はマスクされます。 ラッチされた割り込み要求 IRQF は、IMASK ビットが 0 にされるまでは割り込み要求として有効になりません。</p>
<p>　【 注意 】　コンディション・コード・レジスタ（CCR）の割り込みマスク（I）では、IRQ 割り込み要求を含むすべての割り込み要求がマスクされます。<br /><br /><strong><font color="#0000cc">MODE = 0 のとき</font></strong><br />　MODE ビットが 0 のとき、<font color="#ff8000">IRQ ピンの立ち下がりエッジ</font> によって外部割り込みの検出を行います。 MODE ビットが 0 の状態で <font color="#00a000">IRQ ベクタ・フェッチ（IRQ割り込みルーチンにジャンプするとき発生）</font>または <font color="#00a000">ACK操作によるソフトウェア・クリア</font> を実行すると、IRQ ラッチは直ちにクリアされます。</p>
<p><br /><strong><font color="#0000cc">MODE = 1 のとき</font></strong><br />　MODE ビットが 1 のとき、<font color="#ff8000">IRQ ピンの立ち下がりエッジおよびLow レベル</font> によって外部割り込みの検出を行います。 MODE ビットが 1 のときは、IRQ 割り込み要求をクリアするには次の処理を実行する必要があります。<br /><font color="#00a000">　・ IRQピンをHigh レベルに戻す。 IRQ ピンがLow の間は、IRQ 要求はアクティブ<br />　　状態に維持されます。<br />　・ IRQベクタ・フェッチ または ACK操作によるソフトウェア・クリアを実行する。</font></p>
<p>　IRQ ベクタがフェッチ（<font color="#ff8000">fetch： 取ってくる</font>）されると、割り込みアクノリッジ（<font color="#ff8000">Acknowledge： 認識すること</font>）信号が生成されてIRQ ラッチがクリアされます。 また、ソフトウェアでINTSCR のACK ビットに 1 を書き込んで割り込みアクノリッジ信号を生成することができます（ブロック図参照）。 IRQ ピンをポーリングしてソフトウェアでIRQラッチをクリアする必要のあるアプリケーションでは、ACK ビットが役立ちます。<br />　割り込みルーチンを抜け出る前にACK ビットに 1 を書き込むと、ノイズによる割り込みの誤認識を防止することができます。 ACKに 1 を書き込んだ場合でも、それ以降の IRQ ピンの変化には影響しません。 ACK へ 1 を書き込んだ後に立ち下がりエッジが発生すると、次の割り込み要求がラッチされます。<br />　IRQ マスク・ビット（IMASK）が 0 のとき IRQ割り込みを受け付けると、CPU はIRQ ベクタ・アドレス（$FFFA－$FFFB番地に書かれたアドレス）をプログラム・カウンタにロードします（ IRQベクタ・フェッチ）。<br />　<font color="#ff8000">IRQ ベクタ・フェッチまたはソフトウェア・クリア</font>、および <font color="#ff8000">IRQ ピンのHigh レベルへの復帰 </font>は、任意の順序で行ってかまいません。 割り込み要求は、IRQ ピンがLow である限り要求を続けた状態となります。 ただしリセットを実行すると、IRQ ラッチとMODE 制御ビットがクリアされるため、ピンがLow レベルであっても割り込みはクリアされます。</p>
<p>　【 注意 】　レベル検出の割り込みを使用する場合は、IRQ 割り込みの誤認識を防止するために割り込みルーチン内で割り込み要求をマスクしてください。</p>
<p><br /><strong><font color="#00a000">その他の情報</font></strong><br />　INTSCR レジスタのIRQF ビットにより、IRQ割り込みが待ち状態にあるか調べることができます。 IRQF ビットはIMASK ビットの影響を受けないため、ポーリング（割り込みによらず、ひとつひとつ調べること）を行うアプリケーションで便利に利用できます。</p>
<p>　IRQ ピンの入力レベルを知るためには、BIH （Branch if IRQ Pin High）命令またはBIL （Branch if IRQ Pin Low）命令を使用します。 PORTA ビット2 としては機能しないので PTA2 ビットを使ってレベルを読み出すことができません。 なお、CONFIG2 は 一度しか書き込みできないレジスタなので、一時的に IRQ 機能を停止させて PTA2 として使用することはできません。</p>
<p>　IRQEN ビットと IRQPUD ビットを共に 1 にした場合は内蔵プルアップ抵抗が接続されません。 IRQ ピンの電位が不安定にならないよう、必要に応じて外部でプルアップしてください。 PORTA のビット2 としては機能しないため、PTAPUE2 ビットを使って内部プルアップすることはできません。</p>
<p><br />　次回は、アセンブリ言語と C言語のサンプル・プログラムをそれぞれ動かします。<br />　<br />　&nbsp;</p>
<p>　『参考文献』<br /><font color="#00008b"><a href="http://shop.cqpub.co.jp/hanbai/books/46/46051.html" target="_blank"><font color="#00008b">「試しながら学ぶHC08マイコン入門」</font></a>&nbsp;</font>（CQ出版）<br />　　第1章　 マイコン電子工作を始めよう<br />　　第10章　統合開発環境CodeWarriorを使ってみる<br />筆者のホームページ　<a href="http://www.cts-net.ne.jp/%7Ekawano-r/" target="_blank"><font color="#00008b">『マイコン工作の実験室』</font></a> </p>
<p align="right">組み込みエンジニア　KAWANO</p>]]>
   </content>
</entry>

<entry>
   <title>HC08マイコンの使い方QY4A編 -《73》割り込みの理解</title>
   <link rel="alternate" type="text/html" href="http://www.eleki-jack.com/mycom2/2010/02/hc08qy4a_73_1.html" />
   <id>tag:www.eleki-jack.com,2010:/mycom2//4.3998</id>
   
   <published>2010-02-23T02:28:22Z</published>
   <updated>2010-03-01T10:48:50Z</updated>
   
   <summary>　ほとんどのマイコンに備わっている大切な機能のひとつ、割り込みについて学習します...</summary>
   <author>
      <name>kawano</name>
      <uri>http://www.cts-net.ne.jp/~kawano-r/</uri>
   </author>
   
      <category term="HC08マイコンの使い方QY4A編" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="5438" label="ISR" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="1323" label="割り込み" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="5439" label="割り込みベクタ" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="4860" label="割り込みマスク" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="5440" label="割り込みルーチン" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="5441" label="割り込み要因" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="5442" label="命令プリフェッチ" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://www.eleki-jack.com/mycom2/">
      <![CDATA[<p>　ほとんどのマイコンに備わっている大切な機能のひとつ、割り込みについて学習します。<br />　</p>
<p></p>
<span class="mt-enclosure mt-enclosure-image" style="DISPLAY: inline"><a href="http://www.eleki-jack.com/mycom2/cq_news1.gif"></a></span>
<span class="mt-enclosure mt-enclosure-image" style="DISPLAY: inline"><a href="http://www.eleki-jack.com/mycom2/cq_news1.gif"><img class="mt-image-center" style="DISPLAY: block; MARGIN: 0px auto 20px; TEXT-ALIGN: center" height="144" alt="cq_news1.gif" src="http://www.eleki-jack.com/mycom2/assets_c/2010/02/cq_news1-thumb-228x144.gif" width="228" /></a></span>
<p align="center">テレビの生番組に “割り込む” 地震速報</p>]]>
      <![CDATA[<p>　<br /><strong><font color="#0000cc">◆<font style="FONT-SIZE: 1.25em"> 「割り込み」 の概念に至るまで</font></font></strong></p>
<p><strong><font color="#0000cc">・ メイン・プログラムとサブルーチンのようなものとは</font></strong><br />　これまでに皆さんは、「マイコンはあらかじめ用意したプログラムに従って動く」 ということを学習してきました。 あるひとまとまりの仕事に対しサブルーチンや関数呼び出しといった仕組みを導入して効率よくプログラムを記述する方法を学びましたし、条件判定によってプログラムの流れを分岐させる方法も習得済みです。 その大切なプログラムを何かに例えるならば、簡単な例では運動会のプログラムやテレビ番組の進行表のようなものと言うことができるでしょう （下図）。<br />　</p>
<span class="mt-enclosure mt-enclosure-image" style="DISPLAY: inline"><a href="http://www.eleki-jack.com/mycom2/tv_program1.gif"></a></span>
<span class="mt-enclosure mt-enclosure-image" style="DISPLAY: inline"><a href="http://www.eleki-jack.com/mycom2/tv_program1.gif"><img class="mt-image-center" style="DISPLAY: block; MARGIN: 0px auto 20px; TEXT-ALIGN: center" height="218" alt="tv_program1.gif" src="http://www.eleki-jack.com/mycom2/assets_c/2010/02/tv_program1-thumb-280x218.gif" width="280" /></a></span>
<p></p>
<p align="center">テレビ番組の進行表はマイコンのプログラムに似ている<br />コマーシャルの送出はサブルーチンに似ている</p>
<p>　<br /><strong><font color="#0000cc">・ 割り込みのようなものとは</font></strong><br />　テレビ番組の司会者はふつう前もって決められた内容に従い、順番通りに番組を進めます。 ところが、生番組においてはそれだけですまないことが往々にして起こります。 たとえば、ちょっと堅い話ですが生番組中の地震速報はどうでしょう。 「番組の途中ですが、ただいま地震の情報が入りました。 何時何分頃、××県××地方でマグニチュード×．×の地震が発生しました。 △△市では震度□、△△市では震度□、・・・・・」 というものですね。 これを図で表すと、次のように表現できます。（*1）<br />　<br /></p>
<span class="mt-enclosure mt-enclosure-image" style="DISPLAY: inline"><a href="http://www.eleki-jack.com/mycom2/tv_program2.gif"><img class="mt-image-center" style="DISPLAY: block; MARGIN: 0px auto 20px; TEXT-ALIGN: center" height="218" alt="tv_program2.gif" src="http://www.eleki-jack.com/mycom2/tv_program2-thumb-280x218.gif" width="280" /></a></span>
<p></p>
<p align="center">生番組中の地震速報は 「割り込み」 に似ている<br />地震発生のタイミングを予定に組み込むことができない</p>
<p><br />　先ほどのコマーシャル挿入の場合と比べて、何が違うでしょうか。 そうです、決定的な違いは <font color="#ff8000">どのタイミングで地震が発生するか前もって分からない</font> という点です。 図では 「内容4」 のところで地震が発生していますが、「内容6」 のところで発生する可能性もあったわけですし、もちろん地震など発生しないこともあるわけです。 つまり、<font color="#ff8000">何らかのイベントが発生したときに、実行中の処理を中断して別の処理を実行する仕組み</font> が必要なのです。 多くのマイコン（コンピュータ）にはこのような機能が備わっています。 それが 「割り込み」 です。</p>
<p><br /><strong><font color="#0000cc">◆<font style="FONT-SIZE: 1.25em"> 「割り込み」 という手段を用いる</font></font></strong><br />　これから 「割り込み」 について学ぶわけですが、先ほどの説明図を見ると、どうやらサブルーチン呼び出しの仕組みに少し似ているようです。 参考のために <a href="http://www.eleki-jack.com/mycom2/2010/01/hc08qy4a_712.html" target="_blank">第71回</a> の図を再掲します（一部変更）。</p>
<p><br /></p>
<span class="mt-enclosure mt-enclosure-image" style="DISPLAY: inline"><a href="http://www.eleki-jack.com/mycom2/subroutine_image1.gif"><img class="mt-image-center" style="DISPLAY: block; MARGIN: 0px auto 20px; TEXT-ALIGN: center" height="219" alt="subroutine_image1.gif" src="http://www.eleki-jack.com/mycom2/subroutine_image1-thumb-320x219.gif" width="320" /></a></span>
<p align="center">サブルーチン呼び出しのイメージ図</p>
<p>　<br />　これは、あらかじめプログラムの中にサブルーチン呼び出し命令を置いておき、その<font color="#ff8000">決まった場所にきたら</font>サブルーチンを呼び出すというものです。 一方、先ほどの地震速報の例ではサブルーチン呼び出し命令に相当するものがありません。 いつ発生するか予定が立たないプログラム分岐を実現するためには、やはりこれとは別なモデルが必要です。 下図をご覧ください。</p>
<p></p>
<span class="mt-enclosure mt-enclosure-image" style="DISPLAY: inline"><a href="http://www.eleki-jack.com/mycom2/isr_image1.gif"><img class="mt-image-center" style="DISPLAY: block; MARGIN: 0px auto 20px; TEXT-ALIGN: center" height="219" alt="isr_image1.gif" src="http://www.eleki-jack.com/mycom2/isr_image1-thumb-320x219.gif" width="320" /></a></span>
<p align="center">割り込みルーチン実行のイメージ図</p>
<p>　<br />　前もって用意したプログラムに記述したタイミングではなく、割り込み要因が発生したタイミングでプログラムが分岐するようすを表しています。 細かい話をすると、マイコン（プロセッサ）<font color="#00a000">命令の実行途中では中断せず、実行中の命令が終わったところで割り込みが掛かります。</font> そして、割り込みルーチン（ ISR： Interrupt Service Routine ） の最後には必ず 「割り込みからの復帰命令」 を置いておきます。 これを実行すると、割り込まれた位置の続きからプログラム実行を再開します。</p>
<p><br /><strong><font color="#0000cc">◆ <font style="FONT-SIZE: 1.25em">割り込み発生時の動きを考える</font></font></strong><br />　上図を元にして、QY4A （HC08マイコン） で実際に割り込みが発生したときにどのようなことが起きるのか見てみましょう。<br />　</p>
<blockquote>
<p>　(1) マイコン自体が<font color="#00a000">割り込み許可</font>であるとします。<br />　(2) 命令4 の実行中に<font color="#ff8000">割り込み要因が発生</font>しました。<br />　(3) 命令4 の実行が終わった時点で、自動的に下記のような割り込みルーチン実行<br />　　　の準備が行われます。（*2）<br />　　　<font color="#ff8000">・ 次の命令（命令5）の番地をスタックに PUSHする。<br />　　　・ X レジスタの内容をスタックに PUSH する。<br />　　　・ アキュムレータの内容をスタックに PUSH する。<br />　　　・ CCR の内容をスタックに PUSH する。</font><br />　　　・ マイコン自体を<font color="#00a000">割り込み禁止</font>にする。<br />　　　・ あらかじめ決定された割り込みルーチンの先頭番地（*3） を PC にセットする。<br />　(4) 割り込みルーチンの内容を実行します。<br />　(5) 割り込みからの復帰命令を実行すると、自動的に下記の処理が行われます。<br />　　　<font color="#ff8000">・ スタックを PULL して CCR にセットする（割り込み許可の設定に戻る）。<br />　　　・ スタックを PULL して アキュムレータにセットする。<br />　　　・ スタックを PULL して X レジスタにセットする。<br />　　　・ スタックを PULL して戻り先（命令5）の番地を PC にセットする。</font><br />　(6) 割り込みが掛かった位置の続きから、<font color="#00a000">割り込み許可状態</font>で処理を継続します。<br /></p></blockquote>
<p>　このようにすることで、次のようなメリットが生じます。<br /><font color="#00a000">・ いつ発生するかわからないイベントをきっかけにして開始する処理が実現できる。<br />・ メイン・プログラム側は途中で割り込みがなかったかのように処理を継続できる。</font></p>
<p>　もしもメイン・プログラムでスタック操作をしている最中に割り込みが掛かった場合でも、割り込みルーチンから戻ってきたときにはしっかり割り込み発生前の状況が回復できていますから、そのままスタック操作を行っても大丈夫です。 <font color="#ff8000">先入れ後出し</font>というスタックの性質をうまく利用しているのですね。</p>
<p>　CPU自体の割り込み許可・禁止を制御する <font color="#ff0000">I フラグ（割り込みマスク）</font> については、<a href="http://www.eleki-jack.com/mycom2/2009/09/hc08qy4a_61_ccr1.html" target="_blank">第61回</a> で説明済みです。 あらためて読み返してみてください。 今ならきっと良く理解できるはずです。 なお、QY4A マイコンの割り込み全体の説明はデータシートのCPU の項目ではなく <font color="#00a000">システム・インテグレーション・モジュール（SIM）・例外制御（Exception Control）</font> の項目に書かれています。 この連載では取り上げませんが、<font color="#ff8000">ソフトウェア割り込み命令（SWI）</font>についても記述があります。（*4）</p>
<p>&nbsp;</p>
<p><strong><font color="#0000cc">◆ <font style="FONT-SIZE: 1.25em">割り込み要因と割り込みベクタ</font></font></strong><br />　多くのマイコン（コンピュータ）の場合、一つだけでなく複数の割り込み要因が用意されていて、それぞれの要因ごとに異なる割り込みベクタが用意されています。 つまり、割り込み要因Ａが発生したときは自動的に割り込みルーチンＡが実行されますし、割り込み要因Ｂが発生したときは自動的に割り込みルーチンＢが実行されます。 これにより、非常に柔軟なプログラミングが可能になっています。</p>
<p>　QY4A マイコンの割り込み要因と、それが発生したときに実行する割り込みルーチンの先頭アドレス（割り込みベクタ）を格納しておくためのアドレスを下表に示します。<br />　</p>
<p>
<span class="mt-enclosure mt-enclosure-image" style="DISPLAY: inline"><a href="http://www.eleki-jack.com/mycom2/irq_vector.gif"><img class="mt-image-center" style="DISPLAY: block; MARGIN: 0px auto 20px; TEXT-ALIGN: center" height="182" alt="irq_vector.gif" src="http://www.eleki-jack.com/mycom2/assets_c/2010/02/irq_vector-thumb-420x182.gif" width="420" /></a></span></p>
<p align="center">QY4A マイコンの割り込み要因とベクタ・アドレス<br />リセットは割り込みではないが同じ 「例外制御」 ということで表に入れた</p>
<p><br />　<font color="#00a000">いずれかの割り込みが発生するためには下記の条件がすべてそろうこと</font>が必要です。 ただし SWI 命令とリセットについては I フラグは関係ありません。<br />　</p>
<blockquote>
<p><font color="#ff8000">　【 割り込み発生の条件 】<br />　・ CCR レジスタの I フラグ（割り込みマスク） が 0 である。<br />　・ 個別の要求フラグが 1 になる（イベントが発生したとき自動的に 1 になる）。<br />　・ 対応するマスク・ビットが 1 （許可）になっている。</font><br /></p></blockquote>
<p>　<br />　表中に優先順位が書かれていますが、これは割り込み受け付けを判定するタイミングで同時に複数の要求が立っていた場合の優先度です（優先順位の低い方はそのまま待たされる）。 優先順位の低い割り込みルーチンを実行中にほかの優先順位の高い割り込みが発生したとき云々という意味ではありません。</p>
<p>　要求フラグについては、自動的にクリアされるもの（IRQF，KEYF，COCO）と、ソフトウェア的にクリアする必要があるもの（CH0F，CH1F，TOF）があります。 ソフトウェア的にクリアするものは、その手順も含めて個々の説明で詳しく解説します。</p>
<p>&nbsp;</p>
<p>　次回は IRQ 端子を利用した外部割り込み（シングル割り込み）の予定です。</p>
<p><br />（*1） 気になる方のために書いておきますと、実際のテレビ番組では地震情報が入ったあとで少し進行を早めるなどして番組の終了時間にきちんと終われるように調整しますから、厳密にはマイコンの割り込み処理と同じではありません。 しかし開始のタイミングが予定されていない事象をきっかけにして別の処理が実施され、終了次第また元の処理に戻るという点では非常に似ているということができます。 </p>
<p>（*2） HC08 マイコンの CPU レジスタにある <font color="#ff8000">H レジスタは自動的に格納・復帰されません。</font> これは HC08 マイコンの元になった M6805 ファミリ（H レジスタがない）とのソフトウェア互換性を保つためです。 割り込みルーチンの中で H レジスタを書き換えないというのであれば問題ありませんが、H レジスタを書き換える場合は注意が必要です。 具体的には、割り込みルーチンの最初で H レジスタを PUSH して、最後の 「割り込みからの復帰命令」 の前で PULL して H レジスタにセットするという処理が必要です。 C言語の場合はコンパイラが適切に処理してくれるので気にする必要はありません。</p>
<p>（*3） あらかじめ決定した割り込みルーチンの先頭番地のことを <font color="#ff8000">割り込みベクタ</font> と呼ぶことがあります。<br /><br />（*4） データシートをよく読むと<font color="#00a000">命令プリフェッチ</font>動作があることがわかりますが、実機およびデバッガを使用する上では PC の値に関してそのことを意識しないで済むようです（デバッグ時のブレーク・ポイント判定には影響あり）。<br />　</p>
<p>[2010-02-23]　IRQF を 「自動的にクリアされるもの」 に入れた。<br />[2010-03-01]　割り込み要因とベクタ・アドレスの表に番号欄を追加した。</p>
<p>　&nbsp;</p>
<p>　『参考文献』<br /><font color="#00008b"><a href="http://shop.cqpub.co.jp/hanbai/books/46/46051.html" target="_blank"><font color="#00008b">「試しながら学ぶHC08マイコン入門」</font></a>&nbsp;</font>（CQ出版）<br />　　第1章　 マイコン電子工作を始めよう<br />　　第10章　統合開発環境CodeWarriorを使ってみる<br />筆者のホームページ　<a href="http://www.cts-net.ne.jp/~kawano-r/" target="_blank"><font color="#00008b">『マイコン工作の実験室』</font></a> </p>
<p align="right">組み込みエンジニア　KAWANO</p>]]>
   </content>
</entry>

<entry>
   <title>78K マイコンでLED温度計　 </title>
   <link rel="alternate" type="text/html" href="http://www.eleki-jack.com/mycom2/2010/02/78k_led.html" />
   <id>tag:www.eleki-jack.com,2010:/mycom2//4.3983</id>
   
   <published>2010-02-17T01:37:10Z</published>
   <updated>2010-02-17T02:00:25Z</updated>
   
   <summary>■ 実用バージョンの製作● 実用バージョンを作る　ブレッドボードに組み立てたLE...</summary>
   <author>
      <name>yoshida</name>
      
   </author>
   
      <category term="78K" scheme="http://www.sixapart.com/ns/types#category" />
   
      <category term="78KマイコンでLED温度計" scheme="http://www.sixapart.com/ns/types#category" />
   
      <category term="エレキジャックNo.8付録で試す" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="5428" label="ICB-288" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="5014" label="サンハヤト" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://www.eleki-jack.com/mycom2/">
      <![CDATA[<b>■ <font style="font-size: 1.25em;">実用バージョンの製作</font><br />● 実用バージョンを作る</b><br />　ブレッドボードに組み立てたLED温度計は回路の試作やプログラムの開発に便利ですが、「温度計」という実用品としては、いま一つ実用性に乏しいものになっています。<br /><br />　そこで、面倒にならない範囲で実用的なLED温度計を作ってみることにします。ハードウェアは手軽に製作できる、ユニバーサル・ボードの回路を配線して製作します。プログラムは、MINICUBE2などの専用ハードウェアを使用せず、ROMライタで書込み用に用意するプログラム・ファイル（HEXファイル）を汎用のUSB-シリアル変換モジュールを使用した簡易書込み器をブレッドボードで製作してプログラムします。 ]]>
      <![CDATA[<div align="center"><br /></div><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.eleki-jack.com/mycom2/2010/02/17/p9.jpg"><img alt="p9.jpg" src="http://www.eleki-jack.com/mycom2/2010/02/17/p9-thumb-400x385.jpg" class="mt-image-center" style="text-align: center; display: block; margin: 0pt auto 20px;" width="400" height="385" /></a></span><div align="center">写真 9 完成して壁に吊るしたLED温度計<br /></div><div align="center">　基板裏にプラスチック板を両面テープで貼り付け、配線を保護してある。<br /></div><br />●<b> 実用バージョンのハードウェア</b><br />　図 19にユニバーサル・ボードに製作した、実用バージョンのLED温度計の回路を示します。実用バージョンでは、デバッグに使用したMINICUBE2用のコネクタおよび関連回路を削除しています。電源はミニUSBコネクタを取り付け、USB型ACアダプタ、パソコンのUSBポートよりバスパワーのみ電源として取り出します。<br />　LED温度計の消費電流は高効率のLEDを使用しているおかげで、最大50mA程度です。USB電源端子には配線ミスや故障時に備えて0.1Aのリセッタブル・ヒューズを挿入して回路および電源を保護します。<br /><br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.eleki-jack.com/mycom2/2010/02/17/zu19.jpg"><img alt="zu19.jpg" src="http://www.eleki-jack.com/mycom2/2010/02/17/zu19-thumb-400x264.jpg" class="mt-image-center" style="text-align: center; display: block; margin: 0pt auto 20px;" width="400" height="264" /></a></span><div align="center">図 19 ユニバーサル・ボードに製作したLED温度計の回路<br /></div><br />&nbsp;<br /><br />・ 温度計の組み立て<br />　写真 10にサンハヤトICB-288相当品（47×72mm）のユニバーサル・ボードに実装したLED温度計の例を示します。写真のようにレイアウトには余裕があるので、配線も容易です。<br />　この例では、基板裏に両面テープで基板と同サイズのプラスチック板を貼り付け、基板取り付け穴にワイヤを通して壁にピンなどでつるして使用できるようにしました。<br /><br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.eleki-jack.com/mycom2/2010/02/17/p10.jpg"><img alt="p10.jpg" src="http://www.eleki-jack.com/mycom2/2010/02/17/p10-thumb-400x424.jpg" class="mt-image-center" style="text-align: center; display: block; margin: 0pt auto 20px;" width="400" height="424" /></a></span><div align="center">写真 10 サンハヤトICB-288相当品に実装したLED温度計</div><div><br /></div>]]>
   </content>
</entry>

<entry>
   <title>STM8Sマイコンを使った最初のアプリケーション (7)</title>
   <link rel="alternate" type="text/html" href="http://www.eleki-jack.com/mycom2/2010/02/stm8s_7.html" />
   <id>tag:www.eleki-jack.com,2010:/mycom2//4.3840</id>
   
   <published>2010-02-15T02:08:05Z</published>
   <updated>2010-02-15T01:19:58Z</updated>
   
   <summary> ソース・コードを書き直そう 　ライブラリが整いましたので，いよいよ，プログラム...</summary>
   <author>
      <name>noritan.org</name>
      <uri> http://noritan.org/</uri>
   </author>
   
      <category term="STM8S" scheme="http://www.sixapart.com/ns/types#category" />
   
      <category term="ソフト開発環境" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="5408" label="STM8S" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="5410" label="STVD" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://www.eleki-jack.com/mycom2/">
      <![CDATA[<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.eleki-jack.com/mycom2/noritan-stm8s-01-01.jpg"><img alt="STM8S-Discovery" title="STM8S-Discovery" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-01-01-400.jpg" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" width="400" height="300" /></a></span>
<u><strong><big>ソース・コードを書き直そう</big></strong></u>
<p>
　ライブラリが整いましたので，いよいよ，プログラムを作成します．といっても， <code>main</code> 関数をカスタマイズするだけですみます．
</p>
]]>
      <![CDATA[<u><big>main関数を変更する</big></u>
<p>
　<strong>STVD</strong> のワークスペース・ペインにある <code>main.c</code> をダブルクリックすると，テキスト・エディタが開きます．
</p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.eleki-jack.com/mycom2/noritan-stm8s-01-49.png"><img alt="main.cファイルを開く" title="main.cファイルを開く" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-01-49-400.png" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" width="400" height="300" /></a></span>
<p>　ファイルの内容を以下のように書き換えます．
</p>
<pre style="font-family: monospace;">//**************************************
//
// main.c : 
//  
// Copyright (c) 2010 noritan.org
//
//**************************************

#include "stm8s.h"

//======================================
// Constant declaration
//======================================
#define PERIOD  (62500)         // timer counter period
#define DUTY    (PERIOD/2)      // PWM duty value

//======================================
// Main procedure
//======================================
main()
{
  TIM3_TimeBaseInit(            // Configure Timebase
    TIM3_PRESCALER_32,          // divide by 32
    PERIOD-1                    // divide by PERIOD
  );
  TIM3_OC2Init(                 // Configure OC2 output
    TIM3_OCMODE_PWM1,           // PWM mode-1 output
    TIM3_OUTPUTSTATE_ENABLE,    // Enable OC2 output
    DUTY,                       // Activated on count DUTY
    TIM3_OCPOLARITY_LOW         // LOW active output
  );
  TIM3_Cmd(ENABLE);             // Start the Timer
  while (1);                    // Loop forever
}
</pre>
<p>
　ファームウェア・ライブラリを使用するために，ヘッダ・ファイル <code>stm8s.h</code> を呼び出しています．プログラム本体は，三つのライブラリ関数を呼び出してから，無限ループに入るだけの簡単なものです．
</p>
<p>
　最初の <code>TIM3_TimeBaseInit</code> 関数は，タイマ TIM3 の分周比を指定します．分周比の設定値は前述したとおりです．タイマの分周比を設定するときには，1少ない値 <code>PERIOD-1</code> を与えます．
</p>
<p>
　二つ目の <code>TIM3_OC2Init</code> 関数は， PWM 出力を設定する関数です．ここで使用する PWM 機能は，アウトプット・コンペア（Output Compare: OC）機能の一部として実装されています．そのため， PWM の設定を行う関数も OC の設定と共通の <code>TIM3_OC2Init</code> になっているというわけです． PWM 機能では，タイマ・カウンタのオーバフローでポート出力が初期化され， OC イベントが発生するとポート出力が反転されます．点滅のデューティ比を50%にするため， OC イベントが発生するカウンタ値をタイマ周期の半分の値 <code>DUTY</code> に設定しています．また，出力の極性を LOW アクティブとして， <code>TIM3_CCR2</code> レジスタの値に比例した長さだけ LED が点灯するようにしています．
</p>
<p>
　三つ目の <code>TIM3_Cmd</code> 関数は，タイマを始動するための関数です．これ以降，タイマは， CPU とは無関係に動作します．このため， CPU が無限ループに入ったあとも LED は自動的に点滅を続けます．
</p>
<p>
　これら関数の詳細については，ファームウェア・ライブラリに付属しているオンライン・マニュアル（<code>stm8s_fwlib_um.chm</code>）に書いてあります．
</p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.eleki-jack.com/mycom2/noritan-stm8s-01-50.png"><img alt="変更されたmain関数" title="変更されたmain関数" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-01-50-400.png" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" width="400" height="300" /></a></span>
<p>
　ファイルの編集が終わったら， <code>ctrl+S</code> でファイルを保存します．
</p>
<u><big>プログラムをビルドする</big></u>
<p>
　ライブラリとソース・コードがそろったら，コンパイルとリンクをして，マイコンに書き込むバイナリ・コードを作成します．メニューから「Build → Build All」を選んでバイナリ・コードを作成します．
</p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="バイナリ・コードの作成" title="バイナリ・コードの作成" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-01-51.png" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" width="400" height="300" /></span>
<p>
　出力ペインに <code>0 error(s), 0 warning(s)</code> と表示されていたら，バイナリ・コードの作成は，無事終了です．
</p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="バイナリ・コードの作成完了" title="バイナリ・コードの作成完了" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-01-52.png" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" width="400" height="300" /></span>
<p>
　　次回は，マイコンにプログラムを書き込んで，実行します．
</p>
<div style="text-align: right;">田中範明（noritan.org）<br /><br /></div>
<div align="left"><blockquote>STM8-Discoveryは　現在、<a href="http://akizukidenshi.com/catalog/g/gM-03457/">秋月電子通商で取り扱っています</a>。<br /></blockquote><br /></div>]]>
   </content>
</entry>

<entry>
   <title>作りながら学ぶPICマイコン入門のフォロー（24）</title>
   <link rel="alternate" type="text/html" href="http://www.eleki-jack.com/mycom2/2010/02/pic24.html" />
   <id>tag:www.eleki-jack.com,2010:/mycom2//4.3916</id>
   
   <published>2010-02-10T01:07:12Z</published>
   <updated>2010-02-10T10:07:56Z</updated>
   
   <summary><![CDATA[アセンブラの代わりにCで動かしてみる（12）&nbsp;&nbsp; デバッグ時...]]></summary>
   <author>
      <name>kanzaki</name>
      
   </author>
   
      <category term="MPLAB" scheme="http://www.sixapart.com/ns/types#category" />
   
      <category term="PIC" scheme="http://www.sixapart.com/ns/types#category" />
   
      <category term="デバッガ" scheme="http://www.sixapart.com/ns/types#category" />
   
      <category term="作りながら学ぶPICマイコン入門" scheme="http://www.sixapart.com/ns/types#category" />
   
      <category term="書籍フォロー" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="5347" label="PICKIT3、MPLAB IDE" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://www.eleki-jack.com/mycom2/">
      <![CDATA[<p><font style="FONT-SIZE: 1.25em"><strong>アセンブラの代わりにCで動かしてみる（12）</strong></font><br />&nbsp;&nbsp; デバッグ時に利用できるものを確認してみます。メニューバーのViewをクリックして利用できるものを確認します。<br /></p>
<p><font style="FONT-SIZE: 1.25em"><strong>Project、OUTPUT</strong></font><br />&nbsp;&nbsp; Projectは、プロジェクトが管理している各ファイルがツリー構造で表示されます。OUTPUTは、ビルドやプログラムの書き込み、デバッグなどの進行状況、結果などが表示されます。このOUTPUTで進行状況などを確認しながら作業を進めます。この二つは通常、常時表示されています。<br /></p>
<span style="DISPLAY: inline" class="mt-enclosure mt-enclosure-image"><a href="http://www.eleki-jack.com/mycom2/kanzaki/PIC240010.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 20px; DISPLAY: block" class="mt-image-center" alt="PIC240010.jpg" src="http://www.eleki-jack.com/mycom2/assets_c/2010/02/PIC240010-thumb-400x275.jpg" width="400" height="275" /></a></span>]]>
      <![CDATA[<p><strong>Disassembly Listing</strong><br />&nbsp; Disassembly Listingは、次に示すようにプログラムのディスアセンブリ・リストが表示されます。プログラムの最小単位の動作を確認する場合に必要になります。該当するCのプログラムのコードも表示されるので、細部の動きとともにCのコードのどの部分を実行しているのかもわかります。<br /><strong>
<span style="DISPLAY: inline" class="mt-enclosure mt-enclosure-image"><a href="http://www.eleki-jack.com/mycom2/kanzaki/PIC240020.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 20px; DISPLAY: block" class="mt-image-center" alt="PIC240020.jpg" src="http://www.eleki-jack.com/mycom2/assets_c/2010/02/PIC240020-thumb-400x302.jpg" width="400" height="302" /></a></span></strong><strong></strong><strong>File Registers</strong><br />&nbsp;&nbsp; レジスタの内容が次のように表示されます。プログラムの実行に応じて意図通りレジスタの更新が行われているか確認できます。表示内容もレジスタのシンボル名と内容がHEX、10進表示、2進表示となっています。<br />　レジスタのビットが問題になるときは2進表示、値が問題のときは10進またはHEX表示と確認が容易になっています。</p>
<p>
<span style="DISPLAY: inline" class="mt-enclosure mt-enclosure-image"><a href="http://www.eleki-jack.com/mycom2/assets_c/2010/02/PIC240040-thumb-400x385.jpg"></a></span>
<span style="DISPLAY: inline" class="mt-enclosure mt-enclosure-image"><a href="http://www.eleki-jack.com/mycom2/kanzaki/PIC240040.jpg"></a></span></p>
<p>
<span style="DISPLAY: inline" class="mt-enclosure mt-enclosure-image"><a href="http://www.eleki-jack.com/mycom2/kanzaki/PIC240040.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 20px; DISPLAY: block" class="mt-image-center" alt="PIC240040.jpg" src="http://www.eleki-jack.com/mycom2/assets_c/2010/02/PIC240040-thumb-380x366.jpg" width="380" height="366" /></a></span>　アドレスの順番に表示されていますので、離れた場所のレジスタを確認するときには、頻繁にスクロールなどが必要で少し面倒です。通常Symbolicで利用していますがHEX、Symbolicの選択ができます。HEXを選択すると、File Registers全体がHEX表示で一覧できますが、HEX表示のみなのとアドレスからレジスタを割り出さなければならないので、慣れないと大変です。<br />　特定のレジスタの内容を確認したいときは次に示すWatchが便利です。<br /><br /><strong>Watch</strong><br />&nbsp; 次に示すWatchは、PICのSFRとユーザが定義した変数のうち必要なものだけ表示することができます。ドロップダウンリストから必要なSFR、変数のシンボルを選択しAdd SFRまたはAdd Symbolをクリックすると必要なものが追加されます。<br />　デバッグで確認したい、SFR、変数が一覧できるようになりますので便利です。</p>
<p>
<span style="DISPLAY: inline" class="mt-enclosure mt-enclosure-image"><a href="http://www.eleki-jack.com/mycom2/kanzaki/PIC240070.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 20px; DISPLAY: block" class="mt-image-center" alt="PIC240070.jpg" src="http://www.eleki-jack.com/mycom2/assets_c/2010/02/PIC240070-thumb-400x184.jpg" width="400" height="184" /></a></span>　その他に、次に示すSFRのみ表示するウィンドウがあります。</p>
<p><strong>
<span style="DISPLAY: inline" class="mt-enclosure mt-enclosure-image"><a href="http://www.eleki-jack.com/mycom2/kanzaki/PIC240060.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 20px; DISPLAY: block" class="mt-image-center" alt="PIC240060.jpg" src="http://www.eleki-jack.com/mycom2/assets_c/2010/02/PIC240060-thumb-250x380.jpg" width="250" height="380" /></a></span>Program Memory</strong><br />&nbsp; Program Memoryは次に示すように、プログラム・メモリの内容と逆アセンブルしたリストが表示されます。このProgram Memoryの表示はアドレスの順番で、先ほど示したDisassembly ListingはCのプログラムの記述の順番になります。</p>
<p><strong>
<span style="DISPLAY: inline" class="mt-enclosure mt-enclosure-image"><a href="http://www.eleki-jack.com/mycom2/kanzaki/PIC240050.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 20px; DISPLAY: block" class="mt-image-center" alt="PIC240050.jpg" src="http://www.eleki-jack.com/mycom2/assets_c/2010/02/PIC240050-thumb-400x285.jpg" width="400" height="285" /></a></span>ソース・リスト</strong><br />&nbsp; 最初に作成したソース・リストもデバッグ時の重要な資料となります。<br />
<span style="DISPLAY: inline" class="mt-enclosure mt-enclosure-image"><a href="http://www.eleki-jack.com/mycom2/kanzaki/PIC240030.jpg"><img style="TEXT-ALIGN: center; MARGIN: 0px auto 20px; DISPLAY: block" class="mt-image-center" alt="PIC240030.jpg" src="http://www.eleki-jack.com/mycom2/assets_c/2010/02/PIC240030-thumb-400x319.jpg" width="400" height="319" /></a></span>必要に応じてこれらのウィンドウを表示しデバッグを行います。<br /><br /><strong>WDTEN</strong><br />&nbsp;&nbsp; ウォッチドッグ・タイマをディスイネーブルにしておくと、デバッグができません。デバッガでプログラムを書き込むときに、ウォッチドッグ・タイマをイネーブルにするのでWDTENに変更しました。<br />　次回、以上のツールでPICのオンライン・デバッグの様子を確認し次に進みます。<br /><br /></p>
<div style="TEXT-ALIGN: right">&lt;神崎康宏&gt;</div><br /><br />
<p></p>
<p></p>]]>
   </content>
</entry>

<entry>
   <title>STM8Sマイコンを使った最初のアプリケーション (6)</title>
   <link rel="alternate" type="text/html" href="http://www.eleki-jack.com/mycom2/2010/02/stm8s_6.html" />
   <id>tag:www.eleki-jack.com,2010:/mycom2//4.3839</id>
   
   <published>2010-02-08T01:54:54Z</published>
   <updated>2010-02-09T01:17:48Z</updated>
   
   <summary> ライブラリを整備しよう 　TIM3 モジュールを使用するという方針を決めて，レ...</summary>
   <author>
      <name>noritan.org</name>
      <uri> http://noritan.org/</uri>
   </author>
   
      <category term="STM8S" scheme="http://www.sixapart.com/ns/types#category" />
   
      <category term="ソフト開発環境" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="5385" label="STM8-Discovery" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://www.eleki-jack.com/mycom2/">
      <![CDATA[<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.eleki-jack.com/mycom2/noritan-stm8s-01-01.jpg"><img alt="STM8S-Discovery" title="STM8S-Discovery" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-01-01-400.jpg" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" width="400" height="300" /></a></span>
<u><strong><big>ライブラリを整備しよう</big></strong></u>
<p>
　TIM3 モジュールを使用するという方針を決めて，レジスタを直接操作するプログラムを書きました．ところが，これでは簡単にアプリケーションを作成するという目的から逸脱してしまいます．ほかにもっと簡単な方法はないでしょうか．
</p>
]]>
      <![CDATA[<u><big>ファームウェア・ライブラリをダウンロードしよう</big></u>
<p>
　実は，あります． <strong>STマイクロエレクトロニクス社</strong>（以下ST社）は，ファームウェア・ライブラリ（Firmware library: FWLib）というソフトウェア部品を提供しています．これを利用して，細かいレジスタ設定などは出来合いの関数にまかせてしまうことにしました．
</p>
<p>
　まず， <code>stm8fwlib.zip</code> という <strong>ZIP</strong> ファイルを <strong>ST社</strong> のWebページからダウンロードしてきます．この記事を執筆している時点では， <a href="http://www.st.com/products/support/micro/files/stm8sfwlib.zip">http://www.st.com/products/support/micro/files/stm8sfwlib.zip</a> にファイルがあります． <strong>ZIP</strong> ファイルを解凍して，適当な場所に配置します．この例では，作成したワークスペースの隣の <code>C:\Projects\STVD\stm8sfwlib</code> に配置しています．
</p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="ファームウェア・ライブラリ" title="ファームウェア・ライブラリ" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-01-41.png" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" width="400" height="300" /></span>
<p>
　<code>FWLib</code> というフォルダにライブラリのヘッダ・ファイルとソース・ファイルが入っています． <code>stm8s_fwlib_um.chm</code> というファイルは，ファームウェア・ライブラリのマニュアルです．また， <code>version.txt</code> には，ファームウェア・ライブラリのバージョン情報が格納されています．私が展開したものには， "V1.1.1 - 06/05/2009" と書いてありました．
</p>
<u><big>ライブラリ・ファイルをリンクする</big></u>
<p>
　展開したファームウェア・ライブラリは，プロジェクトから明示的にリンクする必要があります．リンクすべきファイルは，以下の表のとおりです．
</p>
<table border="1" cellpadding="5" cellspacing="1">
<caption></caption>
<tbody><tr><th>リンクするファイル</th><th>リンク先</th><th>用途</th></tr>
<tr><td>FWLib\library\inc\stm8s.h</td><td>Include Files</td><td>汎用ヘッダ</td></tr>
<tr><td>FWLib\library\inc\stm8s_tim3.h</td><td>Include Files</td><td>TIM3ヘッダ</td></tr>
<tr><td>FWLib\library\src\stm8s_tim3.c</td><td>Source Files</td><td>TIM3ライブラリ</td></tr>
</tbody></table>
<p><br />
</p><p>　リンクするためには，二つの方法があります．
</p>
<p>
　ひとつは，ワークスペース・ペインの <strong>Source Files</strong> フォルダ，または <strong>Include Files</strong> フォルダにこれらのファイルを Drag&amp;Drop する方法です． <strong>Explorer</strong> などで Drag&amp;Drop した場合，ファイルそのものがコピーまたは移動されてしまいますが， <strong>STVD</strong> の場合には，リンクだけが作成されます．
</p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="ライブラリ・ファイルのDrag&amp;Drop" title="ライブラリ・ファイルのDrag&amp;Drop" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-01-42.png" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" width="400" height="400" /></span>
<p>
　もうひとつは，ワークスペース・ペインの <strong>Source Files</strong> フォルダ，または <strong>Include Files</strong> フォルダを右クリックし，メニューから <strong>Add Files To Folder...</strong> を選びファイルを指定する方法です．この場合にもリンクだけが作成されます．
</p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="ライブラリ・ファイルを追加するメニュー" title="ライブラリ・ファイルを追加するメニュー" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-01-43.png" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" width="400" height="300" /></span>
<p>
　いずれの方法を使っても，ワークスペース・ペインの <strong>Source Files</strong> フォルダと <strong>Include Files</strong> フォルダにリンクされたファイルが並びます．
</p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="リンクされたライブラリ・ファイル" title="リンクされたライブラリ・ファイル" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-01-44.png" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" width="400" height="300" /></span>
<u><big>設定ファイルをコピーする</big></u>
<p>
　ファームウェア・ライブラリを使うためには，プロジェクトごとに <code>stm8s_conf.h</code> という設定ファイルが必要です．このファイルは，リンクするのではなく，ファームウェア・ライブラリに用意されているテンプレートをコピーして使います．
</p>
<p>
　<strong>Explorler</strong> を使って， <code>FWLib\project\stm8s_conf.h</code> にあるテンプレート・ファイルをワークスペース・フォルダ，この例では <code>C:\Projects\STVD\ws01\proj01</code> にコピーします．移動してしまわないように注意しましょう．
</p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="設定ファイルをコピーする" title="設定ファイルをコピーする" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-01-45.png" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" width="400" height="360" /></span>
<p>
　ファイルをコピーしただけでは，プロジェクトからリンクされません．ほかのライブラリ・ファイルと同様にワークスペース・ペインの <strong>Include Files</strong> フォルダにリンクします．
</p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="リンクされた設定ファイル" title="リンクされた設定ファイル" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-01-46.png" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" width="400" height="300" /></span>
<u><big>設定ファイルをカスタマイズする</big></u>
<p>
　次にコピーされたテンプレート・ファイルをこのアプリケーション向けにカスタマイズします．ワークスペース・ペインの <code>stm8s_conf.h</code> をダブルクリックすると，テキスト・エディタが開きます．デフォルトのままでは，ウィンドウが小さいので，最大化ボタンを押して大きくしましょう．
</p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.eleki-jack.com/mycom2/noritan-stm8s-01-47.png"><img alt="設定ファイルをテキストエディタで開く" title="設定ファイルをテキストエディタで開く" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-01-47-400.png" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" width="400" height="300" /></a></span>
<p>
　変更は，コメントになっているマクロ <code>_TIM3</code> の宣言を非コメント化することです．
</p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="_TIM3の宣言を非コメント化する" title="_TIM3の宣言を非コメント化する" src="http://www.eleki-jack.com/mycom2/noritan-stm8s-01-48.png" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" width="400" height="300" /></span>
<p>
　これで， TIM3 モジュールのライブラリが使えるようになりました．ファイルの編集が終わったら， <code>ctrl+S</code> でファイルを保存します．
</p>
<p>
　次回は，プログラムを仕上げます．
</p>
<div style="text-align: right;">田中範明（noritan.org）<br /><div align="left"><blockquote>2010/02/09 追加　STM8-Discovery：　<a href="http://akizukidenshi.com/catalog/g/gM-03457/">秋月電子通商で取り扱い</a>が始まりました。<br /></blockquote><br /></div></div>
]]>
   </content>
</entry>

<entry>
   <title>78KマイコンでLED温度計　 </title>
   <link rel="alternate" type="text/html" href="http://www.eleki-jack.com/mycom2/2010/02/78kled_4.html" />
   <id>tag:www.eleki-jack.com,2010:/mycom2//4.3928</id>
   
   <published>2010-02-05T04:00:06Z</published>
   <updated>2010-02-05T04:32:34Z</updated>
   
   <summary>● LED点灯のソフトウェア・ ダイナミック点灯ドライバ　LED温度計のダイナミ...</summary>
   <author>
      <name>yoshida</name>
      
   </author>
   
      <category term="78K" scheme="http://www.sixapart.com/ns/types#category" />
   
      <category term="78KマイコンでLED温度計" scheme="http://www.sixapart.com/ns/types#category" />
   
      <category term="エレキジャックNo.8付録で試す" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="5370" label="Applilet" scheme="http://www.sixapart.com/ns/types#tag" />
   <category term="5152" label="ダイナミック点灯" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://www.eleki-jack.com/mycom2/">
      <![CDATA[<b><font style="font-size: 1.25em;">● LED点灯のソフトウェア</font></b><br />・ <u>ダイナミック点灯ドライバ</u><br />　LED温度計のダイナミック点灯を制御しているソース・コードをリスト 1に示します。<br /><br />　ダイナミック点灯のソフトウェアは、Applilet2が自動生成した、Timer_user.cというファイル内のタイマ・モジュールTM50の発生する割り込み処理ルーチン内に作成します。Applilet2が生成したコードには、ユーザー・コードを記述する領域が確保されていて、その部分に対象のソース・コードを記述します。<br /><br />　リスト内、変数“DisplayDigit”は現在表示しているLEDの桁を記憶する変数です。この変数はstatic変数として宣言してあり、次に関数がコールされたときには、前回の値を記憶しています。関数BlankDisplay（）は、ブランク・タイム確保のための関数です。関数内ではすべての桁とセグメントを数10μSecの間OFFして終了します。<br /><br />　関数BlankDisplay（）ですべてのLEDがOFFになったところで、変数DisplayDigitが示す桁にswich文で制御が移ります。各桁の制御部分では、該当する表示DATAをセグメント出力ポートに出力した後、該当桁のコモン出力をONにします。このときのnONというマクロは「不論理のON」という意味で、“0”が定義してあります。<br /><br />　これで、該当桁の点灯制御は完了しました。次に制御する桁を変数DisplayDigitにセットして割り込み関数を終了し、次の割り込みで同様の処理を繰り返します。 ]]>
      <![CDATA[<pre>/*
**-----------------------------------------------------------------------------
**
**	Abstract:
**		This function is INTTM50 interrupt service routine.
**
**	Parameters:
**		None
**
**	Returns:
**		None
**
**-----------------------------------------------------------------------------
*/
__interrupt void MD_INTTM50( void )
{
	/* Start user code. Do not edit comment generated here */

	/* ７セグメントLEDダイナミック点灯ドライバ	*/

	static unsigned char DisplayDigit; // 現在表示中の桁
	
	BlankDisplay();		// ブランキング、全ての桁を消灯

	switch (DisplayDigit){	// 割込ごとに表示桁を移動してダイナミック点灯にする。
		case 0:
			SegmentPort = ~System.DisplayBuffer[0];
			DigitPort0		= nON;
			DisplayDigit	= 1;
			break;
		case 1:
			SegmentPort = ~System.DisplayBuffer[1];
			DigitPort1		= nON;
			DisplayDigit	= 2;
			break;
		case 2:
			SegmentPort = ~System.DisplayBuffer[2];
			DigitPort2		= nON;
			DisplayDigit	= 3;
			break;
		case 3:
			SegmentPort = ~System.DisplayBuffer[3];
			DigitPort3		= nON;
			DisplayDigit	= 4;
			break;
		case 4:
			SegmentPort = ~System.DisplayBuffer[4];
			DigitPort4		= nON;
			DisplayDigit	= 0;
			break;
		default:
			DisplayDigit	= 0;
			break;
	}
	
	/* End user code. Do not edit comment generated here */
}
</pre><div align="center">

リスト1　7セグメントLEDダイナミック点灯部（抜粋）<br /></div><br /><u>表示の整頓</u><br />　数値をLED表示する場合、表示器の桁数と表示する数の桁数が合わない場合があります。たとえば、4桁の表示器で3桁の数字「123」を表示する場合です。単純な数値変換プログラムで数値を表示DATAに変換する場合、表示器の表示は「0123」となり、最初の桁のゼロが余分についてしまいます。これに対し、最初の桁をブランク（無表示）にして「　123」と表示する処理を、“ゼロ・サプレス”といいます。<br /><br />　LED温度計に使用しているLM73は-40～+150℃までの広範囲の温度を計測できます。したがって、計測された温度に対して最適な表示フォーマットを選択するよう、プログラムで記述します。<br />&nbsp;<br /><br />

<pre>	
/* LED表示フォーマットルーチン　*/
void Set_DisplayData(long t)
{
	if(t &gt;= 1000){		// 100℃以上はXXX.X表示

		System.DisplayBuffer[3]=  DigitFont[t%10];
		t	= t/10;
		System.DisplayBuffer[2]=  DigitFont[t%10]+DP;
		t	= t/10;
		System.DisplayBuffer[1]=  DigitFont[t%10];
		t	= t/10;
		System.DisplayBuffer[0]=  DigitFont[t%10];
		System.DisplayBuffer[4]=  BLANK;

	}else if (t &gt;= 100){	// 10～99.9℃はXX.X℃
		System.DisplayBuffer[2]=  DigitFont[t%10];
		t	= t/10;
		System.DisplayBuffer[1]=  DigitFont[t%10]+DP;
		t	= t/10;
		System.DisplayBuffer[0]=  DigitFont[t%10];
		System.DisplayBuffer[3]=  DigitFont[0x0c];
		System.DisplayBuffer[4]=  DEGREE;

	}else if (t &gt;= 0) {	//0～9.9℃は X.X℃
		System.DisplayBuffer[2]=  DigitFont[t%10];
		t	= t/10;
		System.DisplayBuffer[1]=  DigitFont[t%10]+DP;
		t	= t/10;
		System.DisplayBuffer[0]=  BLANK;
		System.DisplayBuffer[3]=  DigitFont[0x0c];
		System.DisplayBuffer[4]=  DEGREE;

	}else if (t &gt; -100){	// -0.1℃～-9.9は-X.X℃
		t	= -t;
		System.DisplayBuffer[2]=  DigitFont[t%10];
		t	= t/10;
		System.DisplayBuffer[1]=  DigitFont[t%10]+DP;
		t	= t/10;
		System.DisplayBuffer[0]=  MINUS;
		System.DisplayBuffer[3]=  DigitFont[0x0c];
		System.DisplayBuffer[4]=  DEGREE;

	}else{			// -10℃以下は-XX.X
		t	= -t;
		System.DisplayBuffer[3]=  DigitFont[t%10];
		t	= t/10;
		System.DisplayBuffer[2]=  DigitFont[t%10]+DP;
		t	= t/10;
		System.DisplayBuffer[1]=  DigitFont[t%10];
		System.DisplayBuffer[0]=  MINUS;
		System.DisplayBuffer[4]=  BLANK;
		
	}
}
</pre><div align="center">

リスト 2 LED表示フォーマット・ルーチン<br /></div><br />　リスト 2はLED温度計の表示フォーマット・ルーチンです。温度DATAの範囲を5種類に分けて、それぞれフォーマットに従いLEDの各桁にDATAを割りつけていきます。リストのプログラムでは、100℃以上、-10℃以下の温度においては“℃”表示を消して数字のみの表示にしています。<br /><br /><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.eleki-jack.com/mycom2/2010/02/05/p8.jpg"><img alt="p8.jpg" src="http://www.eleki-jack.com/mycom2/2010/02/05/p8-thumb-300x194.jpg" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" width="300" height="194" /></a></span><div align="center">写真 8 LED温度計表示例<br /></div><div align="center">（写真左上より下へ）無計測時（初期設定時、LM73通信エラー時）、<br />120℃、24.5℃、4.5℃、0.8℃、0℃、-0.9℃、-35.9℃<br /></div><br />　写真 8はLED温度計の各温度における表示例です。このように温度に応じて表示フォーマットを変えて表示します。<br /><br /><div align="right">寺尾 大二</div>]]>
   </content>
</entry>

<entry>
   <title>XPortを使ったNetwork入門キット（14）</title>
   <link rel="alternate" type="text/html" href="http://www.eleki-jack.com/mycom2/2010/02/xportnetwork14.html" />
   <id>tag:www.eleki-jack.com,2010:/mycom2//4.3872</id>
   
   <published>2010-02-04T07:55:46Z</published>
   <updated>2010-02-04T07:03:28Z</updated>
   
   <summary><![CDATA[PIC16FシリーズをXPort03と接続しLANに接続する（4）&nbsp; ...]]></summary>
   <author>
      <name>kanzaki</name>
      
   </author>
   
      <category term="Xportとマイコン" scheme="http://www.sixapart.com/ns/types#category" />
   
   <category term="5269" label="Telnet" scheme="http://www.sixapart.com/ns/types#tag" />
   
   <content type="html" xml:lang="ja" xml:base="http://www.eleki-jack.com/mycom2/">
      <![CDATA[<p><font style="font-size: 1.25em;"><strong>PIC16FシリーズをXPort03と接続しLANに接続する（4）</strong></font><br />&nbsp; XPort経由の通信のテストを次のようにして行います。<br />&nbsp;&nbsp;&nbsp;&nbsp; １）イーサネット経由でPCからTelnetでXPortにアクセスします。<br />&nbsp;&nbsp;&nbsp;&nbsp; ２）XPortはイーサネット経由でPCから受けたデータをシリアル・ポートへ送信し、<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; シリアル・ポートから受信したデータをイーサネット経由でPCに送信します。<br />&nbsp;&nbsp;&nbsp;&nbsp; ３）PIC16F88は、XPortからのデータをシリアル・ポートで受信し、そのデータを<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;そのままシリアル・ポート経由でXPortへ送信します。<br />　PICに用意する、XPortの通信プログラムは次のようになります。MPLAB IDEでコンパイルし、PICkit3でPIC16F88に書き込みテストを行います。<br /></p>]]>
      <![CDATA[<blockquote>
<p>#include<br /> <htc.h>#include<br /> <stdio.h>#include "usart.h"<br />&nbsp;&nbsp; &nbsp;// ここまで必要なヘッダ・ファイルの読み取りの指示<br /> void putch(unsigned char byte) //　文字型(char）のデータを送信する関数 <br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;/* output one byte 送信レジスタが空になるまで待つ*/<br />&nbsp;　　 while(!TXIF)&nbsp;&nbsp; /* PIE1レジスタのTXIFレジスタをチェックする */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;continue; // 送信データをセットできるまで待つ<br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;TXREG = byte;&nbsp;&nbsp;&nbsp; // 送信データを送信レジスタにセットする。自動的に送信される<br /> } <br />unsigned char&nbsp; getch()&nbsp;&nbsp; //データ受信の関数<br />&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* RCIEレジスタをチェックし受信データを待つ */<br />&nbsp;&nbsp;&nbsp;&nbsp; while(!RCIF)&nbsp;&nbsp; /* set when register is not empty */ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue; return RCREG; // 受信データを関数にセットして戻る<br />&nbsp; }<br /> unsigned char getche(void)&nbsp;&nbsp; // 相手側にエコーバックしてデータを受信する <br />{<br />&nbsp;&nbsp;&nbsp; unsigned char c;<br />&nbsp;&nbsp; &nbsp;putch(c = getch());&nbsp;&nbsp; //　データを受信しそのまま相手に戻す<br />&nbsp;&nbsp; return c;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//　受信したデータを関数にセットして戻る<br /> }</stdio.h></htc.h></p></blockquote><br /><font style="font-size: 1.25em;"><strong>テスト結果</strong></font> 
<p>&nbsp; PICとXPortをシリアル・ポートで、XPortとPCをイーサネットで接続して通信のテストを行います。テストはPCでTera Termの端末ソフトを起動して、送信した文字が戻ってきて表示されるか確認します。<br />　Tera Termを起動すると、接続ポートの選択画面が表示されます。IPアドレスを設定して、Telnetを選択しTCPポートを10001にします。</p>
<p></p>
<p></p>
<p>
</p><span style="display: inline;" class="mt-enclosure mt-enclosure-image"><a href="http://www.eleki-jack.com/mycom2/kanzaki/LANTRONIX14010.jpg"><img style="margin: 0px auto 20px; text-align: center; display: block;" class="mt-image-center" alt="LANTRONIX14010.jpg" src="http://www.eleki-jack.com/mycom2/assets_c/2010/01/LANTRONIX14010-thumb-400x330.jpg" width="400" height="330" /></a></span>　デフォルトのままではラインフィードが行われませんので、改行コードでラインフィードも行われるように、CR+LFを選択します。
<p></p>
<p></p>
<p>
</p><span style="display: inline;" class="mt-enclosure mt-enclosure-image"><a href="http://www.eleki-jack.com/mycom2/kanzaki/LANTRONIX14020.jpg"><img style="margin: 0px auto 20px; text-align: center; display: block;" class="mt-image-center" alt="LANTRONIX14020.jpg" src="http://www.eleki-jack.com/mycom2/assets_c/2010/01/LANTRONIX14020-thumb-400x330.jpg" width="400" height="330" /></a></span>　これで、PCから入力した文字がPICまで送信され戻ってきて表示されます。Tera Termは漢字も処理できるようになっています。
<p></p>
<p></p>
<p>
</p><span style="display: inline;" class="mt-enclosure mt-enclosure-image"><a href="http://www.eleki-jack.com/mycom2/kanzaki/LANTRONIX14030.jpg"><img style="margin: 0px auto 20px; text-align: center; display: block;" class="mt-image-center" alt="LANTRONIX14030.jpg" src="http://www.eleki-jack.com/mycom2/assets_c/2010/01/LANTRONIX14030-thumb-400x329.jpg" width="400" height="329" /></a></span>　これで、PICとXPortがシリアル・ポートで接続できることが確認できます。また、XPortを利用するとPICからシリアルの入出力処理を書くだけでイーサネット処理ができます。<br />
<div style="text-align: right;">&lt;神崎康宏&gt;</div>
<p></p>]]>
   </content>
</entry>

</feed>
