mbed
NXPのARMが乗っている。下回りを書かなくてもすぐ使えるようにオブジェクトされたコードがどっかに入っているのか、オンラインでbinaryにするときに組み入れられるのか、たぶん後者か。
freescale Kinetis
Freedomという開発基板をmbed化できるらしい。FRDM-KL25Z
LPC11U24リソース
- 回路図 ハード屋なんでこれが無いと始まらん
- LPC11U24データシート これも必要
USB
機能
RTC
どうも、RTC機能は無いらしい。mbed情報ページなどでは、普通に書かれているのだが、LPC11U24とLPC1768のどちらもで対応するのかどうかが書かれておらず、よくわからない。LPC1768を使っている分にはどっちでも良い話だが、安い方を買ったんで、これもしょうがないか。。。。
設定しても、12:00AMしか帰ってこない。
Digitalポート
ポートにはPullupとPulldownが選択できる。実はこれの機能を見つけるのに、ほぼ1日浪費した。ほんとうにわかりにくい。最初にざっと見たときに、先入観でARMマイコンにPullup内蔵なんて無いやろ(根拠ないです)という気持ちで読んだせいか、タクトSWをポートに接続する際、47KΩでPullupして接続した。で、Handbookにあるように、普通に(SWは4つ使って、押したSWでLEDを点灯させようと思った)
#include "mbed.h" BusOut myled(LED1,LED2,LED3,LED4); BusIn panelsw(p11,p12,p13,p14); int main() { while(1){ myled = panelsw; wait(0.2); } }
こんなのすぐ出来ると思ってたから、ここから長かった。LEDが点かないのよ。プログラムのせいか、ポートのせいか、オシロで見たら、DigitalInになっているポートだけ1Vぐらいの中間電位、押すと0Vにはなるという挙動だ。
あれ?Pulldownしてるの?だれが?。。。ポート変えてみたり、DigitalInのHandbook見ても書いてないから、そういう設定があると言う所まで行き着けなかった。結局、DigitalInのページのAPI Summeryの中にmbed - DigitalIn Class Referenceというのがリンクになっていて、そこにmodeというpropertyが存るように書いてあった。
DigitalIn sw1(p11); DigitalIn sw2(p12); DigitalIn sw3(p13); DigitalIn sw4(p14); int main() { sw1.mode(PullUp); sw2.mode(PullUp); sw3.mode(PullUp); sw4.mode(PullUp);
こんなの、普通にやってたら、わからないと思う。それとも何?おれがアホなだけなのか?
BusInではpropertyが使えないようなので、DigitalInでも宣言し、.mode で設定する。
SPI
SPIマスター機能、これは簡単にできた。下記はシフトレジスタ595で接続されたキャラクタLCDをspiで制御する例
LCDのDB0~7,E,RS、他を595を2個つないだ16bitシフトレジスタにデータを送って制御する。E信号もデータの中なのでデータを3回送る。
SPI spi(p5,p6,p7); DigitalOut solat(p8); int main() { spi.format(16,3); spi.frequency(100000);//100KHz ・・・・・ ・・・・・ ・・・・・ } void send_word(int data){ spi.write( data ); wait_us(1); solat = 0; wait_us(1); solat = 1; wait_us(1); } void send2cmd(char cmd){ int data; data = 0x0100 + cmd; send_word( data ); data = cmd; send_word( data ); data = 0x0100 + cmd; send_word( data ); wait_us(24); }
ところで、
アナログ入力
ちょっとよくわかってないのだが、どうも入力を0~1.0Vに正規化して返すらしい。
普通、Vref-Vss(Vin-GNDと共用する事が多い)の分解能(この場合10bit)の値を返すから、電圧=値×3.3/1024 を算出する事になるが、あらかじめ値を1024で除算してfloatで返すらしい。CPUパワーがあるのでこういう使い方をするとのことだが、、、
ARM使ってプログラムが肥大化するにはこういった処理が含まれるからなのかも知れないなぁ、と感じる。。。
あらかじめ、ハードで1.024倍しておくという使い方もあると思うが、、会社でもそうだが、何でもかんでもファーム。CPUはパフォーマンスを上げ続けるという構図ができあがっている。製品が作れないのはCPUパフォーマンスが足りないからだと、すぐ口にする。きにくわん。
もちろん、0~1で正規化されたfloatのほうが直感的だし使いやすい事は理解する。
AnalogIn LM61(p15); void main(){ float tempC; tempC = ((LM61*3.3)-0.600)*100.0*10;
p15をアナログ入力にして、LM61を増幅せずに繋いだ例。