- - PR -
プログラムでチャタリングを
防止するには
――ようやくプログラムが完成したと思ったのに、スイッチを何回か押すと、カウントが飛んでしまうという現象が起きてしまいました。健一君も頭を抱えています。そう、この問題は「チャタリング」と呼ばれるスイッチによって引き起こされる現象が原因です。ここでは、チャタリング対策について紹介していきます。
チャタリングとは、スイッチ接点の振動により、1回の入力にもかかわらず数回ON/OFFしたかのように、信号が発生してしまう現象をいいます。スイッチの接点は、機械的なものなので、ON/OFF時にこのような現象が生じてしまうのです。
チャタリングをタイムチャートで見てみると、図5のようなON/OFFの振動になります。前述のとおり、マイコンの処理速度は大変高速です。そのため、この振動を“スイッチが数回押された”ものとして処理してしまうのです。
![]() |
図5 スイッチ入力によるチャタリングの発生 |
さて、このチャタリングをどのように防止したらよいのでしょうか。その解答例を以下に示します(ソースコード3)。
/* SW1が押された回数を表示する。 |
| ソースコード3 チャタリング対策をしたプログラム |
| ▼ソースコード3のダウンロード(swcount_03.lzh) |
ここでもう一度、図5をご覧ください。このプログラムでは、図5の黄色で示した時間分、「wait」関数で時間を稼ぎ、チャタリングを読み飛ばしています。「wait」関数は、空のループにより、一定時間CPUの処理を浪費します。
|
|||||||||||||||
|
|||||||||||||||
|
|||||||||||||||
|
変数の記憶域はどこだ
――健一君のプログラム(ソースコード1)では、記述していないmemcpy関数が勝手に入っていました。なぜ、そのようなことが起こるのでしょうか? そこには、変数の記憶域をどのようにメモリに配置するかという、C言語の仕組みが絡んできます。
C言語では、関数の中で宣言される(staticなし)変数を、“自動変数”と呼びます。そして、この自動変数の記憶域は、“スタック領域”に設けられます。
スタック領域は、マイコンのRAMに位置しますから、記憶域が確保されたばかりの内容は“不定”です。そのため、初期値を持つ変数の場合、変数初期化のプログラムが挿入されるのです。
今回のプログラムの場合、
(1)main関数が呼ばれる
(2)char配列LEDの記憶域と、int変数countの記憶域をスタックに確保する
(3)memcpy関数により、char配列LEDの初期値をROMからコピーする
(4)main関数の処理がはじまる
となります。
さて今回は、memcpy関数のような標準Cライブラリ関数のリンクを、「-l」オプションを指定することで解決しました。
「-l」オプションで、「-lc」とすると、標準Cライブラリがリンクに加わります。また、「-lgcc」とすると、longとlongの割り算など、C言語の実行に必要なライブラリがリンクに加わります。さらに、H8マイコン用GCCは、H8マイコン・シリーズをサポートしているので、CPU指定のオプションも必要になります。一口に“H8マイコン”といっても、搭載されているCPUは数種類あります。ここでは、「-mh」オプション、「-mn」オプションを併せて指定することで、H8Tiny用のライブラリをリンクさせています。
| ▼コラム: static変数 | |
|
今回は、memcpy関数をリンクすることで、実行プログラムを作りましたが、そもそもmemcpy関数を使わないC言語プログラムの記述はできないのでしょうか? ここでは、静的変数(static変数)として変数を宣言する方法を紹介します。 関数内で変数宣言するとき、記憶クラス指定子「static」を付けると、その変数には静的記憶域が確保されます。 例として、
とすると、char変数LEDは静的変数になります。 静的変数は、プログラムの実行開始時に記憶域が確保され、1度だけ内容が初期化されます。 プログラム中でchar変数LEDに値が代入されることはないため、char変数LEDは、“読み取り専用(Read Only)”と解釈しても差し支えありません。ですからCコンパイラは、char変数LEDをROMに配置します。ちなみに、char変数LEDをグローバル変数としても同じ効果が得られます。 |
|
|||||||||||||||
|
|||||||||||||||
|
|||||||||||||||
|
|||||||||||||||
|
|||||||||||||||
|
|||||||||||||||
|
|||||||||||||||
|
晴子さんからの宿題(3) マイコン内蔵のタイマを使って、1秒間隔で「0」から「9」の数字を7セグメントLEDに巡回表示するプログラムを作ってね。くれぐれも時間は正確によ! |
◇
今回は――スイッチの状態をとらえる(レベル・センス)のか、スイッチのON/OFF変化をとらえる(エッジ・センス)のか――、スイッチ入力にかかわるプログラミングを解説しました。また、変数の記憶域がRAMかROMか、どこに、どのように確保されるのか、C言語プログラムの機能を解説しました。これらは、マイコン制御プログラミングの基礎中の基礎です。ここでしっかりとマスターしてください。
さて、次回は「H8マイコンの周辺機能・タイマ」を紹介します。併せて、「割り込みプログラム」についても解説する予定です。ご期待ください!(次回に続く)
関連記事 半導体/エレクトロニクス
- 連載:イチから作って丸ごと学ぶ! H8マイコン道
- 特集:組み込みシステムに吹く“仮想化”の風
- 連載:組み込みマルチコア進化論(連載中)
- 連載:必修! FPGAタイミング解析の基礎(全5回)
- 連載:−ザ・組み込み−ソフトウェアのハードウェア化(連載中)
- 連載:S08ではじめるマイコン制御プログラミング(全6回)
- 連載:マイコン制御基礎の次(連載中)
- 連載:マイコン制御基礎の基礎(全10回)
- 連載:マイコン制御基礎以前(全10回)
- 連載:H8で学ぶマイコン開発入門(全13回)
- 連載:触って学ぼう FPGA開発入門(全6回)
- 連載:FPGA開発テクニック、チューニングの心得(全6回)
- 特集:いまさら聞けない FPGA入門
- 連載:バラして納得! 電子部品入門(全18回)
- 連載:完全マスター! 電子回路ドリル III(全14回)
- 連載:完全マスター! 電子回路ドリル II(全25回)
- 連載:完全マスター! 電子回路ドリル(全25回)
- 目指せ! 電子回路マスターへの道
- 目指せ! 電子回路マスターへの道 Part2
- 分かっておきたい、IP活用の落とし穴
組み込み開発フォーラム 新着記事
- フルスクラッチの“Hello World”を動かしてみよう(2011/3/31)
- FlexRayプロトコルの概要(その2)(2011/3/29)
- JASA、東北地域に拠点を置く会員企業を支援(2011/3/25)
- NEC、震災の影響を受けた4拠点の生産再開を発表(2011/3/23)
- 内部ブロック図の基礎と共通要素(2011/3/22)
- インテル、被災地におけるITインフラの復旧を支援(2011/3/22)
- Facts on AUTOSAR/AUTOSAR導入の現実(2011/3/18)
- 計測器・震災被害ホットラインを開設、テクトロニクス(2011/3/18)
- ZMP、地震の揺れを多角的に計測するアプリ無償配布(2011/3/16)
- メンター、3Dテレビ・マルチメディア検証プラットフォーム(2011/3/16)
- 【番外編】タチの良い計測値、悪い計測値とは?(2011/3/15)
- tarファイルシステムをAndroidに組み込む!!(2011/3/10)














