米粒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にPS2キーボードを繋いでみた

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

記事を読む

SDFormatter

Raspbianの起動SDカードを再利用

一度、Raspbianのイメージを書き込んだSDカードは、フォーマットが違う為にWindowsでは利

記事を読む

秋月電子 キャラクタLCD

秋月の小型キャラクタLCD

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

記事を読む

no image

Wimeji Client for Arduino

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

記事を読む

thermometer overlay

パソコンで温度計 #4

前回までに作ったPC温度計のログデータを、計測と同時に撮影した映像にオーバーレイ表示(スーパーイ

記事を読む

Androidで温度計

Androidで温度計(STTS751使用)

  Androidに温度センサー(STTS751)を繋いで温度表示してみました。 温度

記事を読む

no image

PICでMicroBridgeをやってみた

今回は、@yishiiさんが公開されている、PIC24FJ64GB002用のMicroBridgeソ

記事を読む

no image

Android + Arduino でリモコン

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

記事を読む

Raspberry Pi

Raspberry Piを買った

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

記事を読む

no image

Android + Bluetoothドングル + PIC24F

@hrdakinori さんと言う方が、PIC24FとBluetoothドングルを使って、Andro

記事を読む

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 ↑