SSブログ

202duino で 自力シリアル出力 [Arduino]

202duinoは、CH340EをUPDIにもシリアル通信にも使えるように作りました。

202duino で シリアル通信:放課後マイコンクラブ:SSブログ
https://hello-world.blog.ss-blog.jp/2023-05-29

ただ、ハードウェアシリアルを使うと、ほとんどフラッシュメモリの空きがなくなる問題が出てきます。
そこで、

・送信だけ
・送信中に他の事はできない
・高速な通信はできない

という制限はあるもののレジスタを直接たたかずにArduinoの機能だけで自力でシリアル出力をしてみました。
micros()でタイミングをとるバージョンと、delayMicroseconds()でタイミングをとるバージョンを作りました。
以下の1秒毎に「Hello world!」を送信するスケッチで、どちらも余裕で1kBを切れました。

// Arduino based serial output

#define TX    0                 // TX pin
#define BAUD  9600              // baud rate

void setup() {
    pinMode( TX ,  OUTPUT );
    digitalWrite( TX, HIGH );
}

void loop() {
    char text[] = "Hello world!\n";
    for(uint8_t i = 0; text[i]; i++ )   inoTX( text[i] );
    delay(1000);
}

void inoTX( uint8_t c ) {       // *** OK up to 38400bps at 20MHz(ATtiny202) ***
    uint32_t  us = micros();
    digitalWrite( TX,  LOW );                   // start bit
    while( micros() - us < (1000000 / BAUD) );
    us += (1000000 / BAUD);
    for(uint8_t i = 0; i < 8; i++ ) {           // data bits
      digitalWrite( TX, ( c >> i ) & 1 );
      while( micros() - us < (1000000 / BAUD) );
      us += (1000000 / BAUD);
    }
    digitalWrite( TX, HIGH );                   // stop bit
    while( micros() - us < (1000000 / BAUD) );
}

別バージョン ー delayMicroseconds()版
void inoTx( uint8_t c ) {       // *** OK up to 19200bps at 20MHz(ATtiny202) ***
    digitalWrite( TX,  LOW );                   // start bit
    delayMicroseconds( 1000000 / BAUD );
    for(uint8_t i = 0; i < 8; i++ ) {           // data bits
      digitalWrite( TX, ( c >> i ) & 1 );
      delayMicroseconds( 1000000 / BAUD );
    }
    digitalWrite( TX, HIGH );                   // stop bit
    delayMicroseconds( 1000000 / BAUD );
}

202serial_tx.jpg
Rx(CH340E)とシリアル出力ピン(Tx)をワイヤーでつないでいます。
(スケッチ書き込み時は、ワイヤーを外します。)

ちなみにこれらを、UNO R4 minima と USBシリアル変換モジュールで試したらちょくちょく文字化けして使い物にはなりませんでした。
nice!(0)  コメント(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。