Embedded-systems-quick-guide

提供:Dev Guides
移動先:案内検索

組み込みシステム-概要

システム

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

組み込みシステム

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

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

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

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

組み込みシステムの特性

  • 単機能-組み込みシステムは通常、特殊な操作を実行し、同じことを繰り返します。 例:ページャーは常にページャーとして機能します。
  • 厳しい制約-すべてのコンピューティングシステムは設計メトリックに制約がありますが、組み込みシステムの制約は特に厳しい場合があります。 設計メトリックは、コスト、サイズ、消費電力、パフォーマンスなどの実装の機能の尺度です。 単一のチップに収まるサイズである必要があり、リアルタイムでデータを処理するのに十分な速度で動作し、バッテリー寿命を延ばすために最小限の電力を消費する必要があります。
  • リアクティブおよびリアルタイム-多くの組み込みシステムは、システム環境の変化に継続的に反応し、遅延なくリアルタイムで特定の結果を計算する必要があります。 カークルーズコントローラーの例を考えてみましょう。速度およびブレーキセンサーを継続的に監視し、反応します。 限られた時間内で繰り返し加速または減速を計算する必要があります。計算が遅れると、車の制御に失敗する可能性があります。
  • マイクロプロセッサベース-マイクロプロセッサまたはマイクロコントローラベースでなければなりません。
  • メモリ-ソフトウェアは通常ROMに埋め込まれているため、メモリが必要です。 コンピューターに二次記憶は必要ありません。
  • 接続-入力および出力デバイスを接続するには、接続された周辺機器が必要です。
  • * HW-SWシステム*-より多くの機能と柔軟性のためにソフトウェアが使用されます。 パフォーマンスとセキュリティのためにハードウェアが使用されます。

利点

  • 簡単にカスタマイズ可能
  • 低消費電力
  • 低価格
  • 強化されたパフォーマンス

デメリット

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

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

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

埋め込みシステム構造

  • センサー-物理量を測定し、それを電気信号に変換します。電気信号は、観測者またはA2Dコンバーターなどの電子機器で読み取ることができます。 センサーは、測定された量をメモリに保存します。
  • * A-Dコンバーター*-アナログデジタルコンバーターは、センサーから送信されたアナログ信号をデジタル信号に変換します。
  • *プロセッサとASIC *-プロセッサはデータを処理して出力を測定し、メモリに保存します。
  • * D-Aコンバーター*-デジタル-アナログコンバーターは、プロセッサーから供給されたデジタルデータをアナログデータに変換します
  • アクチュエータ-アクチュエータは、D-Aコンバータによって与えられた出力を、そこに保存されている実際の(予想される)出力と比較し、承認された出力を保存します。

組み込みシステム-プロセッサー

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

システム内のプロセッサー

プロセッサには2つの必須ユニットがあります-

  • プログラムフロー制御ユニット(CU)
  • 実行ユニット(EU)

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

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

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

プロセッサの種類

プロセッサは、次のカテゴリにすることができます-

  • 汎用プロセッサー(GPP)
  • マイクロプロセッサ
  • マイクロコントローラー
  • 組み込みプロセッサ
  • デジタルシグナルプロセッサ
  • メディアプロセッサー
  • 特定用途向けシステムプロセッサ(ASSP)
  • 特定用途向け命令プロセッサ(ASIP)
  • 特定用途向け集積回路(ASIC)または超大規模集積(VLSI)回路上のGPPコアまたはASIPコア。

マイクロプロセッサ

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

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

マイクロプロセッサ

マイクロコントローラー

マイクロコントローラーは、シングルチップVLSIユニット(*マイクロコンピューター*とも呼ばれます)であり、計算能力は限られていますが、強化された入出力機能と多くのオンチップ機能ユニットを備えています。

CPU RAM ROM
I/O Port Timer Serial COM Port

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

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

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

Microprocessor Microcontroller
Microprocessors are multitasking in nature. Can perform multiple tasks at a time. For example, on computer we can play music while writing text in text editor. Single task oriented. For example, a washing machine is designed for washing clothes only.
RAM, ROM, I/O Ports, and Timers can be added externally and can vary in numbers. RAM, ROM, I/O Ports, and Timers cannot be added externally. These components are to be embedded together on a chip and are fixed in numbers.
Designers can decide the number of memory or I/O ports needed. Fixed number for memory or I/O makes a microcontroller ideal for a limited but specific task.
External support of external memory and I/O ports makes a microprocessor-based system heavier and costlier. Microcontrollers are lightweight and cheaper than a microprocessor.
External devices require more space and their power consumption is higher. A microcontroller-based system consumes less power and takes less space.

組み込みシステム-アーキテクチャの種類

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

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

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

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

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

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

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

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

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

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

Von-Neumannアーキテクチャとハーバードアーキテクチャ

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

Von-Neumann Architecture Harvard Architecture
Single memory to be shared by both code and data. Separate memories for code and data.
Processor needs to fetch code in a separate clock cycle and data in another clock cycle. So it requires two clock cycles. Single clock cycle is sufficient, as separate buses are used to access code and data.
Higher speed, thus less time consuming. Slower in speed, thus more time-consuming.
Simple in design. Complex in design.

CISCおよびRISC

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

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

CISC vs RISC

次のポイントは、CISCとRISCを区別します-

CISC RISC
Larger set of instructions. Easy to program Smaller set of Instructions. Difficult to program.
Simpler design of compiler, considering larger set of instructions. Complex design of compiler.
Many addressing modes causing complex instruction formats. Few addressing modes, fix instruction format.
Instruction length is variable. Instruction length varies.
Higher clock cycles per second. Low clock cycle per second.
Emphasis is on hardware. Emphasis is on software.
Control unit implements large instruction set using micro-program unit. Each instruction is to be executed by hardware.
Slower execution, as instructions are to be read from memory and decoded by the decoder unit. Faster execution, as each instruction is to be executed by hardware.
Pipelining is not possible. Pipelining of instructions is possible, considering single clock cycle.

組み込みシステム-ツールと周辺機器

コンパイラとアセンブラー

コンパイラ

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

クロスコンパイラ

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

デコンパイラ

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

言語コンバーター

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

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

  • 前処理
  • 構文解析
  • セマンティック分析(構文指向翻訳)
  • コード生成
  • コード最適化

アセンブラー

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

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

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

  • シミュレーター
  • マイクロコントローラースターターキット
  • エミュレータ

シミュレーター

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、キャプチャ/比較、時間処理ユニットなどのイメージ。
  • ディスクリートIO、つまり汎用入出力(GPIO)
  • アナログからデジタル/デジタルからアナログ(ADC/DAC)
  • JTAG、ISP、ICSP、BDMポート、BITP、DP9ポートなどのデバッグ

マイクロコントローラーの選択基準

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

  • 速度-マイクロコントローラーがサポートできる最高速度は?
  • パッケージ-40ピンDIP(デュアルインラインパッケージ)またはQFP(クワッドフラットパッケージ)ですか? これは、最終製品のスペース、組み立て、およびプロトタイピングの観点から重要です。
  • 消費電力-これは、バッテリー駆動製品の重要な基準です。
  • *チップ上のRAMおよびROM *の量。
  • *チップ上のI/Oピンとタイマー*の数。
  • ユニットあたりのコスト-これは、マイクロコントローラーを使用する製品の最終コストの観点から重要です。

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

組み込みシステム-8051マイクロコントローラー

8051の簡単な歴史

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

8051フレーバー/メンバー

  • * 8052マイクロコントローラ*-8052には、8051マイクロコントローラのすべての標準機能に加えて、128バイトのRAMとタイマーが追加されています。 また、4Kバイトの代わりに8KバイトのオンチッププログラムROMがあります。
  • * 8031マイクロコントローラ*-8051ファミリの別のメンバーです。 このチップは、0KバイトのオンチップROMを持っているため、ROMなし8051と呼ばれることがよくあります。 使用するには、外部ROMを追加する必要があります。これには、フェッチして実行するプログラムが含まれています。 このプログラムは、最大64Kバイトになります。 しかし、外部ROMを8031に追加する過程で、4つのポートのうち2つのポートが失われました。 この問題を解決するには、外部I/Oを8031に追加します

8051家族の比較

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

Feature 8051 8052 8031
ROM(bytes) 4K 8K 0K
RAM(bytes) 128 256 128
Timers 2 3 2
I/O pins 32 32 32
Serial port 1 1 1
Interrupt sources 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プログラミング

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

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

PIN図

-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Ωプルアップ抵抗に外部接続する必要があります。

ポート0図

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)ピンです。 これらはアクティブLowピンであり、0が与えられるとアクティブになり、8031ベースのシステムで外部ROMに読み取りおよび書き込み操作を提供するために使用されます。

P3 Bit Function Pin
P3.0 RxD 10
P3.1 < TxD 11
P3.2 < Complement of INT0 12
P3.3 < INT1 13
P3.4 < T0 14
P3.5 < T1 15
P3.6 < WR 16
P3.7 < Complement of RD 17

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

  • ポート0の二重の役割-ポート0は、データ処理とアドレス処理の両方に使用できるため、AD0〜AD7としても指定されます。 8051を外部メモリに接続している間、ポート0はアドレスとデータの両方を提供できます。 8051マイクロコントローラーは、ピンを節約するために、アドレスまたはデータとして入力を多重化します。
  • *ポート2の二重の役割-I/Oとして機能することに加えて、ポートP2はポート0とともに外部メモリ用の16ビットアドレスバスを提供するためにも使用されます。 ポートP2は(A8〜A15)としても指定されますが、ポート0はA0〜A7を介して下位8ビットを提供します。 つまり、8051が最大64KBの外部メモリ(ROM)に接続され、216 = 64KBであることがわかっているため、16ビットアドレスバスでこれが可能であると言えます。 Port2は16ビットアドレスの上位8ビットに使用され、I/Oには使用できません。これは外部ROMのプログラムコードのアドレス指定方法です。

ピンのハードウェア接続

  • * V〜cc〜*-ピン40はチップに電源を供給し、+ 5 Vです。
  • Gnd -ピン20は、リファレンスのグランドを提供します。
  • * XTAL1、XTAL2(ピン番号18およびピン番号19)*-8051にはオンチップオシレータがありますが、実行するには外部クロックが必要です。 水晶振動子は、チップのXTAL1ピンとXTAL2ピンの間に接続されています。 この水晶には、希望の周波数の信号を生成するために、30pFの2つのコンデンサも必要です。 各コンデンサの片側はグランドに接続されています。 8051 ICはさまざまな速度で利用でき、すべてこの水晶振動子に依存しています。たとえば、20 MHzマイクロコントローラーには20 MHz以下の周波数の水晶振動子が必要です。

XTAL1、XTAL2 diagram

  • * RST(ピン番号 9)*-入力ピンであり、アクティブHighピンです。 このピンに高パルス(1)を印加すると、マイクロコントローラーはすべてのアクティビティをリセットして終了します。 このプロセスは*パワーオンリセット*と呼ばれます。 パワーオンリセットをアクティブにすると、レジスタ内のすべての値が失われます。 プログラムカウンターをすべて0に設定します。 リセットの有効な入力を確保するには、コンデンサ値と充電レートに応じて、ハイパルスがローになる前に最低2マシンサイクルの間ハイである必要があります。 (*マシンサイクル*は、単一の命令の実行に必要な周波数の最小量です)。
  • * EAまたは外部アクセス(ピン番号 31)*-入力ピンです。 このピンはアクティブLowピンです。低パルスを適用すると、アクティブになります。 オンチップROMを備えたマイクロコントローラ(8051/52)の場合、EA(バー)ピンはV〜cc〜に接続されます。 しかし、オンチップROMを持たない8031マイクロコントローラーでは、コードは外部ROMに保存され、マイクロコントローラーによってフェッチされます。 この場合、プログラムコードが外部に保存されていることを示すために、(ピン番号31)EAをGndに接続する必要があります。

RST、EA図

  • * PSENまたはプログラムストアイネーブル(ピン番号29)*-これはアクティブローピンでもあります。つまり、ローパルスを印加した後にアクティブになります。 これは出力ピンであり、8031ベースのEAピンとともに使用されます(つまり、 ROMLESS)外部ROMにプログラムコードを保存できるシステム。
  • * ALEまたは(アドレスラッチイネーブル)*-これは出力ピンであり、アクティブHighです。 特に8031 ICが外部メモリに接続するために使用されます。 P0ピンをアドレスバスとして使用するかデータバスとして使用するかを決定するときに使用できます。 ALE = 1の場合、P0ピンはデータバスとして機能し、ALE = 0の場合、P0ピンはアドレスバスとして機能します。

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

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

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

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

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

シングルビット命令

Instructions Function
SETB bit Set the bit (bit = 1)
CLR bit clear the bit (bit = 0)
CPL bit complement the bit (bit = NOT bit)
JB bit, target jump to target if bit = 1 (jump if bit)
JNB bit, target jump to target if bit = 0 (jump if no bit)
JBC bit, target jump to target if bit = 1, clear bit (jump if bit, then clear)

組み込みシステム-用語

プログラムカウンター

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

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

ベクターをリセット

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

リセットベクトルが不要な場合、通常、開発者はそれを当たり前のことと見なし、最終画像にプログラムしません。 その結果、プロセッサは最終製品で起動しません。 これは、デバッグ段階でよくある間違いです。

スタックポインタ

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

CPUレジスタの内容がスタックに格納されている場合、PUSH操作と呼ばれます。 スタックの内容がCPUレジスタに保存される場合、POP操作と呼ばれます。 つまり、レジスタをスタックにプッシュして保存し、スタックからポップして取得します。

無限ループ

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

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

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

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

割り込み

割り込みは主に、イベントが発生したことをプログラムに指示するハードウェアメカニズムです。 これらはいつでも発生する可能性があるため、プログラムフローとは非同期です。 プロセッサによる特別な処理が必要であり、最終的には対応する割り込みサービスルーチン(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

組み込みシステム-アセンブリ言語

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

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

アセンブリ言語の構造

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

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

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

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

  • * labelフィールド*を使用すると、プログラムは名前でコードの行を参照できます。 ラベルフィールドは、特定の文字数を超えることはできません。
  • *ニーモニック*および*オペランドフィールド*は、一緒にプログラムの実際の作業を実行し、タスクを達成します。 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
  • *コメントフィールド*は、コメントインジケータであるセミコロンで始まります。
  • プログラムのラベル「HERE」に注意してください。 命令を参照するラベルには、コロンが続く必要があります。

8051プログラムの組み立てと実行

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

  • まず、エディターを使用して、上記のプログラムに類似したプログラムを入力します。 すべてのMicrosoftオペレーティングシステムに付属するMS-DOS EDITプログラムなどのエディターを使用して、プログラムを作成または編集できます。 エディターはASCIIファイルを作成できる必要があります。 ソースファイルの「asm」拡張子は、次のステップでアセンブラーによって使用されます。
  • 「asm」ソースファイルには、手順1で作成したプログラムコードが含まれています。 8051アセンブラーに供給されます。 次に、アセンブラはアセンブリ言語命令をマシンコード命令に変換し、。objファイル(オブジェクトファイル)および* .lstファイル*(リストファイル)を生成します。 *ソースファイル*とも呼ばれるため、一部のアセンブラはこのファイルに「src」拡張子を付ける必要があります。 「lst」ファイルはオプションです。 すべてのオペコードとアドレス、およびアセンブラーが検出したエラーをリストするため、プログラムにとって非常に便利です。
  • アセンブラーには、 link と呼ばれる3番目のステップが必要です。 リンクプログラムは、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(等しい)*-メモリ位置を占有せずに定数を定義するために使用されます。 EQUは、ラベルがプログラムに表示されるように定数値をデータラベルに関連付け、その定数値がラベルに置き換えられます。 命令「MOV R3、#COUNT」の実行中、レジスタR3に値25がロードされます(#記号に注意)。 EQUを使用する利点は、プログラマーが1回変更するだけで、アセンブラーがすべてのオカレンスを変更できることです。プログラマはプログラム全体を検索する必要はありません。
  • * ENDディレクティブ*-ソース(asm)ファイルの終わりを示します。 ENDディレクティブはプログラムの最後の行です。 ENDディレクティブの後のものは、アセンブラによって無視されます。

アセンブリ言語のラベル

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

  • 各ラベル名は一意である必要があります。 アセンブリ言語プログラミングでラベルに使用される名前は、大文字と小文字の両方のアルファベット文字、0〜9の数字、および疑問符(?)、ピリオド(。)、レート@、アンダースコア(_)などの特殊文字で構成されます。およびドル($)。
  • 最初の文字はアルファベットにする必要があります。数字にすることはできません。
  • 予約語は、プログラムでラベルとして使用できません。 たとえば、ADDワードとMOVワードは命令ニーモニックであるため、予約語です。

組み込みシステム-レジスタ

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

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

8051のストレージレジスタ

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

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

アキュムレータ

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

「R」レジスタ

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

ADD A,R4

この命令の実行後、アキュムレーターには値30が含まれます。 したがって、「R」レジスタは非常に重要な補助または*ヘルパーレジスタ*です。 これらの「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」レジスタの使用を示しています。

8ビットレジスタ

「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は、データを指すためのものです。 8051は、DPTRで指定されたアドレスを使用して外部メモリにアクセスするために使用します。 DPTRは、使用可能な唯一の16ビットレジスタであり、2バイト値を格納するためによく使用されます。

プログラムカウンター

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

分岐、ジャンプ、および*割り込み*操作は、次の連続する場所以外のアドレスでプログラムカウンターをロードします。 パワーオンリセットをアクティブにすると、レジスタ内のすべての値が失われます。 これは、リセット時にPCの値が0になり、CPUがROMロケーション0000から最初のオペコードをフェッチすることを強制することを意味します。 これは、CPUが最初の命令を見つけることを期待する場所であるため、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の一部のファミリーメンバーは、オンチップROMが4Kバイトのみです(例: 8751、AT8951); AT89C52のような8K ROMを搭載しているものもあります。また、ダラスセミコンダクタなどの32Kバイトと64KバイトのオンチップROMを搭載したファミリメンバーもいます。 覚えておくべき点は、8051のプログラムカウンターは16ビットレジスタ(0000からFFFFアドレス)であるため、8051ファミリのメンバーは64Kバイトを超えるオペコードにアクセスできないことです。

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

ROM Space

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

プログラムステータスワード(PSW)レジスタは、フラグレジスタ*とも呼ばれる8ビットのレジスタです。 8ビット幅ですが、使用されるのは6ビットのみです。 2つの未使用ビットは*ユーザー定義フラグ*です。 4つのフラグは*条件付きフラグ*と呼ばれます。これは、命令が実行された後に生じる条件を示すことを意味します。 これら4つは、 *CY (キャリー)、 AC (補助キャリー)、 P (パリティ)、および OV (オーバーフロー)です。 ビットRS0およびRS1は、バンクレジスタを変更するために使用されます。 次の図は、プログラムステータスワードレジスタを示しています。

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

CY CA F0 RS1 RS0 OV - P
CY PSW.7 Carry Flag
AC PSW.6 Auxiliary Carry Flag
F0 PSW.5 Flag 0 available to user for general purpose.
RS1 PSW.4 Register Bank selector bit 1
RS0 PSW.3 Register Bank selector bit 0
OV PSW.2 Overflow Flag
- PSW.1 User definable FLAG
P PSW.0 Parity FLAG. Set/cleared by hardware during instruction cycle to indicate even/odd number of 1 bit in accumulator.

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

RS1 RS2 Register Bank Address
0 0 0 00H-07H
0 1 1 08H-0FH
1 0 2 10H-17H
1 1 3 18H-1FH
  • * CY、キャリーフラグ*-このキャリーフラグは、D7ビットからのキャリーアウトがあるたびに(1)セットされます。 8ビットの加算または減算操作後に影響を受けます。 また、「SETB C」および「CLR C」などの命令によって直接1または0にリセットできます。「SETB」はセットビットキャリーを表し、「CLR」はクリアキャリーを表します。
  • * AC、補助キャリーフラグ*-ADDまたはSUB操作中にD3およびD4からキャリーがある場合、ACビットが設定されます。それ以外の場合はクリアされます。 これは、2進化10進算術演算を実行する命令に使用されます。
  • * P、パリティフラグ*-パリティフラグは、アキュムレータレジスタ内の1の数のみを表します。 Aレジスタに奇数の1が含まれている場合、P = 1。偶数の1の場合、P = 0です。
  • * OV、オーバーフローフラグ*-このフラグは、符号付き数値演算の結果が大きすぎて、上位ビットが符号ビットにオーバーフローするたびに設定されます。 符号付き算術演算のエラーを検出するためにのみ使用されます。

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

MOV A、#9CH

ADD 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バイトは、読み取りおよび書き込みストレージに使用されます。 スクラッチパッド*と呼ばれます。 これらの80個のロケーションRAMは、8051プログラマーがデータとパラメーターを保存する目的で広く使用されています。

ROMスペースの割り当て

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。

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

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

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

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

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

RS1 RS2 Bank Selected
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レジスタに戻すことを POP と呼びます。

スタックにプッシュする

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

スタックからポップする

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

組み込みシステム-手順

プログラムのフローは、コントロール転送命令が実行されない限り、1つの命令から次の命令へと順次進みます。 アセンブリ言語のさまざまな種類のコントロール転送命令には、条件付きまたは無条件のジャンプと呼び出し命令が含まれます。

ループおよびジャンプ命令

8051でのループ

命令のシーケンスを特定の回数繰り返すことを*ループ*と呼びます。 命令 DJNZ reg、label は、ループ操作を実行するために使用されます。 この命令では、レジスタは1ずつ減少します。ゼロでない場合、8051はラベルが参照するターゲットアドレスにジャンプします。

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

繰り返し加算の手法を使用して25を10倍します。

解決策-乗数と同じ回数だけ被乗数を繰り返し追加することで、乗算を実現できます。 例えば、

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)
  • 8051の欠点*-命令* DJNZ Regラベル*によるループアクションは、256回の反復のみに制限されています。 条件付きジャンプが行われない場合、ジャンプに続く命令が実行されます。

ループ内のループ

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

にプログラムを書く-

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

解決策-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で使用される条件付きジャンプの一覧です-

Instruction Action
JZ Jump if A = 0
JNZ Jump if A ≠ 0
DJNZ Decrement and Jump if register ≠ 0
CJNE A, data Jump if A ≠ data
CJNE reg, #data Jump if byte ≠ data
JC Jump if CY = 1
JNC Jump if CY ≠ 1
JB Jump if bit = 1
JNB Jump if bit = 0
JBC Jump if bit = 1 and clear bit
  • * JZ(A = 0の場合ジャンプ)*-この命令では、アキュムレータの内容がチェックされます。 ゼロの場合、8051はターゲットアドレスにジャンプします。 JZ命令はアキュムレータにのみ使用でき、他のレジスタには適用されません。
  • * JNZ(Aが0に等しくない場合にジャンプ)*-この命令では、アキュムレータの内容がゼロ以外であることがチェックされます。 ゼロでない場合、8051はターゲットアドレスにジャンプします。
  • * JNC(キャリーがない場合はジャンプ、CY = 0の場合はジャンプ)*-フラグ(またはPSW)レジスタのキャリーフラグビットを使用して、「JNCラベル」をジャンプするかどうかを決定します。 CPUはキャリーフラグを調べて、キャリーフラグが発生しているかどうかを確認します(CY = 1)。 発生しない場合、CPUはラベルのアドレスから命令のフェッチと実行を開始します。 CY = 1の場合、ジャンプしませんが、JNCの下の次の命令を実行します。
  • * JC(キャリーの場合ジャンプ、CY = 1の場合ジャンプ)*-CY = 1の場合、ターゲットアドレスにジャンプします。
  • * JB(ビットが高い場合ジャンプ)*
  • * JNB(ビットが低い場合にジャンプ)*

-すべての条件付きジャンプはショートジャンプであることに注意する必要があります。つまり、ターゲットのアドレスはプログラムカウンターの内容の-128〜+127バイト以内でなければなりません。

無条件ジャンプ命令

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

  • * LJMP(ロングジャンプ)*-LJMPは3バイトの命令で、最初のバイトはオペコードを表し、2番目と3番目のバイトはターゲット位置の16ビットアドレスを表します。 2バイトのターゲットアドレスは、0000からFFFFHまでの任意のメモリ位置へのジャンプを許可するためのものです。
  • * SJMP(ショートジャンプ)*-最初のバイトがオペコードで、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命令

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

LCALL(ロングコール)

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

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

ACALL(絶対呼び出し)

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

組み込みシステム-アドレス指定モード

  • アドレッシングモード*は、指定されたメモリロケーションのアドレス指定方法を示します。 次のように、この命令を実行する5つの異なる方法または5つのアドレッシングモードがあります-
  • 即時アドレス指定モード
  • 直接アドレス指定モード
  • 直接アドレス指定モードを登録する
  • 間接アドレス指定モードを登録する
  • インデックス付きアドレッシングモード

即時アドレス指定モード

例から始めましょう。

MOV A, #6AH

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

MOV A, #data

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

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

即時アドレス指定モード

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

直接アドレス指定モード

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

MOV A, 04H

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

-即時モードとは異なり、直接アドレス指定モードでは「#」を使用していません。 「#」を使用していた場合、データ値04Hは1FHではなくアキュムレータに転送されていました。

ここで、次の図を見てください。 命令が実行される方法を示します。

直接アドレス指定モード

上の図に示すように、これは完了するのに1サイクルを必要とする2バイトの命令です。 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つのレジスタバンクを選択できます。 レジスタバンクの選択は、 Processor Status Word (PSW)という名前の*特殊機能レジスタ*(SFR)によって可能になります。 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はデータメモリロケーション0C Hからアキュムレータに転送され、点線で示されています。 0CHは、レジスタバンク#1のレジスタ4(R4)のアドレス位置です。 上記の命令は1バイトであり、完全な実行には1サイクルが必要です。 つまり、レジスタダイレクトアドレッシングモードを使用してプログラムメモリを節約できます。

間接アドレス指定モードの登録

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

MOV A, @R0

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

間接アドレス指定モードの登録

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

注意-R0とR1のみがレジスタ間接アドレッシング命令を作成できます。 つまり、プログラマは@ R0または@ R1を使用して命令を作成できます。 すべてのレジスタバンクが許可されます。

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

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

*MOVC A、@ A + DPTR*

and

*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が0200 Hになります。 ロケーション0200Hのデータはアキュムレーターに転送されます。 アキュムレーター内の以前の値(02H)は、0200Hからの新しいデータで置き換えられます。 アキュムレータの新しいデータは、図で強調表示されています。

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

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

組み込みシステム-SFRレジスタ

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

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

-

-

-

BC

BB

BA

B9

B8

IP

B0

B7

B6

B5

B4

B3

B2

B1

B0

P3

A2

AF

-

-

AC

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 Carry Flag
AC PSW.6 Auxiliary Carry Flag
F0 PSW.5 Flag 0 available to user for general purpose.
RS1 PSW.4 Register Bank selector bit 1
RS0 PSW.3 Register Bank selector bit 0
OV PSW.2 Overflow Flag
- PSW.1 User definable FLAG
P PSW.0 Parity FLAG. Set/cleared by hardware during instruction cycle to indicate even/odd number of 1 bit in accumulator.

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

CY AC F0 RS1 RS0 OV - P

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

RS1 RS2 Register Bank Address
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は、PSW1と呼ばれる2番目の特殊機能レジスターで使用可能な2つの追加のステータスフラグZとNを提供します。

組み込みシステム-タイマー/カウンター

  • タイマー*は、時間間隔の測定に使用される特殊なタイプのクロックです。 経過時間を測定するためにゼロからカウントアップするタイマーは、多くの場合*ストップウォッチ*と呼ばれます。 これは、指定された時間間隔からカウントダウンし、時間遅延を生成するために使用されるデバイスです。たとえば、砂時計はタイマーです。
*counter* は、クロック信号に関して特定のイベントまたはプロセスが発生した回数を保存(および表示する)するデバイスです。 マイクロコントローラーの外部で発生するイベントをカウントするために使用されます。 電子機器では、フリップフロップなどのレジスタ型回路を使用して、カウンターを非常に簡単に実装できます。

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

タイマーをカウンターと区別するポイントは次のとおりです-

Timer Counter
The register incremented for every machine cycle. The register is incremented considering 1 to 0 transition at its corresponding to an external input pin (T0, T1).
Maximum count rate is 1/12 of the oscillator frequency. Maximum count rate is 1/24 of the oscillator frequency.
A timer uses the frequency of the internal clock, and generates delay. A counter uses an external signal to count pulses.

8051のタイマーと関連レジスタ

8051には、タイマー0とタイマー1の2つのタイマーがあります。 これらは、タイマーまたはイベントカウンターとして使用できます。 タイマー0とタイマー1は両方とも16ビット幅です。 8051は8ビットアーキテクチャに準拠しているため、各16ビットはローバイトとハイバイトの2つの独立したレジスタとしてアクセスされます。

タイマー0レジスタ

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

タイマー0

タイマー1レジスタ

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

タイマー1

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

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

TMOD Register

*Gate* -設定すると、タイマーはINT(0,1)が高い間のみ実行されます。
*C/T* -カウンター/タイマー選択ビット。
*M1* -モードビット1。
*M0* -モードビット0。

GATE

すべてのタイマーには、開始と停止の手段があります。 これをソフトウェアで行うタイマー、ハードウェアで行うタイマー、ソフトウェアとハ​​ードウェアの両方を制御するタイマーがあります。 8051タイマーには、ソフトウェアとハ​​ードウェアの両方の制御があります。 タイマーの開始と停止は、タイマー1の命令 SETB TR1CLR TR1 、およびタイマー0の SETB TR0CLR TR0 を使用して、ソフトウェアによって制御されます。

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

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

TMODレジスタのこのビットは、タイマーを*遅延ジェネレーター*または*イベントマネージャー*のどちらとして使用するかを決定するために使用されます。 C/T = 0の場合、タイマー遅延生成のタイマーとして使用されます。 時間遅延を作成するクロックソースは、8051の水晶周波数です。 C/T = 0の場合、8051に接続されている水晶周波数によって、8051タイマーが一定間隔で作動する速度も決定されます。

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

M1/M2

M1 M2 Mode
0 0 13-bit timer mode.
0 1 16-bit timer mode.
1 0 8-bit auto reload mode.
1 1 Spilt mode.

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

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

モード0のタイマー1とタイマー0は両方とも8ビットカウンターとして動作します(32分周プリスケーラー付き)。 タイマーレジスタは、TH1の8ビットすべてとTL1の下位5ビットで構成される13ビットレジスタとして構成されます。 TL1の上位3ビットは不定であり、無視する必要があります。 実行フラグ(TR1)を設定しても、レジスタはクリアされません。 カウントがすべて1からすべて0にロールオーバーすると、タイマー割り込みフラグTF1が設定されます。 モード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ビットタイマーを考えてみましょう。

TMOD SFRを初期化します。 TMODの最下位4ビットを使用し、タイマー0を検討します。 タイマーを外部ピンから独立させるため、GATE 0とC/T 0の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はオーバーフローしています。

組み込みシステム-割り込み

割り込みは、ハードウェアまたはソフトウェアが発するプロセッサへの信号であり、即座に注意が必要なイベントを示します。 割り込みが発生するたびに、コントローラーは現在の命令の実行を完了し、割り込みサービスルーチン(ISR)または*割り込みハンドラー*の実行を開始します。 ISRは、割り込みが発生したときの処理をプロセッサまたはコントローラに伝えます。 割り込みは、ハードウェア割り込みまたはソフトウェア割り込みのいずれかです。

ハードウェア割り込み

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

ソフトウェア割り込み

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

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

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

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

ポーリング対割り込み

割り込みとポーリングを区別する例えは次のとおりです-

Interrupt Polling
An interrupt is like a shopkeeper. If one needs a service or product, he goes to him and apprises him of his needs. In case of interrupts, when the flags or signals are received, they notify the controller that they need to be serviced. The polling method is like a salesperson. The salesman goes from door to door while requesting to buy a product or service. Similarly, the controller keeps monitoring the flags or signals one by one for all devices and provides service to whichever component that needs its service.

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

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

プログラムの実行

割り込みベクタテーブル

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

Interrupts ROM Location (Hex) Pin
Interrupts ROM Location (HEX)
Serial COM (RI and TI) 0023
Timer 1 interrupts(TF1) 001B
External HW interrupt 1 (INT1) 0013 P3.3 (13)
External HW interrupt 0 (INT0) 0003 P3.2 (12)
Timer 0 (TF0) 000B
Reset 0000 9
  • リセットピンがアクティブになると、8051はアドレス位置0000にジャンプします。 これはパワーアップリセットです。
  • タイマーには、タイマー0用とタイマー1用の2つの割り込みが確保されています。 メモリの場所は、割り込みベクタテーブルでそれぞれ000BHと001BHです。
  • ハードウェア外部割り込み用に2つの割り込みが確保されています。 ピン番号 12およびピン番号 ポート3の13は、それぞれ外部ハードウェア割り込みINT0およびINT1用です。 メモリ位置は、割り込みベクタテーブルでそれぞれ0003Hおよび0013Hです。
  • シリアル通信には、受信と送信の両方に属する単一の割り込みがあります。 メモリ位置0023Hは、この割り込みに属します。

割り込みを実行する手順

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

  • マイクロコントローラーは現在実行中の命令を閉じ、スタック上の次の命令(PC)のアドレスを保存します。
  • また、すべての割り込みの現在のステータスを内部的に保存します(つまり、スタック上ではありません)。
  • 割り込みサービスルーチンのアドレスを保持する割り込みベクターテーブルのメモリ位置にジャンプします。
  • マイクロコントローラーは、割り込みベクトルテーブルからISRのアドレスを取得し、そこにジャンプします。 RETI(割り込みからの復帰)である割り込みサービスサブルーチンの実行を開始します。
  • RETI命令を実行すると、マイクロコントローラーは中断された場所に戻ります。 まず、スタックの上位バイトをPCにポップすることにより、スタックからプログラムカウンター(PC)アドレスを取得します。 次に、そのアドレスから実行を開始します。

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

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

Level Triggered Edge Triggered
A level-triggered interrupt module always generates an interrupt whenever the level of the interrupt source is asserted. An edge-triggered interrupt module generates an interrupt only when it detects an asserting edge of the interrupt source. The edge gets detected when the interrupt source level actually changes. It can also be detected by periodic sampling and detecting an asserted level when the previous sample was de-asserted.
If the interrupt source is still asserted when the firmware interrupt handler handles the interrupt, the interrupt module will regenerate the interrupt, causing the interrupt handler to be invoked again. Edge-triggered interrupt modules can be acted immediately, no matter how the interrupt source behaves.
Level-triggered interrupts are cumbersome for firmware. Edge-triggered interrupts keep the firmware’s code complexity low, reduce the number of conditions for firmware, and provide more flexibility when interrupts are handled.

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

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

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 Not Implemented.
- IP.6 Not Implemented.
- IP.5 Not Implemented.
- IP.4 Not Implemented.
PT1 IP.3 Defines the Timer 1 interrupt priority level.
PX1 IP.2 Defines the External Interrupt 1 priority level.
PT0 IP.1 Defines the Timer 0 interrupt priority level.
PX0 IP.0 Defines the External Interrupt 0 priority level.

割り込み内部割り込み

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

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

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