LoginSignup
1
1

More than 3 years have passed since last update.

AVRマイコンでいろいろやる②-1 シリアル通信1

Posted at

マイコンからのデータ送信

マイコンからマイコン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");
            }
        }
    }
}

こちらのページを参考にしました。

そして回路はこんな感じです。

IMG_20190516_001830.jpg

TXDとRXDつなげときゃ動くかくらいの感覚です。
ということでPCにつないで、C#のプログラムを起動します。
20190516_2.png

マイコンからの信号を受信することができました!!!!!!

以上です。
次回は地獄のトラブルシューティングが始まります。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1