2008/04/17(木)[雑]LCDライブラリ自作(失敗

拙作ルーチンの移植~失敗(ぉ

あきぼう氏のavrgccでアセンブラを使うを参照し、アセンブラでライブラリを作成します。

;----------------------------------------
;LCD_WriteCMD: LCDへコマンド1Byte送信
;引数: register::LCD_DATA
;返値: なし
;----------
LCD_WriteCMD:
	rcall	LCD_WaitBusy	; Wait for LCD BUSY
	SWAP	LCD_DATA
	RCALL	LCD_WriteCMDn	; $+1?
LCD_WriteCMDn:
	mov	tmp, LCD_DATA
	andi	tmp, 0x0F
	ori	tmp, (ID_DATA)	; P.U.
	out	PORTD, tmp	; RS,R/W set
	sbi	PORTD, LCD_E	; 2cycle, E Hi
	rjmp	PC+1
	SWAP	LCD_DATA
	cbi	PORTD, LCD_E	; 2cycle, E Lo
	ret

これ*1をエイヤこらどっこいしょとgcc向けにポーティングしようとして挫折。寝る前にさくっと終わるならいいかな?と思っていたけれども甘かった。いきなり汎用化記述を始めたのが敗因だなw。使用しているポートも変わるので、いっそのこと汎用化しようなんて考えたのが悪かった。

まぁ、寝不足に疲れのたまった脳では効率悪すぎたか(言い訳


氏のライブラリを伸ばして、コマンド待ちルーチン・データ入力ルーチンを追加することにしますかね。ウェイト部分をコマンドリードしてBUSY消えるのを待てばいいだけだしね。gccが吐き出したコードを見て、すげぇむだがあるようならアセンブラ化してしまいましょう。ただし、ユーザ定義のポート・ビットに耐えないといけないので、Cのままのほうが互換性は高そうですけれど・・・。無理にアセンブラ化しなくていいかなぁ・・。どうせLCDモジュールの処理待ちで待ち時間がかなりかかるはずだし。

ということはこの2時間ばかり捨てたということか('AP

*1 : もちろんサブルーチン一個ではないです... 入れ子で読んでいたので結局まとめて移植しないと動かないという(笑