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

Arduino + USBホストシールド で ADK を試す(その1)

先日Google IOで発表された Android Open Accessory。みなさん知ってます

記事を読む

no image

米粒AVRのEAGLEライブラリ

EAGLEを使って米粒AVR(ATtiny10)の回路図を書こうと思ったら何か様子がおかしい。

記事を読む

Raspberry Piのリビジョン

リビジョンの種類 現在、Rapsberry Piにはリビジョン1とリビジョン2と呼ばれる2つの

記事を読む

no image

AVRISPmk2

米粒AVR(ATtiny10)のプログラム書き込み用にAVRISPmk2を購入しました。 先人

記事を読む

秋月の小型キャラクタLCD

今回秋月電子で売られている小型のキャラクター液晶2種を買ったので、ちょっと比較してみる。 買っ

記事を読む

no image

Arduino + USBホストシールド で ADK を試す(その2)

前回「Arduino + USBホストシールド で ADK を試す(その1)」では、Androidで

記事を読む

Raspberry Piのスクリーンショット

  ブログで使う用に、Raspberry Piのスクリーンショットを撮りたいと思った時、

記事を読む

no image

S2 Resistor Color Code 公開しました。

このアプリは、抵抗のカラーコードから抵抗値を素早く見る為のAndroidアプリです。 4本帯と、5

記事を読む

no image

米粒AVRでLチカ

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

記事を読む

Raspbianの最初の設定

  Raspbianのインストール後にraspi-configを使って行う最初の設定

記事を読む

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 ↑