goo blog サービス終了のお知らせ 
「PIC AVR 工作室」サイトの日記的なブログです。
サイトに挙げなかった他愛ないことを日記的に書き残してます。
PIC AVR 工作室 ブログ



あいかわらずMEGA164PのDDSファンクションジェネレータ。

シリアル通信速度について計算間違えてたことが判った。

20Mhzで19200bpsならUBRRは64ってことになるんだけど、
64って1ビット分のクロック数じゃなくて、コイツをさらに
内部で分周して使ってるから、実際はもっと遅いんだった…

計算しなおしてみると、1バイト受け取るためのクロック数
は、20Mhz÷(19200÷10)=10,416.67になる。ってことは、
充分処理能力的には余力があるってことだな。一桁以上
余裕がある。がんばる必要なかったな。


まぁ、DAC出力の方はナニなのでがんばっておく必要があった
んだけど。

というわけで、ほぼコーディング終了。シミュレータで
動作確認中。

コーディング終わったら、周辺回路をサクッと作って動作確認
だな。


http://www.youtube.com/watch?v=5KkMH0acp9E
意外に、ツクバ程度の速度レンジでもウィングってそれなりに
効くんだなぁ。この手のハコのウィングなんて飾りって
思ってたけど、純正のウィングでもそれなりに効果があるとは。



コメント ( 0 )




今日も引き続きMEGA164PのDDSファンクションジェネレータ。

コードを弄り回して、割り込み処理(角速度の足しこみ、
波形テーブルからのデータ読み出し、ポートへの出力)
が約120クロックに収められることが判った。もちろん
2ch分出力してこの処理時間。シミュレータで色々な
ケースを流してみて、とりあえずバグは一応消えた
んじゃないかと思う。


これを元に考えると、1回の割込み周期は200クロック、
もしくは160クロックあたりが候補になってくる。
200クロックなら、20000Hz波形を出力するときに
1波形あたり5サンプル。160クロックなら6.25サンプル。

中途半端な割込み間隔にする手もあるかもしれない
けど、なんか気持ち悪いのでこのどっちかにしたい。

200クロックなら、割込み1周期あたりの4割は通常処理
(受信処理周り)で使えるので、処理能力的には
USARTにデータがラッシュしても19200bpsでは破綻する
ことはない目論見。

160クロックだと2割程度となり、一番処理負荷が掛かる
データパターン(具体的には”f”の文字を受信時に
角速度を求める処理)の時に超ギリギリになっちゃう。
USARTのダブルバッファ(2バイト分)を使い切る直前
といった感じ。その前後のデータパターンを眺めて、
大丈夫なら19200bpsで160クロックおきにしたいんだけど、
どうだろうなぁ…。エラーパターンまで含めてあとで
ちゃんと見直してみよう。

速度誤差の問題もあるんだよな…。試算してみると
200クロックの場合で130ppmくらい、160クロックの場合
240ppmくらい。水晶の3~5倍くらい精度が低くなるん
だけど、まぁ2ch出力を優先したいのでこのくらいは
目をつぶることに。小数部をあと1バイト増やせば
楽勝なんだけど、問題は処理時間だな…

でもやっぱ、SPIモジュールのI/Oと違って速いな。


初期化関係もほぼ直したので、残っているのは通常処理
の部分。USARTからの入力を受けて、内部の計算数値を
整える処理のところ。

2ch側は初期値としてcos波にすることにしたので、この
cos波を扱えるようにするのと、1ch、2chを切り替える
コマンドを増やしつつ、以前作ったやつとコマンドと
通信速度を上位互換にしておきたいので、そこらへん
も念頭にモロモロがんばってみよう。


ちょっとまえの記事だけど、がた老さんの
http://gataro-avr-ken.cocolog-nifty.com/blog/2012/06/p-10usb-3c26.html
この記事。色々スゴイ。P-10でちゃんとシリアル信号
取り出して使えるようになるまでが纏められてる。

あの時シリアル接続できるって知ったきり、おいらは
全然弄ることも無かったんだけど、物理的、論理的信号
が自由自在に扱えるようにってとこまではかなり手間を
かけられたのでは?と。

ケース加工もイイ。P-10はプローブが取り外しできない
タイプだから使うときちょっと不便なんだけど、こんな
風にコネクタ生やして取り付け/取り外し出来るように
なってたら便利。んで、その空いた部分にUSB/シリアル
変換回路が入っちゃってる!

aitendoのUSBシリアル変換回路って、こんな安いのが
出てたんだなぁ。オイラはArduino用で使うのがもっぱら
だから、ピン配置的にSparkfunのFTDI Breakoutばかり
なんだけど、用途によってはこれが小さくて安くて便利
かも。


おぉ、ザナルディー!金メダル!
http://headlines.yahoo.co.jp/hl?a=20120906-00000004-rcg-moto



コメント ( 0 )




相変わらず、2CH出力できるDDSファンクションジェネレータ
を作れないか、MEGA164Pのデータシートを見ながら進めて
いるところ。


8ビットでR2Rラダーdacと割り切ることで、結構サクッと
短いクロックで済むんじゃないかと思えてきた。20000Hz
なら1波形あたり5~6サンプルくらいには持っていけそう。

出力にオペアンプのアクティブフィルタは必須になるだろう
から、ここで高次フィルターを使えば、波形は結構綺麗に
整形出来るんじゃないかなぁと。


で、コードを書くといえばやっぱデータシートをよく
読まないといかんのだけど、MEGA164Pシリーズにしても、
MEGA164PAシリーズにしても、データシートに間違え
が結構散見されるんだよな。SPIとか、RAMPZとか。

データシートの間違えは、良く調べていけば判るから
まぁいいんだけど、昨日見たように、.incファイルに
間違えが残っていると、微妙に厄介だなぁ。まぁ
しようがない。


http://www.itmedia.co.jp/info/virtualevent/expo2012/embeded.html
これ見てみたいなぁ。


http://www.itmedia.co.jp/pcuser/articles/1205/16/news012_2.html
あのころのプログラムには神がかり的な知恵が満載
だったな。TEXDERには度肝を抜かれたな。


http://www.youtube.com/watch?v=txFoaxURoV4
このメタルスライム、ちょっと欲しい。



コメント ( 0 )




オイラのGX-100。本体にインターバル撮影モードが
搭載されているので、夜景でも昼間でも連写して
timelapseするときには本体だけでとりあえず
出来ちゃうんだけど、以前からいくつか不満点が少々。

(1)最短5秒から5秒おきでインターバル時間を設定

 →5秒より短く出来ないので、特に昼間でシャッター
  速度が速い撮影でtimelapseしても、5秒単位でしか
  撮れない。(もっと短い間隔で連写したい)

(2)インターバル間隔ではなく、待ち時間っぽい

 →5秒などと設定して撮影しても、実は5秒より少し
  長い撮影間隔になる。どうやら、撮影間隔ではなく
  待ち時間っぽい。(出来れば正確な間隔で撮れる
  ようにもしておきたい)

といったあたり。

で、居酒屋ガレージさんのサイトで以前見つけた
タイミンググラフ
http://blogari.zaq.ne.jp/igarage/article/795/
を参考にさせていただき、Arduinoでちょっと実験
をしてみた。(情報感謝!)


レリーズのために使うスイッチには、以前秋月で
買っておいた2段タクトスイッチ
http://akizukidenshi.com/catalog/g/gP-05354/
これとか使えるといいんだけど…

小さい表面実装はちょっとアレなので、とりあえず
普通のタクトスイッチを2つ使うことにして、
どちらか1個だけ押されたときにはAFスタート、
両方押されたときにシャッターが切れるという動作
で考えてみる。
(これなら、上記の2段タクトスイッチでも同じ
 プログラムで制御可能)


とりあえずArduinoを使ってシャッターが切れるだけ
というスケッチをサクッと書いてLEDを点灯させてみる。



2つのタクトスイッチをプルダウンで接続、LEDを
1k抵抗で接続。後でこのLEDをUSBケーブルに換える
だけで動かせるという算段。

スケッチはこんな具合。

//*******************************************
//***                                     ***
//***  release test for GX-100            ***
//***                                     ***
//***    signal output on D7              ***
//***    button input1 on D2              ***
//***    button input2 on D3              ***
//***    data input0   on D14             ***
//***    data input1   on D15             ***
//***    data input2   on D16             ***
//***    data input3   on D17             ***
//***    data input4   on D18             ***
//***                                     ***
//*******************************************


/*                     */
/*  include libraries  */
/*                     */

#include <MsTimer2.h>


/*                            */
/*  global variables declare  */
/*                            */

volatile char button_value;


/*                          */
/*  declare user functions  */
/*                          */


/*  output a short pulse (30ms)  */

void output_short_pulse(void){
  digitalWrite(7, HIGH);   // output high on cable
  delay(30);
  digitalWrite(7, LOW);   // output low on cable
}


/*  output a long pulse (150ms)  */

void output_long_pulse(void){
  digitalWrite(7, HIGH);   // output high on cable
  delay(150);
  digitalWrite(7, LOW);   // output low on cable
}


/*  wait a short moment (30ms)  */

void wait_short_moment(void){
  delay(30);
}


/*  wait a interval (100ms)  */

void wait_interval(void){
  delay(100);
}


/*  case of 1 button pushed  */

void af_start(void){
  output_short_pulse();
}


/*  case of 2 buttons pushed  */

void release_on(){
  wait_interval();
  output_long_pulse();
}


/*  case of both button released  */

void button_off(){
  wait_interval();
  output_short_pulse();
  wait_short_moment();
  output_short_pulse();
}


/*  input buttons  */


void button_chk(){
  char i;
  
  button_value = 0;
  
  for (i=2;iif (digitalRead(i) == HIGH){
      button_value++;
    }
  }
}
 


/*              */
/*  initialize  */
/*              */

void setup() {
  
  //set up i/o pins
  
  pinMode(7, OUTPUT);  // output for cable release

  pinMode(2, OUTPUT);  // input from button1
  pinMode(3, OUTPUT);  // input from button2

  pinMode(14, OUTPUT);  // input data0 from dip0
  pinMode(15, OUTPUT);  // input data1 from dip1
  pinMode(16, OUTPUT);  // input data2 from dip2
  pinMode(17, OUTPUT);  // input data3 from dip3
  pinMode(18, OUTPUT);  // input data4 from dip4
  
  MsTimer2::set(10, button_chk); // 10ms period
  MsTimer2::start();

}


/*             */
/*  main loop  */
/*             */

void loop() {

  char b;
  
  while ((b=button_value)  == 0){
  }  /* wait for signal changes */
  
  if (b == 1){  /* normal pattern */
    /* af_start */
    af_start();
    while ((b=button_value)  == 1){
    }  /* wait for signal changes */

    if (b == 0){  /* af only */
      button_off();
    } else if (b == 2){  /* push both buttons */
      release_on();
      while ((b=button_value)  != 0){
      }  /* wait for signal changes into "0" */
      button_off();
    }
  }else if (b == 2){  /* start from "2" pattern */
    af_start();
    release_on();
    while ((b=button_value)  != 0){
    }  /* wait for signal changes into "0" */
    button_off();
  }    
}


MsTimer2を使ってチャタリング防止をしてるんだけど、
まぁこんな大げさなことしなくても本当は大丈夫。
個々の処理でそれなりの時間間隔が空くはずなので、
チャタリングは影響しないはず。まぁ、あとで
アレコレ面倒にならないように一応。

コイツをUSB-A→USBmini-Bケーブルを使って接続
してみる。



いつも向きがわからなくなるので、USB端子のピン配置
は写真で残しておく。Arduinoから1k抵抗を介して
Vbas端子に繋げばok。


で、動かしてみる。

まずはAFでピントあわせ。片方のタクトスイッチだけ
押してみる。ok。離してみる。ok。さらに押したり
離したりしてみても問題なく動く。

次は2個両方押し。シャッターがちゃんと切れる。ok。
連続でシャッター切ったり、AFだけ合わせたりを
組み合わせてみるも問題なく動作。スバラシイ。
(改めて情報感謝!)

面白いのは、シャッターは「開く」タイミングだけ
指示して、「閉じる」タイミングにあたる信号は
存在しないこと。そう。バルブモードじゃなくて
マニュアル露出モードでシャッター速度を指定する
カメラなので、「閉じる」タイミングが無いわけね。


さらに、ケーブルを抜き差しし直してから再度シャッター
切ってみる。大丈夫。ちゃんと動く。


イイカンジで動くことが解ったので、あとはArduino互換
のちっちゃな専用基板を作って使いたいな。

ちなみにMEGA328基板で実験したんだけど、実は
MEGA8でも動くように考えて作っているところ。
以前ブートローダ書き込んだままあまり使ってない
チップを再利用する作戦。なんでもかんでも
MEGA328じゃなくてもイイのだ。


スケッチ上で定義だけしてあって使ってないI/Oピンは、
DIPスイッチかロータリースイッチを使って、インターバル
時間を指定できるようにする算段。

まぁ、あまり多機能にしようとすると大量の情報を
入力させないといけなくなって面倒なので、念頭に
おくのは短時間のケース。5ビット分の情報を入力
出来るように、5ビット分のタクトスイッチと
5個内蔵の抵抗アレーをゲットしておいた。

とりあえずここまで。

残る課題は、単発でシャッター切るモードに加えて
インターバルで撮影するモードを載せることかな。
あと、どんな形状でどんな操作方法にするか…

本当は、インターバル撮影の最中でもボタン押せば
シャッター切れるような造りになってるとなお良し
なんだけどな。GX-100はそこまでは要らないか…


http://www.nicovideo.jp/watch/1345821364
新ゲーグラ45回。全然知らないマシンだなぁ。

http://www.jiji.com/jc/zc?k=201208/2012082600003&rel=&g=http://www.jiji.com/jc/zc?k=201208/2012082600003&rel=&g=
ルイ=アームストロング氏死去。ご冥福を。




コメント ( 0 )




以前、なんとなくわかったようなつもりで放置して
いた符号付きの多ビット乗算の計算方法。

http://www.atmel.com/Images/doc0936.pdf
http://www.atmel.com/Images/doc1631.pdf
ATMELのアプリケーションノートに計算方法書いて
あるからこれ使えばいいんだろ…とか思ってた
んだけど、そういえば「符号付き×符号付き」の
掛け算がどんな仕組みで計算合うのかよく理解
できてなかったなぁとか思い出す。

8ビット×8ビットなら符号付きでも符号無しでも
mul命令系で好きなもの使えばいいんだけど、16×16
の符号付きに拡張する場合、単に最上位ビットが
符号をあらわす2の補数表示の場合はビヨーンて
伸ばせばいいの?と。

ちょい調べてみる。

http://wentwayup.tamaliver.jp/e165237.html
やっぱ2の補数表示の最上位ビットを参照して符号拡張
するっていうことでやっぱいいみたい。筆算の計算過程
を見せられるとよく理解できる。


ただ、掛けられる数が2の補数表示の負数で
掛ける数が正数の場合は体感的にもしっくりくる
んだけど、逆の場合って、どういう風に解釈すれば
いいんだろうなぁ?あと両方とも負数の場合も
そうだなぁ。

筆算で書いたら、多分単純に順序が変わるだけだから
一緒だろってことだと思うんだけど、本能的に、
脊髄反射的に解釈したいんだよなぁ…



コメント ( 0 )



« 前ページ 次ページ »