米粒AVRでシリアル通信(ただし送信だけ)

公開日: 電子工作 |

adm3202an

米粒AVR(ATtiny10)にUART機能は搭載されていないので、シリアル通信を行う為には自前でプログラムを組む必要があります。

今回、どうしてもデバッグ用にシリアル通信をしたいと思い、とりあえず簡易的なソフトシリアル通信(送信のみ)のプログラムを組んでみました。

 

回路図

回路図
PB1を、シリアル出力に利用しています。
PB0は、動作確認用LEDです。無くても問題無し。

 

tiny10 - ArduinoをUSBシリアル変換器に利用
シリアル出力は、今回ArduinoをUSBシリアル変換器として利用してPCに接続しました。
写真の赤と黒の線は5V電源、白の線がシリアル出力となっています。
この方法、手っ取り早くてとても便利です!

 

プログラム 

#ifndef F_CPU<br />
#define F_CPU 8000000UL<br />
#endif<br />
<br />
#include <avr/io.h><br />
#include <util/delay.h><br />
<br />
#define LED_PIN        PB0<br />
#define DELAY        500<br />
<br />
#if F_CPU == 8000000UL<br />
    // 19200bps<br />
    #define SERIAL_TIME_PER_BIT1    52<br />
    #define SERIAL_TIME_PER_BIT2    51<br />
#elif F_CPU == 4000000UL<br />
    // 9600bps<br />
    #define SERIAL_TIME_PER_BIT1    104<br />
    #define SERIAL_TIME_PER_BIT2    102<br />
#elif F_CPU == 2000000UL<br />
    // 9600bps<br />
    #define SERIAL_TIME_PER_BIT1    103<br />
    #define SERIAL_TIME_PER_BIT2    100<br />
#elif F_CPU == 1000000UL<br />
    // 4800bps<br />
    #define SERIAL_TIME_PER_BIT1    206<br />
    #define SERIAL_TIME_PER_BIT2    201<br />
#endif<br />
<br />
#define SERIAL_TX_PIN            PB1<br />
<br />
void serialBegin()<br />
{<br />
    DDRB |= _BV(SERIAL_TX_PIN);<br />
    PORTB |= _BV(SERIAL_TX_PIN);<br />
}<br />
<br />
void serialWrite(uint8_t data)<br />
{<br />
    PORTB &= ~(_BV(SERIAL_TX_PIN));    // start bit<br />
    _delay_us(SERIAL_TIME_PER_BIT1);<br />
    <br />
    uint8_t i;<br />
    for(i=1;i;i<<=1)<br />
    {<br />
        if(data&i)<br />
        {<br />
            PORTB |= _BV(SERIAL_TX_PIN);<br />
        }            <br />
        else<br />
        {<br />
            PORTB &= ~(_BV(SERIAL_TX_PIN));<br />
            asm volatile ("nop");<br />
        }            <br />
        _delay_us(SERIAL_TIME_PER_BIT2);<br />
    }<br />
<br />
    PORTB |= _BV(SERIAL_TX_PIN);    // stop bit<br />
    _delay_us(SERIAL_TIME_PER_BIT1);<br />
}<br />
<br />
int main(void)<br />
{<br />
    CCP = 0xD8;<br />
    CLKMSR = 0x00;<br />
    CCP = 0xD8;<br />
    CLKPSR = 0x00;<br />
    <br />
    DDRB |= _BV(LED_PIN);<br />
    <br />
    serialBegin();<br />
    PORTB ^= _BV(LED_PIN);<br />
    _delay_ms(DELAY);<br />
    PORTB ^= _BV(LED_PIN);<br />
    _delay_ms(DELAY);<br />
    PORTB ^= _BV(LED_PIN);<br />
    <br />
    serialWrite('H');<br />
    serialWrite('e');<br />
    serialWrite('l');<br />
    serialWrite('l');<br />
    serialWrite('o');<br />
    serialWrite(' ');<br />
    serialWrite('W');<br />
    serialWrite('o');<br />
    serialWrite('r');<br />
    serialWrite('l');<br />
    serialWrite('d');<br />
    serialWrite('!');<br />
    <br />
    while(1)<br />
    {<br />
        PORTB ^= _BV(LED_PIN);<br />
        _delay_ms(DELAY);<br />
    }<br />
}<br />

このプログラムをそのまま動かすと、米粒AVRは8MHzで動作します。
電源を入れると1秒後に、19200bps(8bit, non-parity, stopbit 1)の速度で "Hello World!"と送信して、その後Lチカを続けます。

時々エラーで文字化けが起きます。

 

説明

11~59行目までをコピペすれば、多分使いまわしができると思います。
使い方は、あらかじめ serialBegin() を呼び出しておき、次に serialWrite(data) で送信。
送信中は、割り込みを止めておかないと多分データが壊れてしまいます。

8MHz動作時以外に、4MHz、2MHz、1MHzに対応しています。
F_CPUの値を見て自動で対応しますが、シリアルの速度は変わります。

CPU速度 シリアル通信速度
8MHz 19200bps
4MHz 9600bps
2MHz 9600bps
1MHz 4800bps

 

あと、時々エラーで文字化けが起きます。これ重要!

 

関連記事

no image

Android + Bluetooth + Arduino

 以前書いた『気になる物』で紹介したBluetoothモジュールですが、本当に気になって実

記事を読む

Raspberry Pi

Raspberry Piを買った

先日、Raspberry Pi(ラズベリーパイ)を買いました。 Raspberry Piは噂で

記事を読む

米粒AVR リモコン

米粒AVRでリモコン送信機

米粒AVR(tiny10)を使った赤外線リモコン送信機を作ってみました。 これで送信できるのは

記事を読む

no image

米粒AVRでLチカ

  米粒AVR(ATtiny10)でLチカしてみました。 LチカとはLEDをチカチカと

記事を読む

no image

米粒AVRで小型8連ナイトライダーを作ってみた

米粒AVR(ATtiny10)を2つ使って、8つのLEDを順番に点灯しています。 &nbs

記事を読む

Arduino + STTS751

パソコンで温度計

ありきたりのPC温度計ですが、なんとなく作りたくなったので作ってみる。 コントローラーは手軽な

記事を読む

no image

Softmodem Terminal 公開しました。

需要がどれほど有るのか疑問に思いつつ、以前のエントリ(AndroidでSoftModemを試してみた

記事を読む

no image

Wimeji Client for Arduino

前回紹介したWimeji Client for WindowsXPをArduinoでやってみました。

記事を読む

no image

PIC24FJ64GB002でADKを試す(その2)

 前回「PIC24FJ64GB002でADKを試す(その1)」では回路の説明までしたので、

記事を読む

soundIR 受信機 回路図

赤外線リモコン受信機(イヤホンジャック接続)の回路

  前回からだいぶと時間が経ってしまっていますが、今回はイヤホンジャック接続のリモコン受

記事を読む

Comment (2件)

  1. ohkin

    はじめまして。ohkinと申します。
    attiny10 で検索して本ページにたどり着きました。
    通信機能の無いattiny10で、デバッグを行うのに大変重宝いたしました。有用なプログラムを公開いただき、ありがとうございます。
    これからの情報発信を期待して、ブックマークさせて頂きました。

    1. Futaba

      コメントありがとうございます。
      このプログラム、エラー率がちょっと高いのが難点なのですが、お役に立ててなによりです。

      tiny10ネタは見に来てくれる人が少ないようで寂しく思ってましたが、コメント頂けてブックマークまでして頂いてとても嬉しいです^^;

Arduinoで温湿度データロガー
Arduinoで温湿度計 #2

今回は、前回作った温湿度計にRTCモジュールとSDカードアダプタを

Arduinoで温湿度計
Arduinoで温湿度計

秋月電子の温湿度モジュールを使って、温湿度計を作ってみました。 以前

SDカード・マイクロSDカード
ArduinoでSDカード

電子工作で大量のデータを保存する方法を調べていると、 Arduin

秋月電子 リアルタイムクロック(RTC)モジュール
秋月のリアルタイムクロック(RTC)モジュール

今回は秋月電子のI2C接続のリアルタイムクロック(RTC)モジュールを

秋月電子 キャラクタLCD
秋月の小型キャラクタLCD

今回秋月電子で売られている小型のキャラクター液晶2種を買ったので、

PAGE TOP ↑