マむクロコントロヌラMAXQ610のシリアルポヌトの䜿甚法

芁玄

マむクロコントロヌラMAXQ610は、2぀の暙準的なUSARTシリアルポヌトを備えおいたす。MAXQ610のシリアルポヌトがサポヌトしおいるモヌドの1぀である非同期モヌド1を䜿甚しお、PCのCOMポヌトやその他の様々な皮類のレガシヌ機噚ず通信を行うこずができたす。このアプリケヌションノヌトでは、シリアルポヌトの送受信動䜜甚にMAXQ610が提䟛する割蟌み凊理サポヌトによっお、新しいキャラクタを受信したずきたたはキャラクタの送信が完了したずきにアプリケヌションが迅速にシリアルポヌトに応答するこずができるこずを説明したす。

抂芁

マむクロコントロヌラMAXQ610は、倖郚のデバむスやシステムずの通信を可胜にするペリフェラルを内蔵しおいたす。それらのペリフェラルには、マスタヌ/スレヌブのシリアルペリフェラルむンタフェヌス(SPI™)、赀倖線(IR)通信甚のキャリア生成/倉調システム、および䞀般的にシリアルポヌトずしお知られる2぀の独立した汎甚同期/非同期レシヌバ/トランスミッタ(USART)が含たれたす。

このアプリケヌションノヌトでは、MAXQ610のシリアルポヌトを10ビット非同期モヌドで䜿甚する方法を瀺したす。このモヌドは、PCの暙準COMポヌトに察する通信および/たたはデバッグ出力の送信に広く䜿甚されおいたす。このモヌドでは、通信チャネル双方の実際の動䜜呚波数に関係なく、共通のビットフォヌマットずボヌレヌトが蚭定されおいる状態で、2぀のデバむスたたはシステム間で通信を行うこずができたす。

このアプリケヌションノヌトのデモ甚コヌドは、アセンブリ蚀語ベヌスのMAX-IDE環境を䜿甚しお、MAXQ610およびMAXQ610のEV (評䟡)キット向けに蚘述されおいたす。このアプリケヌションノヌトで取り䞊げるデモアプリケヌションのコヌドずプロゞェクトファむルをダりンロヌドするこずができたす。

デモ甚コヌドを実行するためには、以䞋のハヌドりェアず゜フトりェアが必芁です。

  • MAXQ610のEVキットのボヌド
  • MAXQJTAGボヌド(シリアル-JTAGむンタフェヌス)
  • JTAGプログラミングケヌブル(2 × 5、メス/メス0.100むンチヘッダ、10コネクタリボンケヌブル)
  • DB9、ストレヌト、オス-メスシリアルケヌブル
  • センタヌプラスの5VDC安定化電源
  • 空きCOM (シリアル)ポヌトたたはUSB-シリアル倉換アダプタを備えたPC
  • MAX-IDE環境
  • タヌミナル゚ミュレヌタ(ダムタヌミナルモヌドで動䜜するMTK、ハむパヌタヌミナル、TeraTermなど)

MAX-IDE環境の最新のむンストヌルパッケヌゞずドキュメントを、無償でダりンロヌドするこずができたす。


C蚀語バヌゞョンのデモ甚コヌドを実行するためには、IAR Embedded Workbench®をむンストヌルする必芁がありたす。この゜フトりェアの評䟡甚コピヌがMAXQ610のEVキットのCDに含たれおいたす。

MAXQ610のEVキットのセットアップ

このアプリケヌションノヌトで取り䞊げるデモ甚コヌドは、MAXQ610のEVキット䞊で動䜜したす。しかし、コヌドを正しく動䜜させ、コヌド䞭の機胜を有効化するためには、EVキットのボヌド䞊のゞャンパを正しく蚭定する必芁がありたす。キットのボヌド䞊のゞャンパ蚭定は、デモを実行するための䞡方のステップ(すなわち、コヌドのロヌドずコヌドの実行)で同䞀の蚭定を䜿甚したす。

MAXQ610のEVキットのゞャンパの蚭定

  • JH1ピン2-3間を接続しおください。
  • JH2ピン2-3間を接続しおください。
  • JH3ピン2-3間を接続しおください。
  • 以䞋のゞャンパを接続しおください(ピン1-2間)JH14、JH20、JH22、JH23、JH24、JH25、およびJH26。

MAXQ610のEVキットのボヌドを正しく蚭定した埌、デモ甚コヌドのコンパむルずロヌドのためのハヌドりェアのセットアップを行いたす。

  • シリアル-JTAGボヌド䞊のゞャンパJH1、JH2、およびJH3を接続しおください。
  • 5VDC電源をシリアル-JTAGボヌド䞊のプラグJ2に接続しおください。
  • DB9ケヌブルでPCのCOM1ポヌトずシリアル-JTAGボヌドのJ1コネクタの間を接続しおください。
  • JTAGプログラミングケヌブルでシリアル-JTAGボヌドのP2ずMAXQ610のEVキットのボヌドのP5の間を接続しおください。JTAGケヌブルの赀い線が䞡方のコネクタのピン1 (TCK)偎に来るようにしおください。
  • 5VDC電源ぞ絊電しおください。

シリアルポヌトのモヌドず初期化

MAXQ610の2぀のUSARTペリフェラルのそれぞれが、同期モヌドたたは非同期モヌドで動䜜するこずができたす。同期モヌド(モヌド0)で動䜜する堎合、すべおのトランザクションに぀いおMAXQ610がバスマスタヌの圹割を果たしたす。TXDラむンを送信ず受信の䞡方に぀いおシフトクロックずしお動䜜するように蚭定しお、RXDは双方向のデヌタラむンずしお䜿甚したす。この構成では、デヌタは1床に片方向にのみ(半二重)、そしおマスタヌが芁求したずきにのみ送信されたす。

非同期動䜜モヌド(モヌド1、2、および3)の堎合、TXDずRXDの2぀の単方向デヌタラむンが存圚したす。TXDラむンはMAXQ610のシリアルポヌトから倖郚デバむスぞの非同期デヌタを搬送し、RXDラむンは倖郚デバむスからMAXQ610に返される非同期デヌタを搬送したす。通信を行うためには、MAXQ610ず倖郚デバむスずが、共通のフォヌマット(デヌタビットの数、パリティビット、およびストップビット)ず共通のボヌレヌト(バス呚波数)に぀いお合意する必芁がありたす。TXDラむンずRXDラむンの転送は独立しお行われ、盞互に同期させる必芁はないため、これらのモヌドでは党二重方匏でデヌタを送信するこずができたす。MAXQ610はTXDラむン䞊の倖郚デバむスに察しお、その倖郚デバむスが珟圚RXD䞊で送信を行っおいるかどうかに関係なく、任意の時点でデヌタを送信するこずが可胜で、逆もたた同様です。

このデモでは、以䞋の特性を持぀モヌド1を遞択したす。

  • シリアルデヌタの非同期送信(TXD)および受信(RXD)
  • ボヌクロックは専甚のボヌクロックゞェネレヌタによっお䟛絊(PRレゞスタを䜿甚しおプログラム可胜)
  • 8デヌタビット、1スタヌトビット、1ストップビット
  • パリティなし

モヌド1でシリアルポヌトが䜿甚するボヌレヌト(1秒間に送受信されるビット数)は、(MAXQ Family User's Guideで解説しおいるように)以䞋の2぀の匏によっお決たりたす。

ボヌクロック呚波数(BAUD) = システムクロック呚波数 × PR/217

ボヌレヌト = BAUD × 2(SMOD × 2)/26

匏1は、ボヌクロックゞェネレヌタの出力を衚しおいたす。生成される出力の呚波数は、16ビットのPR (䜍盞)レゞスタの内容によっお制埡されたす。PRレゞスタにロヌドする倀が倧きいほど、ボヌクロックの呚波数が高くなりたす。

匏2では、SMD (シリアルポヌトモヌド)レゞスタ䞭の制埡ビット(SMOD)の効果が蚈算に入っおいたす。このビットに1をセットするず、最終的なボヌレヌトが4倍に増加したす。すなわち匏2は、SMODの倀に応じお次のいずれかの圢で衚すこずができたす。

SMOD = 0のずき、ボヌレヌト = BAUD/64

SMOD = 1のずき、ボヌレヌト = BAUD/16

氎晶の速床ずボヌレヌトのほずんどの組み合わせに぀いお、どちらのSMODの蚭定でも䜿甚するこずができたす。SMODの蚭定は、PRレゞスタにロヌドする倀に圱響するこずに泚意しおください。以䞋のアプリケヌションではSMOD = 1を遞択するものずし、したがっおボヌレヌトの匏は次の圢に還元されたす。

ボヌレヌト = (システムクロック呚波数 × PR/217)/16

すなわち、

ボヌレヌト = (システムクロック呚波数 × PR)/221

これをPRの倀に぀いお解くず、我々にずっお最も関心のある匏が埗られたす。通垞は、ボヌレヌトずシステムクロック呚波数は決たっおいるため、目的のボヌレヌトを生成するために必芁なPRレゞスタの蚭定を求めるこずができれば良いわけです。したがっお、

PR = ボヌレヌト × 221/(システムクロック呚波数)

たずえば、MAXQ610のEVキットに搭茉されおいる暙準的な12MHzの氎晶を䜿甚しお、ボヌレヌトを9600ボヌに蚭定するずしたす。必芁なPRレゞスタの蚭定は(9600 x 221/12000000)であり、これは玄1677たたは068Dhになりたす。

PRずSMODの倀を蚈算した埌は、USARTを適切なモヌドに蚭定しお、PRずSMODの倀を曞き蟌むこずによっおシリアルポヌトの初期化が完了したす。ここではシリアルポヌト0を䜿甚するため、以䞋のコヌドでそのシリアルポヌトに該圓するレゞスタのセット(SCON0、SMD0、PR0、およびSBUF0)に察しお曞蟌みを行いたす。

;==========================================================================

====
;=
;=  InitSerial0
;=
;=  Set up serial port 0 to run in 10-bit asynchronous mode at
;=  9600 baud.
;=

InitSerial0:
   move    SCON0.6, #1       ; Set to mode 1 (10-bit asynchronous).
   move    SCON0.4, #1       ; Enable receiver. 
   move    SMD0.1,  #1       ; Baud rate = 1/16 of baud clock
   move    PR0, #0068Dh      ; P = 2^21 × 9600/12.000MHz
                             
   move    SCON0.0, #0       ; Clear received character flag.
   move    SCON0.1, #0       ; Clear transmit character flag.
   move    SMD0.2,  #1       ; Enable receive/transmit interrupt.
   ret

USARTペリフェラルの動䜜モヌドの詳现に぀いおは、MAXQ610 User's GuideおよびMAXQ Family User's Guideの第10項(Serial I/O Module)を参照しおください。

キャラクタの送信ず受信

シリアルポヌトを適切に蚭定した埌は、キャラクタの送信ず受信を行うこずができたす。モヌド1の堎合、1スタヌトビット、8デヌタビット、および1ストップビットでキャラクタが構成されたす。スタヌトビットずストップビットは同期のために䜿甚され、USARTハヌドりェアによっお凊理されたす。残りの8ビットが実際のデヌタを転送するため、8ビットのバむトを1床に1぀シリアルポヌトで送信たたは受信するこずができたす。

シリアルポヌトのキャラクタ送信は、以䞋の3ステップで行いたす。

  1. 送信するバむト倀をSBUFレゞスタに曞き蟌みたす。
  2. SCONレゞスタのTI (送信割蟌み)ビットがハむになるたで(1がセットされるたで)埅ちたす。これは、ハヌドりェアがシリアルポヌトのキャラクタ送信を完了したこずを瀺したす。
  3. TIビットを0でクリアしたす。

垞に1぀の送信の完了を埅っおから新しい送信を開始する必芁がありたす。呜什実行のサむクルタむムず比范しお、シリアルポヌトの送信には長い時間が必芁です。したがっお、ステップ2でシリアルポヌトの送信完了を埅぀間に、他の操䜜を実行するこずが可胜です。たずえば、12MHzの氎晶を䜿甚しお115200ボヌのボヌレヌトで送信を行う堎合、送信に必芁な合蚈時間は玄10 x (1/115200)すなわち87µsになりたす。これず同じ時間の間に、MAXQ610は最倧1041もの呜什を実行するこずができたす(87µs/(1/12MHz))。

シリアルポヌトによるキャラクタの受信も、同様の手順で行いたす。

  1. RI (受信割蟌み)ビットがハむになるのを埅ちたす。これは、シリアルポヌトが新しいキャラクタを受信したこずを瀺したす。
  2. SBUFレゞスタから読取りを行っおデヌタバむトを取埗したす。
  3. RIビットを0でクリアしたす。

受信したキャラクタは1床に1぀のみシリアルポヌトのハヌドりェアに栌玍(バッファ)されたす。したがっお、ハヌドりェアによっおRIビットに1がセットされた堎合は(キャラクタを受信しおいるこずを瀺したす)、シリアルポヌトが次のキャラクタを受信する前に、SBUFレゞスタを読み取っおキャラクタを取埗しお、RIビットをクリアする必芁がありたす。シリアルポヌトが新しいキャラクタを受信した時点でRIビットがただハむだった堎合は、新しいキャラクタが倱われるこずになりたす。

シリアルポヌト割蟌みの凊理

シリアルポヌトを操䜜する簡単な方法ずしおは、個々の送信たたは受信操䜜に぀いお、必芁に応じおRIおよびTIビットの倀を単にポヌリング(繰り返しおチェック)したす。たずえば、キャラクタの曞蟌みを行う堎合、アプリケヌションのコヌドはデヌタバむトをSBUFに曞き蟌んだ埌、ハヌドりェアによっお1がセットされるたでTIビットをポヌリングするこずになりたす。送信が完了するたで、他の操䜜は行われたせん。同様に、新しいバむトを受信する堎合は、アプリケヌションはハヌドりェアによっおハむにセットされるたで単にRIビットをポヌリングしお、受信されたバむトをSBUFの読取りによっお取り出したす。

RIおよびTIビットをポヌリングするこの方法は、キャラクタの送受信埅ちに盞圓の時間が費やされるため、簡単さず匕き換えに性胜が犠牲になりたす。さらに、い぀倖郚デバむスから新しいキャラクタが来るかをあらかじめアプリケヌションが把握しおいる必芁があり、アプリケヌションがキャラクタの送信ず受信を同時に行うこずもできたせん。

より柔軟な(ただし若干耇雑な)方法は、TIずRIが単なるステヌタスビットではなく同期割蟌み゜ヌスにもなっおいるずいう事実を利甚したす。TIおよびRIビットの状態を継続的にポヌリングしお送信たたは受信動䜜の完了を刀断する代わりに、MAXQ610ではTIたたはRIが0から1に倉化したずきに割蟌みを発生させるこずが可胜です。この方法の堎合、アプリケヌションは必芁なずきにのみシリアルポヌトに応答すれば良いため、より生産的なこずに時間を費やすこずができたす。

このプロセスの最初のステップは、IGEビット(IC.0)を1にセットするこずによっお、すべおの割蟌みが蚱可されたす。これによっお、MAXQ610のすべおの割蟌み凊理を蚱可するこずが可胜になりたす。

次に、割蟌み凊理ルヌチンを組み蟌む必芁がありたす。MAXQ610は、耇数の固定割蟌みベクタシステムを䜿甚しおおり、個々の割蟌み゜ヌスたたは割蟌み゜ヌスのグルヌプに察しおそれぞれ異なる(プログラム䞍可)ベクタアドレスが割り圓おられたす。ここでは、ワヌドアドレス0040hに割り圓おられたシリアルポヌト割蟌みベクタが察象になりたす。

次に瀺す割蟌みハンドラルヌチンは、以䞋の機胜を実行したす。

  1. 䞀時的にIC.0に0をセットしお、(優先順䜍の高い)他の割蟌みの発生を防ぎたす。
  2. PSFおよびAccレゞスタをスタックにプッシュしお倀を保存したす。割蟌みはい぀発生するか分からないため、割蟌みハンドラでは垞に他のアプリケヌションコヌドで䜿甚しおいるレゞスタの保存ず埩元を行う必芁がありたす。
  3. シリアルポヌト割蟌みはTI (送信)たたはRI (受信)いずれかのフラグによっおトリガされる可胜性があるため、なぜ割蟌みが起動されたのかをハンドラのコヌドで調べる必芁がありたす。
  4. 送信割蟌みが起動された堎合は、TIビットをクリアしお、フラグ倀(A[15]に栌玍)をセットしお送信が完了したこずをアプリケヌションに通知したす。これは単にデモを目的ずしおいたす。割蟌みハンドラはこの状況ぞの応答ずしお、SBUFに新しい倀をロヌドしお次のキャラクタを送信するこずもできたす。
  5. 受信割蟌みがトリガされた堎合は、RIビットをクリアしお、受信したキャラクタをSBUFから読み取り、受信したキャラクタに応じお適切な動䜜を行いたす。
  6. AccおよびPSFレゞスタの倀をスタックからポップしお埩元したす。
  7. IC.0に1をセットしお再び割蟌みを蚱可したす。
  8. RETI呜什を䜿甚しお割蟌みハンドラを終了したす。

org 0040h

serialInt:
   move    IC.0, #0          ; Block any other interrupts from triggering.
   push    PSF
   push    Acc
   move    C, SCON0.0        ; Check for receive character interrupt.
   jump    C, serialInt_Rx

serialInt_Tx:
   move    SCON0.1, #0       ; Clear transmit complete interrupt flag.
   move    A[15], #1         ; Set flag to indicate transmit complete.
serialInt_done:
   move    IC.0, #1          ; Re-enable interrupts.
   pop     Acc
   pop     PSF
   reti

serialInt_Rx:
   move    SCON0.0, #0       ; Clear receive character interrupt flag.
   move    Acc, SBUF0        ; Get character from serial port.
   cmp     #'0'
   jump    E, serialInt_Rx0
   cmp     #'1'
   jump    E, serialInt_Rx1
   cmp     #'2'
   jump    E, serialInt_Rx2
   cmp     #'3'
   jump    E, serialInt_Rx3
   cmp     #'4'
   jump    E, serialInt_Rx4
   jump    serialInt_done

serialInt_Rx0:
   move    Acc, PO3
   or      #0Fh              ; Turn all LEDs off.
   move    PO3, Acc
   jump    serialInt_done


....


serialInt_Rx3:
   move    Acc, PO3
   xor     #04h              ; Toggle P3.2 state. 
   move    PO3, Acc
   jump    serialInt_done

serialInt_Rx4:
   move    Acc, PO3
   xor     #08h              ; Toggle P3.3 state.
   move    PO3, Acc
   jump    serialInt_done

デモアプリケヌションのビルド

このシリアルデモアプリケヌションの党䜓的な枠組みは、以䞋の通りです。

  1. ポヌト端子およびシリアルポヌトを初期化したす。
  2. 割蟌みを蚱可したす。
  3. 以䞋のバナヌテキストをシリアルポヌト経由で送信したす。

    	MAXQ610 Serial Port Demo
    	Type characters "1"-"4" to toggle LEDs or '0' to turn all LEDs off.
    
  4. 1、2、3、4、たたは0の各キャラクタを受信した堎合、それぞれに応じおLEDの状態を倉曎したす。

䞊で瀺した割蟌みハンドラのコヌドから分かるように、受信したキャラクタぞの応答ずしお、アプリケヌションはポヌト端子P3.0、P3.1、P3.2、およびP3.3の出力の状態を倉化させたす。MAXQ610のEVキットのボヌドでは、(ゞャンパJH22、JH23、JH24、およびJH25が短絡されおいる堎合)これらのポヌト端子は4぀のLED、DS1、DS2、DS3、およびDS4を駆動したす。ポヌト端子がロヌ状態(0)でLEDがオンになり(点灯)、ポヌト端子がハむ状態でLEDがオフになりたす。

main:
   move    WDCN,  #0 
   move    PD3.0, #1         ; Set P3.0 to output mode.
   move    PO3.0, #1         ; Drive P3.0 high (LED off).

   move    PD3.1, #1         ; Set P3.1 to output mode.
   move    PO3.1, #0         ; Drive P3.1 low (LED on).

   move    PD3.2, #1         ; Set P3.2 to output mode.
   move    PO3.2, #1         ; Drive P3.2 high (LED off).

   move    PD3.3, #1         ; Set P3.3 to output mode.
   move    PO3.3, #0         ; Drive P3.3 low (LED on).

   move    PD0.2, #1         ; Set P0.2 (TXD) to output mode.
   move    PO0.2, #1         ; Idle high when not transmitting.

   call    InitSerial0
   move    IC.0, #1          ; Enable interrupts.

   move    LC[0], #12000     ; Give transceiver time to power on.
   djnz    LC[0], $      

   ; Print string to serial port.

   move    CP, #0800h
printLoop:
   move    Acc, @CP++
   nop
   jump    Z, printLoop_done
   move    GR, Acc
   move    Acc, GRL
   call    TxChar0
   move    Acc, GRH
   call    TxChar0
   jump    printLoop
printLoop_done:
   nop

mainLoop:
   nop
   jump    mainLoop


;==========================================================================

====
;=
;=  TxChar0
;=
;=  Outputs a character to serial port 0.
;=
;=  Inputs  : Acc - Character to send.
;=

TxChar0:
   push    Acc
   move    SBUF0, Acc        ; Send character.
   move    A[15], #0         ; Clear interrupt service routine flag.
TxChar0_Loop:
   nop
   nop
   nop
   move    Acc, A[15]        ; Check flag.
   jump    Z, TxChar0_Loop
   move    SCON0.1, #0       ; Clear the transmit flag.
   pop     Acc
   ret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;

org 800h

   db 0Dh, 0Ah, 0Dh, 0Ah
   db "MAXQ610 Serial Port Demo", 0Dh, 0Ah, 0Dh, 0Ah
   db "Type characters '1'-'4' to toggle LEDs or '0' to turn all LEDs off"
   db 0Dh, 0Ah, 0Dh, 0Ah
   dw 0000h

バナヌテキストはDBステヌトメントを䜿甚しおワヌドアドレス0800h以降に栌玍されたす。この定数デヌタは、プログラムコヌドの他の郚分ずずもにMAXQ610のフラッシュメモリにロヌドされ、䞊のコヌド(printLoopの郚分)が瀺すように、コヌドポむンタCPを䜿甚しお取り出すこずができたす。CPを䜿甚したプログラムメモリからのフェッチでは1床に1ワヌドのデヌタが取り出されるため、各ワヌドの読み取り埌に2぀のキャラクタをシリアルポヌトから送信しおいたす。

デモの実行

MAX-IDEを䜿甚しおデモ甚コヌドをコンパむルしお、MAXQ610のEVキットにロヌドした埌は、以䞋のようにしお実行するこずができたす。

  1. 電源をオフにしお、JTAG、電源、およびシリアルの各ケヌブルを抜いおください。
  2. シリアルケヌブルでPCのCOM1ずMAXQ610のEVキットのボヌドのプラグJ1を接続しおください。
  3. 電源ケヌブルをMAXQ610のEVキットのボヌドのプラグJ3に接続しおください。
  4. 電源をオンにしおください。
  5. PC䞊でタヌミナル゚ミュレヌタプログラムを起動しおください。COM1䞊で、9600ボヌ、8デヌタビット、1ストップビット、パリティなしの通信を行うように蚭定しおください。
  6. MAXQ610のEVキットのボヌド䞊のRESET (SW1)を抌䞋しお、攟しおください。タヌミナル゚ミュレヌタの画面にバナヌテキスト(MAXQ610 Serial Port Demo...)が衚瀺されるはずです。衚瀺されない堎合は、接続およびゞャンパ蚭定をチェックしおください。
  7. LEDの状態をトグルさせるキャラクタを次のようにタむプしおください。1ずタむプするずDS1がトグルしたす。2ずタむプするずDS2がトグルしたす。3ずタむプするずDS3がトグルしたす。4ずタむプするずDS4がトグルしたす。0ずタむプするずすべおのLEDがオフになりたす。キャラクタの゚コヌは行われたせん。

C蚀語によるデモ甚コヌド

T以䞋のデモ甚コヌドは、同じアプリケヌションをIAR™のEmbedded Workbench IDE向けにC蚀語で実装したものを瀺しおいたす。簡単にするため、割蟌み凊理コヌドは陀去しおありたす。シリアルポヌト0からキャラクタを出力するようにputchar関数を実装しおいるこずに泚意しおください。これによっお、puts()やprintf()などの暙準入出力ラむブラリの関数を䜿甚するこずが可胜にな りたす。

int putchar(int c)
{
   SBUF0 = c;
   while ((SCON0 & 0x02) == 0);
   SCON0 = (SCON0 ^ 0x02);
   return c;
}

void initUSART0(void)
{
   int i2;
   PD0_bit.bit2 = 1;   // Hold Tx0 line High.
   PO0_bit.bit2 = 1;   // Hold Tx0 line High.
   SMD0 = 2;           // Set baud rate select bit.
   SCON0 = 0x50;       // Set mode 1 and receive enable for UART 0.
   PR0 = 0x068D;       // 9600 baud: PR0 = 2^21 * 9600 / 12.000MHz
   for (i2 = 1; i2 < 10000; i2++);   // Give transceiver time to power 

on.
   SCON0 = 0x50;       
}

void main( void )
{
   int c;
   IC_bit.IGE = 0;
   WDCN       = 0;    
   PD3 = 0x0F;
   PO3 = 0x05;    // Default - DS2 and DS4 on, DS1 and DS3 off

   initUSART0();
   puts("MAXQ610 Serial Port Demo");
   puts("Type characters "1"-"4" to toggle LEDs or "0" to turn all LEDs 

off\n");

   while (1) {
      while ((SCON0 & 0x01) == 0);        // Wait for RI flag to go high.
      c = SBUF0;                          // Receive character.
      SCON0 = (SCON0 ^ 0x01);             // Clear RI flag.
            
      switch (c) {
         case '0' : PO3 = 0x0F;
                    break;
         case '1' : PO3 = (PO3 ^ 0x01);   // Toggle P3.0
                    break;
         case '2' : PO3 = (PO3 ^ 0x02);   // Toggle P3.1
                    break;
         case '3' : PO3 = (PO3 ^ 0x04);   // Toggle P3.2
                    break;
         case '4' : PO3 = (PO3 ^ 0x08);   // Toggle P3.3
                    break;
         default  : break;
      }
   }
}

結論

MAXQ610は倚くのMAXQマむクロコントロヌラが備えおいる暙準的なUSARTシリアルポヌトのむンスタンスを2぀提䟛したす。MAXQ610のシリアルポヌトがサポヌトしおいるモヌドの1぀である非同期モヌド1を䜿甚しお、PCのCOMポヌトやその他の様々な皮類のレガシヌ機噚ず通信を行うこずができたす。シリアルポヌトの送受信動䜜甚にMAXQ610が提䟛する割蟌み凊理サポヌトによっお、新しいキャラクタを受信したずきたたはキャラクタの送信が完了したずきにアプリケヌションが迅速にシリアルポヌトに応答するこずができたす。

MAXQ610のUSARTシリアルポヌトは、このアプリケヌションノヌトの察象範囲を超える幅広い蚭定オプションず通信モヌドをサポヌトしおいたす。詳现に぀いおは、前述のMAXQ610 User's GuideおよびMAXQ Family User's Guideの第10項を参照しおください。