トラ技ARMライタ、初通電
2014年3月号付録の「トラ技ARMライタ」基板、初通電しました。
半年ほったらかししてました。
で、10月号がたまたまmbedの特集。
これを見ながらmbed環境でLチカでっす。
本に書いてあるとおりにしたらうまいこといきました。
で、ここからが実験。48MHzの動作クロックとのこと。
どのくらいのI/O速度(ポートのon/off)で動くかちょい
確認です。
「Lチカ」のサンプルプログラムを改造。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
#include "mbed.h"
DigitalOut myled1(LED1); // PIO0_20
DigitalOut myled2(LED2); // PIO0_21 (1)
int main() {
while(1) {
myled1 = 1;
myled2 = 0; (1)
// wait(0.2); (2)
myled1 = 0;
myled2 = 1; (1)
// wait(0.2); (2)
}
}
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
(1) LEDをもう一つ追加
(2) 0.2秒の時間待ちを無くす
これで2つのLEDをフルスピードで点滅します。
目じゃ見えないなのでオシロで観測したのがこれ。
(クリックで拡大↓)
簡単に出力をon/offできる関数が用意されているんですが、
こねくり回すのでどうしても遅くなります。
HあるいはLにするのに0.5uSくらいかな。
直接I/Oポートレジスタに書き込むと、どのくらいの時間に
なるのかをテスト。
GPIOポート・バイト・ピン・レジスタに1、0を書きます。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
while(1) {
myled1 = 1; // LED1
LPC_GPIO->B[21] = 1; // LED2
LPC_GPIO->B[21] = 0;
myled1 = 0;
}
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
「21」というのがLED2に割り当てられたポート番号です。
デジタル出力機能でLED1出力をHにした後、ダイレクトに
レジスタを操作します。
すると、こんなパルス(クリックで拡大↓)
48MHzクロックで動いているので、2サイクルでポートが
反応しています。
さらに試しに、ポート・ピン・レジスタに対する
「ORとAND」でon/off出力してみました。
読み出しが増えるので時間がちょい増えます。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
while(1) {
myled1 = 1;
LPC_GPIO->B[21] = 1;
LPC_GPIO->B[21] = 0;
LPC_GPIO->PIN[0] |= (1 << 21); // on
LPC_GPIO->PIN[0] &= ~(1 << 21); // off
myled1 = 0;
}
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
その時間。 (クリックで拡大↓)
波形にリンギングが出たのは、オシロのX軸入力帯域制限を
無くしたから。
写真のようにクリップで端子をつかんでリードを伸ばしているので、
反射が見えます。
さてもう一つ。
連続してパルスを出すとどうなるかという実験。
32ビット(16発)のパルスを出力します。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
uint32_t d = 0xaaaaaaaa;
uint32_t mask;
:
myled1 = 0;
mask = 0x80000000;
while(mask){
if(d & mask) LPC_GPIO->B[21] = 1;
else LPC_GPIO->B[21] = 0;
mask >>= 1;
}
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
「d」をMSBから順に出力しています。
この結果 (クリックで拡大↓)
11uSで32ビットを出力。
これでだいたいの出力速度の感じがつかめました。
※関連
Arduino UNOですが、トラ技に書いた記事、
2013年3月号から抜粋しておきます。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
※AVRマイコン本来のI/O速度を引き出すには
Arduinoの出力信号制御ではピン番号を指定したdigitalWrite()を使います。
ところがこの関数の処理速度が遅く、Hレベルのパルスを出して下げるだけで
4μsほどかかってしまいます。
そこでこのライブラリです。本来のビットI/O速度が出ます。
#include <compat/deprecated.h> あるいは"wiring_private.h"
sbi(PORTB,PORTB5); // 高速パルス出力
cbi(PORTB,PORTB5);
こんな記述で、アセンブラの
__asm__ ("sbi 0x05, 5");
__asm__ ("cbi 0x05, 5");
と、同じコード(最高速)をひねり出してくれます。
これで、125nsのパルス幅(2クロック分)となります。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
|
2014年9月26日 14時54分
|
記事へ |
コメント(0) |
トラックバック(0) |
|
・電子回路工作 |
トラックバックURL:http://blog.zaq.ne.jp/igarage/trackback/3902/
※ブログ管理者が承認するまで表示されません