ATtinyのUART出力


ATtiny84/85/861/4313へスケッチを書き込む環境がそろったので
それぞれのモデルでUART出力ができるかどうか調べてみました。

ATtiny84/85/861にはハードウェアUARTピンはありませんが、ビルトインのソフトウェアシリアルを使ってSerialオブジェク トが使えます。
ATtinyCore UniversalでもFemtoCow ATTinyCoreどちらのAddOnでも同じ結果となりました。

以下のスケッチをATtinyに書き込んだ後、USB-TTLコンバータを使ってUART出力を確認しました。
USB-TTLコンバータ ATtiny
GND GND
VCC VCC
RX TX

ビルトインのソフトウェアシリアルを使う場合、ライブラリのインクルードは不要です。
ATtinyのTXピンはモデルにより変わります。
/*
   UART Output Example
*/

#if defined(__AVR_ATtiny84__)
  //txPin PA1 PCINT1
  #define MODEL "ATtiny84"
#elif defined(__AVR_ATtiny85__)
  //txPin PB0 PCINT0
  #define MODEL "ATtiny85"
#elif defined(__AVR_ATtiny861__)
  //txPin PA6 PCINT6
  #define MODEL "ATtiny861"
#elif defined(__AVR_ATtiny4313__)
  //txPin PD1 PCINT12 (Hardware UART)
  #define MODEL "ATtiny4313"
#endif

void setup() {
  Serial.begin(9600);
}

void loop() {
  static unsigned int num = 0;
  Serial.print("Serial Print num=");
  Serial.print(num);
  Serial.print(" model=");
  Serial.println(MODEL);
  num++;
  delay(1000);
}

【ATtiny84@1MHz】
SerialオブジェクトのTXピンはPA1(PCINT1)にアサインされています。



【ATtiny85@1MHz】
SerialオブジェクトのTXピンはPB0(PCINT0)にアサインされています。


【ATtiny861@1Mhz】
SerialオブジェクトのTXピンはPA6(PCINT6)にアサインされています。


【ATtiny4313@1Mhz】
このチップにはPD1にハードウェアUARTが有ります。





Arduinoには標準ライブラリのSoftwareSerialライブラリが有りますが、上記の実装はこれとは別の実装です。
以下のスケッチを使って同じピンを使ったSoftwareSerialライブラリを試してみました。
/*
   Software Serial Output Example
*/
#include "SoftwareSerial.h"

#if defined(__AVR_ATtiny84__)
  #define txPin 1
  #define rxPin 0
  #define MODEL "ATtiny84"
#elif defined(__AVR_ATtiny85__)
  #define txPin 0
  #define rxPin 1
  #define MODEL "ATtiny85"
#elif defined(__AVR_ATtiny861__)
  #define txPin 12
  #define rxPin 11
  #define MODEL "ATtiny861"
#elif defined(__AVR_ATtiny4313__)
  #define txPin 1
  #define rxPin 0
  #define MODEL "ATtiny4313"
#endif

SoftwareSerial mySerial(rxPin, txPin);

void setup() {
  mySerial.begin(9600);
}

void loop() {
  static unsigned int num = 0;
  mySerial.print("TX Pin=");
  mySerial.print(txPin);
  mySerial.print(" num=");
  mySerial.print(num);
  mySerial.print(" MODEL=");
  mySerial.print(MODEL);
  mySerial.print(" F_CPU=");
  mySerial.println(F_CPU);
  num++;
  delay(1000);
}


【ATtiny84@1MHz(Internal)】
PB1を使ったSoftwareSerialは1MHzクロックでも正しく動きます。



【ATtiny84A@1MHz(Internal)】
同じTiny84でも低電圧版のTiny84Aでは、PA1を使ったSoftwareSerialは文字化けします。



【ATtiny84A@8MHz(Internal)】
クロックを8MHz(Internal)に変えてもだめです。



【ATtiny84A@8MHz(External)】
8MのCeramic Resonators(セラロック)をつけて、クロックを8MHz(External)に変えたら安定して動きました。



【ATtiny85@1MHz】
PB0を使ったSoftwareSerialは1MHzクロックでも正しく動きます。



【ATtiny861@1Mhz】
PA6を使ったSoftwareSerialは全く動きません。
Ceramic Resonators(セラロック)をつけて、クロックを8MHz(External)  16MHz(External)に変えても
動きませんでした。



【ATtiny4313@1Mhz】
PD1はハードウェアUARTのTXですがSoftwareSerialでも使うことができます。



続く....