2008年5月25日日曜日

PIC16F690、EUSARTの罠

PIC16F690の周辺機器ESUARTで非同期シリアル通信(RS232)をしてみた。表題にある通り罠が2つほど用意されていた。

まず1つ、Revision Eスペックシートの「BAUDRATE」(ボーレート)の値、9600の次が10417と記載されている。
内蔵オシレータ8MHzの場合この値がエラー0%で問題が無さそうなのだが、TeraTermでボーレート10417は選択できない。スペックシートで他の値はErrorが0.16%とありエラー頻度と解釈し今回の試験用途では問題にならないと思い9600で実験した。が、文字化けして全く使えない、改善方法の見当もつかない。エラー0.16%が利いているのか非同期だからダメなのか悩み抜いた、、TeraTermのボーレート選択を14400にしてみた。(PIC側は10417の設定)

これで文字化けは解消された、、、、14400が正しい?このしょうもない罠に半日以上苦しめられてしまった。どうしてくれる!マイクロチップ!


そしてもう1つ、Transmit(送信)時、なぜか1個置きの文字しかPCのコンソール(TeraTerm)に表示されない現象が発生した。”必ず”なのでソース上でダミーを送信するように変更を加えることで対処できた、、、、、が、何かしっくり来ない。いろいろwebで調べてみるとPICをいじっていれば必ず拝む後閑氏の「電子工作の実験室」にて重要な情報を得た。Transmitで1文字送信が完了したかどうかの確認フラグは「TXIF」とある。後閑氏のページでは「確実にするためには"TRMT"をチェックする。」との記載があった。これの変更で問題をクリアできた。

今回の試験内容(写真の物)

RS232でPCと接続しTeraTermにてcomポートに接続TeraTermのシリアルの設定は「ボーレート14400、8bit、パリティ無し、ストップビット1、フロー制御無し」、PICの電源を投入すると「日本語」とTeraTermに表示する。キーボードで"1"を入力するとLEDがOFF、"2"を入力するとLEDがONする。

ハード構成は写真の通り単純な物。蛇足だが記載するとPIC16F690,ADM3202AN,LED,1kΩ(LED点灯用),0.1uF x 5,(ADM3202AN用),D-sub9ピンメス。
写真の左上のケーブルはPICKIT2接続用、右下はD-sub9ピンに接続する3本のライン。

その他、参考にした情報
なひたふ電子、、、、D-sub9ピンについて (何回何回も拝見させて頂いております)
はじめてのPICアセンブラ入門、、、、持ってます。 (周辺装置の手引き用途)

ソースコードの関連部分を記載します。(宣言部分とかは頂き物なので、外しています)
※テキストをDLできるようにできないのかぁ、、このブログは、、

POINT EQU 0xXX ;変数宣言
;; RS232送信; bsf STATUS,RP0 ; バンク 1を選択 clrf TRISB bcf BAUDCTL,BRG16; bit3 movlw 0x26 movwf TXSTA movlw 11 ; 14400bps movwf SPBRG ; clrf SPBRGH ;
bcf STATUS,RP0 ; バンク 0を選択
clrf PORTB bsf RCSTA,SPEN; Serial Port Enable bcf RCSTA,RX9; bcf RCSTA,ADDEN;
clrf POINT;CON1 movwf TXREG
bsf STATUS,RP0 ; バンク 1を選択 btfss TXSTA,TRMT; データ送信済みかチェック goto $-1
bcf STATUS,RP0 ; バンク 1を選択
movf POINT,w; call STRING_03; addlw 0; btfsc STATUS,Z; goto CON1_END;
incf POINT; goto CON1
CON1_END
;; RS232受信;
bsf STATUS,RP0 ; バンク 1を選択 bcf TRISB,TRISB5 bsf BAUDCTL,SCKP bcf STATUS,RP0 ; バンク 0を選択 bsf RCSTA,CREN
bsf PORTB,6 ;LED ON
RXCHR BTFSS PIR1,RCIF goto $-1 btfss RCSTA,OERR goto CHK_FERR bcf RCSTA,CREN bsf RCSTA,CREN goto RXCHR
CHK_FERR btfss RCSTA,FERR goto RCV_END movfw RCREG goto RXCHR
RCV_END movlw '1' xorwf RCREG,w btfsc STATUS,Z bcf PORTB,6 ;LED OFF
movlw '2' xorwf RCREG,w btfsc STATUS,Z bsf PORTB,6 ;LED OFF
goto RXCHR
;; テーブルデータ;
STRING_03 ADDWF PCL,F DT "日本語\n\r",0,0

0 件のコメント: