2011年10月25日火曜日

PICで高速にシリアル通信

PICでpurintfを使う場合
普通は

void sputch(const char ch) {
while(!TXSTAbits.TRMT);
TXREG = ch;
}
っていう関数を使うことになる
これはシリアルで文字列を送信するためのものなんだけど
9600bpsだと1bitあたり
1/9600*1000000で104uSかかる
それが8bit+2(スタートストップ)で
1バイト送信するのに1mSくらい
ということは30文字送信するのに30mSかかる
これは無視できない時間

ということで
割り込みで送信できるようにしてみた


char text[50];
char textSize;
char textCnt = 0;



static void interrupt intr(void) {
if (TXIF) {
if (textSize > textCnt) {
TXREG = text[textCnt];
textCnt++;
} else {
textCnt = 0;
TXIE = 0;
}
}
}

これで


void main(void) {
init();

textSize = sprintf(text,"hello world ... serial TEST\r\n");
TXIE = 1;

for ( ; ; ) {
}
}
とかだと 300uS程度で処理が完了する
あとは割り込みで勝手に送信してくれる


ただ 当たり前だけどこれはハードウェアシリアルが有るPICに限られます


0 件のコメント:

コメントを投稿