アマチュア無線や電子工作,バイクの話などを徒然なるままに書き散らすメモ程度のblogです.


by jq1ocr

とくりゃ,シリアルリスナ

ですよね.はい,ちゃちゃっとしましたよ.
d0106518_1521781.jpg

mega かよって声が聞こえそうですが,LCD の付いたテストボードを使っただけで,ポートは GPIO PB0 です.なので,LCD こそ異なる I/F が必要ですが,シリアル部分は tiny85 でも問題なく動くはずです.

0 に落ちてから 9 ビット目が 1 になる組み合わせが続くと,しれっと化け字を吐き続けますが,一度スタートビットがつかめれば,あとは大丈夫っぽいのでこのあたり注意すれば問題なく使えるかと思います.

#define S_HIGH bit_is_set(PINB, PINB0)
-----
while(1){
while(S_HIGH){}
data=0;
for(i=0;i<8;i++){
_delay_us(107);
if(S_HIGH)data|=1<< i ;
}
_delay_us(107);
if(S_HIGH)lcd_write(data);
}

中身の delay の 107us の話です.9600bps の場合の1シンボルは計算上 104us 強ですね.Arduino シリアルトーカーの場合 0 〜 9(文字コードは 0x30-0x39) を連続で出しています.オシロで波形を観測すると,こんな感じです.
d0106518_17251665.jpg
0x0011xxxx ですから OK ですね.プログラム上,読み始めを falling edgeにとっており,時間をおいて次を読む場合,これよりやや長い時間後にしておかないと,手前のビットを読んでしまう恐れがあります.様子を見ながら伸ばしていって今回は 107us になりました.もちろん状況によっては値は異なるでしょう.続くとずれていきそうですが,スタートビットで同期をとっているのでこの位の差であれば1バイト中に累積した遅延はリセットされます.
[PR]
by jq1ocr | 2016-12-13 21:50 | マイコン・電子工作 | Comments(0)