目次
ダウンロードと準備(glcdtest) 2008.3.8
ATMega168への変更(glcdtest) 2008.3.8
コマンドラインでのexamples全コンパイル 2008.3.9
examplesのサンプル(pulse)をAVRStudio4に変更してみる外部makefile不使用 2008.3.10
Procyon AVRlib というすばらしいAVR用のライブラリがあります。
いろんなソースファイルがあり、多種の機能があるライブラリです。グラフィック液晶(以降GLCD)のドライバーライブラリも含まれていて、まとまったライブラリとしては是非使ってみたいと思います。GPLライセンスで使用できるようなのでさっそく研究をはじめました。
Procyon AVRlib (zip file, 1.5MB, Sunday October 29, 2006 ) をダウンロードしてみました。最新バージョンのダウンロードページ インストール手順のページ ドキュメントのページ
↑英文の紹介ページでもあります。
インストール手順のページによれば、スペースなしのフォルダに入れろとあります。たぶん漢字もだめなので、解凍したものを次のフォルダにコピーしました。
C:\AVRlib
AVRStudio4でコンパイルする人は、AVRLIBの環境変数の設定が必須です。以下のように設定してください。コマンドラインでコンパイルする人は、ここでは設定しなくてもいいです。
環境変数は AVRLIB = C:\AVRlib としました。やり方は、WindowsXPのシステムのプロパティーにある、詳細設定タブの環境変数ボタンで環境変数画面を出し、ユーザーの環境変数にて新規ボタンでセットしました。

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

環境変数設定画面2 AVRLIBを新規で作成
コンパイルはAVRStudio4にておこないます。

C:\AVRlib\examplesフォルダにglcdtestというものがあるので、F:\AVR\proc\glcdtestという作業フォルダをつくり、そこのサンプルの以下のファイルをコピーしました。
gcldtest.c global.h ks0108conf.h makefile
glcdtestのフォルダ名は変えないほうがいいです。makeファイルで指定されていて変えるとelfファイルが見つからないと怒られます。変えたい場合はmakeファイルを修正すれば任意のフォルダにすることができるはずです。

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

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

一緒にコピーしたmakefileを指定してください。
Buildするとeepファイルのエラーがでますが、Build自体は成功しています。
eepはEEPROM用のファイルだと思われますが、使用するのかどうか後日調査します。
glcdtest.hexファイルは無事できました。 ヤッタ〜!!
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さんと違うので回路に合うように後日ソースに修正を加えたいとおもいます。
注意点は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