無線電子工学および電気工学の百科事典 MCS48 上の制御システムのモジュール式プログラミング。 無線エレクトロニクスと電気工学の百科事典 無線電子工学と電気工学の百科事典 / マイクロコントローラー 同じマイクロコントローラーで、複雑な技術機器と家庭用コーヒーグラインダーや電子時計の両方を制御できることが知られています。 特定のオブジェクトへの適応はマイコンのプログラムを変更することで行われ、ハードウェアにはほとんど影響を与えません。 提案された記事は、さまざまな目的の制御システムで広く使用されている MCS48 シリーズ マイクロコントローラーのプログラミング技術に特化しています。 その主な規定は、より最新のデバイスにも有効です。 制御プログラムがモジュール原理に従って構築されていれば、制御プログラムの開発と最新化が大幅に容易になります。 この場合、ある程度の経験を積んだ後、そして最も重要なことは、デバッグされたモジュールの独自のライブラリを獲得した後、新しい制御システム (CS) をプログラミングすることは、既存のデバッグされたプログラムの一部のモジュールを置き換えることになり、場合によっては、それをフラグメントで補完することになります。特定のシステムの詳細を考慮してください。 この原則は多くの高級言語 (PASCAL、C++) の構造に組み込まれており、プログラマは文字通りそれに従うことを強いられています。 残念ながら、アセンブラ (MSS48 を含む) は、プログラマに問題解決のための手段や方法の選択の自由を与えていますが、原則として、プログラミング規律の遵守をまったく監視しません。 これにより、他のプログラムでデバッグされたフラグメントが使用されることは言うまでもなく、作成者ですら時間が経つと何が行われたのか理解できなくなるほど非常に混乱したプログラムが作成されることがよくあります。 一般的なモジュラー概念を意識的に遵守すると、マイクロコントローラーのプログラミングが大幅に容易になり、速度が向上します。 CS の典型的なモジュール型プログラムの例を表に示します。 その構文は、8048 マイクロプロセッサの TASM 表形式 ASSEMBLY に対応します。 ご覧のとおり、プログラム テキストの先頭で、EQU ディレクティブによって定数に名前が付けられ、値が割り当てられます。 実行可能なプロセッサ命令で直接数値を指定するよりも、名前付き定数を使用することをお勧めします。 たとえば、以下で説明するサブルーチンの 1 つによって実装される時間遅延は、2 つの数値によって定義されます。 それらは定数 N3、NXNUMX、NXNUMX によって与えられます。 シャッタースピードを変更する必要がある場合は、EQU 演算子で新しい値を指定するだけで十分です。 それ以外の場合は、プログラム全体でこれらの数値に等しいオペランドを持つ命令を探し、それぞれが時間遅延を参照しているかどうかを判断し、必要な場合に新しい値を示す必要があります。 明らかに、そのような作業には多くの時間がかかり、エラーなしで完了することはよくありません。 コマンドによっては整数ではなく、上位バイトや下位バイトなどを使用する場合があるため、特に複雑になります。 ASSEMBER はすでにプログラムの翻訳段階にあり、他の定数の値に基づいていくつかの定数を計算できます。 この可能性は、数値 N3 の上位 (N3N) バイトと下位 (NXNUMXL) バイトの計算によって示されます。 次に、プログラムは変数にメモリを割り当てます。 これは同じ EQU ディレクティブで実行されますが、定数の記述とは異なり、変数の数値ではなく、変数が占有するメモリ セルのアドレスを指定します。 ASSEMBLER が許可する場合は、マクロを使用する可能性を無視してはなりません。 それらのそれぞれは、いわば、プロセッサの命令システムによって直接提供されていない操作を実行する新しい命令です。 マクロ命令を記述する際、プログラマはそれに名前を付け(もちろん、「実際の」命令の名前とは一致しません)、一連の機械命令の形式で必要なアクションを指定します。 プログラム内でマクロ命令が見つかるたびに、ASSEMBLER はそれを指定されたシーケンスに置き換えます。 この例では、XNUMX つのマクロが使用されています。 そのうちの XNUMX つはアキュムレータの内容をマクロ パラメータで指定されたデータ メモリ セルに転送し、もう XNUMX つは逆に転送します。 マイコンは電源投入後(またはリセット信号が与えられると)、3番地からプログラムの実行を開始します。 このアドレスは通常、実際のプログラムの開始点 (この場合は START ラベル) に無条件ジャンプ コマンドを書き込むために使用されます。 ハードウェア割り込みは常に固定アドレス 7 と XNUMX に制御を転送するため、これが必要です (他のタイプのマイクロコントローラーの場合、アドレスは異なる場合がありますが、それでもプログラム メモリの先頭に位置します)。 これらのアドレスにある対応する割り込みのサービス ルーチンへの無条件移行コマンドは、メイン プログラムによって「バイパス」されます。 次のステップでは、コントローラーの動作モードを設定し (メモリーバンクとレジスターを選択するなど)、変数と外部デバイスを初期化します。 初心者プログラマの典型的な間違いは、プログラムの開始直後に、変数にすでに一定の値が設定されていると想定することです。 この誤解は、一部の高級言語 (BASIC など) がすべての変数を自動的に初期値 1 に設定するという事実によってさらに強化されます。 アセンブリ言語 (および他の多くの言語) のプログラムでは、プログラマ自身が、変数の値を最初に読み取る前に、変数に割り当てられたメモリ セルにすでに何かが書き込まれていることに注意する必要があります。 優れたプログラミング スタイルでは、プログラムの最初で初期値を変数に割り当てる必要があります。 この場合、これは XNUMXINIT サブルーチンによって行われます。 外部デバイスの初期化セクションは通常、サブルーチンへの代替呼び出しのように見えます。各サブルーチンはそれらの XNUMX つ (アナログ - デジタル コンバーター、LED インジケーター、キーパッドなど) をリセットし、システムを完成させ改善するときに簡単に置き換えることができます。 多くの場合、これらの同じルーチンでデバイスの状態がチェックされます。 次に、ほとんどの制御プログラムは無限に繰り返されるメイン ループに入り、その実行は割り込みを処理するためだけに一時停止されます。 このサイクルは、キーボードやその他のセンサーをポーリングし、割り込み処理サブルーチンによって設定されたフラグ (たとえば、指定された時間間隔の満了またはアナログ - デジタル コンバーターの終了を示すフラグ) を確認し、処理を行うためのサブルーチンで構成されます。指定された制御アルゴリズムに従って受信した情報、アクチュエータへの制御動作の出力、液晶ディスプレイまたはその他のインジケータ上での技術プロセスの状態に関する情報の表示。 メインループからの出口は、通常、緊急事態の場合にのみ提供されます。たとえば、障害の影響を排除する場合、すべての変数と外部デバイスの初期化を繰り返す必要がある場合、および割り込みを処理する場合です。 したがって、モジュールベースで構築されたプログラムはサブルーチンのセットです。 たとえば、新しい制御システムで別のキーボードが使用されている場合は、BUTT サブルーチンを置き換えるだけで十分です。 このような置き換えを簡単かつ苦痛なく行うためには、特定のルールを作成し、常に遵守する必要があります。 サブルーチンは、可能であれば、すべてのコントローラ レジスタの内容を保存し、初期データを受信して同じレジスタとメモリ セルで結果を発行し、同じ文字エンコーディングを使用する必要があります。 厳格なルールから離れ、非標準的なテクニックを使用してプログラムを簡素化したいという自然な欲求と戦う必要があります (特に、最初の困難を克服し、プロになったと感じ始めているプログラマーにとって)。 一見すると、不当に複雑化しても、デバッグが容易になり、プログラム全体が作り直されるため、十分に効果があるように見えます。 サブルーチンのいくつかの機能を考えてみましょう。 I NCREM と DESREM は、多くの場合に必要な、16 ビット 6 進数の指定された値だけ増加または減少する操作を実行します (その上位バイトと下位バイトはそれぞれレジスタ R5 と RXNUMX にあります)。 インクリメント量を指定する定数はプログラムの先頭に記述されています。 どのマイクロコントローラーもテクノロジー機器よりもはるかに高速に動作するため、プログラム内で時間遅延を調整できることが非常に重要です。 この場合、プロセッサの内部カウンタ/タイマーが使用されます。 容量には制限があり、ミリ秒単位でオーバーフローします。 オーバーフローが発生するたびに割り込み要求が生成されます。 タイマ割り込みサービス ルーチン (TIME) はそれらをカウントし、指定された数に達すると、FLT タイムアウト フラグを XNUMX に設定します。 動作が時間に依存するすべてのサブルーチンでは、このフラグの状態を分析する必要があります。 したがって、数秒、さらには数分のシャッタースピードを実現することが可能です。 新しい間隔のカウントを開始するには、TIME サブルーチンの作業セルに初期値を入力し、タイマーをオンにする必要があります。 たとえば、サブルーチン SET2M は遅延時間を 2 分に設定します。 初期値の計算にはいくつかの微妙な点があります。 MSS48 シリーズのマイクロコントローラーでは、パルスが水晶発振器の周波数の 480 分の 7 の周波数で内部カウンター/タイマーの入力に到達することが知られています。 たとえば、水晶共振子の周波数が 480 MHz の場合、カウンタに書き込まれる数値は 7000000/0,00006857 = 68,57 s = 68,57 µs ごとに変化します。 したがって、カウンタは 256 -(1-N1) μs 以内にオーバーフローします (そして割り込み要求が生成されます)。ここで、N0,1 は最初にカウンタに書き込まれた数値です。 この数値から新しいカウントを開始するたびに、N2 = 0,1 7000000/[1480 (256-N1)] オーバーフローが XNUMX 秒以内に発生します (最小遅延時間)。 明らかに、異なる N1 と N2 で同じ遅延を得ることができますが、これらの数値は小数にすることができないため、多少の誤差を伴って実装されます。 タスクは、誤差が最小限になるような値のペアを選択することです。 検討中のケースでは、最良のオプションは N1 = 13、N2 = 6 です。説明した手順を N2 = 3 回繰り返すと、1200 分の遅延時間が得られます。 プログラム動作の異なるモードで同じハードウェア割り込みを処理するには、異なる手順を使用する必要があることがよくあります。 これを行う 1 つの方法は、INTER サブルーチンで示されています。 これは、メイン プログラムによって INTT セルに入力された割り込みタイプ コードを分析し、その値に応じて、割り込みサービス ルーチン ISR2 または ISRXNUMX のいずれかを呼び出します。 どちらも RETR ではなく RET で終わることに注意してください。 処理オプションの数を増やすことは簡単で、コードの特定の値に対して複数の異なるサブルーチンが次々に呼び出されるようにすることもできます。 必要なサブルーチンをすべてメインプログラムのテキストファイルに記述する必要はありません。 デバッグされ、さまざまなプログラムで繰り返し使用されるモジュールは、別個のファイルに配置され、INCLUDE ディレクティブを使用してメイン プログラムに接続できます。 各インクルード ファイルには XNUMX つ以上のルーチンを含めることができます。 この方法の欠点は、使用されるすべてのモジュールの変数、定数、ラベルの名前を繰り返す必要がないことです。 この欠陥がないため、モジュールを個別に変換し、その後オブジェクト コードのレベルで結合する方法は、残念ながら TASM ASSEMBLY ではサポートされていません。 著者: D. リゾフ、ウラジミール 他の記事も見る セクション マイクロコントローラー. 読み書き 有用な この記事へのコメント. 科学技術の最新ニュース、新しい電子機器: 庭の花の間引き機
02.05.2024 最先端の赤外線顕微鏡
02.05.2024 昆虫用エアトラップ
01.05.2024
その他の興味深いニュース: ▪ スマート電球 Connected Cree LED Bulb
無料の技術ライブラリの興味深い資料: ▪ 記事 リンネが女性の生殖器にちなんで名付けた植物は何ですか? 詳細な回答 ▪ 記事 XNUMXバンドアクティブトーンコントロール。 無線エレクトロニクスと電気工学の百科事典 ▪ 記事 スムーズな局部発振器を備えたコンバーター 144/27 MHz。 無線エレクトロニクスと電気工学の百科事典 このページのすべての言語 ホームページ | 図書館 | 物品 | サイトマップ | サイトレビュー www.diagram.com.ua |