ATtinyのソフトウェアシリアル通信


ArduinoISP+ATTinyCoreで、 ATtiny84 Attiny85 ATtiny861 ATtiny4313へスケッチを書き込む環境がそろったので
それぞれのモデルでソフトウェア・シリアル通信ができるかどうか調べてみました。

受信側はUNOを使い、以下のスケッチを書き込みます。
こちらもシリアル通信にはSoftwareSerialを使い、シリアルモニターで受信データを確認します。
シリアル通信のボーレートは安全を見て、4800Bpsに設定しています。
/*
 * Software Serial Receiver Sample
 */
#include "SoftwareSerial.h"

#define rxPin 4    // D2
#define txPin 5    // D1
#define BaudRate   4800

SoftwareSerial mySerial(rxPin, txPin); // RX, TX

void setup() {
  Serial.begin(9600);
  Serial.print("Software Serial Receiver Start BaudRate=");
  Serial.println(BaudRate);
  mySerial.begin(BaudRate);
}

void loop() {
  char buf[60];
  int pos=0;
  buf[pos]=0;
 
  while(1) {
    if (mySerial.available()) {
      char c = mySerial.read();
//      Serial.print (" c=");
//      Serial.print(c,HEX);

      if (c == 0x0d) {
      
      } else if ( c == 0x0a) {
        Serial.print ("buf=");
        Serial.println(buf);
        pos=0;
      } else {
        buf[pos++]=c;
        buf[pos]=0;
      }
    }
  }
}

送信側のスケッチは以下の通りです。
rxPinを受信側のtxPin(3番)、txPinを受信側のrxPin(2番)、お互いのGNDを接続します。

/*
 * Software Serial Send Sample
 */
#include <SoftwareSerial.h>

#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168P__)
  #define rxPin 2    // PD2
  #define txPin 3    // PD3
  #if defined(__AVR_ATmega328P__)
    #define Model "ATmega328P"
  #else
    #define Model "ATmega168P"
  #endif
#elif defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
  #define rxPin 2    // PB2
  #define txPin 3    // PA7
  #if defined(__AVR_ATtiny44__)
    #define Model "ATtiny44"
  #else
    #define Model "ATtiny84"
  #endif
#elif defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
  #define rxPin 3    // PB3
  #define txPin 4    // PB4
  #if defined(__AVR_ATtiny45__)
    #define Model "ATtiny45"
  #else
    #define Model "ATtiny85"
  #endif
#elif defined(__AVR_ATtiny861__)  // 動かない
  #define rxPin 4   // PB4
  #define txPin 3   // PB6
  #define Model "ATtiny861"
#elif defined(__AVR_ATtiny2313__) || defined(__AVR_ATtiny4313__)
  #define rxPin 5   // PD3
  #define txPin 6   // PD4
  #if defined(__AVR_ATtiny2313__)
    #define Model "ATtiny2313"
  #else
    #define Model "ATtiny4313"
  #endif
#endif

SoftwareSerial mySerial(rxPin, txPin); // RX, TX

void setup() {
#if defined(__AVR_ATmega328P__)
  Serial.begin(9600);
  Serial.println("Software Serial Send Start");
#endif
  mySerial.begin(4800);
}

void loop() {
  static int num = 0;
#if defined(__AVR_ATmega328P__)
  Serial.print("num=");
  Serial.print(num);
  Serial.print(" model=");
  Serial.println(Model);
#endif
  mySerial.print("num=");
  mySerial.print(num);
  mySerial.print(" model=");
  mySerial.println(Model);
  num++;
  delay(1000);
}

【ATtiny84@1MHz】
正常に動きました。



【ATtiny85@1MHz】
正常に動きました。


【ATtiny861@1Mhz】
全く通信できません。


【ATtiny4313】
正常に動きました。


ATtiny861はハードウェアUARTも持っていないので困ります。
ATtiny861でシリアル通信は無理なのか.....

続く....