ニックネーム: 居酒屋ガレージ店主
★ZAQのBlogari停止のため、あれこれ「データ吸い出し」対策しています。 新規記事はとりあえず停止。 コメント書き込みはまだ有効です。 (JH3DBO 下間憲行)
2014年09月26日(金)
トラ技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/
※ブログ管理者が承認するまで表示されません
コメントを記入  
お名前(必須)
 
パスワード:
 
メール:
 
URL:
 
非公開:  クッキーに保存: 
※非公開にチェックを入れると、管理者のみにコメントが届きます。
ブログの画面には表示されません。
captcha


※画像に表示されている文字を入力してください(半角・大文字/小文字の区別なし)。
文字が読みづらい場合はこちらをクリックしてください。
小文字 太字 斜体 下線 取り消し線 左寄せ 中央揃え 右寄せ テキストカラー リンク