マイクロコントローラーの基本を探る

問題を排除するために楽器を試してください





マイクロコントローラーICの優れている点の1つは、世界中のほぼすべての地域と電子小売店で入手できることです。

前書き

基本的に、マイクロコントローラデバイスは、周囲の環境の評価を含むアプリケーションや同様の電子機器で広く使用されています。



これらのデバイスは、モーター制御アプリケーション、LED照明、傾斜センサー、加速度計、速度計、データロガー、温度コントローラー、キーボードなどのさまざまなタイプのセンサーで、特定のパラメーターを表示するために使用されています。

マイクロコントローラーに関する主な理解は、チップ内のコンピューターと呼ばれることもあるほど高度なAVRAmega32マイクロコントローラーを参照することで得られます。



このデバイスは、プログラムを形成するための一連のコマンドを実行するように割り当てられています。

ここに表示されるプログラムの言語はC ++です。このコースでは、この言語をより深く学ぶことができます。

MCUに関しては、すべてのピン配置を制御および構成するオプションを利用できます。

これに少し疲れている場合は、冷やすだけで複雑なことは何もありません。前進するにつれて、すべての側面を着実に、しかししっかりと緩和されます。

MCUチップでは、チップの電源ピンであるVddとVssを除くすべてのピンに、排他的な指定を割り当てることができます。

ピン配置の詳細

チップを上から見ると、小さな三角形のノッチがあります。これは、ピン配置が始まるポイントから、チップの#1ピンがこのノッチのすぐ下から始まることを示しています。

このピンから始めて、その側の下部(左)に20個のピンがあり、反対側(右)にさらに20個のピンがあり、右側の下から上に続いています。

ここでのすべてのプログラムはインデックスゼロで始まるため、ノッチから始まる最初の8ピンはICのインデックスピンを形成するPBO-7です。

上記の一連のピン配置はポートBと呼ばれますが、AからDに割り当てられた他の同一のポートのセットがあります。

これらのポートは、INPUTと呼ばれるフィードデータを受け入れて認識するように、またOUTPUTと呼ばれる特定の形式でデータを送信するように割り当てることができます。

一般的なカテゴリに含まれる2つのピンは、(+)/(-)ピンであり、VddおよびGNDとも呼ばれます。

ポートD(PDO-6)からの1つのピンは、チップの左側の下部にあります。

ポートDのピン#7であるPD7は、スタンドアロンで、右側の一連のピン配置を開始してトレースできます。

ここで、ポートDが終了するチップの右側から移動すると、ポートCは順番にカウントを開始します。

これらは、アナログからデジタルまで、MCUの多くの興味深いピンに貢献しています。

これらのピンは、外部で構成されたアナログ回路ステージを介して多くのパラメータを検出するための検出入力になるように機能します。

上記のピンはポートAを構成します。

上記のピン間のアナログからデジタルへの変換は、サーミスタなどの通常のセンサーを使用して検出されたアナログ温度レベルが、MCUによって容易に受け入れられて変換されるPORTAピンの1つに適用される例の助けを借りて理解できます。華氏0度から255度までのデジタル読み出しを生成します(10ビット出力を実現するためにアップグレードできる8ビットの数値)。

さらに、MCUで確認できる別の機能は、使用可能なプログラミングスペース、またはマイクロコントローラーに指定された変数とプログラムのスペースを決定するメモリです。

これに加えて、MCUには、関連するパラメーターをカウントするために割り当てられた組み込みクロックがあります。

クロック機能により、MCUは、特定のデバイスの仕様に応じてマイクロ秒の範囲で高速になり、必要な範囲で低速になる可能性がある多くの異なるカウントプロセスに適用できます。

これまでに、マイクロコントローラーの概念とそのポートとピンについてある程度理解しているかもしれません。

プログラマーからマイクロコントローラーへのSPIコネクターを作成する方法

それでは、このテーマについてもう少し深く掘り下げて、プログラミングの世界を調査しましょう。

そうは言っても、チップへのプログラムのロード手順にふける前に、SPI(シリアルペリフェラルインターフェイス)コネクタをMCUと統合する適切な方法を見つける必要があります。

ただし、この後でも、SPIをMCUのピン配置にプッシュすることはできません。 SPIからの延長ワイヤーをパンボードに直接挿入することもできません。これにより、誤った配線設定が誤ったピンに接続され、接続が正しくなくなる可能性もあります。

したがって、物事を完全に非の打ちどころのないものにするために、「ヘッダー」とも呼ばれる必要な接続金属ピンをはんだ付けする小さなベロボード上で手順を実行します。これらのヘッダーピンは、SPIコネクタとの接続に使用できるようになりました。このヘッダーからの接続は、ブレッドボード接続に使用できる別の並列ヘッダーピンに終端することができます。

したがって、上記のアセンブリは、SPIからMCUへのぴったりとした信頼性の高い中間接続プラットフォームを形成します。

今まではすべてが完璧に見えたので、PCとMCUの間に必要なプログラマーについて稼ぎましょう。

これらのプログラマーユニットを製造および販売している企業は多数存在する可能性があるため、Adafruit Industries、USBtinyISP、Sparkfunなど、これらのプログラマーユニットの調達は問題になりません。

これらのいくつかは、従来のタイプとは完全に異なって見える可能性がありますが、基本的にすべてが同一であり、標準のプログラミングルールに従い、PCとAVRマイクロコントローラー間のインターフェイスとして使用できます。

ただし、AVR Atmega32ではなく他のMCUを使用している場合は、その特定のMCUチップに対応する互換性のあるプログラマーを確認する必要があるかもしれません。

これらのプログラマーのかなりの数が同一のドライバーを使用していることが観察される場合があります。何かを処理する必要があります。これについては、次の章で詳しく説明します。

PCをマイクロコントローラーチップに接続することは本当に基本的なことであり、これに必要な手順がいかに簡単であるかを知って喜んでいただけることでしょう。さっそくボタンを押しましょうJ

上で説明したSPIインターフェースボードを作成することは難しくありません。小さな汎用ボード上のピンの2つのヘッダー列にまたがるすべての接続を介してはんだごてを機能させることがすべてです。

上の図は、ヘッダー間のワイヤを相互接続する際に従う必要のある接続の詳細を示しています。

物事をさらに簡単にするために、上の画像を参照して、同じものについて次の接続の詳細を見ていきましょう。

左上から始まるSPIピンは「マスターIN、スレーブOUT」(MISO)に接続されます

左中央からのSPIピンはクロックピン(SCK)に接続します

左下のSPIピンはリセットと結合します。 (このピンについては、次のチュートリアルで詳しく学習します)

右下に関連するSPIはMCUのGNDピンに接続します。GNDはゼロ電源ラインまたは電源の負(相対)レールを形成するピンを指します。

右中央のヘッダーから終端するSPIは、MCUの「マスター出力、スレーブ入力」(MOSI)ピンにリンクします。

右上のヘッダーから出てくるSPIは、MCUの(+)に接続されています。これは、明らかにVddまたはMCUの正の電源ピンです。

それでおしまい。

説明に従って2つのコネクタを接続すると、SPIインターフェイスボードで必要なアクションを実行できるようになります。

さらにヘルプが必要な場合は、上記の図を参照してください。上記の説明を参考にしてすべての配線接続が適切に行われた後、最終的なインターフェイスボードは次のようになります。

前のチュートリアルで説明したように、すでにSPIインターフェイスを構築していることを願っています。今度は、PCとMCUの間に統合する必要のあるプログラマーをコンピューターが受け入れるようにします。

MCU用の簡単なプログラミングコードの作成

コンピューターとマイクロコントローラーをリンクするために、Sparkfunから入手可能なUSBTinyISPユニットを使用します。

Windowsなどのコンピューターオペレーティングシステムにはドライバーが必要であり、ドライバーがないとコンピューターに何かをロードすることはできません。したがって、プログラマーはコンピューターにロードするためにドライバーが必要になります。

コンピューターのOSにドライバーをインストールするために必要な手順を見てみましょう。ここでは、32ビットまたは64ビット仕様のWindows 7OSの例を取り上げます。

sparkfun.comを開き、「ポケットAVRプログラマーページ」をクリックします。リンクはページ内で簡単に視覚化できます。

次に、ドキュメントの下にある「Windowsドライバ」を見つけてクリックします。

これにより、コンピューターにpocketprog-driver.zipファイルが提供されます。

コンピューターに移動し、ダウンロード場所を見つけて、ダウンロードしたファイルをフォルダーに解凍します。

コンピューターが64ビットOSの場合は、以下に示す手順に従う必要があります。32ビットOSの場合は、解凍したファイルから直接インストールを開始できます。

64ビットの場合は次の手順に従います。32ビットの場合は単に無視します。

グーグル「libusbsourceforge」とこのリンクの最新バージョンをクリックしてください。

いくつかの追加ファイルに出くわすでしょうが、bibファイルを見つけることに興味があるでしょう:libusb-win32-bin-#。#。#。#。zip

次に、コンピュータでこのダウンロード場所を見つけて解凍し、いずれかのフォルダに保存します。

このフォルダーに移動し、binフォルダーに移動して、amd64フォルダーに進みます。

ここには、ghcalledlibusb0.dllおよびlibusb0.sysという2つのフォルダーが表示されます。

これらの名前をlibusb0_x​​64.dllおよびlibusb0_x​​64.sysに変更することをお勧めします。

次に、上記のファイルをpocketprog-driverフォルダーにコピーする必要があります。既存のバージョンのファイルを上書きするだけです。

上記のドライバーをインストールするには、そのタイプではかなり型破りな次の方法に興味があります。

これは「レガシーハードウェアの追加」モードです。

「スタートメニュー」をクリックします

次に、「コンピュータ」を右クリックして続行します

「管理」をクリックし、最後に「デバイスマネージャ」をクリックします

次に、メニュー内で「レガシーハードウェアの追加」を選択します

ウィザードが挿入されるまで、「次へ」を押し続けます

指示に従って、「詳細リストから選択する必要があるハードウェアをインストールする」をクリックします。これにより、その特定の選択にラジオボタンアイコンが表示されます。これは実際にはWindowsのコントロールボタンであり、丸みを帯びた青いファイリングが入った小さな円のように見えます。

「次へ」をクリックするだけです

これにより、クリックする必要のある「すべてのデバイスを表示」メニューが表示されます。

この後、「ディスク使用」アイコンをクリックします。

「参照」アイコンを使用して、pocketprog-driverフォルダーの場所に移動します。選択が正しく行われた場合は、その特定のフォルダーに配置されたpocketprog.infファイルを視覚化できます。

このファイルをダブルクリックすると、ドライバーがPCにインストールされるのを確実に確認できます。

何度も!次のページの次のチュートリアルに進みましょう。

これで、必要なソフトウェアをインストールし、SPIインターフェイスを構築した可能性があります。

プログラムをマイクロコントローラーチップに転送する方法

次のステップでは、目的のアプリケーション用に、ブレッドボード、LED、計算された抵抗などのいくつかのコンポーネントが必要になります。

このセクションでは、プログラマーのテスト方法を学び、関連するドライバーとソフトウェアのインストールを確認します。

ドライバとソフトウェアが正しくインストールされているかどうかを確認するために、avrdudeと呼ばれる簡単なプログラムを実装します。

AVRdudeは、最新のWinAVRインストールに関連付けられたプログラムであり、これがないと、ファイルをMCUに実際に転送することはできません。

このプログラムは.hexファイル形式であり、必要な実行についてMCUが本質的に理解できるようになります。

検証が成功しなかった場合、プログラマーはファイルの転送を行うことができなくなります。

次の手順を使用して、テスト手順を実装する方法を簡単に見てみましょう。

「スタートメニュー」をクリックし、表示された検索ボックスにcmd.exeと入力して、DOS(ディスクオペレーティングシステム)プロンプトを開きます。

これで、DOSプロンプトでavrdude –c usbtiny –p m32と入力するだけで、AVRdudeを実行できます。これが実装されるとすぐに、DOSは接続が成功したかどうかを即座に確認します。

上記のコマンドで、「-c」は「usbtiny」プログラマーパラメータ指定を含む通知フラグであり、「-p」タグはマイクロコントローラーデバイスを識別します(「m32はAtmega32を示します)。

別のMCUを使用した場合は、実装に関連するプレフィックスを含める必要があります。

上記の手順が完了したら、DOSプロンプトで「exit」と入力すると、ウィンドウの外に移動します。

実際のプログラミングの詳細について真剣に疑問に思っている場合は、MCUからの応答を確認するシステムがない限り、プログラミングを実行できる外部アナログLED回路をはんだ付けして構築する必要があります。マイクロコントローラの実行はまったく意味がありません。

LEDボードの作成は非常に簡単です。それは、LEDの2つのリード線をベロボードにはんだ付けし、抵抗をLEDのリード線の1つに接続することです。このLEDの役割は、LEDへの電流を制限して、MCU出力からの過剰な電圧と電流が原因でLEDが燃え尽きないようにすることだけです。

抵抗の値は、次の簡単な式を使用して計算できます。

R =(Ub-LEDfwd)/ I

ここで、Ubは供給電圧、LEDfwdは使用されるLEDの最適な動作電圧、Iはその最適なアンペアです。

LED順方向電圧= 2.5Vおよび電流I = 20mAのREDLEDを使用すると、上記の式は次のように解くことができます。

MCUからの電圧は5Vになるため、次のように表すことができます。

R =(5 – 2.5)/。02 = 125オーム、¼ワット、最も近い値は120オームで十分です。

これで、LED、120オームの抵抗、ベロボードができました。図に示すように、上記のコンポーネントをマイクロコントローラーと相互接続するだけです。

これが行われると、MCUは上記のLEDセットアップで意図された応答のためにプログラムされる可能性があります。

次は、MCUのプログラミングです。

マイクロコントローラがいくつかの意味のある実装を実行できるようにするには、MCUに適切な命令を書き込むことが不可欠です。

プログラミング環境をインストールしてWinAVRを調査する方法

このために、おそらくPCで独自の「テキストエディタ」を使用できますが、通常のテキストエディタの代わりに、より専門的な「プログラミング環境」を使用することをお勧めします。このアプローチでは、いくつかの機能を楽しむことができます。この「プログラミング環境」パッケージに組み込まれた興味深い機能。

さまざまな言語を使用したプログラムの作成と編集をサポートし、マイクロコントローラーチップで簡単に理解して受け入れられる成果物モードにコンパイルします。

最終的に、これはWinAVRによってサポートされ、関連するMCUチップに転送されます。

WinAVRは、プログラムのトラブルシューティング、構文の可能性についての警告、ミスやエラーのコンパイルなど、他の多くの操作を実行するために装備することもできます。これらについては、後のチュートリアルで説明します。

WinAVRのインストールコースは非常に迅速で迅速です。次の点について詳しく見ていきましょう。

WinAVRソースフォージファイルフォルダから最新バージョンをダウンロードする必要があります。あなたはその公式ウェブサイトからこのダウンロードに関連するいくつかの有用な情報に出くわすでしょう。

ダウンロードを実行するかどうかを確認できるように、セキュリティクエリが表示されます。これは、ダウンロードするファイルが実行可能ファイルであるかどうかを確認するためのものです。

ファイルをダウンロードし、クリックして実行プロセスを開始します。インストールを開始しましょう。

このプロセスでは、いくつかの回答可能な質問を案内します。これにより、快適にインストールを合理化できる場合があります。これらの多くをデフォルトの形式で無視することをお勧めします。アクションに最も適していると思われるものを選択するのはあなた次第です。

今まで、あなたはすべてが非常に普通で簡単なことであり、スタートメニューがあなたに投げられているいくつかのオプションを見つけるでしょう。心配はいりません。実際に「プログラマーメモ帳」という名前のtemの1つだけを使用しているのはそのうちのいくつかだけです。

このアイコンをクリックすると、ユーザーインターフェイスが開始され、プログラムの作成(作成や編集など)を適用できるようになります。また、コードをコンパイルしてマイクロコントローラーに埋め込むのに役立つメニューコマンドで構成されるプログラムを目にすることもあります。

上記のプログラマーメモ帳の基本的な仕事は、人間が読めるコードを、MCUだけが理解できる一連の命令に変換することです。

次のチュートリアルでは、上記のプログラマーのテストについて説明します。これにより、Windowsとの互換性、およびマイクロコントローラーICと完全に「握手」するかどうかを確認できます。

LEDをオンにするためにMCUをプログラムする方法

これが確認されたら、コード転送の手順でエラーが発生しないようにするために、小さな「何もしない」コードの作成に進みます。

もちろん、これで最初のプログラムをMCU内に実装する準備が整いましたが、その前に、前のチュートリアルの過程で行ったことを簡単に要約するのは興味深いことです。

ここでは、必要な仕様に従ってAVR Atmelマイクロコントローラーを調達し、図にはATMega32を使用しました。次に、マイクロコントローラーの基本と、プログラムをMCUチップに転送するプログラマーユニットについて学習しました。

さらに、プログラミングアクションのためにコンピュータをマイクロコントローラにリンクできるようにするために不可欠なSPインターフェイスコネクタを構築しました。

この後、32ビットおよび64ビットオペレーティングシステムのコンピューターにドライバーが正しくインストールされているかどうかを確認しました。

次に、Win AVRと呼ばれるプログラミング環境をインストールして、コードをマイクロコントローラーに簡単に書き込み、転送できるようにしました。次に、PCとマイクロコントローラーが相互接続されたプログラマーを検証するためのavrdudeを実装しました。

最後に前の章で、LED /抵抗回路の構築を完了し、関連するMCU出力に接続しました。

それは確かに多くの作業ですが、それでもすぐに実際のプログラミングに取り掛かる時が来ました!

まず、マイクロコントローラーを3つのカテゴリーに分けたいと思います。これにより、理解が大幅に簡素化されます。

制御、検出、および通信

上記の関数をさまざまな方法でプログラムできることを知っておくと興味深いでしょう。

最初のプログラムでは、マイクロコントローラーに外部パラメーターを「制御」するように命令しようとしました。そうです、最近作成したLEDです。

正確には、接続されたLEDをオンにするようにMCUに指示します。これは非常に原始的に見えることはわかっていますが、開始フェーズは常に簡単である必要があります。

現在の仕事を進めると、MCUにLEDを制御させるのは実際には非常に簡単です。

このために、ポートBのピン#0に、LEDに必要な5Vを生成するように指示します。

前のチュートリアルを思い出してください。LEDのアノードをMCUの上記のピンに接続しました。

MCUのこのピンにアドレス指定する必要がある2つの重要なものがあります:1)出力と2)5ボルト

特定のピンにMCUの出力になるように指示する方法を学習します。

チップの出力に設定されたら、アプリケーションの必要に応じて「高」(5V)または「低」(0V)のいずれかにするように指示する場合があります。

MCUなどの任意の論理回路のピンは出力または入力を枯渇させる可能性があり、論理ハイまたは論理ローのいずれかを生成するように構成できるため、ピンは論理ハイまたは論理ローのいずれかに割り当てる必要があります。 、マイクロコントローラーまたはデジタルICのこれらのいくつかの状態以外に、中間状態または未定義の状態はありません。また、MCUのすべてのピンにも同じことが当てはまります。

入力ピンと出力ピンの割り当てに関しては、入力は外部アナログステージからの信号を受け入れるように配置され、出力はこれらを指定された論理状態または周波数に解釈する役割を果たします。

上記の割り当てはさまざまな方法で実行できますが、簡単にするためにそのうちの1つについて説明します。ただし、今提示するものは簡単で興味深いように見えますが、それほど実行可能ではなく、すべてのMCUアプリケーションに推奨されるタイプではないことに注意する必要があります。同じ理由で、コースの後半でより一般的なプログラミング方法を紹介します。 。これらのプログラムでは、他の機能を実行するためにすでに割り当てられている可能性のある他の隣接するピンに影響を与えることなく、仕様に従って必要なピンのみを割り当てることができます。

ただし、現時点では、他のピンについてはそれほど気にせず、関心のある関連するピンのみを使用して、ある程度の複雑さを回避します。

ピンを出力として割り当てるには、データ方向レジスタ(DDR)を使用する必要があります。ここでのレジスタの意味がわからない場合は、マイクロコントローラが特定の方法で応答できるようにするのは、MCU内の単なるスペースです。

DDRを使用して、「出力」のようなデータを送信するか、「入力」の形式のデータを受け入れるようにピンを設定できます。

しかし、あなたはその言葉に関して混乱するかもしれません、これは何を意味しますか?データは、論理ゼロ(0V)または論理高(5V)で連続的に割り当てられるピンに3番目の次元を追加しますが、パルスの周波数など、急速に変化する可能性のある信号についてはどうでしょうか。周波数には、特定の間隔または周期で振動する高低ロジック(5Vおよび0V)が伴うため、時間指向になり、時間に対して調整される可能性があります。そのため、「データ」として識別します。別の関数(論理状態と時間)に関連する関数。

pin0を出力として割り当てる1つの方法は、次のコードを記述することです。

DDRB = 0b00000001

上記のプログラムでは、DDRBはポートBのデータ方向レジスタを意味します0bは、次の数値の2進式に関してコンパイラに指示し、式の最後の「1」はpin0の位置、つまりフォーム内の位置を示します。ポートBの最初のピンの。

ポートBが8つのピン(0からピン7まで)を関連付けていることを覚えている場合、上記のコードにも8桁が含まれていることに気付いた場合、各桁はポートBのこれらの8つのピンを示します。

次の手順は、このピン(pin0)に5Vを割り当てることです。この場合も、動作原理は、次のバイナリコードで表される上記のDDRと同じです。

PORTB = 0b00000001

ご覧のとおり、上記のコードと以前のコードの唯一の違いは、このコードではPORTレジスタを使用していることです。このレジスタは、MCU内に配置されている特定のポートのピン割り当てを具体的に処理します。したがって、これらのピン配置に実際のデータロジック(0または1)を割り当てることができます。

今、私たちは私たちのプログラムのおおよその詳細に関していくつか議論することに興味があるかもしれません。すべてのプログラムが実行を開始するために特定のスペースを必要とすることがわかっているので、これは、特定のレシピに関するすべての材料を知っているが、どこから始めればよいかを指示されていないシェフと比較できます。

ここでの「メイン」関数は、各C / C ++プログラムが実行を開始する場所です。したがって、メインは次のように作成できます。

int main(void)
{{
}

ただし、プログラムがDDRおよびPORTレジスタの詳細とMCUチップ内でのそれらの機能を解釈できるようにするには、AVRMCUに関するすべてのデータで構成される追加のステートメントを含める必要があります。おそらく、このインクルージョンをすべてのプログラムに追加したいと思うでしょう。

#include
int main(void)
{{
}

コンパイルが開始されるとすぐに、コンパイラのプリプロセッサセクションは「io.h」ファイルを識別するためにAVRディレクトリに焦点を合わせます。ここでの拡張子「.h」は、それがヘッダーファイルであることを示し、ファイル内のこのコードは、作成されるソースファイルの先頭(head)に導入されるため、「header」という名前になります。

ここでは、DDRステートメントとPORTステートメントをコードに導入できます。これは、io.hヘッダーファイルを追加すると、それらに関してコンパイラーに指示されるためです。

#include

int main(void)

{{

DDRB = 0b00000001 //データ方向レジスタはpin0を出力に設定し、残りのピンを入力として設定します

PORTB = 0b00000001 // pin0を5ボルトに設定

}

上記は、5Vの大きさのpin0の方向を出力として固定しています。ただし、このピンについてはまだ決定されていない問題が1つあります。それは、MCUの電源が入っている限り、このピンを無期限にオンにするように指示されていないことです。この無限のフィードバックループにより、MCUからのこのピンがオフに切り替わることはなく、5V出力が無期限に継続します。

ピンにループ命令を適用する方法はたくさんありますが、ここでは「while」ループを使用してみます。名前が示すように、「while」ループは、「while」電力が利用可能であることをマイクロコントローラーに通知し、割り当てられたピン配置に割り当てられた5Vでアクティブ化されたままにする必要があります。

#include

int main(void)

{{

DDRB = 0b00000001 //データ方向レジスタはpin0を出力に設定し、残りのピンを入力として設定します

PORTB = 0b00000001 // pin0を5ボルトに設定

while(1)

{{

//何度も何度も実行する必要がある場合、コードはここにあります...無限に

}

}

ここでは、「0」以外はすべて論理的な「真」と見なされる可能性があるため、「while」ループの引数の形式で「1」を使用していることに注意してください。

つまり、「while」ループの考慮事項は、論理的な「true」以外の責任を負わないことを意味します。つまり、特定のピンが指定された状態で無期限にラッチします。

MCUがVddとVssで電力を受け取っている限り、割り当てられたピンでLEDが永続的にオンになるのを確認できます。

これで、私たちが望んでいた結果が得られ、最終的には多くのハードワークの後にそれが起こっているのを見ることができますが、それでも私たちのハードワークの甘い結果を見るのはとても満足です。

次のチュートリアルでは、上記のLEDに「時間」ディメンションを追加する方法、つまり、特定の指定された速度で点滅させる方法を学習します。

実際、上記の実装では、LEDは実際に点滅していますが、ループレートが非常に速いため、LED照明の永続的なスイッチオンのようです。

LEDをその遅延速度で点滅させるために、必要に応じてこのループを遅延で追加する方法を見ていきます。

AVRマイクロコントローラーを使用してLEDを点滅させる方法

前回のディスカッションでは、マイクロコントローラーでLEDスイッチをONにする方法を学びましたが、それはすごかったですね。そんなに多くないかもしれません!

ここでは、双方向機能を使用して上記のLED照明にスパイスを加える方法を学習します。つまり、指定された周波数または速度で点滅または点滅させようとします。また、ユーザーの希望に応じてこのレートを増減する方法についても説明します。

これを見てみましょう:

#include

#include

int main(void)

{{

DDRB | = 1<< PINB0

(1)

{{

PORTB ^ = 1<< PINB0

_delay_ms(100)

}

}

上記の式で使用されている奇妙な記号(&、^、|など)に困惑している場合(&はありませんが、他の同様のコードで使用できます)、これらについて知りたい関連情報を以下に示します。 :

これには、上記のコードで通常使用されるAND、OR、NOT、XORなどの多くの標準論理アルゴリズムが含まれています。

これらの論理機能は、割り当てられた真理値表に従って2つのビット「1」と「0」を具体的に比較します。

次のビット配置を分析することでアイデアが得られます。

01001011&
10001101
等しい
00001001

上記のコードでは、&はCプログラミングで使用されるANDを指します。

行を垂直方向に読み取ると、0と1が0に等しく、1と0も0に等しく、0と0が0に等しく、1と1が1に等しいことがわかります。読み取りはそれと同じくらい簡単です。これらは、AND演算子の真理値表によるものです。

次の表を評価すると、記号「|」を示しています。 「OR」機能の使用を示す「|」コンピュータのキーボードの「バックスペース」のすぐ左側にあります。

01001011 |
10001101
等しい
11001111

同様に、OR論理機能のこの真理値表は、ビット0または1が1に等しく、1または0も1に等しく、0または0が0に等しく、1または1が1に等しいことを示しています。

次のビットの組み合わせは、^で示されるXOR論理演算子用であり、AND、OR真理値表で行ったのと同じように調べることができます。

01001011 ^
10001101
等しい
11000110

それでは、最初のプログラムを続けて、その中の次の行が何を意味するかを学びましょう。

#include

以前のチュートリアルでは、式がどのように機能するかを知っているので、繰り返しませんが、#includeで表される新しい「インクルード」のようであり、調査する必要があります。

この「インクルード」では、delay.hにより、いくつかの簡単な実装方法が可能になります。

名前が示すように、delay.hを使用すると、特定のプログラムで遅延を引き起こすことができます。

次の式intmain(void)は、以前の投稿ですでに説明しているため、進行中の議論から省略できます。

次は、変更されたDDRBです。

以下は、0から7までのすべてのピンが入力を形成するように切り替えられたため、ピンを割り当てるためのより良い方法ではない以前の形式を示しています。しかし、他の機能のためにこれらのピンを必要とするより長いプログラムを作成したい場合はどうなるか想像してみてください。たとえば、アプライアンスのリモートスイッチングを適用するには、pin2が必要になる場合があります。その場合、試行錯誤だけで入力と同じものを割り当てることはできません。これは、リモート送信機からアプライアンス受信機への誤った応答を意味する可能性があります。

DDRB = 0b00000001

むしろ、バイナリマスキングを介して実行できる「OR」機能を一瞥して、1ビットのハットpin0ビットに影響を与えたいと考えています。

DDRB = DDRB | 0b00000001

ここでは、「OR」マスク:0b00000001で覆われていますが、これは本物の2進数のように見えますが、たとえば以前のDDRB:0b01001010の場合、マスキングを介してこれにORを適用すると、次のようになります。 0b00000001 = 0b01001011。

目撃できるような結果の違いは、ビットが変更されたpin0のみです。

上記のステートメントをC ++でさらに圧縮すると、次のようになります。

DDRB | = 0b00000001

ただし、特定のプログラムにはさらに多くのものがあることがわかりました。非常に正当で明白に見えるかもしれませんが、特に私たちの便宜のために基本的に作成されている場合は、io.hヘッダーファイルからのステートメントのいくつかを利用する必要がありますか?

したがって、「DDRB | = 1<< PINBO, why it’s like that?

1<< PINBO is implemented for applying the masking effect. The “1” indicates what may be introduced inside the mask, while the < < is simply the left shift functionality. It executes exactly as it’s named, and PINBO is the number of locations that the “1” would sequence across the left hand side. To be precise PINBO may be equivalent of a 0.

したがって、0b00000000から始めて、「1」を入力して0b0000001を生成し、それを左0の位置に転送します。これにより、上記とまったく同じ0b00000001が得られます。

ここで、PINB4であるとすると、ステートメントは1として表すことができます。<< PINB4. I this case the “1” would be pushed to the left 4 locations producing: 0b00010000.

「1」の後に4つのゼロがあることを意味するゼロインデックスを使用していることに注意してください。

ここで、以前に「無限ループ」を横切って注目していた「while」ループに進みます。しかし、おそらく今、マイクロコントローラーに必要な実行のいくつかを実装させたいと考えています。これは、指定されたループ内でのみ実行可能である可能性があります。これは、特定のシーケンスが何度も繰り返されるループです。

実行がループの前に配置される場合、それは一度だけ実装されます。

ただし、LEDを無期限に点滅させるには、ループ内でPINB0を交互にオン/オフに切り替える必要があります。ここでは、遅延が発生していることもわかります。遅延がないと、LEDの点滅は不可能です。しかし、これにより、LEDが非常に速い速度で点滅し、肉眼では認識できなくなります。目で識別できるようにするには、少し減速する必要があります。

2進数の特定のビットの設定手順はわかっていますが、特定のビット「0」が「1」の場合に適用する方法はわかりません。

次のプログラムがこれを実行しているのを見ることができますが、プログラムに表示されない可能性もあります。

最初の2つのステートメントは、ビットを「1」(5V、LEDライト)に変更し、その後、100ミリ秒間一時停止が導入されます。

次の数行でPINB0ビットが「0」(ゼロ電圧、LEDシャットオフ)に変わりますが、申し訳ありませんが、AND比較ではビットから「0」を実行できませんが、NOT「〜」を使用するとバイナリマスクの場合、すべての0を1に、またはその逆に切り替えることができます。

これにより、PINB0ビットのみに影響を与えて「0」に反転させることができます。左シフトの前の「1」だけでなく、マスク全体にNOT操作を適用できるように、マスキングの実行を含めるために括弧が含まれています。<<”.

PORTB | = 1<< PINB0
_delay_ms(100)
PORTB&=〜(1<< PINB0)
_delay_ms(100)

ON OFF遅延または同じ期間の期間を作成するために、前の4行を2行に短縮し、XOR機能を適用する場合があります。 XORを実行すると、割り当てられたピンが0の場合は1に、その逆の場合は1に割り当てられることに注意する必要があります。この実行は、PINB0にのみ影響します。コマンドが適用される場合があるように、それは単にビットを既存のロジックの反対に変えるでしょう。

PORTB ^ = 1<< PINB0
_delay_ms(100)

完了!設定した速度でLEDが点滅します…。簡単ですね。




前:複数のアプライアンスのリモートコントロール回路 次へ:AC相、中性、地絡インジケータ回路