完全に目的が達成されたわけではありません。
しかしGPSの4800bpsUSART出力をすべて垂れ流しで、LCDへ出力できるところまで出来ました。
あとはGPSメッセージのコマンド分析($で始まりCR/LFで終わる通信文の必要部分を切り出しフォーマットする)を行うサブルーチンを付け足していけばいいはずです。
接続は、以下の通りとします
GPS TX → PIC16F648A RX pin (=RB1)
PIC16F648A → LCD
・ RA0 → Enable pin
・ RA1 → RS pin
・ RB4 → DB4 pin
・ RB5 → DB5 pin
・ RB6 → DB6 pin
・ RB7 → DB7 pin
PICプログラムの構造は、
・初期化 → メインはループのみ
・USART割込み → リングバッファに書き込み
・タイマー0割込み → リングバッファから読込 → LCDへ出力
となっています。
ターミナルへのエコーバック用に1語入っているところ(;Echo-back to Terminalとコメントがある行)は、GPSへコマンド送信することになった場合、コメントアウトする必要があります。
リングバッファの書き込みポインタと読み込みポインタを管理していて、値が違うときだけLCDへ出力します。
USARTの割込みは高々4800bpsなので割込み間隔は2ms程度。
タイマー0割込みは256μsごとなので(=0.256ms)8倍くらい頻度が多いのでリングバッファからの読み込みが書き込みに追いつかれることはありません。
また、LCDは一文字書いたあとは40μs程度次ぎの書き込みができませんが、タイマー0割込みは256μsごとなので書き込みがオーバーランすることはありません。
LCDの1行目と2行目はアドレスが飛んでいるので連続で書くと中抜けになってしまうので、リングバッファアドレスが0x40のときと0x60のときは1行目先頭から、0x50と0x70のときは2行目に指定してLCD出力します。
割込みは2つ同時に発生することはあっても(IF(=InterrupFlag)が複数1になる)、割込み処理中に割込みは発生しないようになっているようです。
少なくともデバッガで見る限り、割込み処理中はGIEが0に戻されています。
割込みついでにマニュアルから割込みロジック図をコピーして貼ります。
※例:T0IFとT0IEがAND条件で揃って、他とORを取って、最後にGIEとANDを取って割込みが発生します。

下がソースコード。アメブロの「パワーアップした新エディタ」は余計タグをたくさん勝手に入れてしまうのでソースコードを貼るのはとても困難です;;
これは旧エディタで編集しました。
同じ機器を持っていればコピペ&アセンブルで動くはずです。
しかしGPSの4800bpsUSART出力をすべて垂れ流しで、LCDへ出力できるところまで出来ました。
あとはGPSメッセージのコマンド分析($で始まりCR/LFで終わる通信文の必要部分を切り出しフォーマットする)を行うサブルーチンを付け足していけばいいはずです。
接続は、以下の通りとします
GPS TX → PIC16F648A RX pin (=RB1)
PIC16F648A → LCD
・ RA0 → Enable pin
・ RA1 → RS pin
・ RB4 → DB4 pin
・ RB5 → DB5 pin
・ RB6 → DB6 pin
・ RB7 → DB7 pin
PICプログラムの構造は、
・初期化 → メインはループのみ
・USART割込み → リングバッファに書き込み
・タイマー0割込み → リングバッファから読込 → LCDへ出力
となっています。
ターミナルへのエコーバック用に1語入っているところ(;Echo-back to Terminalとコメントがある行)は、GPSへコマンド送信することになった場合、コメントアウトする必要があります。
リングバッファの書き込みポインタと読み込みポインタを管理していて、値が違うときだけLCDへ出力します。
USARTの割込みは高々4800bpsなので割込み間隔は2ms程度。
タイマー0割込みは256μsごとなので(=0.256ms)8倍くらい頻度が多いのでリングバッファからの読み込みが書き込みに追いつかれることはありません。
また、LCDは一文字書いたあとは40μs程度次ぎの書き込みができませんが、タイマー0割込みは256μsごとなので書き込みがオーバーランすることはありません。
LCDの1行目と2行目はアドレスが飛んでいるので連続で書くと中抜けになってしまうので、リングバッファアドレスが0x40のときと0x60のときは1行目先頭から、0x50と0x70のときは2行目に指定してLCD出力します。
割込みは2つ同時に発生することはあっても(IF(=InterrupFlag)が複数1になる)、割込み処理中に割込みは発生しないようになっているようです。
少なくともデバッガで見る限り、割込み処理中はGIEが0に戻されています。
割込みついでにマニュアルから割込みロジック図をコピーして貼ります。
※例:T0IFとT0IEがAND条件で揃って、他とORを取って、最後にGIEとANDを取って割込みが発生します。

下がソースコード。アメブロの「パワーアップした新エディタ」は余計タグをたくさん勝手に入れてしまうのでソースコードを貼るのはとても困難です;;
これは旧エディタで編集しました。
同じ機器を持っていればコピペ&アセンブルで動くはずです。
;******************************** |