ようやく解決できました。
1.信号確認
鈍って受信できていないのではないかという疑惑を明らかにするために
とりあえずTXDから出ている信号を見てみました。
直列に挿入されている抵抗値を変えてみます。
1kΩと330Ωだとほぼ変化なし。
0Ωだときれいになっています。
抵抗いれてそこまでなまっているかと言われればそういうわけでもないので、
別のことが原因だと推測できます。
明らかに送信間隔詰め詰めなのが見て取れるので、
おそらくこっちが原因かなと思います。
2.送信間隔変更
そこでもっと送信の時間間隔を空けます。
ADCデータの送信も考慮して計算します。
最大サンプルレートは15kSample/sなのでスタートビット、ストップビットを含めると
実は300kbit/s必要でした。
なのでボーレートを500kに設定します。(これだったらパリティも入れられそう)
続いて8Bitタイマで割込みを入れて送信間隔を管理します。
設定値は2Byte同時送信を考えて15kHzです。
逆数を取って66.67μsでタイマ割込みが発生するように設定します。
20MHz/前置分周=0.4μs/1カウント
一番いいところは8分周、166カウントで検知をかけることにします。
とりあえずデバッグしてみます。
一発目割込み 73.35μs
140.2μs - 73.35μs = 66.85μs(14.959kHz)
まあ今のところはこれで十分です。
あとあと計測時刻のずれが問題になってくるかもしれません。
そしたら水晶を16MHzにするとかは必要になってきそうです。
ということで以下のコードを流して試してみます。
# include <avr/io.h>
# include <avr/interrupt.h>
int main(void)
{
/* Replace with your application code */
//int mode =0;
InitC();
PORTC = 1; //PORTCはデバッグ用
UCSR0A = UCSR0A |0b00000010; //倍速設定
UCSR0B = 0b00001000;
UCSR0C = 0b00000110;
UBRR0 = 4;
PORTC = 2;
TCCR0A=0b00000010;//比較一致動作に設定
TCCR0B=0b00000010;//8分周設定
OCR0A=166;//一致発生カウント
TIMSK0=0b00000010;//タイマ一致割込み有効
sei();//割込み有効
while(1)
{
}
}
//タイマ一致割込み
ISR(TIMER0_COMPA_vect){
while ( !(UCSR0A & (1<<5)) );
UDR0 = 0x77;
while ( !(UCSR0A & (1<<5)) );
UDR0 = 0x33;
PORTC++;
}
void InitC(){
DDRC = 0b00111111;
}
信号波形は想定通りです。
パリティ2bit分入れる余裕もありそうです。
問題なさそうです。
後から抵抗1kΩを入れましたが、今のところは文字化けはしなかったです。
ということで次はPCからデータを送信してそのアンサバックを返すようなことをやります。