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

 

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

 

関連記事

米粒AVR リモコン

米粒AVRでリモコン送信機

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

記事を読む

Raspberry Pi

Raspberry Piを買った

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

記事を読む

no image

Android+Arduinoでリモコン3 その1(AndroidAccessory接続)

何度か、Android+リモコンのネタを書いたことがあるのですが、今回はAndroid Access

記事を読む

no image

Android+Arduinoでリモコン3 その2(AndroidAccessory接続)

何度か、Android+リモコンのネタを書いたことがあるのですが、今回はAndroid Access

記事を読む

no image

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

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

記事を読む

no image

Androidで一眼レフカメラのシャッターを制御する

またSoftModemネタです。 調子に乗って arms22さんの記事 iPhoneで一眼レフカメ

記事を読む

sdcards

Raspberry Pi SDカードのクラスと起動速度

SDカードにOSをインストールするので、起動にはそれなりに時間がかかります。 では、どれくらい

記事を読む

米粒AVT(tiny10) リモコンレシーバー

米粒AVRでリモコン受信処理

  米粒AVR(Tiny10)で赤外線リモコンを受信して処理をするサンプルを作ってみまし

記事を読む

no image

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

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

記事を読む

no image

S2 Resistor Color Code 公開しました。

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

記事を読む

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 ↑