米粒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

米粒AVR(ATtiny10)

通称「米粒AVR」で知られるTiny10を使ってみたくて、秋月の通販で買ってみました。 超小型

記事を読む

no image

Android Open Accessory開発時のWiFiデバッグ

Android Open Accessory開発時のデバッグは、ADBをWiFiで接続しろと、USB

記事を読む

Arduinoで温湿度計

秋月電子の温湿度モジュールを使って、温湿度計を作ってみました。 以前「パソコンで温度計」と言うもの

記事を読む

no image

AndroidにPS2キーボードを繋いでみた

@yishiiさんの素のAndroid端末を外部のキーにより操作する実験と言う記事を参考に、Ardu

記事を読む

Raspberry Piのサウンドを試したら音が出なかった話

(これはX-WindowのVLCメディアプレイヤーのスクショ) Raspberry Piでは、

記事を読む

no image

Android + Bluetooth + Arduino

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

記事を読む

no image

Android + Arduino でリモコン

今こんなのを作ってますと言う動画です。   DoCoMoのFOMA携帯

記事を読む

no image

米粒AVRでアナログ入力を試してみた

米粒AVR(ATtiny10)に搭載されている8ビット4チャンネルのアナログ入力を試してみました

記事を読む

no image

気になる物

HT-03Aで使えるのかどうかは知らないけど、Bluetooth-シリアルモジュール(BT-MOD1

記事を読む

no image

SoundIRModemライブラリのサンプル

 SoundIRModemライブラリは、米粒AVR(Tiny10)とAndroid端末をイ

記事を読む

Comment (2件)

  1. ohkin

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

    1. Futaba

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

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

Arduinoで温湿度計 #2

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

Arduinoで温湿度計

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

ArduinoでSDカード

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

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

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

秋月の小型キャラクタLCD

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

PAGE TOP ↑