AVRでアセンブラーの練習 2010.12.02(木)〜 LessonA_09B。 LCDモジュールの表示。
著作者名: 中野 良知 作成開始: 2010.12.02(木) 更新 : 2010.12.09(木) △1 タイミングチャートを追加。
目次 1. 目的 2. 使用マイコン 2.1. 動作クロック 2.2. ヒューズビット 3. ゼネラルフローチャート 3.1. mainフロー 3.2. 100usec遅延 3.3. 文字列表示 3.4. 8ビットモード 3.4.1. LCDモジュールの初期化 3.4.2. コマンド発行 3.4.3. コマンド書込み 3.4.4. データ書込み 3.4.5. ビジーチェック 3.5. 4ビットモード 3.5.1. LCDモジュールの初期化 3.5.2. コマンド発行 3.5.3. コマンド書込み 3.5.4. データ書込み 3.5.5. ビジーチェック 4. アセンブリスイッチ 5. タイマー0 6. タイミングチャート 6.1. 書込み 6.2. 読出し 7. プログラムのダウンロード 8. 実験回路 9. 経過 1. 目的 LCDキャラクターモジュールに文字列を表示します。 2. 使用マイコン ATtiny2313を使用します。 2.1. 動作クロック ATtiny2313の内蔵RC発信器をクロック分周比=1/8。動作クロック=1MHzで使用します。 基本命令サイクルは1usecで実行されます。 2.2. ヒューズビット 1) 内蔵RC発信器。 較正済みの8MHzを使用します。 2) クロック分周比=1/8。 基本命令を1usecで実行します。 3) フーズビットの値 拡張=$FF, 上位=$DF、下位=$64 工場出荷の値です。 3. ゼネラルフローチャート 3.1. mainフロー (スタート) │ PORTB初期化 │ スタックポインター初期化 │ PORTD初期化 │ タイマー0初期化 │ アナログ比較器電源オフ │ ウォッチドッグ禁止 │ LCDモジュール初期化 │ 表示クリア、カーソル位置を初期化 │ 1行目文字列表示 │ 2行目文字列表示 │ 3行目文字列表示 │ 4行目文字列表示 │ ├←─┐ │ │ループ └──┘ 3.2. 100usec遅延 w_count×100usecの遅延をします。 遅延倍数をw_countに設定後wait100uをコールします。 (wait100u) ├←───────────────────┐ タイマーカウンタークリア │ │ │ ├←────────────────┐ │ │ No │ │ <タイマーカウンター100usen経過?>───┘ │ │Yes │ 遅延カウンタ減算 │ │ │ │ No │ <遅延カウンタ=0? >─────────────┘ │Yes (終了) 3.3. 文字列表示 Z(ZH,ZL)にフラッシュROMの文字列の先頭アドレスを設定し、 positionにLCDのRAMアドレスを設定後lcd_string_writeをコールします。 フラッシュROMの文字列データが$00(null)でルーチンを終了します。 ldi ZL, Low(str1*2) ; ワードアドレス×2=バイトアドレス ldi ZH, High(str1*2) ; ldi position, LINE1+1 ; 1行の2桁目を指定 rcall lcd_string_write ; (lcd_string_write) │ LCDの行と桁を指定 ├←─────────┐ ROMの文字データを取得 │ │ Yes │ <nullコード?> →┐ │ │No │ │ データ書込み │ │ │ │ │ └──────────┘ ┌──────┘ (終了) 3.4. 8ビットモード 3.4.1. LCDモジュールの初期化 (lcd_init) │ 15msec遅延 │ コマンド$30発行 │ 4.1msec遅延 │ コマンド$30発行 │ 100usec遅延 │ コマンド$30発行 │ コマンド$38発行(8ビット、2行、5×7ドット) │ コマンド$0C発行(表示オン、カーソルオフ、点滅オフ) │ コマンド$06発行(カーソルインクリメント、表示シフトせず) │ (終了) 3.4.2. コマンド発行 コマンド(command)レジスタにコマンドを設定し、 lcd_command_outをコールします。 (lcd_command_out) │ データバスを出力に設定 │ データバスにコマンド出力 │ RS=0 │ R/W=0 │ E=1 │ E=0 │ データバスに$00を出力(プルアップオフ) │ データバスを入力に設定 │ (終了) 3.4.3. コマンド書込み コマンド(command)レジスタにキャラクターコードを設定し、 lcd_command_writeをコールします。 (lcd_command_write) ├←──────────────┐ │ Yes │ <LCDモジュールビジー?>──────┘ │ lcd_command_outをコール │ (終了) 3.4.4. データ書込み データ(data)レジスタにキャラクターコードを設定し、 lcd_data_writeをコールします。 (lcd_data_write) │ ├←──────────────┐ │ Yes │ <LCDモジュールビジー?>──────┘ │ データーバスを出力に切換え │ データーバスにデータを出力 │ Reg sel=1 │ R/W=0 │ E=1 │ E=0 │ データーバスを入力に切換え │ データーバスに$00を出力(プルアップオフ) │ (終了) 3.4.5. ビジーチェック (lcd_busy_sheck) │ Reg sel=0 │ R/W=1 │ E=1 │ 0 <ビジーフラグ>─┐ │1 │ Carry=1 Carry=0 │ │ ├──────┘ │ (終了) 3.5. 4ビットモード データバスのビット4からビット7を使ってLCDモジュールにコマンドやキャラクター コードを書込みます。 データは上位4ビットを最初に出力し、次に下位4ビットを出力します。 ビジーフラグはビット7に出力されます。 3.5.1. LCDモジュールの初期化 (lcd_init) │ 15msec遅延 │ コマンド上位$3発行 │ 4.1msec遅延 │ コマンド上位$3発行 │ 100usec遅延 │ コマンド上位$3発行 │ (上位・下位=$38で、8ビット、2行、5×7ドット) │ コマンド上位$3発行 │ コマンド下位$8発行 │ (上位・下位=$0Cで、表示オン、カーソルオフ、点滅オフ) │ コマンド上位$0発行 │ コマンド下位$C発行 │ (上位・下位=$06で、カーソルインクリメント、表示シフトせず) │ コマンド上位$0発行 │ コマンド下位$6発行 │ (終了) 3.5.2. コマンド発行 コマンド(command)レジスタにコマンドを設定し、 lcd_command_outをコールします。 (lcd_command_out) │ データバスを出力に設定 │ データバスにコマンドの上位4ビットを出力 │ RS=0 │ R/W=0 │ E=1 │ E=0 │ データバスにコマンドの下位4ビットを出力 │ E=1 │ E=0 │ データバスに$00を出力(プルアップオフ) │ データバスを入力に設定 │ (終了) 3.5.3. コマンド書込み コマンド(command)レジスタにコマンドを設定し、 lcd_command_writeをコールします。 (lcd_data_write) ├←──────────────┐ │ Yes │ <LCDモジュールビジー?>──────┘ │ lcd_command_outをコール │ (終了) 3.5.4. データ書込み データ(data)レジスタにキャラクターコードを設定し、 lcd_data_writeをコールします。 (lcd_data_write) │ ├←──────────────┐ │ Yes │ <LCDモジュールビジー?>──────┘ │ データバスを出力に切換え │ データバスに上位4ビットデータを出力 │ Reg sel=1 │ R/W=0 │ E=1 │ E=0 │ データバスに下位4ビットデータを出力 │ E=1 │ E=0 │ データバスを入力に切換え │ データバスに$00を出力(プルアップオフ) │ (終了) 3.5.5. ビジーチェック 戻り値のキャリーフラグが1ならビジー中、0ならビジー解除。 (lcd_busy_sheck) │ Reg sel=0 │ R/W=1 │ E=1 │ データバス上位4ビットを読み込み │ 0 <ビジーフラグ>─┐ │1 │ Carry=1 Carry=0 │ │ ├←─────┘ │ E=0 │ E=1 (データバスに下位4ビットを読出し。空読み) │ E=0 │ (終了) 4. アセンブリスイッチ アセンブル疑義命令 .if〜.else〜.endifを使用し、LCDモジュールのデータバス幅の 8ビットと4ビットを切換えてアセンブルします。 .def BIT_LENGTH = 8 ; 8または4を設定 .if BIT_LENGTH == 8 ; 8ビットモードなら ; こちらをアセンブルします。 .else ; 4ビットモードなら ; こちらをアセンブルします。 .endif 5. タイマー0 タイマー0のカウンタークロックは1usecです。 タイマー割込みは使用しません。 サブルーチンwait100uで使用します。 6. タイミングチャート △1 命令サイクルを1usecより早くする場合は、nop命令などを使用して各タイミングを を確保します。 6.1. 書込み RS=0でコマンドやLCD RAMアドレスの書込み、RS=1で表示データを書込みます。 ──┬────────┬──────┬────────┬─── RS ──┴────────┴──────┴────────┴─── ──┐ ┌──────┐ ┌─── RW ──┴────────┴──────┴────────┴─── │←→│tAS →││←tAH ┌────┐ ┌────┐ E ─────┘ └───────────┘ └─── │←──→│PWEH │←─→│tDSW →││←tH ──────┬────┬───────────┬────┬── DATA ──────┴────┴───────────┴────┴── │←───────────────→│tcycE tAS=140nsec(min)、tAH=10nsec(min)、PWEH=450nsec(min)、tDSW=195nsec(min) tH=10nsec(min)、tcycE=1000nsec(min) 6.2. 読出し RS=0でビジーフラグを読み出します。 ──┬────────┬──────┬─────────┬── RS ──┴────────┴──────┴─────────┴── ──┬────────┬──────┬─────────┬── RW ──┘ └──────┘ └── │←→│tAS →││←tAH ┌────┐ ┌────┐ E ─────┘ └───────────┘ └─── │←──→│PWEH │←→│tDDR →││←tDHR ────────┬──┬─────────────┬──┬── DATA ────────┴──┴─────────────┴──┴── │←──────────────→│tcycE tAS=140nsec(mini、tAH=10nsec(min)、PWEH=450nsec(min) tDDR=320nsec(max)、tDHR=20nsec(min)、tcycE=1000nsec(min) 7. プログラムのダウンロード ここをクリックして下さい。 ファイルはlzh形式で圧縮してあります。解凍してご利用下さい。 8. 実験回路 8ビットモード ATtiny2313 ┌────┐ │ │20 │ VDD├───────────────●───────●─ +5V │ │ │ │ │ │ │┴│100u/10V │ │ │ └┬┘ │ │ │10 │ │ │ GND├───────────────●─────●─── 0V │ │ │ │ │ │ DM1640 │ │ │ │ ┌─────┐ │ │ │ │8 4│ │1 │ │ │ PD4├─────┤RS VDD├─────────│─┘ │ │9 5│ │2 │ │ PD5├─────┤R/W VSS├─────────● │ │11 6│ │3 ┌───┐ │ │ PD6├─────┤E V0├───┤VR5KΩ├─┘ │ │ │ │ └───┘ │ │ │ │ │ │12 7│ │ │ PB0├─────┤DB0 │ │ │13 8│ │ │ PB1├─────┤DB1 │ │ │14 9│ │ │ PB2├─────┤DB2 │ │ │15 10│ │ │ PB3├─────┤DB3 │ │ │16 11│ │ │ PB4├─────┤DB4 │ │ │17 12│ │ │ PB5├─────┤DB5 │ │ │18 13│ │ │ PB6├─────┤DB6 │ │ │19 14│ │ │ PB7├─────┤DB7 │ │ │ │ │ │ │ └─────┘ └────┘ 4ビットモード ATtiny2313 ┌────┐ │ │20 │ VDD├───────────────●───────●─ +5V │ │ │ │ │ │ │┴│100u/10V │ │ │ └┬┘ │ │ │10 │ │ │ GND├───────────────●─────●─── 0V │ │ │ │ │ │ DM1640 │ │ │ │ ┌─────┐ │ │ │ │8 4│ │1 │ │ │ PD4├─────┤RS VDD├─────────│─┘ │ │9 5│ │2 │ │ PD5├─────┤R/W GND├─────────● │ │11 6│ │3 ┌───┐ │ │ PD6├─────┤E V0├───┤VR5KΩ├─┘ │ │ │ │ └───┘ │ │ │ │ │ │16 11│ │ │ PB4├─────┤DB4 │ │ │17 12│ │ │ PB5├─────┤DB5 │ │ │18 13│ │ │ PB6├─────┤DB6 │ │ │19 14│ │ │ PB7├─────┤DB7 │ │ │ │ │ │ │ └─────┘ └────┘ 9. 経過 2010.12.02(木) ドキュメント作成 2010.12.01(木) DBUS 4ビットモードプログラム作成、デバッグ。 2010.11.30(火) DBUS 8ビットモードプログラムデバッグ。 2010.11.29(火) DBUS 8ビットモードプログラム作成。

LessonAのTopへ
サイトのTopへ
法律条項 この資料により生じたいかなる障害や損害に対し、著者は全てを免責されるものとします。 この資料は、著作権法の下で保護され、入手先、著者、日付、法律条項を含んだ場合にのみ複製が可能です。
inserted by FC2 system