2009年12月アーカイブ

点を打つpset()関数の製作(バグあり版)

 画面へのパターン表示ができたので,次はpset()関数で点を打つ実験.

 int pset(x,y); でx=0~71,y=0~31の範囲で点を打ちます.点を打つといっても結局はアドレスを計算してそこにデータを書き込むだけです.

 アドレスの計算式ですが,座標(0,0)のアドレスが0x80000で,xが1増えるごとにアドレスが1増える.面倒なのがyの計算で,yが8増えるごとに0x100増えます.先日のVRAMのアドレスの項参照のこと.ということで計算式は,

      p = vram+(y/8)*0x100+x;

になります.ここに書き込むデータですが,y座標=0,8,16,24のときは0x01,y座標=1,9,17,25のときは0x02となります下記図参照.

■ ビット0 0x01を書き込むとこうなる.






□ ビット7
 

□ ビット0
■  0x02を書き込むとこうなる





□ ビット7
 

 ということでシフト演算子を使って,

   unsigned char data=1;
    data <<=(y % 8);    // 書き込むデータ

となります.ということで関数は以下の通り.

int pset(int x, int y){
const unsigned char *vram=0x80000;
unsigned char *p;
unsigned char data=1;

//範囲チェック
if ((x>72)||(y>32)){
return (-1); //以上終了
}
p = vram+(y/8)*0x100+x; //アドレスの計算
data <<=(y % 8); // 書き込むデータ
*p = data;

return (0); //正常終了
}
 

 入力値xとyの範囲チェックもちゃんとやってます.意外と重要.これを以下のように呼び出します.

for (i=0; i<32; i++){
pset(i,i);
}
 

 するとこんな感じ.

 斜め線です.右下のゴミは液晶のゴミです(余った基板使ってるので…).

 ところでバグあり版って何? 続く.

 

Amazonマーケットプレイスで本誌がすごい値段に

 Interface本誌の方が校了したので更新します.

 一時期Amazonのマーケットプレイスで『すぐに使える!液晶搭載マイコン・モジュール』(www.amazon.co.jp/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%82%A4%E3%82%B9%E5%A2%97%E5%88%8A-%E3%81%99%E3%81%90%E3%81%AB%E4%BD%BF%E3%81%88%E3%82%8B-%E6%B6%B2%E6%99%B6%E6%90%AD%E8%BC%89%E3%83%9E%E3%82%A4%E3%82%B3%E3%83%B3%E3%83%BB%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB-2010%E5%B9%B4-01%E6%9C%88%E5%8F%B7/dp/B002WD9ZEK/ref=sr_1_1)が5,000円を超えていましたが,今見たら少し安くなっていますね.

 在庫のあるうちにお買い求めください.ちなみに先週金曜日の時点で有隣堂秋葉原ヨドバシ店には3冊残っていました.

 

VRAMへのアクセスをプログラムで書くと

 こんな感じですね.

    //$00~順に書く
    for (i = 0; i < 72; i++) {
        ((unsigned char *)0x80000)[i] = i;
    }
    for (i = 0; i < 72; i++) {
        ((unsigned char *)0x80100)[i] = 256-i;
    }
    for (i = 0; i < 72; i++) {
        ((unsigned char *)0x80200)[i] = i;
    }
    for (i = 0; i < 72; i++) {
        ((unsigned char *)0x80300)[i] = 256-i;
    }

    for(i = 0; i < LOOP_NUM; i++);
    clearLine(0);
    clearLine(1);
    clearLine(2);
    clearLine(3);

    //文字Aのビット・パターン
    *(unsigned char *)0x80000 = 0x7e;
    *(unsigned char *)0x80001 = 0x09;
    *(unsigned char *)0x80002 = 0x09;
    *(unsigned char *)0x80003 = 0x09;
    *(unsigned char *)0x80004 = 0x7e;

    for(i = 0; i < LOOP_NUM; i++);
    clearLine(0);
    clearLine(1);
    clearLine(2);
    clearLine(3);

 MovableTypeでソースが綺麗に貼れるかテスト.

 「画面に文字や絵を描く」=VRAMへの書き込むというのは単純でいいですね.結局,書き込むメモリ(VRAM)のアドレスを指定してデータを書き込むというCPUの基本機能で液晶画面も制御できるということが分かります.最近のパソコンではVRAMへの直接アクセスができず,ライブラリから描画コマンドを投げるだけということが多く,その先で何をやっているのかが目で見えませんが,このマイコンのように素朴な構成だと描画の様子が目で見えます.実はパソコンの描画ライブラリも,CPUからGPUへコマンドを発行して,GPUにつながっているVRAMへ書き込むというプログラムがどこかに書かれているのですが(ただしそのVRAMへの書き込みプログラムはnVIDIAとかのGPUメーカの人にしか見えないので,一般人はアクセス不可).

 

S1C17702の表示RAM(VRAM)の構造

 今回の基板で用いたS1C17702の表示RAM(以降Video RAM:VRAM)はこのような感じです.

unsigned char
1行目0x80000~0x80047 (72バイト)
2行目0x80100~0x80147
3行目0x80200~0x80247
4行目0x80300~0x80347

0x80000         0x80047
+------------------------+
|            |
|            |
|            |
|            |
+------------------------+
0x80300         0x80347

 一番上がビット0~一番下がビット7
■ ビット0






□ ビット7
 

 ちょっと表示がガタガタですが,こんな感じです.たとえば,下記のように文字「A」の形で左上に表示したい場合,

□■■■□
■□□□■
■□□□■
■■■■■
■□□□■
■□□□■
■□□□■
□□□□□
 

0x80000から0x7e,0x09,0x09,0x09,0x7eを書き込むことになります.


  こんな感じです.続く.

 

自力で液晶に描画($00~$ffまでループ)

 よし出来た.解説は後ほど.

Eclipseプロジェクトのコピー(C言語の場合)

 ET展示用にLCD_Testを改造していたわけですが,これ以上改造するなら別のプロジェクトにしよう,ということでプロジェクト名をLCD_TestからLCD_TestEtに変更しようとしました.元のLCD_Testは残しておきたいので,プロジェクトをコピーして名前を変更します.

 そこでディレクトリLCD_TestをLCD_TestEtという名前でいったんデスクトップに丸ごとコピーしてFile→Importしようとしたら,「Some projects were hidden because they exist in the workspace directory」と言われて拒絶された.むむむ,ディレクトリ名を変えただけでは同じプロジェクトと認識されてインポートできないのか.

 Eclipseのプロジェクトのコピー方法をWebで検索してみても,どれもJavaの記事なのでいまいち参考にならない.ということでテキスト・エディタでファイルを眺めていたところ,ファイル.projectでプロジェクト名を指定している「<projectDescription> <name>LCD_Test</name>」という記述を発見.これをLCD_TestEtに書き換えたところ,無事にインポートできました.

 で,無事にビルドできたと思って書き込もうとRun→Externel Tools→Externel Tools Configurationとしたところ,Externel Tools ConfigurationsウィンドウにC17 Debbuger Launch for LCD_Testしか出てこない.Etの方はどうしたのか.ディレクトリを眺めていたところ,拡張子.launchのファイルC17 Debbuger Launch for LCD_Test.launchを~LCD_TestEt.launchにリネームしたところConfigurationsウィンドウに出てきた.このファイルの中にワークスペースの場所を指定している箇所workspace_loc:/LCD_Testというところがあったので,これもEtを加える.この作業をしないとデバッグ時にコピー前のファイルが参照されてハマります.

 以上の変更で無事新しいプロジェクトでのビルド&実行ができました.

<結論>

 Eclipseプロジェクトのコピーをするには,

  1. .projectの編集
  2. <プロジェクト名>.launchを<新プロジェクト名>.launchにリネーム
  3. <新プロジェクト名>.launchを編集

が必要.

このアーカイブについて

このページには、2009年12月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2009年11月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。