0

Mac OSXにおける近代的なAVRマイコン開発環境

久しぶりにAtmel AVRマイコンを直に使うプロジェクトをやるので、環境を整えてみた。@rain_yukizoraと@qt_fbが色々教えてくれた。



これが最強の組み合わせだ!!


この記事では、MacでのAVRマイコン開発環境の構築と、ATMega168pでLEDを1秒間隔で点滅させるプログラムを作成して、マイコンに書き込んで動作させる所までを解説します。


Macbook Air + usbasp + ATMega168pで開発しているところ
AVR and Mac



■Cross Pack for AVRをインストールする
CrossPack – A Development Environment for Atmel’s AVR Microcontrollers
ここからダウンロードしてインストールする。
普通は /usr/local/CrossPack-AVR にインストールされるはず。


■usbaspを買う
aitendoで売ってるusbaspを買う。
これはMacからAVRマイコンに書き込みをする機械(writer)で、USBで動作するライターの中で最も安いし対応デバイスも多いのでオススメ。
朝買ってすぐ銀行に振りこんだら昼には発送されてた。


■XCodeをインストールする
次の項目のmacportsのインストールのために、XCodeが必要なのでインストールする。
Developer Downloads & ADC Program Assets

有料のXCode4が最新だけど、無料の3系でも良い。


■Macportsをインストールする
macports.orgからダウンロードしてインストールする。


■macportsとCross Pack for AVRのPATHを通す
$HOME/.profile を開く(無ければ作る)

これを下の方に書く
export PATH=$PATH:/opt/local/bin
export PATH=$PATH:/usr/local/CrossPack-AVR/bin

新しいterminalを開いて、PATHがセットされているか確かめる。
echo $PATH


■macportsでavrdudeをインストールする
Cross Pack for AVRに入っているavrdudeはUSBで使えないので、USBで使えるavrdudeを作る。
sudo port install git-core libusb avrdude
which avrdude

/opt/local/bin/avrdude が出てくればok。Cross Packの方が出てきたら、前のPATHの設定の順序が間違っている。

(homebrewでもavrdudeがインストールできるが、libusbを先にインストールしていても使えない。よくわからない。)


■avrdude.confにATMega168pのデバイス設定を追加する
ATMega168pを使う人だけ。168や328pを使うなら必要ない。
https://github.com/shokai/atmel-avrgcc-studyからavrdude.confをダウンロードしてきて、 /opt/local/share/avrdude.confと入れ替える。

git clone git://github.com/shokai/atmel-avrgcc-study.git
sudo cp /opt/local/etc/avrdude.conf /opt/local/etc/avrdude.conf.bak
sudo cp atmel-avrgcc-study/avrdude.conf /opt/local/etc/avrdude.conf

このavrdude.confはmacportsでインストールしたavrdude.confに、Kimio Kosakaさんが作ったavrdude.confにあったatmega168pの設定を追加した物です。




これで環境は整ったので、プログラムを書く。
俺が作ったプログラムは https://github.com/shokai/atmel-avrgcc-study/tree/master/28pin/led_blinkにある。これをそのまま書きこんで動かしても良いと思う

■avr-gccプロジェクトを作る
LEDを点滅させるプロジェクトを作る
avr-project led_blink
cd led_blink/firmware
make
xcode用のファイルも生成されるが、xcodeを使っても全く意味が無いので無視する。

プロジェクトをそのままいきなりコンパイルして、バイナリ(.hexファイル)が作れるか確かめる。



■ATMega168pで回路を組む

写真を見て回路を組む。
左の2つのLED(PB0, PD7)が交互に1秒ごとに点滅する。右のLED(PB1)はスイッチ(PB2)を押している間だけ点灯する。
R0015973R0015976


ATMega168pのピン配置はこれ。VCC(AVCC)とGNDを接続する。
atmega168 pin assign


usbaspのケーブルの穴側から見たピン配置はこうなっている。
RESET,MISO,MOSI,SCKをAVRライターと接続する。VCCとGNDは回路のそれぞれと接続する。
R0015977



■Makefileを修正する
修正する箇所はDEVICE,CLOCK,PROGRAMMER,FUSESの4つ。
DEVICE     = atmega168p
CLOCK = 8000000
PROGRAMMER = -c usbasp
FUSES = -U hfuse:w:0b11011111:m -U lfuse:w:0b11100010:m
ATMega168の時はDEVICE = atmega168にする。

ここに完成品がある https://github.com/shokai/atmel-avrgcc-study/blob/master/28pin/led_blink/Makefile

fusebitの設定については橋本商会 » ATmega168のクロックを内蔵8Mhzに切り替えるに書いた。



■プログラムを書く
main.c を書く
#include <avr/io.h>
#include <util/delay.h>

#define TRUE 1
#define FALSE 0
#define NULL '\0'
#define sbi(BYTE,BIT) BYTE|=_BV(BIT)
#define cbi(BYTE,BIT) BYTE&=~_BV(BIT)

#define LED0_ON() sbi(PORTB, PB0)
#define LED0_OFF() cbi(PORTB, PB0)
#define LED1_ON() sbi(PORTD, PD7)
#define LED1_OFF() cbi(PORTD, PD7)
#define LED2_ON() sbi(PORTB, PB1)
#define LED2_OFF() cbi(PORTB, PB1)

void check_sw(void){
if(PINB&_BV(PB2)) LED2_ON();
else LED2_OFF();
}


int main(void)
{
DDRB = 0b00000011;
DDRD = 0b10000000;
LED2_ON();
for(;;){
LED0_ON();
LED1_OFF();
check_sw();
_delay_ms(1000);
LED0_OFF();
LED1_ON();
check_sw();
_delay_ms(1000);
}
return 0;
}

出力方向レジスタを指定する時は0bで2進数で書くと楽。
LED点滅の1秒(1000ミリ秒)のdelayはutil/delay.hを使った。



■コンパイルする
make
エラーがあるか確かめられる。



■ヒューズビットを書きこむ
Makefileで指定した、内蔵クロック8MHz駆動のfusebitを書きこむ。
make fuse
この操作は1回で良い。



■プログラムを書き込む
make flash
usbaspが書きこんでくれる。
avrdudeがSCKを使えていないというメッセージが出るが、書き込める。

usbaspが電源も供給してくれるので、回路にACアダプタや電池などの他の電源は接続してはならない。
usbaspの電源供給は基板上のjumper pinを抜けばOFFにできる。


これでAVRマイコンをMacで開発できる環境が整った。

0

avr-gccのレジスタ操作で16進数とか使わない方法

最近出たこの本、すごくいい。

マイコンもATmega168で最新だし、gccでのコードが載っているのでよくわかる。

AVRマイコン活用ブック—オリジナル電子ゲーム&ロボット製作
松原 拓也
電波新聞社 (1982/01)
売り上げランキング: 23347

でもIOの操作で16進数とか使うのがあんまり好きじゃない。別にどう書いても動けばいいんだけど…

PORTB = 0x21;

とか。0x21、つまり10進数の33を代入しているので、PB5とPB0のピンを出力に設定しているという事だ。

でもこう書いたほうが好きだな。

PORTB = _BV(PB5)|_BV(PB0);

それかアセンブラ風にこういうのも好き。

sbi(PORTB,PB5);
sbi(PORTB,PB0);

こういう書き方の方が16進数慣れてない人には見やすい。ピン配置とプログラムをある程度柔軟に変えやすいのが近代的。(PB0からPB3に変えるのも、エディタの置換で一発だ)

どうなってるのかというと……

Read more

0

トランジスタでUARTを分岐させる

普段使う20ピンや28ピンのAVRには、UARTピンが1組しかない。64ピンとかになれば2組とか付いているけど。

んで昨日からDontronicsのUARTかUSBで制御できる小型LCDをいじっているんだけど、いつもシリアル通信でデバッグしているのに、UARTがLCDに占有されているせいでデバッグができない。

仕方ないので、信号用のトランジスタ2SC1815と10kΩの抵抗を使って、UARTセレクタ(分岐させる回路)を作った。

usart selectorusart selector

Read more

0

Dontronics uLCD128のカラーコード変換

Micro-LCD 届いたので使ってみた。 (hatayanlog)
Dontronics :: 4d-Micro-LCD Old
畑山さんにもらったDontronicsの小型LCDを動かしてみた。シリアル通信で液晶画面を制御できる。
uLCDの仕様では、色をrrrrrggggggbbbbbの計16bit(2byte)で赤緑青を表すようになっているので、2byteをmsb,lsbというそれぞれ1byteのデータに分け、シリアル通信で別々に送らなければならない。
緑が丁度真ん中で割られてしまう。しかもなぜか緑だけ6byte。
んでカラーコードの扱いが面倒臭かったので変換するコードを書いた(まだ試してない)
試した。やっぱりちょっと間違っていた。
変換用関数(avr-gcc)

char*colorToSb(char*color){
charsb[2];
//msb
sb[0]=(color[0]&0b11111)<<3//RED
+(color[1]&0b111000)>>3;//GREEN-A
//lsb
sb[1]=(color[1]&0b111)<<3//GREEN-B
+(color[2]&0b11111);//BLUE;
returnsb;
}
mainからはこう呼ぶ
charcolor[3]={0xFF,0xFF,0xFF};//RGB
char*sb;
sb=colorToSb(color);//msb,lsb取得
//msb=sb[0],lsb=sb[1]
RGBで分けて書けて良い感じ。(明日実機で試す)

0

3軸加速度センサ KXM52を使って傾斜を測定

半年前にACA302という加速度センサを試したが、秋月電子で手に入らなくなった(取り扱い品がACA302からACB302になった)ので、樹に薦められたKXM52-1050モジュールを試してみた。

ACA302は3.3Vを作らなければならなかったが、KXM52の動作電圧は2.7~5.5Vそのままで動くし、ノイズも全然無いのにACB302より200円安く、感度も6倍でいい感じ。Pileus2号機に採用する予定。

そういえば最近ACB302は2000円から1000円に値下げになったけどね

■とりあえず動かしてみた

SourceCode, hex, Makefile(avr-gcc 3.4.6)

ATmega168のADC0,1,2でX,Y,Z軸の出力値をAD変換し、文字列に変換してUARTでPCに送っている。



x,y軸の値は通常520ぐらいで、傾けると730~300ぐらいの間で変わる。これは重力加速度を検出しているということ

Read more