目的: このプロジェクトの目的は、Arduino C 環境に組み込まれるアセンブリ プログラムを使用するだけでなく、Arduino ボードからの入力と出力を行う方法を紹介することです。入力はプルアップまたはプルダウン抵抗を使用してプログラムを開始するスイッチとなり、出力はモールス信号で SOS を点滅させる LED を駆動します。複雑そうに見えますが、各段階でヒントが与えられます。また、以前のラボ遅延機能と R16 を使用して、さまざまな遅延時間を設定できます。
電報や無線電信の時代には、音声が暗号化される前も後も、通信手段はモールス信号を使用した「タッパー」または派手なスイッチを使用しており、送信者は長短を使ってメッセージを打ち出すことができました。継続時間または「タップ」。受信側には、タップを繰り返すリレーまたはトーンがあり、それを聞いて言葉に翻訳し直すことができます。モールス信号では、文字 S は 3 つの短いドットまたは長さでエンコードされ、O は 3 つの長いダッシュまたは長さでエンコードされます。メーデーやヘルプを表すモールス信号は SOS で、…---… …---… などのようになります。
このラボでは、スイッチがオンのときに LED にモールス信号で SOS を送信し、スイッチがオフのときに完全な SOS を送信した後に停止します。
以下は、どのように聞こえるかという例です: https://www.youtube.com/watch?v=Zsb7stKelq4
スイッチの入力を作成します。このような一見単純な操作をマイクロプロセッサで実行する場合は、少し考える必要があります。
入力を行う一般的な手順は次のとおりです。
I/O ポートについては、AVR データシートのセクション 14 を参照してください。 AVR の 1 つの I/O ピンのハードウェアを以下に示します。
AVRのI/Oピンの内部ハードウェア
これらすべてのハードウェアは、ピンを入力または出力として設定できるようにするために必要であり、さらに内部プルアップ抵抗、スリープ モード、クロックとの同期などのその他の機能も必要です。明らかに、I/O ピンは単純ではありませんが、このラボでは単純な入力または出力のみを考慮します。このためには、DDR レジスタと、使用する入力または出力のポートが必要です。
以前は、PORTB ビット 5 の LED が点滅するように出力がどのように設定されているかを見てきました。
Arduino でこれに使用できる任意のポート ピンを選択できますが、そのポートとビットを決定する必要があります。
出力: PORTB、レジスタ 5、ビット 5 は LED に内部的に使用され、コネクタ (UNO のピン 13) にも送られますが、外部的には使用しないでください。2 つの LED を駆動するのに十分な電流能力がありません。
• 提案: PORTB、レジスタ 5 のビット 4 (UNO のピン 12) を出力に使用してください。
入力: 使用できる選択肢は他にもたくさんあります (ただし、I/O ピン 0 または 1 はコンピュータとの通信に必要なので使用しないでください)。 • 提案: PORTB、レジスタ 5 のビット 3 (UNO のピン 11) を入力として使用できます。
一般的なセットアップ: 入力と出力のピンを選択します。
入力の読み取り: ポートを認識して入力を読み取るには、以下に示す IN 命令と、使用しているポートのピン アドレスを使用します。たとえば、PORTB のビット 4 (UNO のピン 18) を読み取るには、この命令を使用してポートを読み取ります。
ループ:
IN r17、0x03; //PORTB ピンをレジスタ 17 に読み取ります
ここで、ビット 4 と 0x10 の AND 演算を行ってビット 4 を選択し、他のすべてのビットをマスクする必要があります。これ以降は、入力構成とプルアップまたはプルダウンのどちらを使用しているかによって異なります。ここではプルダウン抵抗を使用しています。
プルアップ抵抗を使用している場合、スイッチを閉じると 0 が返され、それ以外の場合は 1 になるため、AND 命令を実行して、ゼロの場合に分岐できます。
ANDI r17、0x08; //そして r17 と 08h
BRNE スタート; // スイッチが閉じていない場合 (つまり 1)、戻ってループします
プルダウン抵抗を使用する場合、スイッチを閉じると 1 が返され、それ以外の場合は 0 になります。
ANDI r17、0x08; //そして r16 と 08h
BREQ 開始; // スイッチが閉じていない場合 (つまり 0)、戻ってループします
出力の作成は、入力の作成と非常に似ています。ポートピンを出力に設定する必要があります。次に、CBI または SBI を使用して、それを 0 または 1 にすることができます。
出力を作成するための一般的な手順をいくつか示します。
プログラムの設計 このラボは、LED の点滅に関する前のラボと非常に似ています。そのスケッチは、開始するためのベースとして添付されています。上記のルールに従って SOS を作成するように構造を変更し、スイッチの入力を使用して SOS を実行し、出力を使用して LED を駆動するだけです。以下のボックス内に示すように、遅延サブルーチンを使用して、点、ダッシュなどにさまざまな遅延を設定します。
SOS モールス信号用のプログラムを設計するときは、タイミング関係を定義するドキュメントを参照し、次の規則に従ってください。