AVR MCUチュートリアル - デジタルIOレジスタ

2つのフロントチュートリアルでは、我々は、基本的な原則との関係を切り替えて、デジタル入力と出力の両方の使用をLED、ボタンを学びました。我々は使用  pin_mode  、  pin_read  と  pin_write  (少なくとも、シングルチップ・メーカーは、私たちが下に接触できるようにする)、実際には、彼らが唯一のステップ離れて下からあり、これらの3つの機能を。SCMの基礎となる科学、1時を理解していない場合は、Arduinoの選手との違いは何ですか?(Arduinoの忠実なファンが私を呼んでいる防ぐために、私はArduinoの選手の小さな部分がまだあることを是認しなければならない。このチュートリアル導入コンテンツを認識しています。)彼らはオーケーSCMを学んだと言うことだけで恥ずかしいです。このいわゆる最低レベル、つまりは、デジタルIOレジスタです。

始める前に、次の2つのドキュメントをダウンロードする必要があります。

SCMのデータシート公式サイトのリンクが遅い、私は国内でプラットフォームをアップロードA、チュートリアルで記述されたときBenpianで最新のものです。

開発ボードの回路図それはもちろんの冒頭に置かれている必要がありますが、何の回路図が存在しないという事実は、使用には影響しません。それは確かに必要とされています。

 

ように、あなたはイエス登録するのか分からないかもしれません。その後、我々は、レジスタから始まりました。

CPUのメモリの内部レジスタの種類は、汎用レジスタと特殊機能レジスタ(も細分特殊機能レジスタの8086組)に分割されます。汎用レジスタ、Cプログラミング言語を使用した場合、直接接触汎用レジスタには、一般的ではありません、それは一般的なものとオペランド、コンピューティングの結果、および他のデータ・メモリ・アドレスを格納できることを示唆している、コンパイラは、その使用の編成を担当しています。特殊機能レジスタは、(それらを理解することなく、今)スタックメモリの記録位置SP、そのような次の命令のPC格納アドレスなどの特定の機能、CPU内部の効果のいくつかを有し、そしてマイクロコントローラプログラムによって接続された他のIOモジュールさまざまな周辺機器を制御するために、これらのレジスタは、今日我々は、デジタル信号IOを知るこのカテゴリに分類され登録して、最も簡単なの一つでなければなりません。

我々が使用するMCU ATmega324PAモデルである、それは、異なる多数のパッケージング、ピン(ピン)の多様を有するが、32の汎用入出力(GPIO)ピンが存在します。アーキテクチャAVR 8ビットワード長が1ビットのデータと8ビットのデータを処理するために必要なCPU時間は同じであり、これらの32本のピンは、4つのポート(ポート)として編成され、PA、PB、PCでありますそして、PD。

メガAVRアーキテクチャ小さなMCUシリーズで、各ポートは、3つのレジスタは、IOデジタル信号を、それぞれPORTx、DDRXとPINXを制御しています。Xは、B、CまたはDであり、四つのポートので、デジタルIOの点で、彼らはそれを置くマージ同一です。したがって、各ピンのためとPxnは(Rなし)にPORTxn、のDDxnがあるとにPINxn 3ビットのデジタルIOを制御します。

DDxn制御ピン方向:のDDxnが1である場合とPxnが出力され、のDDxnが0である場合とPxnが入力されます。

Pxnが入力された場合にPORTxnが1である場合、次いで、ピンは、プルアップ抵抗を介してVCCに接続され、それ以外の場合はフローティング。

出力とPxnはPORTxnが1であれば、高出力端子は、場合、そうでない場合はローレベルを出力します。

PINxn値とPxn端子のレベル。あなたがにPINxn 1に書き込む場合にはPORTxnの値が反転します。

そのようなMCUCR PUDビットレジスタ関数として多くの詳細があり、レジスタの値は、入出力切替方法、端子のレベルが読み出される待ち時間、未接続のピンを処理する方法であって、予約ジョブ今日リセットされますこれらの質問に対する答えを見つけるために兼用ポート機能の1(8の合計よりも少なく、それの多くではない)を除き、データシートI / O-ポートの章の内容を読み、答えに基づいて、チュートリアルとしてそれを使用します最後の質問。

 

そんなに話、私はあなたはあまり覚えていないと信じて、あなたはこれらのレジスタにどこへ行くかわかりません。

登録するには、C言語でプログラムを書く必要がある  の#include <AVR / io.h>  (あなたはそこにプロジェクトコードを作成するときに自動的に生成された)、その後、あなたは使用することができます  PORTA  、  DDRB  、  PINCを  レジスタなど。彼らはあなたのように、ちょうどあなたが操作を配置することができ、割り当てることができ、これらのマクロを読み取ることができることを知って、彼らはどのように展開探るために戻って行く必要はありません、マクロ定義されている  uint8_t  同じ型の変数。

しかし、そのような  PORTA0  と  DDB7が  、これはマクロ定義上のレジスタは、彼らが実際のようなリテラル定数、されていることを意味するものではありません  PORTAxの  登録のための感覚  PORTAは  x番目のビット(ビット0は最下位ビットを、ビット7が最高ですその値xはビット)。したがって、これらのマクロの直接のコピーが正しくありません(だけではなく、誤っ、コンパイラは合格しないという意味)。

で開発ボードライブラリ関数  <EE1 / bit.h>  マクロ機能を操作するためのいくつかのビットが含まれています。さんが従うみよう取扱説明書をそれらが実装されている方法を確認するために後で使用します。

 

のは、元の例に、LEDを点灯し、私たちが使用しなくなった今回は、自然界に戻って見てみましょう  <EE1 / led.h>  の機能が提供さが、直接操作レジスタ。

まず赤のLEDバーを点灯。3ページの図の左上に、赤色LEDはLED0に抵抗ネットワークを介して接続され、1ページ、マイクロコントローラLED0のPC4ピンに接続されているので、我々は、高PC4ピン出力に必要。上記3つのレジスタは、機能を振り返ると、ハイレベルを同時にのDDxnたPORTxn 1を必要として出力します。X及びnは、それぞれ、C 4とにある場合、すなわち、我々はDDC4とPORTC4 1にしたいです。

1の位置登録を行うことができる  SET_BIT  達成します。これは、整数変数は、いくつかの最初の整数で動作する、2つのパラメータを必要とします。書き込むべきDDC4が1に設定  SET_BIT(DDRC、4  、4を使用することができる  DDC4が  置き換え、この定義は、そのように使用されます。同様PORTC4は1に設定されてもよいです。赤色は、次のようにプログラム全体を照明LED:

1の#include <AVR / io.h>
 2の#include <EE1 / bit.h>
 3  
4  int型メイン(ボイド5  {
 6      SET_BIT(DDRC、4 )。
7      SET_BIT(PORTC、4 )。
8 }

私はあなたがすでに光の点滅や流水を知っているスマートな方法を書くことと信じています。出力レベルを反転して使用することができる  flip_bit(PORTCを4。 ) 使用されてもよい  SET_BIT(PINC、4。 )  。

 

デジタル入力を見てみましょう。キーが整合した状態、即ちプレスLEDライトように、または、最初の例と関連したキーを使用。

使用するレジスタの読み  Read_bitピンがハイレベルである場合、Read_bitの  非ゼロ(論理値1必ずしも必要ではないが)の計算結果。あなたはそれを忘れていない場合はピンが低いときには、ボタンが押された場合には、端子レベルのリードの結果が否定され、ボタンを押してください。

概略において、BTN0一端キーは、ネットワークに接続され、MCUのピンPA4に接続。だから、キーが押されたかのように記述する必要があります!Read_bit(PINA、4  。

読む前に第一ピンが入力として設定すべきです。リセット時のデフォルトの入力にもかかわらず、この場合にはそこに0 DDA4を書く必要はありませんが、明らかに人々は(他の人が自分の可能性があります)を参照することを可能にするコードを書くPA4は、入力のためであることを理解、これはAです良い習慣のようなもの。ピンは外部プルアップ抵抗を有するためPORTA4として、内部プルアップ抵抗を有効にする必要はありません。

1の#include <AVR / io.h>
 2の#include <EE1 / bit.h>
 3  
4  int型メイン(ボイド5  {
 6      reset_bit(DDRA、4 )。
7      SET_BIT(DDRC、4 )。
8      一方、1 9      {
 10          cond_bit(read_bit(PINA、!4)、PORTC、4 )。
11      }
 12 }

キーストロークと組み合わせた知識は、あなたがバーのレジスタ操作で直接キーストロークを判断する方法を知っている必要があります。

 

質問を出る前に、ビット操作を実現する方法です。以下は  <EE1 / bit.h>  コードのセクション:

1つ の#define SET_BIT(R、B)((R)| =(1U <<(B)))
 2  の#define reset_bit(R、B)((R)&=〜(1U <<(b)参照))
 3  #define read_bit(R、B)((R) - (1U <<(b)参照))
 4  の#define flip_bit(R、B)((R)^ =(1U <<(b)参照))

演算子の優先順位の問題を防ぐために、非常に多くの括弧を書きます。仮定するRレジスタであり、例えばPORTCため、bは、例えば4などの数であり、次いで、可変であってもよい  (R)| =(1U <<(B))が  に相当する  R = | 1U << B  (サフィックスu)は、オペランドのビット操作は、一般に、符号なしであり、符号無しです。バイナリ表現の各ビット、そうでない場合は最初のBビットのために、オペレータの位置または右のビットが0である、計算結果、すなわち、それらはR変わらないために、左に等しいステップと、b番目のビットと右ビットためのものですかかわらず、左に、このビットの値の数は、結果が1になり、即ち、このビットは1に設定されている;従って1の関数としての位置を達成します。

reset_bitの  実装だけでなく、曲がりの周り。1Uは、 bは<<  B番目のビットが1であり、残りのビットの数は、0  〜(1U << B)  、右のアクセッション番号の割り当てと、B番目のビットに0の数であるが、余りながら1です。Bビットの演算結果が同一とオリジナル値R 0と残りのビットである必要があり、上記の分析を得ることができる従います。同様の分析をするために適用され得る  flip_bit  :2ビットのXOR演算の結果、同一又は異なる0と比較した場合、オペランドが1である場合、結果は別の否定オペランドがあり、オペレータ従って、数は0、他のオペランドと同じ結果である  flip_bitは、  第1のR bが取得させるが、他は不変です。

上記は、レジスタのビットへの書き込み動作です。ビットを読み取るため  read_bit  レジスタとの値を持つ原理は基本的に同じである、  1U << Bの  最初のビットb 1が結果である場合にのみ、位相、  1U << B  さもなければゼロで、0を。read_bit  ステートメントを直接配置することができる  場合に  ステートメント条件部が、それは変数が1だけインクリメントされているかどうかを決定するために結果に基づいている場合、直接計算結果と結合することができない、に変換することができる  ブール  型またはで  あれば  文が決定されます。

 

このチュートリアルでは、少し長いです。適切に消化し、その後、彼らが学んだことを統合するために、再びそれを再書き込みするために以前に書かれたプログラムに登録されます。

 

今からチュートリアルを起動し、我々は最初の方法を使用してライト、ボタン、トグルスイッチ、デジタル入力および出力のLED、及びC言語学習とデジタルIOレジスタのビット操作、最終的にアプリケーションに底部から通路を開きました。多くのネットワーク、すなわち、レジスタを導入し、次にLED駆動するために、キーレジスタ、例えばライトのような、あるいは直接の検出を介して直接ような、逆チュートリアルある  DDRB | = 0x0Cの ;  または  IF(PINB&0x40の  そのようなコード初心者はどのようにそれを理解するには?私の視点に立ち、私は上記の常識だと思う、でも私は(からこそ当然のものとターン)Pofeizhouzheを学んでいたときも、話すことはありません。今、私はこのチュートリアルを説明するためには、理解しやすいこと、ビューの初心者の視点に立っています。

私はコンピュータを学んだ前に、必ず、特別なコンピュータの幻想を持っていることは何でもできると思う、それは素晴らしいです。今、これらのアイデアは、特にSCMにおける学習過程では、ありません。コンピュータ学習は分析し、問題を解決するため、マイクロコントローラは、私たちはより良いコンピュータが問題を解決するために、私たちの考えに従っているかを理解することができます学ぶために私たちに教えてくれました。このチュートリアルでは、あなたを伴うことになるあなたは、マイクロコントローラを学ぶプロセス全体で、レジスタを理解かかります。レジスタは、ハードウェアとソフトウェアの間の重要なリンクであり、任意のコンピュータ機能は、レジスタから不可分です。CPU?レジスタがあります。バス通信?レジスタを介して。ページング?登録する必要があります。すべてのレジスタに基づきます。コンピュータリンクを確立するために、電子・正孔対とカラフルな世界との間のリンクと同じレジスタのよりがあります。彼らはすべてのコンピュータが突然一晩消えていても、まだ明らかで、非常に複雑になり、人間がコンピュータの世界を構築するための層ごと、チューブとパンチテープから開始します。そして、我々は、これはちょうど海の巨大なシステムの低下であることを知っています。

コンピュータの世界に入ると、あなたはコンピュータが行うことができます、私は完了コンピュータを行うことができると思います。コンピュータの世界では、コンピュータが、私ができないことを行うことができないことを理解するであろう、徐々にでは、深さ、とても深いです。デジタル制御、ブザー、彼らはあなたの開発ボードにされている、あなたはそれらを使用する方法がわからない、あなたは聞いたことがないものにシニアそれらを言及しません。学習は認知のスピードの速さに追いつくことはありません - より多くのあなたが勉強し、あなたは元が減少されることはありませんが、より多くの心の「非現実的」という考えの外に発芽していることがわかります。チュートリアルのこのシリーズは、あなたがすべて「いいえ」を除去するのに役立つことはできませんが、「ない」プロセスでのいくつかの解消に一歩ずつ取ることはあなたが「いいえ」より多くの方法を見つけて排除します。

 

おすすめ

転載: www.cnblogs.com/jerry-fuyi/p/11620890.html