アーカイブ
avr-gccのレジスタ操作で16進数とか使わない方法
最近出たこの本、すごくいい。
マイコンもATmega168で最新だし、gccでのコードが載っているのでよくわかる。
電波新聞社 (1982/01)
売り上げランキング: 23347
でもIOの操作で16進数とか使うのがあんまり好きじゃない。別にどう書いても動けばいいんだけど…
PORTB = 0×21;
とか。0×21、つまり10進数の33を代入しているので、PB5とPB0のピンを出力に設定しているという事だ。
でもこう書いたほうが好きだな。
PORTB = _BV(PB5)|_BV(PB0);
それかアセンブラ風にこういうのも好き。
sbi(PORTB,PB5);
sbi(PORTB,PB0);
こういう書き方の方が16進数慣れてない人には見やすい。ピン配置とプログラムをある程度柔軟に変えやすいのが近代的。(PB0からPB3に変えるのも、エディタの置換で一発だ)
どうなってるのかというと……
トランジスタでUARTを分岐させる
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){
char sb[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;
return sb;
}
mainからはこう呼ぶ
char color[3] = {0xFF, 0xFF, 0xFF}; // RGB
char *sb;
sb = colorToSb(color); // msb,lsb取得
// msb = sb[0], lsb = sb[1]
RGBで分けて書けて良い感じ。(明日実機で試す)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ぐらいの間で変わる。これは重力加速度を検出しているということ
ATmega168でUSART受信割り込み、シリアルエコー
mega168でUART受信割り込みできた。
回路はmega8の時と同じ。
さっきできなかった理由は割り込みベクタ名が間違ってた為だった。
コンパイル結果をよく見ると SIGNAL(SIG_UART_RECV)の所でwarningが出ていたので、avr-gccのフォルダの中のコードをよく読んだらSIG_USART_RECVになっていた。
コンパイラのバージョンというわけではなく、ATmega8のコードではSIG_UART_RECVで通るのでATmega168以降はSIG_USART_RECVに変わったみたいだ。
あとavr/signal.hは廃止されてavr/interrupt.hに統合される模様。
■関連記事
s.h.log: AVR – MEGA8のUART送受信
s.h.log: AVR – ATMega8でUSARTエコー




最近のコメント