フォト
2025年4月
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30      
無料ブログはココログ

« ATtiny13AでI2C接続キャラクタLCDを利用する(2) | トップページ | AVRのアセンブラプログラミングを勉強しています »

2014年11月12日 (水)

ATtiny13Aでシリアル通信(UART)を行う

Attiny13Aでシリアル通信をしてパソコンとの連携をしたい今日この頃、
探しに探してやっと見つけ実現出来ました。

Nerd Ralphさん「AVR half-duplex software UART supporting single pin operation」
ATtinyで利用できるソフトウェアUARTを公開しています。

早速、ATtiny13Aで試してみました。ソースコードは上記HPからダウンロードできます。
かなり良いです。Nerd Ralphさんに感謝!! です。

03_2

概要
これは何?
シリアル通信(UART)をビットバンディング(エミュレーション)で実装したソフトです。
半二重通信でI/O用に1ピンのみ利用、消費フラッシュメモリはわずか62バイトです。
バッファリングは行っていないのでSRAMの消費は無しです。
16Mhzだと460.8kbpsの速度まで対応できるそうです(デフォルトは115.2kbps)。

送信・受信を同時に行うことはないのでこれで半二重通信も問題なしですね。

回路作成
1ピンで入出力に使う場合、ダイオード、トランジスタでTxとRxを分離する回路が必要です。
TxとRxを別ピンに割り当てればこれは不要です(ただし、ソース内のdefine文を修正)。

8ピンATtiny13A的には1ピンだけで済ませたいので、回路も作成しました。
特に部品説明はなかったので、トランジスタとダイオードは手持ちのありふれた
2SC18151N4148を利用しました。

04
実際はこんな感じ。

     Dscn3234


シリアル通信用にはPB3(D3)を割り当てました。

ライブラリのインストール
ダウンロードしたファイルを解凍しBasicSerial3フォルダをlibrariesフォルダに入れます。

ライブラリソースの修正
利用ピンがPB3(D3)なので、BasicSerial3.SのUART_Tx、UART_Rxの定義を修正します。
 #define UART_Tx   3
 #define UART_Rx   3

さらに、通信速度が115200に固定されているので、
  //#define  BAUD_RATE   115200
  #if  !defined(BAUD_RATE)
  #define  BAUD_RATE   115200
  #endif

こんな感じに修正して、スケッチ(ソースコード)作成時にも設定できるようにしました。
動作確認のスケッチを作成して動かしてみます。

ATtiny13Aの9.6MHzだと57600bps,115200bpsではタイミング的に
微妙にエラーが発生します。
通信速度は38400bpsにて利用しました。

#define BAUD_RATE 38400
#include <BasicSerial3.h>

// sketch to test Serial

void setup() {

}

void serOut(const char* str) {
   while (*str) TxByte (*str++);
}

void loop(){
  byte c;
  c = RxByte();
  switch(c) {
    case '1': 
      for (uint8_t i=0;i<10;i++) serOut("埼玉");
      serOut("\n\r");
      break;
    default:
      TxByte(c);
  }
}

プログラムサイズは426バイトでした。標準のSerialと比べると小さいですね。
TeraTermで確認すると、双方向の通信が出来ました。
1を押すと"埼玉"を10個表示します。他はそのまま文字を表示します。

01

十分使えますね。通信速度 38400bps なら十分な速度です。

考察
念のため、ロジックアナライザで通信データを見てみました。
実は57600bps,115200bpsでもそれなりに通信できるのですが、微妙にエラーがでました。
微妙にフレームエラー発生です。パルス幅が規定どおり出てないみたいです。

05

38400bpsの場合はかなり良好です。

06

38400bpsの場合、1ビット当たり26.04マイクロ秒の時間幅なのですが、
生成している波形幅は25.5、26.0マイクロ秒で2%程度のずれでおさまっているようです。

検証時に使った、必要パルス幅とディレイに必要なサイクル数のメモ

検証用データ 通信速度と1ビット幅・必要ディレイサイクル数
※サイクル数換算は ATTiny13A 9.6MHzの場合

07
(57600,115200bpsのタイミングを合わせようとソースのTXDELAYを調整したがだめでした)

実際に、記事のコメント&感想でもATtiny13では38400bpsを使うと良いみないな
投稿がありました。

ということで、 38400bps なら十分利用できます。
このUARTライブラリはかなりの戦力として使えそうです。

ちなみに、2線でで利用する場合は
BasicSerial3.SのUART_Tx、UART_Rxに別ポートを割り当てればよいです。
 #define UART_Tx   3
 #define UART_Rx   4

この場合は、トランジスタ、ダイオード、抵抗は不要でピンに直接接続で利用出来ます。

今回の調査で参考にしたサイト
  ・福福電子工房   「RS-232Cとは?」 - 通信書式
  ・たろの部屋 月刊ソフト作り! 「通信ソフトを作る!(その1)」
  ・秋月電子 スイッチング・ダイオード 1N4148トランジスタ2SC1815GR

« ATtiny13AでI2C接続キャラクタLCDを利用する(2) | トップページ | AVRのアセンブラプログラミングを勉強しています »

arduino」カテゴリの記事

AVR」カテゴリの記事

ATtiny13A」カテゴリの記事

コメント

ご無沙汰しています 今更ですが Digi sparkで1ピンシリアルを行いたいのですが
クロックが16.5MHzのようです このままつかえるでしょうか?
よろしくおねがいします

abeさん

クロックが異なるとタイミングも異なるので利用出来ないと思います。
同じクロックのArduino UNO(Atmega328)では利用できました。

Digisparkでのシリアル通信はDigisparkSoftSerialライブラリを使えば
1線でのシリアル通信が可能なようです。
結線方法はDigi_1io_SerialDbgあたりのサンプルソースが参考になると思います。
https://github.com/digistump/DigistumpArduino/blob/master/digistump-avr/libraries/DigisparkSoftSerial/examples/Digi_1io_SerialDbg/Digi_1io_SerialDbg.ino

了解 明日実験してみます
ありがとうございました

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: ATtiny13Aでシリアル通信(UART)を行う:

« ATtiny13AでI2C接続キャラクタLCDを利用する(2) | トップページ | AVRのアセンブラプログラミングを勉強しています »