HOME

Procyon AVRlib と GLCD12864 (KS0108ドライバー)の研究     2008.3.7

目次

ダウンロードと準備(glcdtest)  2008.3.8

ATMega168への変更(glcdtest)  2008.3.8

コマンドラインでのexamples全コンパイル  2008.3.9

examplesのサンプル(pulse)をAVRStudio4に変更してみる外部makefile不使用  2008.3.10

 

 

 

★ ダウンロードと準備 (glcdtest) ★

Procyon AVRlib というすばらしいAVR用のライブラリがあります。

いろんなソースファイルがあり、多種の機能があるライブラリです。グラフィック液晶(以降GLCD)のドライバーライブラリも含まれていて、まとまったライブラリとしては是非使ってみたいと思います。GPLライセンスで使用できるようなのでさっそく研究をはじめました。

Procyon AVRlib (zip file, 1.5MB, Sunday October 29, 2006 ) をダウンロードしてみました。

最新バージョンのダウンロードページ   インストール手順のページ   ドキュメントのページ

   ↑英文の紹介ページでもあります。

インストール手順のページによれば、スペースなしのフォルダに入れろとあります。たぶん漢字もだめなので、解凍したものを次のフォルダにコピーしました。

C:\AVRlib

AVRStudio4でコンパイルする人は、AVRLIBの環境変数の設定が必須です。以下のように設定してください。コマンドラインでコンパイルする人は、ここでは設定しなくてもいいです。

環境変数は  AVRLIB = C:\AVRlib  としました。やり方は、WindowsXPのシステムのプロパティーにある、詳細設定タブの環境変数ボタンで環境変数画面を出し、ユーザーの環境変数にて新規ボタンでセットしました。

img1.gif

環境変数設定画面1  AVRLIBを新規で作成

全ユーザーが同じ環境変数を使用するなら、システム環境変数に入れたほうがいいかもしれません。ユーザーが一人ならどちらでもいいです。どちらか1つに設定しておいてください。

img1.gif

環境変数設定画面2  AVRLIBを新規で作成

コンパイルはAVRStudio4にておこないます。

img2.gif

C:\AVRlib\examplesフォルダにglcdtestというものがあるので、F:\AVR\proc\glcdtestという作業フォルダをつくり、そこのサンプルの以下のファイルをコピーしました。

gcldtest.c     global.h     ks0108conf.h     makefile

glcdtestのフォルダ名は変えないほうがいいです。makeファイルで指定されていて変えるとelfファイルが見つからないと怒られます。変えたい場合はmakeファイルを修正すれば任意のフォルダにすることができるはずです。

 

img3.gif

サンプルはATMega163用なのでとりあえず、そのまま設定します。

 

img4.gif

3つのファイルをそれぞれAddします。Soruce FIlesとHeader Filesにて右クリックするとAddできます。

 

img5.gif

一緒にコピーしたmakefileを指定してください。

 

Buildするとeepファイルのエラーがでますが、Build自体は成功しています。

eepはEEPROM用のファイルだと思われますが、使用するのかどうか後日調査します。

 

glcdtest.hexファイルは無事できました。 ヤッタ〜!! 

 

★ ATMega168への変更(glcdtest) ★

Makefileの以下を変更しました

#put the name of the target mcu here (at90s8515, at90s8535, attiny22, atmega603 etc.)

        MCU = atmega168    ATMea168の設定

 

 

 

 #put your C sourcefiles here

#  Here you must list any C source files which are used by your target file.

#  They will be compiled in the order you list them, so it's probably best

#  to list $(TRG).c, your top-level target file, last.

 

        SRC = $(AVRLIB)/buffer.c $(AVRLIB)/uart.c $(AVRLIB)/rprintf.c $(AVRLIB)/timerx8.c $(AVRLIB)/a2d.c $(AVRLIB)/glcd.c $(AVRLIB)/ks0108.c $(TRG).c   ソースファイルのtimer8.cをtimerx8.cに変更します。

 

###### dependecies, add any dependencies you need here ###################

#  Dependencies tell the compiler which files in your code depend on which

#  other files.  When you change a piece of code, the dependencies allow

#  the compiler to intelligently figure out which files are affected and

#  need to be recompiled.  You should only list the dependencies of *.o

#  files.  For example: uart.o is the compiled output of uart.c and uart.h

#  and therefore, uart.o "depends" on uart.c and uart.h.  But the code in

#  uart.c also uses information from global.h, so that file should be listed

#  in the dependecies too.  That way, if you alter global.h, uart.o will be

#  recompiled to take into account the changes.

 

buffer.o                : buffer.c              buffer.h

uart.o          : uart.c                        uart.h          global.h

uart2.o         : uart2.c               uart2.h         global.h

rprintf.o       : rprintf.c             rprintf.h

a2d.o                   : a2d.c                 a2d.h

timerx8.o               : timerx8.c             timerx8.h               global.h

 

timerをtimerx8に変更してください。timerx8はATMegaxx8用だそうです。

 

ks0108conf.hのピンアサインの変更をしました

#ifdef GLCD_PORT_INTERFACE

        // make sure these parameters are not already defined elsewhere

        #ifndef GLCD_CTRL_PORT

                #define GLCD_CTRL_PORT  PORTB   // PORT for LCD control signals

                #define GLCD_CTRL_DDR   DDRB    // DDR register of LCD_CTRL_PORT

                #define GLCD_CTRL_RS    PB3             // pin for LCD Register Select

                #define GLCD_CTRL_RW    PB4             // pin for LCD Read/Write

                #define GLCD_CTRL_E             PB5             // pin for LCD Enable

                #define GLCD_CTRL_CS0   PB0             // pin for LCD Controller 0 Chip Select

                #define GLCD_CTRL_CS1   PB1             // pin for LCD Controller 1 Chip Select(*)

                #define GLCD_CTRL_CS2   PB6             // pin for LCD Controller 2 Chip Select(*)

                #define GLCD_CTRL_CS3   PB7             // pin for LCD Controller 3 Chip Select(*)

                #define GLCD_CTRL_RESET PB2             // pin for LCD Reset

                // (*) NOTE: additonal controller chip selects are optional and

                // will be automatically used per each step in 64 pixels of display size

                // Example: Display with 128 hozizontal pixels uses 2 controllers

        #endif

        #ifndef GLCD_DATA_PORT

                #define GLCD_DATA_PORT  PORTD   // PORT for LCD data signals

                #define GLCD_DATA_DDR   DDRD    // DDR register of LCD_DATA_PORT

                #define GLCD_DATA_PIN   PIND    // PIN register of LCD_DATA_PORT

        #endif

#endif

 

glcdtest.cの以下を変更しました

int main (void)

{

        // initialize

        uartInit();

        timerInit();

        a2dInit();

        glcdInit();

        outb(DDRC, 0x00);   とりあえずポートAからポートCへ変更、最終的にはポートDを予定

 

 

void lcdtest(void)

{

    ・

    ・

    ・

        while(1)

        {

                timerPause(10);

                key = ~inb(PINC);  とりあえずポートAからポートCへ変更、最終的にはポートDを予定

 

シミュレーションのAVRもATMega168に変更してください。

DebugメニューのSelect Platform and Deviceから変更できます。

 

以上で最初に一度だけ、BuildメニュからCleanします。

Cleanしないと、ATMega163のものが残っているためです。

ビルドします。あいかわらずeepのエラーはありますが、Buildは成功しました。

なお、ピンアサインはO-Familyさんのオシロの回路を参考にさせていただきました。

KEY入力のところが、O-Familyさんと違うので回路に合うように後日ソースに修正を加えたいとおもいます。

 

★ コマンドラインでのexamples全コンパイル ★

注意点はWinAVRは20060125バージョンです。古いWinAVRでないとeepのエラーがでます。

いくつもGCCを入れている人は、以下の方法は有効です。AVRバージョン選択にも応用できます。

それでは環境変数を以下のように設定してからコマンドラインでmakeすることにします。

AVR=C:\WinAVR-20060125

AVRLIB=C:\AVRlib

あとpathもC:\WinAVR-20060125\bin;C:\WinAVR-20060125\utils\bin;に設定しました。

 WinAVRはC:\WinAVR-2006012ディレクトリにあるとして説明しています。C:\WinAVR等のディレクトリにある場合は、読み替えてください。

環境変数を設定するバッチファイルを用意しました。解凍してmkenv.batをC:\AVRlib\examplesにコピーしておくと便利です。mkenv.batの内容は以下のものです。

  set AVR=C:\WinAVR-20060125    WinAVRのインストールディレクトリ

  set AVRLIB=C:\AVRlib         AVRlibのインストールディレクトリ

  set Path=%AVR%\bin;%AVR%\utils\bin;%Path%    この行は変更しないでください

avrlib_mkenv.zip   2008.3.9

DOSコマンドプロンプトの作業フォルダをC:\AVRlib\examplesにしてからDOSコマンドプロンプトを開き、コマンドラインでmkenvとしてください。

AVRLibのexamplesのディレクトリでmake cleanを一度おこないます。次にmake allします。

うまくいって最後のディレクトリまでコンパイル・リンクできました。 ヤッタ〜!! 

 

  余談ですがavrlibのmakeディレクトリにあるavrproj_make_origは使用できません。avrproj_makeを使用してください。(avrproj_make_origはAVR-GCC用とあったので、avrproj_makにリネームして使用しましたがどうも内容が古いようでexamplesがコンパイルできません)

 

★ examplesのpulseサンプルをAVRStudio4に変更してみる外部makefile不使用 ★

AVRStudio4では外部makefileを使用するとエラーがあったときに、エラー表示をダブルクリックしてもタグジャンプすることができないようです。そこで、外部makefileではなく、最初からプロジェクトを作ってタグジャンプできるようにしました。

必要なのは、次の手順です。

1)examplesのpulseフォルダにある拡張子dswとdsp以外の全ファイルをあらかじめ準備したフォルダにコピーします。準備したフォルダはAVRStudio4でプロジェクトフォルダにします。

2)examplesのpulseフォルダにあるmakefileをみて、SRCとAVRLIB_SRCのソースファイルをC:\AVRlibからプロジェクトフォルダにコピーします。

以下の行はmakefileファイルの記述

        SRC = $(AVRLIB)/buffer.c $(AVRLIB)/uart.c $(AVRLIB)/rprintf.c $(AVRLIB)/timer.c $(AVRLIB)/pulse.c $(TRG).c

これから、buffer.c  uart.c  rprintf.c  timer.c  pulse.c  をコピーすればよいことがわかります。

ただし、上記はATMega163用で、今回ATMega168にしたいのでtimer.cではなく、timerx8.cをコピーします。timerx8.cはATMegaxx8用のタイマーソースです。

 

3)AVRStudio4の準備

Project nameをpulseとし、Locationに準備したプロジェクトフォルダF:\AVR\proc\pulseを選択します。Create initial file とCreate folderはチェックしません。

 

4)ソースファイルの選択

Source、Hederにてマウス右クリックで、上記のファイルをプロジェクトフォルダからAddします。ここでは、C:\AVRlibにあるファイルを選択してはなりません。注意してください。場合によりC:\AVRlibにある関連インクルードファイルもプロジェクトフォルダにコピーしてくる必要もでてくるかもしれませんが、今回はとりあえずCソースファイルだけをコピーしています。

 

5)Project Optionの設定

Device と Frequencyを設定します。 外部makefileは必要ありません。

 

6)インクルードPATHの設定

.\ と C:\AVRlibと C:\AVRlib\conf を設定してください。

.\はプロジェクトフォルダです。必ず先頭に持ってきてください。

 

7)ATMega168用にソース修正1

クロックがglobal.hで設定されているのですが、これをAVRStudio4のProject Optionで設定するので、これをコメントにします。

//クロックはAVRStudioのProjectOptionから設定してください byすん

//#define F_CPU        16000000                         // 16MHz processor

//#define F_CPU        14745000                         // 14.745MHz processor

//#define F_CPU        8000000                          // 8MHz processor

//#define F_CPU        7372800                          // 7.37MHz processor

//#define F_CPU        4000000                          // 4MHz processor

//#define F_CPU        3686400                          // 3.69MHz processor

 

8)ATMega168用にソース修正2

パルス出力ピンがOC1AとOC1BですがATMega163のピン番号から、ATmega168用にPB1(15ピン),PB2(16ピン)に変更しました。外部カウンターやオシロにこの15,16ピンを繋いで観測してください。

pulse.c

void pulseTest(void)

{

        u16 i;

 

        // print a little intro message so we know things are working

        rprintf("\r\nWelcome to the pulse library test program!\r\n");

 

        // set pulse pins as output

        // ** these are the correct pins for most processors, but not all **

        sbi(DDRB, 1);//OC1A

        sbi(DDRB, 2);//OC1B

 

9)ATMega168用にソース修正3

pulse.cではATMega163を想定しているので、TIMSKレジスタになっています。これをTIMSK1に直します。さっそくタグジャンプを試してみます。

では念のため最初に一度Build CleanしてからBuildします。TIMSKのところで未定義のエラーが数箇所でてきます。これをダブルクリックしてエラー行にジャンプしましす。

TIMSKをTIMSK1に変更してください。

 

もしくはTIMSKをそのままにして、#define  TIMSK  TIMSK1とpulse.cの最初に入れてもOKです。これで、TIMSKはTIMSK1にコンパイラが読み替えてくれます。

 

とくにエラーもワーニングもなくなれば成功です。 ヤッタ〜!! 

ATMega168用examplesのpulseプログラム AVRlib_pulse080311.zip    2008.03.11

 

inserted by FC2 system