組み込みシステム-クイックガイド

システム

システムは、そのすべてのユニットが一連のルールに従って一緒に機能するように組み立てられた配置です。また、固定された計画に従って1つまたは複数のタスクを実行、編成、または実行する方法として定義することもできます。たとえば、時計は時刻表示システムです。そのコンポーネントは、時間を表示するための一連のルールに従います。部品の1つが故障すると、時計は機能しなくなります。したがって、システムでは、そのすべてのサブコンポーネントが相互に依存していると言えます。

組み込みシステム

その名前が示すように、Embeddedは別のものに接続されているものを意味します。組み込みシステムは、ソフトウェアが組み込まれたコンピュータハードウェアシステムと考えることができます。組み込みシステムは、独立したシステムにすることも、大規模なシステムの一部にすることもできます。組み込みシステムは、特定のタスクを実行するように設計されたマイクロコントローラーまたはマイクロプロセッサーベースのシステムです。たとえば、火災警報器は組み込みシステムです。煙だけを感知します。

組み込みシステムには3つのコンポーネントがあります-

  • それはハードウェアを持っています。

  • それはアプリケーションソフトウェアを持っています。

  • これには、アプリケーションソフトウェアを監視し、遅延を制御する計画に従ってプロセッサがスケジュールに従ってプロセスを実行できるようにするメカニズムを提供するリアルタイムオペレーティングシステム(RTOS)があります。RTOSは、システムの動作方法を定義します。アプリケーションプログラムの実行中にルールを設定します。小規模の組み込みシステムにはRTOSがない場合があります。

したがって、組み込みシステムを、マイクロコントローラーベースのソフトウェア駆動型の信頼性の高いリアルタイム制御システムとして定義できます。

組み込みシステムの特徴

  • Single-functioned−組み込みシステムは通常、特殊な操作を実行し、同じことを繰り返し実行します。例:ポケットベルは常にポケットベルとして機能します。

  • Tightly constrained−すべてのコンピューティングシステムには設計メトリックに制約がありますが、組み込みシステムのコンピューティングシステムは特に厳しい場合があります。設計メトリックは、コスト、サイズ、電力、パフォーマンスなどの実装の機能の尺度です。シングルチップに収まるサイズであり、データをリアルタイムで処理するのに十分な速度で動作し、バッテリー寿命を延ばすために最小限の電力を消費する必要があります。

  • Reactive and Real time−多くの組み込みシステムは、システム環境の変化に継続的に対応する必要があり、特定の結果を遅滞なくリアルタイムで計算する必要があります。カークルーズコントローラーの例を考えてみましょう。速度センサーとブレーキセンサーを継続的に監視して反応します。限られた時間内に繰り返し加速または減速を計算する必要があります。計算が遅れると、車の制御に失敗する可能性があります。

  • Microprocessors based −マイクロプロセッサまたはマイクロコントローラベースである必要があります。

  • Memory−ソフトウェアは通常ROMに埋め込まれているため、メモリが必要です。コンピュータに二次メモリは必要ありません。

  • Connected −入力デバイスと出力デバイスを接続するには、周辺機器が接続されている必要があります。

  • HW-SW systems−ソフトウェアは、より多くの機能と柔軟性のために使用されます。ハードウェアは、パフォーマンスとセキュリティのために使用されます。

利点

  • 簡単にカスタマイズ可能
  • 低消費電力
  • 低価格
  • パフォーマンスの向上

短所

  • 高い開発努力
  • 市場投入までの時間の延長

組み込みシステムの基本構造

次の図は、組み込みシステムの基本構造を示しています。

  • Sensor−物理量を測定し、それを電気信号に変換します。この信号は、観測者またはA2Dコンバーターなどの電子機器で読み取ることができます。センサーは測定量をメモリーに保存します。

  • A-D Converter −アナログ-デジタルコンバーターは、センサーから送信されたアナログ信号をデジタル信号に変換します。

  • Processor & ASICs −プロセッサはデータを処理して出力を測定し、メモリに保存します。

  • D-A Converter −デジタル-アナログコンバーターは、プロセッサーから供給されたデジタルデータをアナログデータに変換します

  • Actuator −アクチュエータは、DAコンバータによって与えられた出力を、そこに保存されている実際の(期待される)出力と比較し、承認された出力を保存します。

プロセッサは組み込みシステムの心臓部です。データを処理した後、入力を受け取り、出力を生成する基本ユニットです。組み込みシステムの設計者は、マイクロプロセッサとマイクロコントローラの両方の知識を持っている必要があります。

システム内のプロセッサ

プロセッサには2つの重要なユニットがあります-

  • プログラムフローコントロールユニット(CU)
  • 実行ユニット(EU)

CUには、メモリから命令をフェッチするためのフェッチユニットが含まれています。EUには、データ転送操作と、ある形式から別の形式へのデータ変換に関する命令を実装する回路があります。

EUには、算術論理演算装置(ALU)と、割り込みなどのプログラム制御タスクの命令を実行する回路、または別の命令セットにジャンプする回路が含まれています。

プロセッサはフェッチのサイクルを実行し、メモリからフェッチされるのと同じ順序で命令を実行します。

プロセッサーの種類

プロセッサは次のカテゴリに分類できます-

  • 汎用プロセッサー(GPP)

    • Microprocessor
    • Microcontroller
    • 組み込みプロセッサ
    • デジタルシグナルプロセッサ
    • メディアプロセッサ
  • 特定用途向けシステムプロセッサ(ASSP)

  • アプリケーション固有の命令プロセッサ(ASIP)

  • 特定用途向け集積回路(ASIC)または超大規模集積回路(VLSI)のいずれかのGPPコアまたはASIPコア。

マイクロプロセッサ

マイクロプロセッサは、CPUを搭載した単一のVLSIチップです。さらに、コーチ、浮動小数点処理演算ユニット、および命令の高速処理に役立つパイプラインユニットなどの他のユニットも含まれる場合があります。

以前の世代のマイクロプロセッサのフェッチと実行のサイクルは、約1MHzのクロック周波数によって導かれていました。プロセッサは現在、2GHzのクロック周波数で動作します

マイクロコントローラー

マイクロコントローラは、シングルチップVLSIユニット(別名 microcomputer)計算能力は限られていますが、強化された入出力能力と多数のオンチップ機能ユニットを備えています。

CPU ROM
I / Oポート タイマー シリアルCOMポート

マイクロコントローラは、オンチッププログラムメモリとデバイスを備えたリアルタイム制御アプリケーションの組み込みシステムで特に使用されます。

マイクロプロセッサとマイクロコントローラ

ここで、マイクロプロセッサとマイクロコントローラの最も顕著な違いを見てみましょう。

マイクロプロセッサ マイクロコントローラー
マイクロプロセッサは本質的にマルチタスクです。一度に複数のタスクを実行できます。たとえば、コンピュータでは、テキストエディタでテキストを書きながら音楽を再生できます。 単一のタスク指向。たとえば、洗濯機は衣類の洗濯専用に設計されています。
RAM、ROM、I / Oポート、およびタイマーは外部から追加でき、数はさまざまです。 RAM、ROM、I / Oポート、およびタイマーを外部から追加することはできません。これらのコンポーネントはチップ上に一緒に埋め込まれ、数が固定されています。
設計者は、必要なメモリまたはI / Oポートの数を決定できます。 メモリまたはI / Oの固定数により、マイクロコントローラは限られた特定のタスクに最適です。
外部メモリとI / Oポートの外部サポートにより、マイクロプロセッサベースのシステムはより重く、より高価になります。 マイクロコントローラは、マイクロプロセッサよりも軽量で安価です。
外部デバイスはより多くのスペースを必要とし、それらの消費電力はより高くなります。 マイクロコントローラベースのシステムは、消費電力とスペースが少なくて済みます。

8051マイクロコントローラは8ビットデータバスで動作します。したがって、最大64Kの外部データメモリと最大64Kの外部プログラムメモリをサポートできます。まとめると、8051マイクロコントローラは128kの外部メモリをアドレス指定できます。

データとコードが異なるメモリブロックにある場合、アーキテクチャは次のように呼ばれます。 Harvard architecture。データとコードが同じメモリブロックにある場合、アーキテクチャは次のように呼ばれます。Von Neumann architecture

フォンノイマンアーキテクチャ

フォンノイマンアーキテクチャは、コンピュータ科学者のジョンフォンノイマンによって最初に提案されました。このアーキテクチャでは、命令とデータの両方に対して1つのデータパスまたはバスが存在します。その結果、CPUは一度に1つの操作を実行します。メモリから命令をフェッチするか、データに対して読み取り/書き込み操作を実行します。そのため、共通バスを共有して、命令フェッチとデータ操作を同時に行うことはできません。

フォンノイマンアーキテクチャは、単純なハードウェアをサポートします。これにより、単一のシーケンシャルメモリを使用できます。今日の処理速度はメモリアクセス時間を大幅に上回っており、プロセッサに対してローカルで非常に高速ですが少量のメモリ(キャッシュ)を使用しています。

ハーバードアーキテクチャ

ハーバードアーキテクチャは、命令とデータ用に個別のストレージバスと信号バスを提供します。このアーキテクチャには、CPU内に完全に含まれるデータストレージがあり、データとしての命令ストレージへのアクセスはありません。コンピュータには、内部データバスを使用してプログラム命令とデータ用に別々のメモリ領域があり、命令とデータの両方に同時にアクセスできます。

プログラムはオペレーターがロードする必要がありました。プロセッサはそれ自体を起動できませんでした。ハーバードアーキテクチャでは、2つのメモリにプロパティを共有させる必要はありません。

フォンノイマンアーキテクチャとハーバードアーキテクチャ

以下の点で、フォンノイマンアーキテクチャとハーバードアーキテクチャが区別されます。

フォンノイマンアーキテクチャ ハーバードアーキテクチャ
コードとデータの両方で共有される単一のメモリ。 コードとデータ用に別々のメモリ。
プロセッサは、別のクロックサイクルでコードをフェッチし、別のクロックサイクルでデータをフェッチする必要があります。したがって、2クロックサイクルが必要です。 コードとデータにアクセスするために別々のバスが使用されるため、単一のクロックサイクルで十分です。
高速であるため、時間がかかりません。 速度が遅いため、時間がかかります。
シンプルなデザイン。 複雑なデザイン。

CISCとRISC

CISCは、複雑な命令セットコンピュータです。多数の命令に対応できるコンピュータです。

1980年代初頭、コンピューターの設計者は、コンピューターがメモリを使用せずにCPU内ではるかに高速に実行できるように、単純な構造で使用する命令を少なくすることを推奨しました。このようなコンピューターは、縮小命令セットコンピューターまたはRISCとして分類されます。

CISCとRISC

以下の点で、CISCとRISCを区別しています。

CISC RISC
命令のより大きなセット。プログラミングが簡単 命令のより小さなセット。プログラミングが難しい。
より多くの命令セットを考慮した、コンパイラのより単純な設計。 コンパイラの複雑な設計。
複雑な命令フォーマットを引き起こす多くのアドレッシングモード。 いくつかのアドレッシングモード、命令フォーマットを修正。
命令長は可変です。 命令の長さは異なります。
1秒あたりのクロックサイクルが高くなります。 1秒あたりのクロックサイクルが低い。
重点はハードウェアにあります。 重点はソフトウェアにあります。
コントロールユニットは、マイクロプログラムユニットを使用して大規模な命令セットを実装します。 各命令はハードウェアによって実行されます。
命令がメモリから読み取られ、デコーダユニットによってデコードされるため、実行が遅くなります。 各命令はハードウェアによって実行されるため、実行が高速になります。
パイプライン化はできません。 単一のクロックサイクルを考慮して、命令のパイプライン化が可能です。

コンパイラとアセンブラ

コンパイラ

コンパイラは、プログラミング言語(ソース言語)で記述されたソースコードを別のコンピュータ言語(通常はバイナリ形式)に変換するコンピュータプログラム(またはプログラムのセット)です。変換の最も一般的な理由は、実行可能プログラムを作成することです。「コンパイラ」という名前は、主に、ソースコードを高級プログラミング言語から低水準言語(アセンブリ言語や機械語など)に翻訳するプログラムに使用されます。

クロスコンパイラ

コンパイルされたプログラムが、コンパイラーがプログラムをコンパイルしたコンピューターとは異なるCPUまたはオペレーティングシステムを備えたコンピューターで実行できる場合、そのコンパイラーはクロスコンパイラーと呼ばれます。

逆コンパイラ

プログラムを低水準言語から高水準言語に翻訳できるプログラムは、逆コンパイラーと呼ばれます。

言語コンバーター

さまざまな高級言語で書かれたプログラムを翻訳するプログラムは、通常、言語トランスレータ、ソースからソースへのトランスレータ、または言語コンバータと呼ばれます。

コンパイラは次の操作を実行する可能性があります-

  • Preprocessing
  • Parsing
  • セマンティック分析(構文指向の翻訳)
  • コード生成
  • コードの最適化

アセンブラ

アセンブラは、基本的なコンピュータ命令(アセンブリ言語と呼ばれる)を受け取り、それらをコンピュータのプロセッサが基本的な操作を実行するために使用できるビットのパターンに変換するプログラムです。アセンブラは、アセンブリ命令ニーモニックをオペコードに変換し、シンボリック名をメモリ位置に解決することによってオブジェクトコードを作成します。アセンブリ言語は、ニーモニックを使用して、各低レベルのマシン操作(オペコード)を表します。

組み込みシステムのデバッグツール

デバッグは、コンピュータプログラムまたは電子ハードウェアのバグの数を見つけて減らし、期待どおりに機能するようにするための系統的なプロセスです。サブシステムが緊密に結合されている場合、あるサブシステムに小さな変更を加えると別のサブシステムにバグが発生する可能性があるため、デバッグは困難です。組み込みシステムで使用されるデバッグツールは、開発時間とデバッグ機能の点で大きく異なります。ここでは、次のデバッグツールについて説明します-

  • Simulators
  • マイクロコントローラースターターキット
  • Emulator

シミュレーター

コードは、コード開発に使用されるホストコンピューターでシミュレートすることにより、MCU /システムに対してテストされます。シミュレーターは、ソフトウェアで完全なマイクロコントローラーの動作をモデル化しようとします。

シミュレーターの機能

シミュレータは以下の機能を実行します-

  • プロセッサまたは処理デバイスファミリ、およびターゲットシステムのさまざまなバージョンを定義します。

  • 単一のステップごとに実行が進むにつれて、ラベルとシンボリック引数を使用してソースコードパーツの詳細情報を監視します。

  • シングルステップ実行ごとに、ターゲットシステムのRAMとシミュレートされたポートのステータスを提供します。

  • システムの応答を監視し、スループットを決定します。

  • プログラムカウンタの内容とプロセッサレジスタの出力のトレースを提供します。

  • 現在のコマンドの詳細な意味を提供します。

  • シミュレータコマンドがキーボードから入力されるか、メニューから選択されるときに、これらのコマンドの詳細情報を監視します。

  • 条件(最大8、16、または32の条件)と無条件のブレークポイントをサポートします。

  • 重要なテストおよびデバッグツールであるブレークポイントとトレースを提供します。

  • 内部周辺機器と遅延の同期を容易にします。

マイクロコントローラースターターキット

マイクロコントローラスターターキットは、次のもので構成されます。

  • ハードウェアボード(評価ボード)
  • インシステムプログラマー
  • コンパイラ、アセンブラ、リンカなどのいくつかのソフトウェアツール。
  • 場合によっては、IDEとコードサイズがコンパイラの評価版を制限していました。

シミュレータに対するこれらのキットの大きな利点は、リアルタイムで動作するため、入出力機能の検証が容易になることです。ただし、スターターキットは完全に十分であり、単純なマイクロコントローラープロジェクトを開発するための最も安価なオプションです。

エミュレーター

エミュレーターは、ハードウェアキットまたはソフトウェアプログラムであるか、または両方とも、最初のコンピューターシステム(ホスト)とは異なる別のコンピューターシステム(ホスト)の1つのコンピューターシステム(ゲスト)の機能をエミュレートするため、エミュレートされた動作は動作に非常に似ています。実際のシステム(ゲスト)の。

エミュレーションとは、電子デバイス内のコンピュータプログラムが、別のプログラムまたはデバイスをエミュレート(模倣)する機能を指します。エミュレーションは、元のコンピューター環境の再作成に重点を置いています。エミュレーターには、デジタルオブジェクトの信頼性との密接な関係を維持する機能があります。エミュレーターは、ソフトウェアが元の環境で実行されるのと同じように、ユーザーがプラットフォーム上のあらゆる種類のアプリケーションまたはオペレーティングシステムで作業するのに役立ちます。

組み込みシステムの周辺機器

組み込みシステムは、次の&mins;などの周辺機器を介して外界と通信します。

  • RS-232、RS-422、RS-485などのシリアル通信インターフェース(SCI)。
  • I2C、SPI、SSC、ESSIなどの同期シリアル通信インターフェース
  • ユニバーサルシリアルバス(USB)
  • マルチメディアカード(SDカード、コンパクトフラッシュなど)
  • イーサネット、LonWorksなどのネットワーク。
  • CAN-Bus、LIN-Bus、PROFIBUSなどのフィールドバス。
  • PLL(s)、キャプチャ/比較、時間処理ユニットなどのイマー。
  • ディスクリートIO、別名汎用入力/出力(GPIO)
  • アナログ-デジタル/デジタル-アナログ(ADC / DAC)
  • JTAG、ISP、ICSP、BDMポート、BITP、DP9ポートなどのデバッグ

マイクロコントローラを選択するための基準

マイクロコントローラを選択するときは、それが目前のタスクを満たし、費用効果が高いことを確認してください。8ビット、16ビット、または32ビットのマイクロコントローラーがタスクのコンピューティングニーズを最適に処理できるかどうかを確認する必要があります。また、マイクロコントローラを選択する際には、以下の点に注意してください。

  • Speed −マイクロコントローラがサポートできる最高速度はどれくらいですか?

  • Packaging− 40ピンDIP(デュアルインラインパッケージ)またはQFP(クアッドフラットパッケージ)ですか?これは、スペース、組み立て、および最終製品のプロトタイピングの観点から重要です。

  • Power Consumption −これはバッテリー駆動製品の重要な基準です。

  • Amount of RAM and ROM チップ上。

  • Count of I/O pins and Timers チップ上。

  • Cost per Unit −これは、マイクロコントローラが使用される製品の最終コストの観点から重要です。

さらに、コンパイラー、デバッガー、アセンブラーなどのツールがマイクロコントローラーで使用できることを確認してください。すべての中で最も重要なのは、信頼できるソースからマイクロコントローラーを購入する必要があるということです。

8051の簡単な歴史

最初のマイクロプロセッサ 4004 インテルコーポレーションによって発明されました。 8085 そして 8086マイクロプロセッサもIntelによって発明されました。1981年、Intelはと呼ばれる8ビットマイクロコントローラを発表しました。8051。それはsystem on a chip128バイトのRAM、4KバイトのオンチップROM、2つのタイマー、1つのシリアルポート、および4つのポート(8ビット幅)がすべて1つのチップ上にあるためです。広く普及したとき、Intelは他のメーカーが8051と互換性のあるコードで8051のさまざまなフレーバーを作成および販売することを許可しました。つまり、8051の1つのフレーバー用にプログラムを作成すると、他のフレーバーでも実行されます。メーカー。これにより、速度とオンチップRAMの量が異なるいくつかのバージョンが生まれました。

8051フレーバー/メンバー

  • 8052 microcontroller− 8052には、8051マイクロコントローラのすべての標準機能に加えて、追加の128バイトのRAMと追加のタイマーがあります。また、4Kバイトの代わりに8KバイトのオンチッププログラムROMがあります。

  • 8031 microcontroller−これは8051ファミリーのもう1つのメンバーです。このチップは、0KバイトのオンチップROMを備えているため、ROMレス8051と呼ばれることがよくあります。フェッチして実行するプログラムを含む外部ROMを使用するには、外部ROMを追加する必要があります。このプログラムは最大64Kバイトになる可能性があります。しかし、8031に外部ROMを追加する過程で、4つのポートのうち2つのポートが失われました。この問題を解決するために、外部I / Oを8031に追加できます。

8051ファミリーメンバー間の比較

次の表では、8051、8052、および8031で使用可能な機能を比較しています。

特徴 8051 8052 8031
ROM(バイト) 4K 8K 0K
RAM(バイト) 128 256 128
タイマー 2 3 2
I / Oピン 32 32 32
シリアルポート 1 1 1
割り込みソース 6 8 6

8051マイクロコントローラーの機能

8051マイクロコントローラには次の機能がバンドルされています-

  • 4KBバイトのオンチッププログラムメモリ(ROM)
  • 128バイトのオンチップデータメモリ(RAM)
  • 4つのレジスターバンク
  • 128のユーザー定義ソフトウェアフラグ
  • 8ビット双方向データバス
  • 16ビット単方向アドレスバス
  • 各8ビットの32個の汎用レジスタ
  • 16ビットタイマー(通常は2つですが、多かれ少なかれある場合があります)
  • 3つの内部割り込みと2つの外部割り込み
  • 4つの8ビットポート(ショートモデルには2つの8ビットポートがあります)
  • 16ビットプログラムカウンタとデータポインタ
  • 8051には、UART、ADC、オペアンプなどの多くの特別な機能もあります。

8051マイクロコントローラーのブロック図

次の図は、8051マイクロコントローラのブロック図を示しています。

8051では、I / O操作は4つのポートと40のピンを使用して実行されます。次のピン図は、40ピンの詳細を示しています。I / O操作ポートは32ピンを予約し、各ポートには8ピンがあります。他の8つのピンは、V cc、GND、XTAL1、XTAL2、RST、EA(バー)、ALE / PROG(バー)、およびPSEN(バー)として指定されます。

40ピンPDIP(プラスチックデュアルインラインパッケージ)です。

Note− DIPパッケージでは、IC中央のカットで最初のピンと最後のピンを識別できます。最初のピンはこのカットマークの左側にあり、最後のピン(この場合は40番目のピン)はカットマークの右側にあります。

I / Oポートとその機能

4つのポートP0、P1、P2、およびP3は、それぞれ8ピンを使用するため、8ビットポートになります。リセットすると、すべてのポートが入力として構成され、入力ポートとして使用できるようになります。最初の0がポートに書き込まれると、それが出力になります。入力として再構成するには、1をポートに送信する必要があります。

ポート0(ピン番号32 –ピン番号39)

8つのピン(32から39)があります。入力または出力に使用できます。P1、P2、およびP3ポートとは異なり、通常、P0から10Kオームのプルアップ抵抗を接続して、オープンドレインである入力または出力ポートとして使用します。

AD0-AD7とも呼ばれ、アドレスとデータの両方として使用できます。8031(つまり、ROMレスチップ)の場合、外部ROMにアクセスする必要があるときは、アドレスバスとデータバスの両方にP0が使用されます。ALE(ピン番号31)は、P0にアドレスまたはデータがあるかどうかを示します。ALE = 0の場合、データD0〜D7を提供しますが、ALE = 1の場合、アドレスA0〜A7を持ちます。外部メモリ接続が利用できない場合は、P0を10Kオームのプルアップ抵抗に外部接続する必要があります。

MOV A,#0FFH  ;(comments: A=FFH(Hexadecimal  i.e. A=1111 1111)  

MOV P0,A     ;(Port0 have 1's on every pin so that it works as Input)

ポート1(ピン1から8)

これは8ビットポート(ピン1から8)であり、入力または出力として使用できます。プルアップ抵抗はすでに内部接続されているため、必要ありません。リセットすると、ポート1は入力ポートとして構成されます。次のコードを使用して、55HとAAHの値を交互にポート1に送信できます。

;Toggle all bits of continuously 
MOV     A,#55 
BACK:    

MOV     P2,A 
ACALL   DELAY 
CPL     A      ;complement(invert) reg. A 
SJMP    BACK

ポート1が出力ポートとして使用されるように構成されている場合、それを再び入力ポートとして使用するには、次のコードのように、すべてのビットに1を書き込んでプログラムします。

;Toggle all bits of continuously 

MOV     A ,#0FFH    ;A = FF hex 
MOV     P1,A        ;Make P1 an input port                     
MOV     A,P1        ;get data from P1 
MOV     R7,A        ;save it in Reg R7 
ACALL   DELAY       ;wait 

MOV     A,P1        ;get another data from P1 
MOV     R6,A        ;save it in R6 
ACALL   DELAY       ;wait 

MOV     A,P1        ;get another data from P1 
MOV     R5,A        ;save it in R5

ポート2(ピン21から28)

ポート2は合計8ピン(ピン21から28)を占め、入力操作と出力操作の両方に使用できます。P1(ポート1)と同様に、P2も内部で接続されているため、外部プルアップ抵抗は必要ありません。外部メモリに16ビットアドレスを提供するには、P0と一緒に使用する必要があります。そのため、ピン図に示すように、(A0–A7)とも呼ばれます。8051が外部メモリに接続されている場合、16ビットアドレスの上位8ビットへのパスを提供し、I / Oとして使用することはできません。リセットすると、ポート2は入力ポートとして構成されます。次のコードを使用して、55HとAAHの値を交互にポート2に送信できます。

;Toggle all bits of continuously 
MOV     A,#55 
BACK: 
MOV     P2,A 
ACALL   DELAY 
CPL     A         ; complement(invert) reg. A 
SJMP    BACK

ポート2が出力ポートとして使用されるように構成されている場合、それを再び入力ポートとして使用するには、次のコードのように、すべてのビットに1を書き込んでプログラムします。

;Get a byte from P2 and send it to P1 
MOV    A,#0FFH    ;A = FF hex 
MOV    P2,A       ;make P2 an input port 
BACK: 
MOV    A,P2       ;get data from P2 
MOV    P1,A       ;send it to Port 1
SJMP   BACK       ;keep doing that

ポート3(ピン10から17)

また、8ビットであり、入力/出力として使用できます。このポートは、いくつかの非常に重要な信号を提供します。P3.0とP3.1はそれぞれRxD(受信機)とTxD(送信機)であり、シリアル通信にまとめて使用されます。P3.2およびP3.3ピンは外部割り込みに使用されます。P3.4とP3.5は、それぞれタイマーT0とT1に使用されます。P3.6とP3.7は、書き込み(WR)ピンと読み取り(RD)ピンです。これらはアクティブローピンです。つまり、0が与えられるとアクティブになり、8031ベースのシステムで外部ROMに読み取りおよび書き込み操作を提供するために使用されます。

P3ビット 関数 ピン
P3.0 RxD 10
P3.1 < TxD 11
P3.2 < INT0の補数 12
P3.3 < INT1 13
P3.4 < T0 14
P3.5 < T1 15
P3.6 < WR 16
P3.7 < RDの補完 17

ポート0とポート2の二重の役割

  • Dual role of Port 0−ポート0は、データとアドレスの両方の処理に使用できるため、AD0〜AD7としても指定されます。8051を外部メモリに接続している間、ポート0はアドレスとデータの両方を提供できます。次に、8051マイクロコントローラは、ピンを節約するために入力をアドレスまたはデータとして多重化します。

  • Dual role of Port 2− I / Oとして機能するほか、ポートP2はポート0とともに外部メモリ用の16ビットアドレスバスを提供するためにも使用されます。ポートP2は(A8– A15)としても指定され、ポート0は経由で下位8ビットを提供します。 A0〜A7。言い換えると、8051が最大64KBの外部メモリ(ROM)に接続されている場合、これは216 = 64KBであることがわかっているため、16ビットアドレスバスで可能であると言えます。Port2は16ビットアドレスの上位8ビットに使用され、I / Oには使用できません。これは、外部ROMのプログラムコードのアドレス指定方法です。

ピンのハードウェア接続

  • Vcc −ピン40はチップに電源を供給し、+ 5Vです。

  • Gnd −ピン20はリファレンスのグランドを提供します。

  • XTAL1, XTAL2 (Pin no 18 & Pin no 19)− 8051にはオンチップ発振器がありますが、それを実行するには外部クロックが必要です。チップのXTAL1ピンとXTAL2ピンの間に水晶振動子が接続されています。この水晶はまた、所望の周波数の信号を生成するために30pFの2つのコンデンサを必要とします。各コンデンサの片側はグランドに接続されています。8051 ICはさまざまな速度で利用でき、すべてこの水晶振動子に依存します。たとえば、20 MHzのマイクロコントローラーには、周波数が20MHz以下の水晶振動子が必要です。

  • RST (Pin No. 9)−入力ピンとアクティブHighピンです。このピンにハイパルス、つまり1を印加すると、マイクロコントローラはすべてのアクティビティをリセットして終了します。このプロセスは、Power-On Reset。パワーオンリセットをアクティブにすると、レジスタ内のすべての値が失われます。プログラムカウンタをすべて0に設定します。リセットの有効な入力を保証するには、ハイパルスがローになる前に最低2マシンサイクルの間ハイである必要があります。これは、コンデンサの値と充電速度によって異なります。((Machine Cycle は、単一の命令が実行に必要な最小頻度です)。

  • EA or External Access (Pin No. 31)−入力ピンです。このピンはアクティブローピンです。低パルスを適用すると、アクティブになります。オンチップROMを搭載したマイクロコントローラ(8051/52)の場合、EA(バー)ピンはVccに接続されます。ただし、オンチップROMを備えていない8031マイクロコントローラでは、コードは外部ROMに格納されてから、マイクロコントローラによってフェッチされます。この場合、(ピン番号31)EAをGndに接続して、プログラムコードが外部に保存されていることを示す必要があります。

  • PSEN or Program store Enable (Pin No 29)−これもアクティブローピンです。つまり、ローパルスを印加した後にアクティブになります。これは出力ピンであり、8031ベース(つまりROMLESS)システムのEAピンと一緒に使用され、外部ROMにプログラムコードを格納できるようにします。

  • ALE or (Address Latch Enable)−これは出力ピンであり、アクティブHighです。特に8031ICが外部メモリに接続するために使用されます。P0ピンをアドレスバスまたはデータバスのどちらとして使用するかを決定する際に使用できます。ALE = 1の場合、P0ピンはデータバスとして機能し、ALE = 0の場合、P0ピンはアドレスバスとして機能します。

I / Oポートとビットアドレス指定可能性

これは、8051のコードを記述しているときに、8051で最も広く使用されている機能です。8ビット全体ではなく、ポートの1ビットまたは2ビットにのみアクセスする必要がある場合があります。8051は、ポートの個々のビットにアクセスする機能を提供します。

シングルビット方式でポートにアクセスする場合、構文「SETB X. Y」を使用します。ここで、Xはポート番号(0〜3)、YはデータビットD0〜D7のビット番号(0〜7)です。ここで、D0はLSB、D7はMSBです。たとえば、「SETB P1.5」は、ポート1の上位ビット5を設定します。

次のコードは、ビットP1.2を継続的に切り替える方法を示しています。

AGAIN: 
SETB    P1.2
ACALL   DELAY    
CLR     P1.2      
ACALL   DELAY 
SJMP    AGAIN

シングルビット命令

指示 関数
SETBビット ビットを設定します(ビット= 1)
CLRビット ビットをクリアします(ビット= 0)
CPLビット ビットを補完します(ビット= NOTビット)
JBビット、ターゲット ビット= 1の場合はターゲットにジャンプします(ビットの場合はジャンプします)
JNBビット、ターゲット ビット= 0の場合はターゲットにジャンプします(ビットがない場合はジャンプします)
JBCビット、ターゲット ビット= 1の場合はターゲットにジャンプし、ビットをクリアします(ビットの場合はジャンプしてからクリアします)

プログラムカウンター

プログラムカウンタは、次に実行される命令のアドレスを含む16ビットまたは32ビットのレジスタです。PCは、命令がフェッチされるたびに、次のシーケンシャルメモリ位置に自動的にインクリメントします。分岐、ジャンプ、および割り込み操作は、プログラムカウンタに次の順次位置以外のアドレスをロードします。

パワーオンリセットをアクティブにすると、レジスタ内のすべての値が失われます。これは、リセット時にPC(プログラムカウンタ)の値が0であることを意味し、CPUがROMメモリ位置0000から最初のオペコードをフェッチするように強制します。つまり、アップコードの最初のバイトをROM位置0000に配置する必要があります。 CPUは最初の命令を見つけることを期待しています

ベクトルをリセット

リセットベクトルの重要性は、ファームウェアの最初の命令を含むメモリアドレスをプロセッサに向けることです。リセットベクトルがないと、プロセッサはどこから実行を開始するかわかりません。リセット時に、プロセッサは事前定義されたメモリ位置からリセットベクトル値をプログラムカウンタ(PC)にロードします。CPU08アーキテクチャでは、これは次の場所にあります$FFFE:$FFFF。

リセットベクトルが必要ない場合、開発者は通常それを当然のことと見なし、最終的なイメージにプログラムしません。その結果、プロセッサは最終製品で起動しません。これは、デバッグフェーズ中に発生する一般的な間違いです。

スタックポインタ

スタックはRAMに実装され、CPUレジスタを使用してSP(スタックポインタ)レジスタと呼ばれるスタックにアクセスします。SPレジスタは8ビットレジスタであり、00hからFFhの範囲のメモリアドレスをアドレス指定できます。最初に、SPレジスタには、8051によってスタックに使用される最初の場所として場所08を指す値07が含まれています。

CPUレジスタの内容がスタックに格納される場合、それはPUSH操作と呼ばれます。スタックの内容をCPUレジスタに格納することをPOP演算と呼びます。言い換えると、レジスタはスタックにプッシュされて保存され、スタックからポップされて取得されます。

無限ループ

無限ループまたは無限ループは、次の理由により、ループ内で無限に実行されるコンピュータプログラム内の一連の命令として識別できます。

  • 終了条件のないループ。
  • 決して満たすことができない終了条件でループします。
  • ループを最初からやり直す原因となる終了条件のあるループ。

このような無限ループは通常、古いオペレーティングシステムが応答しなくなる原因となりました。これは、無限ループが使用可能なすべてのプロセッサ時間を消費するためです。ユーザー入力を待機するI / O操作は、「無限ループ」とも呼ばれます。コンピューターの「フリーズ」の考えられる原因の1つは、無限ループです。その他の原因は次のとおりですdeadlock そして access violations

組み込みシステムは、PCとは異なり、アプリケーションを「終了」することはありません。それらは、割り込みの形でイベントが発生するのを待つ無限ループを介してアイドル状態になります。pre-scheduled task。電力を節約するために、一部のプロセッサは特別に入力しますsleep または wait modes 無限ループを介してアイドリングする代わりに、タイマーまたは外部割り込みのいずれかでこのモードを終了します。

割り込み

割り込みは主に、イベントが発生したことをプログラムに指示するハードウェアメカニズムです。これらはいつでも発生する可能性があるため、プログラムフローとは非同期です。これらはプロセッサによる特別な処理を必要とし、最終的には対応する割り込みサービスルーチン(ISR)によって処理されます。割り込みは迅速に処理する必要があります。割り込みの処理に時間がかかりすぎると、別の割り込みを見逃す可能性があります。

リトルエンディアンとビッグエンディアン

数値は常に同じ方法で表示されますが、メモリに同じ方法で保存されるわけではありません。ビッグエンディアンマシンは、最下位のメモリアドレスに最上位バイトのデータを格納します。ビッグエンディアンマシンは0x12345678を-として格納します

ADD+0: 0x12 
ADD+1: 0x34 
ADD+2: 0x56 
ADD+3: 0x78

一方、リトルエンディアンマシンは、最下位のメモリアドレスにデータの最下位バイトを格納します。リトルエンディアンのマシンは、0x12345678を-として格納します

ADD+0: 0x78 
ADD+1: 0x56 
ADD+2: 0x34 
ADD+3: 0x12

アセンブリ言語は、提供するために開発されました mnemonicsまたはマシンレベルのコード命令の記号。アセンブリ言語プログラムはニーモニックで構成されているため、マシンコードに翻訳する必要があります。この変換を担当するプログラムは、assembler。アセンブリ言語は、CPUの内部構造と直接連携するため、低水準言語と呼ばれることがよくあります。アセンブリ言語でプログラミングするには、プログラマはCPUのすべてのレジスタを知っている必要があります。

C、C ++、Java、その他のさまざまな言語などのさまざまなプログラミング言語は、CPUの内部の詳細を処理しないため、高級言語と呼ばれます。対照的に、アセンブラは、アセンブリ言語プログラムをマシンコードに翻訳するために使用されます(アセンブラとも呼ばれます)。object code または opcode)。同様に、コンパイラは高級言語を機械語に変換します。たとえば、C言語でプログラムを作成するには、Cコンパイラを使用してプログラムを機械語に翻訳する必要があります。

アセンブリ言語の構造

アセンブリ言語プログラムは、ADDやMOVなどのアセンブリ言語命令、または呼び出されるステートメントのいずれかである一連のステートメントです。 directives

アン instruction CPUに何をすべきかを指示し、 directive (とも呼ばれている pseudo-instructions)アセンブラに指示を出します。たとえば、ADDおよびMOV命令はCPUが実行するコマンドであり、ORGおよびENDはアセンブラディレクティブです。ORGディレクティブが使用される場合、アセンブラはオペコードをメモリ位置0に配置し、ENDはソースコードの終わりを示します。プログラム言語命令は、次の4つのフィールドで構成されています-

[ label: ]   mnemonics  [ operands ]   [;comment ]

角括弧([])は、フィールドがオプションであることを示します。

  • ザ・ label fieldプログラムがコードの行を名前で参照できるようにします。ラベルフィールドは、特定の文字数を超えることはできません。

  • ザ・ mnemonics そして operands fields一緒にプログラムの実際の作業を実行し、タスクを実行します。ADD A、C&MOV C、#68のようなステートメント。ここで、ADDとMOVは、オペコードを生成するニーモニックです。「A、C」と「C、#68」はオペランドです。これらの2つのフィールドには、ディレクティブを含めることができます。ディレクティブはマシンコードを生成せず、アセンブラによってのみ使用されますが、命令はCPUが実行するためにマシンコードに変換されます。

1.0000         ORG  0H            ;start (origin) at location 0 
2 0000 7D25    MOV  R5,#25H       ;load 25H into R5 
3.0002 7F34    MOV  R7,#34H       ;load 34H into  R7 
4.0004 7400    MOV  A,#0          ;load 0 into A 
5.0006 2D      ADD  A,R5          ;add contents of R5 to A 
6.0007 2F      ADD  A,R7          ;add contents of R7 to A
7.0008 2412    ADD  A,#12H        ;add to A value 12 H 
8.000A 80FE    HERE: SJMP HERE    ;stay in this loop 
9.000C END                        ;end of asm source file
  • ザ・ comment field コメントインジケータであるセミコロンで始まります。

  • プログラムのラベル「HERE」に注目してください。命令を参照するラベルの後にはコロンを付ける必要があります。

8051プログラムのアセンブルと実行

ここでは、アセンブリ言語の基本的な形式について説明します。アセンブリ言語プログラムを作成、アセンブル、および実行する手順は次のとおりです。

  • まず、エディターを使用して、上記のプログラムと同様のプログラムを入力します。すべてのMicrosoftオペレーティングシステムに付属しているMS-DOSEDITプログラムのようなエディタを使用して、プログラムを作成または編集できます。エディタはASCIIファイルを生成できる必要があります。ソースファイルの「asm」拡張子は、次のステップでアセンブラによって使用されます。

  • 「asm」ソースファイルには、手順1で作成したプログラムコードが含まれています。これは、8051アセンブラに送られます。次に、アセンブラはアセンブリ言語命令をマシンコード命令に変換し、.obj file (オブジェクトファイル)と .lst file(リストファイル)。とも呼ばれますsource file、そのため、一部のアセンブラでは、このファイルに「src」拡張子を付ける必要があります。「lst」ファイルはオプションです。アセンブラが検出したすべてのオペコードとアドレス、およびエラーが一覧表示されるため、プログラムにとって非常に便利です。

  • アセンブラには、次の3番目のステップが必要です。 linking。リンクプログラムは、1つ以上のオブジェクトファイルを受け取り、拡張子が「abs」の絶対オブジェクトファイルを生成します。

  • 次に、「abs」ファイルは「OH」(オブジェクトから16進へのコンバーター)と呼ばれるプログラムに送られます。このプログラムは、ROMに書き込む準備ができている拡張子「hex」のファイルを作成します。

データ・タイプ

8051マイクロコントローラには8ビットの単一データタイプが含まれており、各レジ​​スタも8ビットサイズです。プログラマーは、CPUで処理できるように、8ビットより大きいデータ(00からFFH、または10進数で255)に分解する必要があります。

DB(バイトの定義)

DBディレクティブは、アセンブラで最も広く使用されているデータディレクティブです。8ビットデータを定義するために使用されます。また、10進数、2進数、16進数、またはASCII形式のデータを定義するために使用することもできます。10進数の場合、10進数の後の「D」はオプションですが、「B」(2進数)および「Hl」(16進数)には必須です。

ASCIIを示すには、文字を引用符で囲みます(「このように」)。アセンブラは、数字/文字のASCIIコードを自動的に生成します。DBディレクティブは、2文字を超えるASCII文字列を定義するために使用できる唯一のディレクティブです。したがって、すべてのASCIIデータ定義に使用する必要があります。DBのいくつかの例を以下に示します-

ORG  500H 
DATA1:  DB   28                     ;DECIMAL (1C in hex) 
DATA2:  DB   00110101B              ;BINARY  (35 in hex) 
DATA3:  DB   39H                    ;HEX 
        ORG  510H 
DATA4:  DB   "2591"                 ;ASCII  NUMBERS 
        ORG  520H                         
DATA6:  DA   "MY NAME IS Michael"   ;ASCII CHARACTERS

ASCII文字列の前後に一重引用符または二重引用符を使用できます。DBは、バイトサイズのチャンクでメモリを割り当てるためにも使用されます。

アセンブラディレクティブ

8051のディレクティブのいくつかは次のとおりです-

  • ORG (origin)− originディレクティブは、アドレスの開始を示すために使用されます。16進数または10進数の形式の数値を取ります。数値の後にHが指定されている場合、数値は16進数として扱われ、それ以外の場合は10進数として扱われます。アセンブラは10進数を16進数に変換します。

  • EQU (equate)−メモリ位置を占有せずに定数を定義するために使用されます。EQUは、定数値をデータラベルに関連付けて、ラベルがプログラムに表示されるようにします。その定数値がラベルの代わりに使用されます。命令「MOVR3、#COUNT」の実行中に、レジスタR3に値25がロードされます(#記号に注意してください)。EQUを使用する利点は、プログラマーがEQUを一度変更でき、アセンブラーがすべての出現箇所を変更できることです。プログラマーはプログラム全体を検索する必要はありません。

  • END directive−ソース(asm)ファイルの終わりを示します。ENDディレクティブは、プログラムの最後の行です。ENDディレクティブの後は、アセンブラによって無視されます。

アセンブリ言語のラベル

アセンブリ言語のすべてのラベルは、以下の規則に従う必要があります-

  • 各ラベル名は一意である必要があります。アセンブリ言語プログラミングでラベルに使用される名前は、大文字と小文字の両方のアルファベット、0から9までの数字、および疑問符(?)、ピリオド(。)などの特殊文字で構成され、@、アンダースコア(_)、およびドル($)。

  • 最初の文字はアルファベット文字である必要があります。数字にすることはできません。

  • 予約語はプログラムのラベルとして使用できません。たとえば、ADDワードとMOVワードは命令ニーモニックであるため、予約語です。

レジスタはCPUで使用され、処理されるデータ、またはフェッチされるデータを指すアドレスなどの情報を一時的に格納します。8051では、MSB(最上位ビット)D7からLSB(最下位ビット)D0までの8ビットのデータ型が1つあります。8ビットデータ型では、8ビットより大きいデータ型は、処理する前に8ビットチャンクに分割する必要があります。

8051で最も広く使用されているレジスタは、A(アキュムレータ)、B、R0-R7、DPTR(データポインタ)、およびPC(プログラムカウンタ)です。DPTRとPCを除いて、これらのレジスタはすべて8ビットです。

8051のストレージレジスタ

ここでは、次のタイプのストレージレジスタについて説明します。

  • Accumulator
  • Rレジスタ
  • Bレジスタ
  • データポインタ(DPTR)
  • プログラムカウンタ(PC)
  • スタックポインタ(SP)

アキュムレータ

アキュムレータであるレジスタAは、すべての算術演算および論理演算に使用されます。アキュムレータが存在しない場合、各計算(加算、乗算、シフトなど)のすべての結果がメインメモリに格納されます。大容量のメインメモリに使用されるテクノロジは、レジスタに使用されるテクノロジよりも遅い(ただし安価である)ため、メインメモリへのアクセスはアキュムレータなどのレジスタへのアクセスよりも遅くなります。

「R」レジスタ

「R」レジスタは、R0、R1からR7の8つのレジスタのセットである。これらのレジスタは、多くの操作で補助または一時ストレージレジスタとして機能します。10と20の合計の例を考えてみましょう。変数10をアキュムレータに格納し、別の変数20をたとえばレジスタR4に格納します。加算演算を処理するには、次のコマンドを実行します-

ADD A,R4

この命令を実行した後、アキュムレータには値30が含まれます。したがって、「R」レジスタは非常に重要な補助または helper registers。これらの「R」レジスタがなければ、アキュムレータだけではあまり役に立ちません。「R」レジスタは、値を一時的に保存するためのものです。

別の例を見てみましょう。R1とR2の値を合計し、結果からR3とR4の値を減算します。

MOV A,R3   ;Move the value of R3 into the accumulator 
ADD A,R4   ;Add the value of R4 
MOV R5,A   ;Store the resulting value temporarily in R5 
MOV A,R1   ;Move the value of R1 into the accumulator 
ADD A,R2   ;Add the value of R2 
SUBB A,R5  ;Subtract the value of R5 (which now contains R3 + R4)

ご覧のとおり、R5を使用してR3とR4の合計を一時的に保持しました。もちろん、これは(R1 + R2)–(R3 + R4)を計算する最も効率的な方法ではありませんが、値を一時的に格納する方法として「R」レジスタを使用する方法を示しています。

「B」レジスタ

「B」レジスタは、8ビット(1バイト)の値を保持できるという意味でアキュムレータと非常によく似ています。「B」レジスタは、2つの8051命令でのみ使用されます。MUL AB そして DIV AB。Aを別の数値ですばやく簡単に乗算または除算するには、他の数値を「B」に格納して、これら2つの命令を使用できます。MULおよびDIV命令の使用とは別に、「B」レジスタは、9番目のRレジスタのように、さらに別の一時ストレージレジスタとして使用されることがよくあります。

データポインタ

データポインタ(DPTR)は、8051で唯一のユーザーアクセス可能な16ビット(2バイト)レジスタです。アキュムレータ、R0〜R7レジスタ、およびBレジスタは1バイトの値のレジスタです。DPTRは、データを指すためのものです。これは、DPTRによって示されるアドレスを使用して外部メモリにアクセスするために8051によって使用されます。DPTRは、使用可能な唯一の16ビットレジスタであり、2バイト値を格納するためによく使用されます。

プログラムカウンター

プログラムカウンタ(PC)は、次に実行する命令がメモリ内のどこにあるかを8051に通知する2バイトのアドレスです。PCは、8051が初期化される0000hから起動し、命令が実行されるたびにインクリメントされます。PCは常に1ずつインクリメントされるわけではありません。一部の命令では2バイトまたは3バイトが必要になる場合があります。このような場合、PCは2または3ずつ増加します。

Branch, jump、および interrupt操作は、次の順次位置以外のアドレスでプログラムカウンタをロードします。パワーオンリセットをアクティブにすると、レジスタ内のすべての値が失われます。これは、リセット時にPCの値が0であることを意味し、CPUがROMロケーション0000から最初のオペコードをフェッチするように強制します。これは、CPUがROMロケーション0000を見つけることを期待しているため、アップコードの最初のバイトをROMロケーション0000に配置する必要があることを意味します最初の指示。

スタックポインタ(SP)

スタックポインタは、DPTRとPCを除くすべてのレジスタと同様に、8ビット(1バイト)の値を保持できます。スタックポインタは、次の値がスタックから削除される場所を示します。値がスタックにプッシュされると、SPの値がインクリメントされ、その値が結果のメモリ位置に格納されます。値がスタックからポップされると、SPによって示されるメモリ位置から値が返され、SPの値がデクリメントされます。

この操作の順序は重要です。8051が初期化されると、SPは07hに初期化されます。値が同時にスタックにプッシュされると、8051は最初にSPの値を(07hから08hに)インクリメントし、次にプッシュされた値をそのメモリに格納するため、値は内部RAMアドレス08hに格納されます。アドレス(08h)。SPは、PUSH、POP、ACALL、LCALL、RET、およびRETIの6つの命令によって8051によって直接変更されます。

8051のROMスペース

8051の一部のファミリメンバーは、4KバイトのオンチップROMしか持っていません(例:8751、AT8951)。AT89C52のように8KROMを搭載しているものもあれば、DallasSemiconductorのように32Kバイトと64KバイトのオンチップROMを搭載しているファミリもあります。覚えておくべきポイントは、8051のプログラムカウンタは16ビットレジスタ(0000からFFFFアドレス)であるため、8051ファミリのメンバーは64Kバイトを超えるオペコードにアクセスできないことです。

8051内のプログラムROMの最初の場所のアドレスは0000Hですが、最後の場所はチップ上のROMのサイズによって異なる場合があります。8051ファミリのメンバーの中で、AT8951には$ kバイトのオンチップROMがあり、メモリアドレスは0000(最初の場所)から0FFFH(最後の場所)です。

8051フラグビットとPSWレジスタ

プログラムステータスワード(PSW)レジスタは、8ビットレジスタであり、別名 flag register。幅は8ビットですが、使用されるのは6ビットのみです。2つの未使用ビットはuser-defined flags。4つのフラグが呼び出されますconditional flags、これは、命令が実行された後に発生する状態を示すことを意味します。これらの4つはCY (運ぶ)、 AC (補助キャリー)、 P (パリティ)、および OV(オーバーフロー)。ビットRS0およびRS1は、バンクレジスタを変更するために使用されます。次の図は、プログラムステータスワードレジスタを示しています。

PSWレジスタには、CPUの現在のステータスを反映するステータスビットが含まれています。

CY CA F0 RS1 RS0 OV - P

CY PSW.7 キャリーフラグ
交流 PSW.6 補助キャリーフラグ
F0 PSW.5 ユーザーが汎用で使用できるフラグ0。
RS1 PSW.4 レジスタバンクセレクタビット1
RS0 PSW.3 レジスタバンクセレクタビット0
OV PSW.2 オーバーフローフラグ
- PSW.1 ユーザー定義可能なフラグ
P PSW.0 パリティフラグ。アキュムレータの1ビットの偶数/奇数を示すために、命令サイクル中にハードウェアによってセット/クリアされます。

RS0およびRS1ビットを使用して、対応するレジスタバンクビットを選択できます。

RS1 RS2 レジスターバンク 住所
0 0 0 00H-07H
0 1 1 08H-0FH
1 0 2 10H-17H
1 1 3 18H-1FH
  • CY, the carry flag−このキャリーフラグは、D7ビットからのキャリーが発生するたびにセット(1)されます。8ビットの加算または減算演算の後に影響を受けます。「SETBC」や「CLRC」などの命令で直接1または0にリセットすることもできます。「SETB」はセットビットキャリーを表し、「CLR」はクリアキャリーを表します。

  • AC, auxiliary carry flag− ADDまたはSUB操作中にD3およびD4からのキャリーがある場合、ACビットがセットされます。それ以外の場合はクリアされます。これは、2進化10進演算を実行する命令に使用されます。

  • P, the parity flag−パリティフラグは、アキュムレータレジスタの1の数のみを表します。Aレジスタに奇数の1が含まれている場合、P = 1; 偶数の1の場合、P = 0です。

  • OV, the overflow flag−このフラグは、符号付き数値演算の結果が大きすぎて上位ビットが符号ビットにオーバーフローするたびに設定されます。符号付き算術演算のエラーを検出するためにのみ使用されます。

次の手順で、9CHおよび64Hを追加した後のCY、AC、およびPフラグのステータスを表示します。

MOV A、#9CH

追加A、#64H

Solution:  9C   10011100 
          +64   01100100 
          100   00000000 
			 
CY = 1 since there is a carry beyond D7 bit  
AC = 0 since there is a carry from D3 to D4 
P  = 0 because the accumulator has even number of 1's

8051マイクロコントローラには合計128バイトのRAMが搭載されています。これらの128バイトのRAMの割り当てについて説明し、スタックおよびレジスタとしての使用法を調べます。

8051でのRAMメモリスペースの割り当て

8051内の128バイトのRAMには、アドレス00〜7FHが割り当てられます。それらはメモリ位置として直接アクセスでき、次のように3つの異なるグループに分けられます-

  • 00Hから1FHの位置までの32バイトは、レジスタバンクとスタック用に確保されています。

  • 20Hから2FHの位置までの16バイトは、ビットアドレス指定可能な読み取り/書き込みメモリ用に確保されています。

  • 30Hから7FHの場所までの80バイトは、読み取りおよび書き込みストレージに使用されます。それはとして呼ばれますscratch pad。これらの80の場所のRAMは、8051プログラマーがデータとパラメーターを格納する目的で広く使用されています。

8051年に銀行を登録する

レジスタバンクとスタック用に合計32バイトのRAMが確保されています。これらの32バイトは4つのレジスタバンクに分割され、各バンクには8つのレジスタR0〜R7があります。0から7までのRAMロケーションは、R0〜R7のバンク0用に確保されます。R0はRAMロケーション0、R1はRAMロケーション1、R2はロケーション2というように、バンクのR7に属するメモリロケーション7まで続きます。 0。

レジスタR0〜R7の2番目のバンクは、RAMロケーション08から始まり、ロケーションOFHに移動します。R0〜R7の3番目のバンクは、メモリ位置10Hから始まり、位置17Hに移動します。最後に、RAMの位置18Hから1FHは、R0〜R7の4番目のバンク用に確保されています。

デフォルトのレジスタバンク

RAMロケーション00〜1Fが4つのレジスタバンク用に確保されている場合、8051の電源を入れたときに、R0〜R7のどのレジスタバンクにアクセスできますか?答えはレジスタバンク0です。つまり、8051のプログラミング時に0〜7のRAMロケーションにR0〜R7という名前でアクセスします。これらのRAMロケーションは、メモリロケーションではなく、R0〜R7などの名前で参照する方がはるかに簡単だからです。

レジスタバンクを切り替える方法

レジスタバンク0は、8051の電源が入っているときのデフォルトです。PSWレジスタを使用して他のバンクに切り替えることができます。PSWのD4ビットとD3ビットは、ビットアドレス指定可能な命令SETBとCLRからアクセスできるため、目的のレジスタバンクを選択するために使用されます。たとえば、「SETB PSW.3」は、PSW.3 = 1を設定し、バンクレジスタ1を選択します。

RS1 RS2 選択された銀行
0 0 Bank0
0 1 Bank1
1 0 Bank2
1 1 Bank3

スタックとその操作

8051でスタック

スタックは、CPUがデータやメモリアドレスなどの情報を一時的に格納するために使用するRAMのセクションです。CPUは、レジスタ数が限られていることを考慮して、このストレージ領域を必要とします。

スタックへのアクセス方法

スタックはRAMのセクションであるため、CPU内にそれを指すレジスタがあります。スタックへのアクセスに使用されるレジスタは、スタックポインタレジスタと呼ばれます。8051のスタックポインタは8ビット幅であり、00からFFHの値を取ることができます。8051が初期化されると、SPレジスタには値07Hが含まれます。これは、RAMロケーション08がスタックに使用される最初のロケーションであることを意味します。スタックへのCPUレジスタの格納操作は、PUSH、およびスタックからCPUレジスタに内容を戻すことをCPUレジスタと呼びます。 POP

スタックにプッシュする

8051では、スタックポインタ(SP)は、スタックの最後に使用された場所を指します。データがスタックにプッシュされると、スタックポインタ(SP)が1インクリメントされます。PUSHが実行されると、レジスタの内容がスタックに保存され、SPが1インクリメントされます。レジスタをスタックにプッシュするには、 RAMアドレスを使用する必要があります。たとえば、命令「PUSH 1」は、レジスタR1をスタックにプッシュします。

スタックから飛び出す

スタックの内容を特定のレジスタにポップバックすることは、プッシュのプロセスとは逆です。ポップ操作のたびに、スタックの最上位バイトが命令で指定されたレジスタにコピーされ、スタックポインタが1回デクリメントされます。

プログラムの流れは、制御転送命令が実行されない限り、ある命令から次の命令へと順番に進みます。アセンブリ言語のさまざまなタイプの制御転送命令には、条件付きまたは無条件のジャンプと呼び出し命令が含まれます。

ループとジャンプの命令

8051でループ

一連の命令を特定の回数繰り返すことを、 loop。指示DJNZ reg, labelループ操作を実行するために使用されます。この命令では、レジスタは1だけデクリメントされます。ゼロでない場合、8051はラベルで参照されているターゲットアドレスにジャンプします。

レジスタには、ループの開始前の繰り返し回数のカウンタがロードされます。この命令では、レジスタのデクリメントとジャンプの決定の両方が1つの命令に結合されます。レジスタはR0〜R7のいずれかです。カウンターはRAMの場所にすることもできます。

Multiply 25 by 10 using the technique of repeated addition.

Solution−乗算は、被乗数を乗数と同じ回数だけ繰り返し加算することで実現できます。例えば、

25 * 10 = 250(FAH)

25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 = 250

MOV A,#0             ;A = 0,clean ACC 
   MOV R2,#10           ; the multiplier is replaced in R2 
   Add A,#25            ;add the multiplicand to the ACC 
	
AGAIN:DJNZ R2, 
AGAIN:repeat  until R2 = 0 (10 times) 

   MOV R5 , A           ;save A in R5 ;R5 (FAH)

Drawback in 8051 −命令によるループアクション DJNZ Reg label256回の反復のみに制限されています。条件付きジャンプが行われない場合、ジャンプに続く命令が実行されます。

ループ内でループする

別のループ内でループを使用する場合、それは nested loop。最大カウントが256に制限されている場合、2つのレジスタを使用してカウントを保持します。したがって、このメソッドを使用して、アクションを256回以上繰り返します。

Example

-にプログラムを書く

  • 値55Hでアキュムレータをロードします。
  • ACCを700回補完します。

Solution− 700は255(任意のレジスタの最大容量)より大きいため、2つのレジスタを使用してカウントを保持します。次のコードは、カウントに2つのレジスタR2とR3を使用する方法を示しています。

MOV A,#55H            ;A = 55H 
	
NEXT: MOV R3,#10         ;R3 the outer loop counter 
AGAIN:MOV R2,#70         ;R2 the inner loop counter 

   CPL A                 ;complement

その他の条件付きジャンプ

次の表に、8051で使用される条件付きジャンプを示します。

命令 アクション
JZ A = 0の場合にジャンプ
JNZ A≠0の場合にジャンプ
DJNZ レジスタ≠0の場合、デクリメントとジャンプ
CJNE A、データ A≠データの場合にジャンプ
CJNE reg、#data バイト≠データの場合にジャンプ
JC CY = 1の場合にジャンプ
JNC CY≠1の場合にジャンプ
JB ビット= 1の場合にジャンプ
JNB ビット= 0の場合にジャンプ
JBC ビット= 1の場合にジャンプし、ビットをクリアします
  • JZ (jump if A = 0)−この命令では、アキュムレータの内容がチェックされます。ゼロの場合、8051はターゲットアドレスにジャンプします。JZ命令はアキュムレータにのみ使用でき、他のレジスタには適用されません。

  • JNZ (jump if A is not equal to 0)−この命令では、アキュムレータの内容がゼロ以外であることがチェックされます。ゼロでない場合、8051はターゲットアドレスにジャンプします。

  • JNC (Jump if no carry, jumps if CY = 0)−フラグ(またはPSW)レジスタのキャリーフラグビットは、「JNCラベル」をジャンプするかどうかを決定するために使用されます。CPUは、キャリーフラグを調べて、キャリーフラグが発生しているかどうかを確認します(CY = 1)。上げられていない場合、CPUはラベルのアドレスから命令のフェッチと実行を開始します。CY = 1の場合、ジャンプはしませんが、JNCの下の次の命令を実行します。

  • JC (Jump if carry, jumps if CY = 1) − CY = 1の場合、ターゲットアドレスにジャンプします。

  • JB (jump if bit is high)

  • JNB (jump if bit is low)

Note −すべての条件付きジャンプは短いジャンプであることに注意する必要があります。つまり、ターゲットのアドレスは、プログラムカウンタの内容から–128〜 +127バイト以内である必要があります。

無条件ジャンプ命令

8051には2つの無条件ジャンプがあります-

  • LJMP (long jump)− LJMPは3バイトの命令で、最初のバイトはオペコードを表し、2番目と3番目のバイトはターゲット位置の16ビットアドレスを表します。2バイトのターゲットアドレスは、0000からFFFFHまでの任意のメモリ位置へのジャンプを許可するためのものです。

  • SJMP (short jump)−これは2バイトの命令であり、最初のバイトはオペコードで、2番目のバイトはターゲット位置の相対アドレスです。相対アドレスの範囲は00HからFFHで、前方ジャンプと後方ジャンプに分けられます。つまり、現在のPC(プログラムカウンタ)のアドレスを基準にして、メモリの–128〜 +127バイト以内です。フォワードジャンプの場合、ターゲットアドレスは現在のPCから127バイトのスペース内にある可能性があります。後方ジャンプの場合、ターゲットアドレスは現在のPCから–128バイト以内にある可能性があります。

ショートジャンプアドレスの計算

すべての条件付きジャンプ(JNC、JZ、およびDJNZ)は、2バイトの命令であるため、短いジャンプです。これらの命令では、最初のバイトはオペコードを表し、2番目のバイトは相対アドレスを表します。ターゲットアドレスは常にプログラムカウンタの値を基準にしています。ターゲットアドレスを計算するために、ジャンプのすぐ下の命令のPCに2番目のバイトが追加されます。以下に示すプログラムを見てください-

Line   PC    Op-code   Mnemonic   Operand 
1      0000               ORG       0000 
2      0000  7800         MOV       R0,#003  
3      0002  7455         MOV       A,#55H0 
4      0004  6003         JZ        NEXT 
5      0006  08           INC       R0 
6      0007  04   AGAIN:  INC       A 
7      0008  04           INC       A 
8      0009  2477 NEXT:   ADD       A, #77h 
9      000B  5005         JNC       OVER 
10     000D  E4           CLR       A
11     000E  F8           MOV       R0, A 
12     000F  F9           MOV       R1, A 
13     0010  FA          MOV       R2, A 
14     0011  FB           MOV       R3, A 
15     0012  2B   OVER:   ADD       A, R3 
16     0013  50F2         JNC       AGAIN 
17     0015  80FE HERE:   SJMP      HERE 
18     0017             END

後方ジャンプターゲットアドレスの計算

フォワードジャンプの場合、変位値は0〜127(16進数で00〜7F)の正の数です。ただし、後方ジャンプの場合、変位は0〜–128の負の値です。

呼び出し手順

CALLは、サブルーチンまたはメソッドを呼び出すために使用されます。サブルーチンは、頻繁に実行する必要のある操作またはタスクを実行するために使用されます。これにより、プログラムがより構造化され、メモリスペースが節約されます。LCALLとACALLの2つの命令があります。

LCALL(ロングコール)

LCALLは3バイトの命令で、最初のバイトはオペコードを表し、2番目と3番目のバイトはターゲットサブルーチンのアドレスを提供するために使用されます。LCALLを使用して、8051の64Kバイトのアドレス空間内で使用可能なサブルーチンを呼び出すことができます。

呼び出されたサブルーチンの実行後のポイントに正常に戻るために、CPUはスタック上のLCALLのすぐ下に命令のアドレスを保存します。したがって、サブルーチンが呼び出されると、制御はそのサブルーチンに移され、プロセッサはPC(プログラムカウンタ)をスタックに保存し、新しい場所から命令のフェッチを開始します。命令RET(return)は、サブルーチンの実行が終了した後、制御を呼び出し元に戻します。すべてのサブルーチンは、最後の命令としてRETを使用します。

ACALL(アブソリュートコール)

3バイトのLCALLとは対照的に、ACALLは2バイトの命令です。2バイトのうち11ビットのみがアドレスに使用されるため、サブルーチンのターゲットアドレスは2Kバイト以内である必要があります。ACALLとLCALLの違いは、LCALLのターゲットアドレスは8051の64Kバイトのアドレス空間内のどこにでも配置できるのに対し、CALLのターゲットアドレスは2Kバイトの範囲内にあることです。

アン addressing mode特定のメモリ位置をどのようにアドレス指定するかを指します。この命令を実行するには、次の5つの異なる方法または5つのアドレッシングモードがあります。

  • 即時アドレッシングモード
  • ダイレクトアドレッシングモード
  • 直接アドレッシングモードを登録する
  • 間接アドレッシングモードを登録する
  • インデックス付きアドレッシングモード

即時アドレッシングモード

例から始めましょう。

MOV A, #6AH

一般的に、私たちは書くことができます、

MOV A, #data

それはと呼ばれます immediate 8ビットデータはすぐにアキュムレータ(宛先オペランド)に転送されるためです。

次の図は、上記の命令とその実行について説明しています。オペコード74Hは0202アドレスに保存されます。データ6AHは、プログラムメモリの0203アドレスに保存されます。オペコード74Hを読み取った後、次のプログラムメモリアドレスのデータがアキュムレータAに転送されます(E0Hはアキュムレータのアドレスです)。命令は2バイトであり、1サイクルで実行されるため、プログラムカウンタは2ずつインクリメントされ、プログラムメモリの0204を指します。

Note− 6AHの前の「#」記号は、オペランドがデータ(8ビット)であることを示します。'#'がない場合、16進数がアドレスとして使用されます。

ダイレクトアドレッシングモード

これは、オペランドをアドレス指定する別の方法です。ここでは、データ(ソースデータ)のアドレスをオペランドとして指定しています。例を見てみましょう。

MOV A, 04H

レジスタバンク#0(4番目のレジスタ)のアドレスは04Hです。MOV命令を実行すると、レジスタ04Hに格納されているデータがアキュムレータに移動します。レジスタ04Hがデータ1FHを保持するので、1FHはアキュムレータに移動される。

Note−即時モードとは異なり、ダイレクトアドレッシングモードでは「#」を使用していません。'#'を使用した場合、データ値04Hは1FHではなくアキュムレータに転送されます。

次に、次の図を見てください。命令がどのように実行されるかを示します。

上の図に示すように、これは2バイトの命令であり、完了するまでに1サイクルが必要です。PCは2ずつインクリメントされ、0204を指します。命令MOV A、アドレスのオペコードはE5Hです。0202の命令が実行されると(E5H)、アキュムレータがアクティブになり、データを受信できるようになります。次に、PCは0203として次のアドレスに移動し、ソースデータ(アキュムレータに転送される)が配置されている04Hの場所のアドレスを検索します。04Hで、コントロールはデータ1Fを見つけてアキュムレータに転送し、実行が完了します。

ダイレクトアドレッシングモードの登録

このアドレッシングモードでは、レジスタ名を直接(ソースオペランドとして)使用します。例を使って理解してみましょう。

MOV A, R4

一度に、レジスタはR0からR7までの値を取ることができます。そのようなレジスタは32個あります。レジスタをアドレス指定するために8つの変数を持つ32のレジスタを使用するために、レジスタバンクが使用されます。0から3までの名前の4つのレジスタバンクがあります。各バンクは、R0からR7までの名前の8つのレジスタで構成されています。

一度に1つのレジスタバンクを選択できます。レジスタバンクの選択は、Special Function Register (SFR)という名前 Processor Status Word(PSW)。PSWは8ビットSFRであり、必要に応じて各ビットをプログラムできます。ビットはPSW.0からPSW.7まで指定されます。PSW.3およびPSW.4は、レジスタバンクを選択するために使用されます。

次に、次の図を見て、それがどのように機能するかを明確に理解してください。

オペコードECは、MOV A、R4に使用されます。オペコードはアドレス0202に格納され、実行されると、制御は関連するレジスタバンク(PSWで選択されている)のR4に直接送られます。レジスタバンク#0が選択されている場合、レジスタバンク#0のR4からのデータはアキュムレータに移動されます。ここで2Fは04Hに格納されています。04Hは、レジスタバンク#0のR4のアドレスを表します。

データ(2F)の動きは太字で強調表示されています。2Fはデータメモリ位置0CHからアキュムレータに転送されており、点線で示されています。0CHは、レジスタバンク#1のレジスタ4(R4)のアドレス位置です。上記の命令は1バイトであり、完全に実行するには1サイクルが必要です。つまり、レジスタ直接アドレッシングモードを使用してプログラムメモリを節約できます。

間接アドレッシングモードの登録

このアドレッシングモードでは、データのアドレスがオペランドとしてレジスタに格納されます。

MOV A, @R0

ここで、R0内の値は、アキュムレータに転送されるデータを保持するアドレスと見なされます。 Example:R0の値が20Hで、データ2FHがアドレス20Hに格納されている場合、この命令の実行後に値2FHがアキュムレータに転送されます。次の図を参照してください。

したがって、のオペコード MOV A, @R0E6Hです。レジスタバンク#0が選択されていると仮定すると、レジスタバンク#0のR0はデータ20Hを保持する。プログラム制御は20Hに移動し、そこでデータ2FHを見つけ、2FHをアキュムレータに転送します。これは1バイトの命令であり、プログラムカウンタは1ずつインクリメントし、プログラムメモリの0203に移動します。

Note−レジスタ間接アドレス指定命令を形成できるのはR0とR1のみです。つまり、プログラマーは@ R0または@ R1を使用して命令を作成できます。すべてのレジスタバンクが許可されます。

インデックス付きアドレッシングモード

インデックス付きアドレッシングモードの概念を理解するために、2つの例を取り上げます。次の手順を見てください-

MOVC A, @A+DPTR

そして

MOVC A, @A+PC

ここで、DPTRはデータポインタ、PCはプログラムカウンタです(どちらも16ビットレジスタです)。最初の例を考えてみましょう。

MOVC A, @A+DPTR

ソースオペランドは@A + DPTRです。この場所のソースデータが含まれています。ここでは、DPTRの内容とアキュムレータの現在の内容を追加しています。この追加により、ソースデータのアドレスである新しいアドレスが提供されます。このアドレスが指すデータは、アキュムレータに転送されます。

オペコードは93Hです。DPTRの値は01FEです。01はDPH(上位8ビット)にあり、FEはDPL(下位8ビット)にあります。アキュムレータの値は02Hです。次に、16ビットの加算が実行され、01FE H + 02Hの結果は0200Hになります。位置0200Hのデータはアキュムレータに転送されます。アキュムレータ内の以前の値(02H)は、0200Hからの新しいデータに置き換えられます。図では、アキュムレータの新しいデータが強調表示されています。

これは、実行に2サイクル必要な1バイトの命令であり、この命令に必要な実行時間は、以前の命令(すべて1サイクル)に比べて長くなっています。

他の例 MOVC A, @A+PC上記の例と同じように機能します。ここでは、アキュムレータでDPTRを追加する代わりに、プログラムカウンタ(PC)内のデータをアキュムレータで追加してターゲットアドレスを取得します。

特殊機能レジスタ(または特殊目的レジスタ、または単に特殊レジスタ)は、マイクロプロセッサのさまざまな機能を制御または監視するマイクロプロセッサ内のレジスタです。特殊レジスタは、プロセッサの特殊な機能やステータスと密接に関連しているため、通常の命令(追加、移動など)では直接書き込みできない場合があります。代わりに、一部のプロセッサアーキテクチャの一部の特殊レジスタは、それらを変更するために特別な命令を必要とします。

8051では、レジスタA、B、DPTR、およびPSWは、一般にSFR(特殊機能レジスタ)と呼ばれるレジスタグループの一部です。SFRには、名前またはアドレスでアクセスできます。

次の表に、SFRとそのアドレスのリストを示します。

バイトアドレス ビットアドレス
FF
F0 F7 F6 F5 F4 F3 F2 F1 F0 B
E0 E7 E6 E5 E4 E3 E2 E1 E0 ACC
D0 D7 D6 D5 D4 D3 D2 - D0 PSW
B8 - - - 紀元前 BB BA B9 B8 IP
B0 B7 B6 B5 B4 B3 B2 B1 B0 P3
A2 AF - - 交流 AB AA A9 A8 IE
A0 A7 A6 A5 A4 A3 A2 A1 A0 P2
99 ビットアドレス指定不可 SBUF
98 9F 9E 9D 9C 9B 9A 99 98 SCON
90 97 96 95 94 93 92 91 90 P1
8D ビットアドレス指定不可 TH1
8C ビットアドレス指定不可 TH0
8B ビットアドレス指定不可 TL1
8A ビットアドレス指定不可 TL0
89 ビットアドレス指定不可 TMOD
88 8F 8E 8D 8C 8B 8A 89 88 TCON
87 ビットアドレス指定不可 PCON
83 ビットアドレス指定不可 DPH
82 ビットアドレス指定不可 DPL
81 ビットアドレス指定不可 SP
80 87 87 85 84 83 82 81 80 P0

SFRアドレスについては、次の2点を考慮してください。

  • 特殊機能レジスタは、80HからFFHまでのアドレスを持つことができます。00から7FHまでのアドレスは8051内のRAMメモリのアドレスであるため、これらのアドレスは80Hより上です。

  • 80からFFのすべてのアドレス空間がSFRによって使用されるわけではありません。未使用の場所(80HからFFH)は予約されており、8051プログラマーが使用してはなりません。

CY PSW.7 キャリーフラグ
交流 PSW.6 補助キャリーフラグ
F0 PSW.5 ユーザーが汎用で使用できるフラグ0。
RS1 PSW.4 レジスタバンクセレクタビット1
RS0 PSW.3 レジスタバンクセレクタビット0
OV PSW.2 オーバーフローフラグ
- PSW.1 ユーザー定義可能なフラグ
P PSW.0 パリティフラグ。アキュムレータの1ビットの偶数/奇数を示すために、命令サイクル中にハードウェアによってセット/クリアされます。

次の例では、SFRレジスタの名前がそれらのアドレスに置き換えられています。

CY 交流 F0 RS1 RS0 OV - P

RS0およびRS1ビットを使用して、対応するレジスタバンクビットを選択できます。

RS1 RS2 レジスターバンク 住所
0 0 0 00H-07H
0 1 1 08H-0FH
1 0 2 10H-17H
1 1 3 18H-1FH

プログラムステータスワード(PSW)には、CPUの現在の状態を反映するステータスビットが含まれています。8051バリアントは、このステータス情報を備えた1つの特殊機能レジスタPSWを提供します。8251は、2つの追加のステータスフラグZとNを提供します。これらは、PSW1と呼ばれる2番目の特殊機能レジスタで使用できます。

A timer時間間隔を測定するために使用される特殊なタイプの時計です。経過時間を測定するためにゼロから上にカウントするタイマーは、多くの場合、stopwatch。これは、指定された時間間隔からカウントダウンし、時間遅延を生成するために使用されるデバイスです。たとえば、砂時計はタイマーです。

A counterは、クロック信号に関して、特定のイベントまたはプロセスが発生した回数を保存する(場合によっては表示する)デバイスです。マイクロコントローラの外部で発生するイベントをカウントするために使用されます。エレクトロニクスでは、フリップフロップなどのレジスタタイプの回路を使用して、カウンタを非常に簡単に実装できます。

タイマーとカウンターの違い

タイマーとカウンターの違いは次のとおりです。

タイマー カウンター
レジスタは、マシンサイクルごとにインクリメントされます。 レジスタは、外部入力ピン(T0、T1)に対応する1から0への遷移を考慮してインクリメントされます。
最大カウントレートは発振器周波数の1/12です。 最大カウントレートは発振器周波数の1/24です。
タイマーは内部クロックの周波数を使用し、遅延を生成します。 カウンタは外部信号を使用してパルスをカウントします。

8051のタイマーとそれに関連するレジスタ

8051には、タイマー0とタイマー1の2つのタイマーがあります。これらは、タイマーまたはイベントカウンターとして使用できます。タイマー0とタイマー1はどちらも16ビット幅です。8051は8ビットアーキテクチャに従っているため、各16ビットは下位バイトと上位バイトの2つの別々のレジスタとしてアクセスされます。

タイマー0レジスタ

タイマ0の16ビットレジスタは、下位バイトと上位バイトとしてアクセスされます。下位バイトレジスタはTL0(タイマー0下位バイト)と呼ばれ、上位バイトレジスタはTH0(タイマー0上位バイト)と呼ばれます。これらのレジスタには、他のレジスタと同じようにアクセスできます。たとえば、命令MOV TL0, #4H 値をタイマー#0の下位バイトに移動します。

タイマー1レジスタ

タイマ1の16ビットレジスタは、下位バイトと上位バイトとしてアクセスされます。下位バイトレジスタはTL1(タイマ1下位バイト)と呼ばれ、上位バイトレジスタはTH1(タイマ1上位バイト)と呼ばれます。これらのレジスタには、他のレジスタと同じようにアクセスできます。たとえば、命令MOV TL1, #4H 値をタイマー1の下位バイトに移動します。

TMOD(タイマーモード)レジスタ

タイマ0とタイマ1はどちらも同じレジスタを使用して、さまざまなタイマ動作モードを設定します。これは、タイマー0用に下位4ビット、タイマー用に上位4ビットが確保されている8ビットレジスタです。いずれの場合も、下位2ビットを使用してタイマーモードを事前に設定し、上位2ビットを使用して場所を指定します。

Gate −設定すると、タイマーはINT(0,1)がハイのときにのみ実行されます。

C/T −カウンタ/タイマ選択ビット。

M1 −モードビット1。

M0 −モードビット0。

ゲート

すべてのタイマーには、開始と停止の手段があります。一部のタイマーはソフトウェアによって、一部はハードウェアによってこれを実行し、一部はソフトウェアとハ​​ードウェアの両方の制御を備えています。8051タイマーには、ソフトウェアとハ​​ードウェアの両方の制御があります。タイマーの開始と停止は、命令を使用してソフトウェアによって制御されますSETB TR1 そして CLR TR1 タイマー1の場合、および SETB TR0 そして CLR TR0 タイマー0の場合。

SETB命令はそれを開始するために使用され、CLR命令によって停止されます。これらの命令は、TMODレジスタのGATE = 0である限り、タイマーを開始および停止します。タイマーは、TMODレジスタでGATE = 1にすることにより、外部ソースによって開始および停止できます。

C / T(時計/タイマー)

TMODレジスタのこのビットは、タイマーをとして使用するかどうかを決定するために使用されます。 delay generator または event manager。C / T = 0の場合、タイマー遅延生成のタイマーとして使用されます。時間遅延を作成するためのクロックソースは、8051の水晶周波数です。C/ T = 0の場合、8051に接続された水晶周波数も、8051タイマーが一定の間隔で刻む速度を決定します。

タイマー周波数は常に8051に接続されている水晶の周波数の1/12です。さまざまな8051ベースのシステムのXTAL周波数は10MHz〜40 MHzですが、通常は11.0592MHzのXTAL周波数で動作します。これは、8051.XTAL = 11.0592のシリアル通信のボーレートにより、8051システムがエラーなしでPCと通信できるためです。

M1 / M2

M1 M2 モード
0 0 13ビットタイマーモード。
0 1 16ビットタイマーモード。
1 0 8ビット自動リロードモード。
1 1 こぼれたモード。

タイマーのさまざまなモード

モード0(13ビットタイマーモード)

モード0のタイマー1とタイマー0は、どちらも8ビットカウンターとして動作します(32分周プリスケーラーを使用)。タイマレジスタは、TH1の8ビットすべてとTL1の下位5ビットで構成される13ビットレジスタとして構成されています。TL1の上位3ビットは不確定であるため、無視する必要があります。実行フラグ(TR1)を設定しても、レジスタはクリアされません。タイマー割り込みフラグTF1は、カウントがすべて1からすべて0にロールオーバーしたときに設定されます。モード0の動作は、タイマー0の場合もタイマー1の場合も同じです。

モード1(16ビットタイマーモード)

タイマーモード「1」は16ビットタイマーであり、一般的に使用されるモードです。16ビットすべてが使用されることを除いて、13ビットモードと同じように機能します。TLxは0から最大255までインクリメントされます。値255に達すると、TLxは0にリセットされ、THxは1ずつインクリメントされます。完全な16ビットタイマーであるため、タイマーには最大65536個の個別の値が含まれる場合があります。 65,536マシンサイクル後にオーバーフローして0に戻ります。

モード2(8ビット自動リロード)

両方のタイマレジスタは、自動リロードを備えた8ビットカウンタ(TL1およびTL0)として構成されています。TL1(TL0)からのオーバーフローは、TF1(TF0)を設定し、ソフトウェアによって事前設定されたTh1(TH0)の内容をTL1(TL0)に再ロードします。リロードにより、TH1(TH0)は変更されません。

自動リロードモードの利点は、タイマーに常に200〜255の値を含めることができることです。モード0または1を使用する場合は、コードをチェックインしてオーバーフローを確認する必要があります。その場合は、タイマーを200にリセットします。この場合、貴重な指示が値をチェックするか、リロードされます。モード2では、マイクロコントローラーがこれを処理します。モード2でタイマーを構成すると、タイマーがオーバーフローしたかどうかを確認する必要はありません。また、マイクロコントローラーハードウェアがすべてを行うため、値をリセットする必要もありません。自動リロードモードは、一般的なボーレートを確立するために使用されます。

モード3(スプリットタイマーモード)

タイマーモード「3」は、 split-timer mode。タイマー0がモード3に設定されると、2つの別々の8ビットタイマーになります。タイマー0はTL0で、タイマー1はTH0です。両方のタイマーは0から255までカウントし、オーバーフローの場合は0にリセットします。タイマー1のすべてのビットがTH0に関連付けられます。

タイマー0がスプリットモードの場合、実際のタイマー1(つまり、TH1とTL1)はモード0、1、または2に設定できますが、TH0にリンクされているビットとして開始/停止することはできません。実際のタイマー1は、マシンサイクルごとにインクリメントされます。

タイマーの初期化

タイマーモードを決定します。継続的に実行され、外部ピンから独立している16ビットタイマーについて考えてみます。

TMODSFRを初期化します。TMODの下位4ビットを使用し、タイマー0を検討します。タイマーを外部ピンから独立させたいので、GATE0とC / T0の2ビットを0のままにします。16ビットモードはタイマモード1なので、T0M1をクリアしてT0M0を設定します。事実上、オンにする唯一のビットはTMODのビット0です。次の命令を実行します-

MOV TMOD,#01h

現在、タイマー0は16ビットタイマーモードですが、タイマーは実行されていません。タイマーを実行モードで開始するには、次の命令を実行してTR0ビットを設定します。

SETB TR0

これで、タイマー0はすぐにカウントを開始し、マシンサイクルごとに1つずつインクリメントされます。

タイマーを読む

16ビットタイマーは2つの方法で読み取ることができます。タイマーの実際の値を16ビットの数値として読み取るか、タイマーがオーバーフローしたことを検出します。

タイマーオーバーフローの検出

タイマーが最大値から0にオーバーフローすると、マイクロコントローラーはTCONレジスタのTFxビットを自動的に設定します。したがって、タイマーの正確な値をチェックする代わりに、TFxビットをチェックできます。TF0が設定されている場合、タイマー0はオーバーフローしています。TF1が設定されている場合、タイマー1はオーバーフローしています。

割り込みは、ハードウェアまたはソフトウェアによって発行されるプロセッサへの信号であり、早急な対応が必要なイベントを示します。割り込みが発生するたびに、コントローラは現在の命令の実行を完了し、Interrupt Service Routine (ISR)または Interrupt Handler。ISRは、割り込みが発生したときに何をするかをプロセッサまたはコントローラに指示します。割り込みは、ハードウェア割り込みまたはソフトウェア割り込みのいずれかです。

ハードウェア割り込み

ハードウェア割り込みは、ディスクコントローラや外部周辺機器などの外部デバイスからプロセッサに送信される電子アラート信号です。たとえば、キーボードのキーを押したり、マウスを動かしたりすると、ハードウェア割り込みがトリガーされ、プロセッサがキーストロークまたはマウスの位置を読み取るようになります。

ソフトウェア割り込み

ソフトウェア割り込みは、例外的な状態、またはプロセッサによって実行されたときに割り込みを引き起こす命令セット内の特別な命令のいずれかによって引き起こされます。たとえば、プロセッサの算術論理演算装置が数値をゼロで除算するコマンドを実行すると、ゼロによる除算の例外が発生し、コンピュータは計算を中止するか、エラーメッセージを表示します。ソフトウェア割り込み命令は、サブルーチン呼び出しと同様に機能します。

ポーリングとは何ですか?

継続的な監視の状態は、 polling。マイクロコントローラは他のデバイスのステータスをチェックし続けます。その間、他の操作は行われず、監視のためにすべての処理時間を消費します。この問題は、割り込みを使用することで解決できます。

割り込み方式では、コントローラは割り込みが発生した場合にのみ応答します。したがって、コントローラは、インターフェイスされたデバイスおよび組み込みデバイスのステータス(フラグ、信号など)を定期的に監視する必要はありません。

v / sポーリングを中断します

これは、割り込みとポーリングを区別するアナロジーです。

割り込み ポーリング
割り込みは shopkeeper。サービスや製品が必要な場合、彼は彼のところに行き、彼に彼の必要性を知らせます。割り込みの場合、フラグまたは信号を受信すると、サービスが必要であることをコントローラに通知します。 ポーリング方法は salesperson。セールスマンは、製品やサービスの購入を要求している間、訪問販売を行っています。同様に、コントローラーはすべてのデバイスのフラグまたは信号を1つずつ監視し続け、サービスを必要とするコンポーネントにサービスを提供します。

割り込みサービスルーチン

割り込みごとに、割り込みサービスルーチン(ISR)が必要です。 interrupt handler。割り込みが発生すると、マイクロコントローラは割り込みサービスルーチンを実行します。割り込みごとに、その割り込みサービスルーチンISRのアドレスを保持するメモリ内の固定位置があります。ISRのアドレスを保持するために確保されているメモリ位置のテーブルは、割り込みベクタテーブルと呼ばれます。

割り込みベクタテーブル

8051のRESETを含む6つの割り込みがあります。

割り込み ROMの場所(16進数) ピン
割り込み ROMロケーション(HEX)
シリアルCOM(RIおよびTI) 0023
タイマー1割り込み(TF1) 001B
外部ハードウェア割り込み1(INT1) 0013 P3.3(13)
外部ハードウェア割り込み0(INT0) 0003 P3.2(12)
タイマー0(TF0) 000B
リセット 0000 9
  • リセットピンがアクティブになると、8051はアドレス位置0000にジャンプします。これはパワーアップリセットです。

  • タイマー用に2つの割り込みが確保されています。1つはタイマー0用、もう1つはタイマー1用です。割り込みベクタテーブルのメモリ位置は、それぞれ000BHと001BHです。

  • ハードウェア外部割り込み用に2つの割り込みが確保されています。ピン番号 12およびピン番号 ポート3の13は、それぞれ外部ハードウェア割り込みINT0およびINT1用です。メモリ位置は、割り込みベクタテーブルでそれぞれ0003Hと0013Hです。

  • シリアル通信には、受信と送信の両方に属する単一の割り込みがあります。メモリ位置0023Hはこの割り込みに属します。

割り込みを実行する手順

割り込みがアクティブになると、マイクロコントローラは次の手順を実行します。

  • マイクロコントローラは、現在実行中の命令を閉じ、次の命令(PC)のアドレスをスタックに保存します。

  • また、すべての割り込みの現在のステータスを内部的に(つまり、スタック上ではなく)保存します。

  • 割り込みサービスルーチンのアドレスを保持する割り込みベクタテーブルのメモリ位置にジャンプします。

  • マイクロコントローラは、割り込みベクタテーブルからISRのアドレスを取得し、それにジャンプします。RETI(割り込みからの復帰)である割り込みサービスサブルーチンの実行を開始します。

  • RETI命令を実行すると、マイクロコントローラは中断された場所に戻ります。まず、スタックの最上位バイトをPCにポップすることにより、スタックからプログラムカウンタ(PC)アドレスを取得します。次に、そのアドレスから実行を開始します。

エッジトリガーとレベルトリガー

割り込みモジュールには、レベルトリガーまたはエッジトリガーの2つのタイプがあります。

レベルトリガー エッジトリガー
レベルトリガー割り込みモジュールは、割り込みソースのレベルがアサートされるたびに常に割り込みを生成します。 エッジトリガー割り込みモジュールは、割り込みソースのアサートエッジを検出した場合にのみ割り込みを生成します。割り込みソースレベルが実際に変化すると、エッジが検出されます。また、定期的なサンプリングと、前のサンプルがアサート解除されたときにアサートされたレベルを検出することによっても検出できます。
ファームウェアの割り込みハンドラが割り込みを処理するときに割り込みソースがまだアサートされている場合、割り込みモジュールは割り込みを再生成し、割り込みハンドラを再度呼び出します。 エッジでトリガーされる割り込みモジュールは、割り込みソースの動作に関係なく、すぐに実行できます。
レベルでトリガーされる割り込みは、ファームウェアにとって面倒です。 エッジトリガー割り込みは、ファームウェアのコードの複雑さを低く抑え、ファームウェアの条件の数を減らし、割り込みが処理されるときの柔軟性を高めます。

割り込みの有効化と無効化

リセットすると、割り込みがアクティブになっていても、すべての割り込みが無効になります。マイクロコントローラがこれらの割り込みに応答するには、ソフトウェアを使用して割り込みを有効にする必要があります。

IE(割り込みイネーブル)レジスタは、割り込みの有効化と無効化を担当します。IEはビットアドレス可能なレジスタです。

割り込みイネーブルレジスタ

EA - ET2 ES ET1 EX1 ET0 EX0
  • EA −グローバルな有効化/無効化。

  • - −未定義。

  • ET2 −タイマー2割り込みを有効にします。

  • ES −シリアルポート割り込みを有効にします。

  • ET1 −タイマー1割り込みを有効にします。

  • EX1 −外部1割り込みを有効にします。

  • ET0 −タイマー0割り込みを有効にします。

  • EX0 −外部0割り込みを有効にします。

割り込みを有効にするには、次の手順を実行します-

  • 残りのレジスタを有効にするには、IEレジスタ(EA)のビットD7をハイにする必要があります。

  • EA = 1の場合、IEの対応するビットがハイであれば、割り込みが有効になり、応答されます。EA = 0の場合、IEレジスタ内の関連するピンがハイであっても、割り込みは応答しません。

8051での割り込み優先度

いずれかの割り込みに高い優先度を割り当てることで、割り込みの優先度を変更できます。これは、と呼ばれるレジスタをプログラミングすることによって実現されます。IP (割り込み優先度)。

次の図は、IPレジスタのビットを示しています。リセット時に、IPレジスタにはすべて0が含まれます。割り込みの優先度を高くするために、IPレジスタの対応するビットをハイにします。

- - - - PT1 PX1 PT0 PX0

- IP.7 実装されていません。
- IP.6 実装されていません。
- IP.5 実装されていません。
- IP.4 実装されていません。
PT1 IP.3 タイマー1の割り込み優先度レベルを定義します。
PX1 IP.2 外部割り込み1の優先度レベルを定義します。
PT0 IP.1 タイマー0の割り込み優先度レベルを定義します。
PX0 IP.0 外部割り込み0の優先度レベルを定義します。

割り込み内部割り込み

8051が割り込みに属するISRを実行していて、別のISRがアクティブになった場合はどうなりますか?このような場合、優先度の高い割り込みが優先度の低い割り込みを中断する可能性があります。これはとして知られていますinterrupt inside interrupt。8051では、優先度の低い割り込みは、優先度の高い割り込みによって割り込むことができますが、優先度の低い別の割り込みによって割り込むことはできません。

ソフトウェアによる割り込みのトリガー

シミュレーションによってISRをテストする必要がある場合があります。これは、割り込みをハイに設定し、それによって8051を割り込みベクタテーブルにジャンプさせる簡単な命令で実行できます。たとえば、タイマー1のIEビットを1に設定します。命令SETB TF1 何をしていても8051に割り込みをかけ、割り込みベクタテーブルにジャンプさせます。