マイコンからのデータ送信
マイコンからマイコンROM内の一定の数値を受け取って
PCの画面に出力します。
通信設定は
ボーレート:250kbps
パリティ:なし
ビット数:8Bit
ストップビット:1bit
です。マイコンとPC側で同じ設定をします。
マイコンに書き込むプログラムは以下です。
main.c
# include <avr/io.h>
# include <avr/interrupt.h> //まだいらない
int main(void)
{
UCSR0B = 0b00001000;//USART送受信ENA/DIS設定
UCSR0C = 0b00000110;//USART各通信設定
UBRR0 = 4;//システムクロック20MHz、ボーレート250kbps設定
while(1)
{
while ( !(UCSR0A & (1<<5)) );//送信バッファが空くまで待機
UDR0 = 0x77;//0x77をPCに送信
}
}
各レジスタ値の役割はATmega328Pのドキュメントを見ると書いてあります。
(面倒なので省略してしまいます。)
ちなみにADC変換速度を基にするとボーレートは
16f_{sample} [\rm bps]
で求まります。(16は8bit×2バイト分、ADCの分解能が10bitに因る)
ADC最大分解能サンプリング周期:15kSample/s
より240kpbsは必要です。かつかつです。
PC側はC#で作っていきます。
C#でシリアルポート通信するのは初めてなので、
うまく行くか心配です。
Program.cs
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OnBoardTester
{
class Program
{
static void Main(string[] args)
{
//受信Only
SerialPort serialPort = new SerialPort("COM3", 250000, Parity.None, 8, StopBits.One);
serialPort.Open();
while (true)
{
System.Console.WriteLine(serialPort.ReadByte().ToString("x2")+"\n");
}
}
}
}
こちらのページを参考にしました。
そして回路はこんな感じです。
TXDとRXDつなげときゃ動くかくらいの感覚です。
ということでPCにつないで、C#のプログラムを起動します。
マイコンからの信号を受信することができました!!!!!!
以上です。
次回は地獄のトラブルシューティングが始まります。