なんとかなるさね

マイコンをネタにブログを始めてみました


RL78マイコン基板(RL78/G10)|TOOL0端子から2Mbaudでソフトウェアシリアル出力するコード 

3つ前2つ前のエントリでブレッドボード上に回路(FT232RLと74HC125と抵抗2本の簡単なもの)を組んで
秋月電子さんで販売されているRL78/G10 10pin DIP基板に書き込み(とプログラム実行)をしてみましたが、
せっかくFT232RLが繋がっていますのでデバッグメッセージをPC上に表示させることが出来ないか試して
みたくなりました。試行錯誤したところ、FT232RLをスペック上限付近で使うことになってしまうものの、
ブレッドボード上の回路を変更せずに済み、かつサイズの小さいアセンブラコードを作ることが出来ました。
(ただし、残念ながら5μsecほどの割り込み禁止時間があります。それから、個体差のせいでボーレートを
下げないといけなくなる(併せて割り込み禁止時間が延びてしまう)こともあるかも、、、) 追記 : 大事な
注意事項を書き忘れていました。FT232RL側から送信しようとしてはいけないです。送信しようとすると、
僅かな期間ですが74HC125のLow出力とRL78/G10のHigh出力が衝突して何かしらダメージがある筈です。

FT232RL側から送信したいことがある場合はに、1つ後2つ後のエントリのアセンブラコードが良いです。




作成したアセンブラコード(計26バイト)は以下の通りです。(このコード自体はRL78-S1コアの20MHz動作
専用ですが、一部の命令で実行クロック数が少ないS2コア/S3コアの32MHz動作にもNOPやBRでクロック
数を合わせ込めば対応出来ると思います。また、このコード自体はTOOL0端子用ですが、ポート部分を変更
すれば他の端子にも使えると思います。)

; This code is in the public domain. You may use, modify or distribute it freely.
PUBLIC  _putchar
_putchar:               ;X = data, A = ignored, void putchar( unsigned char )
    SET1    P4.0        ; 2 clk     3 byte      always I do for robustness, P40 = TOOL0
    CLR1    PM4.0       ; 2 clk     3 byte      same as above
_putchar_b:             ;begin
    ONEB    A           ; 1 clk     1 byte      as a stop bit,   shorter than "MOV A, #01H"
    ADDW    AX, AX      ; 2 clk     1 byte      for a start bit, shorter than "SHLW AX, 1"
    PUSH    PSW         ; 2 clk     2 byte
    DI                  ; 4 clk     3 byte
_putchar_l:             ;loop (start bit = 0, b0, b1, b2, b3, b4, b5, b6, b7, stop bit = 1)
    SHRW    AX, 1       ; 2 clk     2 byte
    MOV1    P4.0, CY    ; 2 clk     3 byte
    CMPW    AX, #0000H  ; 2 clk     3 byte
    BNZ     $_putchar_l ; 2/4 clk   2 byte
_putchar_e:             ;end
    POP     PSW         ; 4 clk     2 byte
    RET                 ; 7 clk     1 byte
END


また、動作確認用に作成したCコードは以下の通りです。

void putchar( unsigned char );

途中省略

            unsigned char c;
            for ( c = '0' ; c <= '9' ; c++ )
            {
                putchar(c);
            
            }
            for ( c = 'A' ; c <= 'Z' ; c++ )
            {
                putchar(c);
            
            }
            for ( c = 'a' ; c <= 'z' ; c++ )
            {
                putchar(c);
            }
            putchar('\r');
            putchar('\n');




関連記事

2015/01/07   blog-entry-546   category: RL78 /* 16bit,8bit CISC */

go page top