組込システムのセンスを磨くための方法とは?

このQ&Aのポイント
  • 組込システムのセンスを磨くには、関西のサークルや勉強会に参加し、情報を共有できる人と知り合うことが重要です。
  • 組込システムの勉強におすすめの書籍や情報サイトを紹介してもらいましょう。
  • 組込システムの知識を深めるためには、実際に手を動かしてプロジェクトに取り組んでみると良いです。
回答を見る
  • ベストアンサー

16ビットPICのインプットキャプチャについて(2

以前に http://oshiete1.watch.impress.co.jp/qa9005302.html で質問をさせて頂いた者です。 質問していました問題は、解決いたしました。 koujikuu 様から頂いたアドバイスの 「ICxCON2 / ICTRIG=0 同期モード キャプチャの度にタイマがクリアされる」 という言葉で、もう一度マニュアルを読んでみたところ。ここが問題でした。 トリガモードにして(ICTRIG=1) トリガ源も、ICクロック源と同じTimer1に変更しました。 (FIFO機能は用いずに、一回のエッジ検出毎にカウンタを++しました) 今回の問題は ICTRIG=0; だと、キャプチャごとにタイマ値がリセットされるので 同じタイミング→    例) Rise[0]-Down[0]  →  だと値が正常で タイミングがずれると 例) Rise[1]-Down[0]  →  だと値が異常でした。 前置きが長くなりましたが、質問をさせて頂きます。 「組込システム」のセンスを磨くにはどうすればいいでしょうか。 周りに質問できる人がいない状態です。 父と二人で計測器を作っていますが、父はアナログ屋で、昔にZ80を少し触った程度。 下名は4年目で、以前は3年間工作機械メーカー勤務(学生時代にロボットアームの制御でC言語は触っていました) 翔泳社のCodezinというサイトにも無料登録しましたが、マイコンや組込系とは少し違う気がします。 具体的な質問として 1.(関西の)サークルや勉強会の情報を持っているかたはおられませんか?   情報の「クレクレ」では無く、上記の通りアナログの知識は(主に父経由ですが)   40年の蓄積があるので、情報の取引的なことができるかとは思います。   (情報を共有できる方と知り合える場、もちろん関西以外でも結構です。)    2.皆様は何で勉強されましたか?   「これだけは読め!」等の書籍等を教えて頂けると幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

仕事で使うのなら一度は丸紅情報システムhttp://www.marubeni-sys.com/などのセミナーを受けることです。 ここでノウハウを学ぶことよりも講師や参加者との名刺交換などで人脈を作ることですね。

Snoodam
質問者

お礼

TooManyBugs様: 貴重なアドバイスありがとうございます。 また、お礼を述べるのが遅くなり申し訳ございません。 後閑さんが講師として来るのですね。 11月にdsPICがあるようなので、出席を検討致します。 また、もしお時間があればでいいのですが、H8系を扱っているマイコンの大手商社 (教えて頂きました丸紅等のセミナーを開催している会社) をご存じであれば、教えて頂けると幸いです。 何度も質問申し訳ございません。

その他の回答 (1)

  • koujikuu
  • ベストアンサー率43% (428/992)
回答No.2

PIC16の基本は「PIC活用ガイドブック」で学びましたが、平成12年の本なので内容は古いです 一番参考になる資料は日本語PICデータシートです、但し全部のPICにあるわけでは無いので、本来使用するPICの英語データシートで再確認します 私は普段アセンブラでプログラムしますが、C言語を使う際にもこのC言語の命令がどのアセンブラコードに変換されるか確認しています(ブラックボックスにはしません) 今回PIC24Fを使うにあたり、シリアルモニタを作成していたのですが、UxTXREGにワード書き込みをしたところPICが暴走しました(恐らくアドレスエラー) データシートで確認したところ、UART8ビットモード=UxTXREGバイトアクセス    / UART9ビットモード=UxTXREGワードアクセスと明確に区別されていました 自己流のプログラミングスタイルなのであまり参考にならないかも知れませんが?

Snoodam
質問者

お礼

koujikuu様: アドバイスありがとうございます。 やはりアセンブラでの確認も重要なのですね。 「Cコンパイラのエラーがある時もある」というのは耳にしたことがあります。 やはり、データシートを基本にし、書いてあることの本質を理解できるように 私自身のレベルアップを焦らずに着実に行っていきます。 ありがとうございます。

関連するQ&A

  • 16ビットPICのインプットキャプチャについて

    dsPICやPIC24の16ビットPICのインプットキャプチャについて お世話になります。16ビットPICのインプットキャプチャは、8ビットのPIC(特に16F1ファミリ)のCCPモジュールと使用方法がどこか違うのでしょうか。 16ビットPICはバッファを4つ持っており、値を4つまで保持できるはずですが、パルス幅計測がうまくできません。 現在dsPIC33Eを使っています。 皆様のアドバイスを頂けると幸いです。 問題点: 以下のパルスを計測すると、値がおかしくなる。 ㅤAㅤㅤ Bㅤㅤ CㅤㅤD ___|¯¯¯¯|_________|¯¯¯¯¯|______ ・B-Aでは正常 ・D-Cでも正常 ・しかし、C-Bをすると値が狂う。 値の確認方法: LCDにて表示。 タイマ1をキャプチャ用タイマとしている。(分解能は0.1336us) オシロでの計測値が120usの時、LCDの表示は「896」なので 896*0.1336=119.705us なので、正常と判断しています。(B-AやD-Cでパルス幅を計算時) プログラム仕様: メインループ内で、キャプチャを行う。 IC1で立下りエッジを検出 Captime_down[0]=IC1BUF;ㅤㅤ上図のDエッジ Captime_down[1]=IC1BUF;ㅤㅤ上図のBエッジ IC2で立ち上がりエッジ検出 Captime_rise[0]=IC2BUF;ㅤㅤ上図のCエッジ Captime_rise[1]=IC2BUF;ㅤㅤ上図のAエッジ 2msでタイマ3割込みが入り、値を計算し、表示 Captime[0]=Captime_down[0]-Captime_rise[0];ㅤㅤD-C Captime[1]=Captime_down[1]-Captime_rise[1];ㅤㅤB-A この時にC-B Captime_rise[0]-Captime_down[1] を行うと値が理論値をはるかに超えた19000等の値になります。 考察: インプットキャプチャに使用のタイマ1のオーバーフローも疑いましたが オーバフローしている形跡はありません。以下を試しました。 (1)タイマ1は0.1336usでカウントUP。 FFFFまで8755us=8.7ms必要。今回は2msで回し、値もクリアしている。 (TMR1=0) (2)タイマ1がオーバーフローすると、別ピンがON →ONしていないのでオーバーフローしない バッファの使い方?がおかしいのか? Captime_rise[0]-Captime_down[1] と配列の要素が違う計算(バッファの位置とでも言うのでしょうか、 キャプチャしたタイミングの違う値→[0]でのエッジ検出と[1]で タイマ1の値が変わる?) リファレンスマニュアルや書籍も読んだのですがわかりません。 アドバイスを頂けると幸いです。

  • dsPIC33E でのインプットキャプチャについて

    問題点 概要: インプットキャプチャを用いて、ラインカメラの出力の幅を計測しようと考えています。 しかし、カメラ出力が無い場合でも、キャプチャをしてしまいます。 SHOEISHAの「組込みマルチタスクプログラミング」等の書籍でも勉強していますが 分かりません。 何かアルゴリズムのお勧めの書籍等も教えて頂けると幸いです。 添付画像のような信号図になります。 仕様: ラインカメラ:投光器を用いて、物体を検知すると信号が「L」になる。 そのエッジをキャプチャし、パルス幅を計測する。 ※但し、現状はエッジを検出すると、あるピンを反転させてキャプチャしたかの点検をしています。(オシロにて確認) 動作詳細: ・動作は120MHzです。 ・カメラはPICからクロックパルスを送り、それに応じて出力を返す。 1MHzのクロック(T=1[us])で129発。 その後は出力はOFFになり、リセットパルスが入力させるまで、信号を出力しない。 ・タイマ2にて上記クロックパルスをカウントし、130回目で、割込み。 (後にデータ送信等を行う) ・タイマ3にて500[us]毎にリセットパルスを送信を、割込みにて行う。 これでカメラがリセットされる。 上記のタイマ2での割込み後です。 ・メインループ内では、インプットキャプチャフラグを見ており、フラグONで RB13ピンを反転させる。 (後に、タイマ1を用いたキャプチャ値の計算を実装予定) 問題点 詳細: カメラの前に物体が無いと、信号は「H」です。 しかし、129回クロックパルスを与えると、カメラ出力は「L」になります。 この部分も検知してしまい、冒頭に述べたように、「カメラ出力が無い場合でもキャプチャをする」事態になっています。 (1)物体を検知していない状態のカメラ出力   ここでは、本来であればキャプチャは行わない ____________|¯¯¯¯¯¯¯¯¯|_________________ (2)物体を検知した状態 ____________|¯¯¯|___|¯¯¯¯ |_________________ 現状のプログラムでは、(1)の場合のエッジを検知してしまいます。 目的は(2)の状態の中央部のエッジ2つのみをキャプチしたいのです。 考察 調査した点: (1)main内のwhile(1)内で、無限にキャプチャのフラグを見ていますので タイマ2の値でのifを付けた。 TMR2が、1<TMR2<129の間のみキャプチャフラグを見る ! (1-1)上記の改良で、キャプチャフラグ検知後に、TRM2の条件分岐 (2)キャプチャを行うタイミングでのみ、インプットキャプチャをONにする。 リセットパルス後、インプットキャプチャON、クロックパルス130回目でインプットキャプチャOFF いずれも、うまくいきませんでした。(カメラが物体を検知していないのに、キャプチャをすると出力反転するピンが反転している) 要約は、 mainの無限ループ内でインプットキャプチャを行っており、それを条件に合わせてON/OFFしたいのですが、上手く行きません。 長文になりましたが宜しくお願い致します。 参考文献等の案内でも大歓迎ですのでお願いします。

  • C言語 値の合計について(PICマイコン上)

    C言語、値の合計について(PICマイコンを使用) C言語のアルゴリズムについての質問です。 申し訳ございませんが、前提が長く、質問が後半にあります。 1.行いたいこと パルス幅を取り込んで、パルス幅を足しこんでいく。この値を面積とする。 2.仕様 ・500usでループを回しており、その都度、パルス幅を取得しています。 (パルス幅は1つであったり、複数であったりします。パルスの数を「Rise」という 変数で記憶しています。) ・そのパルス幅を取得し、一定ループ後に合計値を計算したい。 例) ___|¯¯|___|¯¯¯|___ Rise=1。中央のくぼみの幅を計算 ↓ ___|¯¯|_|¯¯|_|¯|____ Rise=2。中央2つのくぼみを計算 3.問題点 Riseの値でif分岐をした、べた書きしたプログラムと、より一般化したプログラムの 面積の値(SUM_Areaの値)が異なる。 一般化したものの方が値が大きくなる。 /*以下プログラム*/ // べた書き if(Rise==2){ Captime[1]=Captime_rise[2]-Captime_down[1]; //パルス幅の計算 Area[1] += Captime[1]; //面積計算 SUM_Area=Area[1]; //合計の面積 } // Rise==2 LOOP END else if(Rise==3){ Captime[1]=Captime_rise[2]-Captime_down[1]; Captime[2]=Captime_rise[3]-Captime_down[2]; Area[1] += Captime[1]; Area[2] += Captime[2]; SUM_Area=Area[1]+Area[2]; } // Rise==3 LOOP END else if(Rise==4){ Captime[1]=Captime_rise[2]-Captime_down[1]; Captime[2]=Captime_rise[3]-Captime_down[2]; Captime[3]=Captime_rise[4]-Captime_down[3]; Area[1] += Captime[1]; Area[2] += Captime[2]; Area[3] += Captime[3]; SUM_Area=Area[1]+Area[2]+Area[3]; } // 一般化したもの for(i=1;i<Rise;i++){ Captime[i]=Captime_rise[i+1]-Captime_down[i]; Area[i]+=Captime[i]; SUM_Area+=Area[i]; } 4.考察 一般化したプログラムの SUM_Area+=・・・・ の部分のみをifで場合分けすると、 (SUM_Area=Area[1]+Area[2]+Area[3]; の様にRiseの値で分岐) 値が一致したので この部分が悪さをしていると考えています。 5.質問 今回の場合はSUM_Areaの部分は、べた書き(Riseでの分岐)しか方法がないのでしょうか。 Riseが64個まであるので、プログラムが冗長になってしまいます。 宜しくお願いします

  • C言語でのif文分岐について(PICで使用)

    お世話になります。 現在PICマイコンでC言語を用いて、プログラムを組んでいますが、煮詰まったので皆様のアドバイスを頂戴したく、質問させて頂きます。 問題点概要: if文の分岐がうまく行かない。 パルス幅を計測し、その幅に応じて個数を判別し、累積カウントをするプログラムです。 しかし、パルス幅での個数の判別がうまく行きません。 例)パルス幅100以上で「2つ」とカウントしたいところが、「1つ」とカウントする。 プログラム仕様: 1.パルスの幅を計測するプログラム 2.計測したパルス幅に応じて、個数を判別する。 3.個数を累積する。 4.表示する 1から3を2[ms]周期で実行しています。 ※カメラの前を物体が横切ると、カメラ出力がLになるので、そのエッジを見ています。 したがって、 カメラの前にずっと物体があると、出力がLのままなので、累積カウントがアップし続けます。 その時は、累積カウントをしないプログラムにしています。  → 一回目の検知時のみ累積カウントをアップさせる。 そのために、「PP」という変数を定義しています。 添付資料に、詳しく書いています。 見て頂けると幸いです。 カメラ出力の取り込みについて: 立ち上りエッジをCaptime_rise[Rise]; Riseは検知するたびに、インクリメントされます。(1から++) Downも同様です。 カメラは、物体を検知しないときは ______|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾|________________ なので、Rise==Down==1です。 物体を検知すると ______|‾‾‾‾‾‾|_____|‾‾‾‾‾‾|______________ となります。 上述の通り、「カメラの前に物体がずっとある場合の、累積カウントアップ防止」の為に PP==1  // PPは前のRiseの値 の時のみ、累積を加算するようにしています。 PP==1の状態とは、物体を検知していない場合なので、この考えで大丈夫ではないかと思っています。 //プログラム抜粋 // 個数の計算 /* Captime[i] → 計測パルス Captime_rise[i] → 立上パルス Captime_down[i] → 立下パルス KOSU → 個数 KOSU_SUM → 累積個数 PP → 1つ前のサイクルのRiseの値 STD_width → 個数判別の基準値 */ if(Rise==1){ KOSU=0; Captime[1]=0; } else if(Rise==2){ // パルス幅の計算 Captime[0]=Captime_down[1]-Captime_rise[1]; // Captime[1]=Captime_rise[2]-Captime_down[1]; // 1つ目の検知 if(PP==1){ if(Captime[1]>STD_width) { KOSU=2; KOSU_SUM=KOSU_SUM+2; } else { KOSU=1; KOSU_SUM++; } } } else{ KOSU=9; } PP=Rise; アルゴリズムの考え方等が我流なので、皆様のアドバイスを頂けると幸いです。

  • 地デジ映像は一旦アナログ化してからキャプチャしてもガードがかかる?

    地デジ映像は一旦アナログ化してからキャプチャしてもガードがかかる?  以前に、地デジ映像を一旦アナログ化してからキャプチャする方法についてご質問したとき得られた回答で、アナログ化してもガードがかかってキャプチャできないことがあるとのことでした。  しかし、その後、あるキャプチャボードを使って、ガードがかかることも無くちゃんとキャプチャできました。  ところが、しばらくキャプチャの作業を休んだ後、再開したところガード信号が働くようになっていてキャプチャが不能になりました。  なぜこのようなことになったのでしょうか?いつの時点からか、ガード信号が強化されたとか、方式が変わったとかあるのでしょうか、  また、なにかの設定によってはガードがかからないように出来るのかどうかお伺いします。  地デジでコピーガードがかかるようになったのは、ディジタルのままでは映像劣化無くコピーできるので著作権上問題があるからと理解していたので、一旦アナログ化すればそこには映像劣化が伴うので著作権上の問題も薄れるのではないかと思っていたのですが、そうではないのでしょうか?

  • C言語でのif文分岐について(PICで使用) 2

    http://oshiete1.watch.impress.co.jp/qa9017378.html で質問をさせて頂き、アドバイスを基に以下のアルゴリズムを追加しました。 (以前の質問では、間違って質問を締め切ってしまいました。 アドバイスを頂いた方に大変失礼なことをしてしまいました。申し訳ございません。) 1.パルス幅の最大値を保持する。 2.物体の通過後に累積個数を加算する。この時に、保持した最大値を用いる 従来はRise==2,PP==1の時に、累積加算+パルス幅の判別を行っていました。 このタイミングは、「物体の先端を検知した時」になります。 それを変更し、Rise==1,PP==2の時に、判別するようにしました。 このタイミングは「物体の通過後」になります。 質問: 「1」の「最大値の保持」のプログラムが意図した通りに動きません。 1ループ前のパルス幅を P_Captime[1]=Captime[1]; として保持し、 現在のループの計測値を比較を行い、現在の値の方が大きければ Max_Captime[1]=Captime[1]; とし、最大値を保持しています。 私の意図している動き: LCDに ・現在のパルス幅(Captime[1]) ・最大値 (Max_Captime[1]) を表示しています。 この時、LCDの表示が ・1ループ目 現在のパルス幅が50 →最大値も50 ・2ループ目 現在のパルス幅が20 →最大値は50のまま としたいのですが、 ずっと現在のパルス幅=最大値となり、 最後のパルス幅(物体が通過した最後のループ)がLCDに保持されたままになります。 例)上記の後、最後のループのパルス幅が30の場合、最大値は50でなく、30と表示される。 以下ソース抜粋 /* パルス有無の検知 Rise による識別*/ if(Rise==1){ KOSU=0; Captime[1]=0; } else if(Rise==2){ // パルス幅の計算 Captime[1]=Captime_rise[2]-Captime_down[1]; if(Captime[1]>P_Captime[1]){ // 最大パルスの取得・保持 Max_Captime[1]=Captime[1]; } } P_Captime[1]=Captime[1]; PP=Rise; /*抜粋終わり*/ ドツボに嵌っています。 あえて昨日は何も考えずに、もう一度ソースコードでなく、アルゴリズム図から見直してみましたが、うまくいきません。 /*****************************/ 冗長な文章でしたので、要約すると 1.パルス幅の最大値を保持する。 2.物体の通過後に累積個数を加算する。この時に、保持した最大値を用いる の「1.パルス幅の最大値を保持する」がうまくいかないので、「2」に進めずに 困っています。 となります。 アドバイスを頂けたら幸いです。 (もちろん自分自身でも、並行して考え直しています)

  • TVキャプチャーカード、デジタルチューナーと併用で画面がカクカク

    地上デジタル放送を視聴しようとパソコンにTVキャプチャーカードを買いました。Leadtek の製品です。 組み込み後からきれいな画質を満喫していました。 そこでデジタルチューナーも購入しました。 家にある一般的なブラウン管テレビでデジタル放送を視聴するためです。 ところがデジタルチューナーを設置して、ブラウン管テレビでデジタル放送が視聴できるようになったのはいいのですが、パソコンでは画像がカクカクしたり、時にはソフトが固まったりして視聴ができなくなってしまいました。 TVキャプチャーカードとデジタルチューナーへは、アンテナからブースター分配機を使って信号を分配しています。 二つのデジタル信号がぶつかってこのような症状がでることがあるのでしょうか。 いままでアナログのTVキャプチャーカードとアナログ放送受信の頃は問題ありませんでした。デジタル化したとたんにこの有様です。 識者の皆様よろしくお願いします。

  • vista32ビット→64ビット+AHCI

    現在Vista Ultimate(アップグレード版)の32ビット版をIDEモードで使用しています。マザーボードはASUS製P5Bです。使用しているソフトやドライバの対応状況もキャプチャボードが使えない以外は問題なくなってきたので、せっかくなので64ビットへ移行したいと思いました。 現在使っているパソコンは大学の入学祝として自作したものなのですが、つい最近までAHCIのことを知らずにIDEモードのままでインストールしてしまいました(別に問題があるというわけではないですが)。 AHCIを使用するにはOSのインストール前にドライバを入れなければならなかったのですが、Vistaでは標準でサポートしているようですね。「OSのインストールの前に」というのはわかったのですが、データのみが入っているディスクやパーティションはそのまま使えるのでしょうか? 現在の構成は、2つのディスクで、パーティションがWD5000AAKSに「system(OSインストール)」「data(ファイル)」があり、HDT722516DLA380に「data2(ふぁいる)」といった感じです。 また、現在の32ビット版から直接インストールはできないようなのですが、どのようにしてインストールすればよいのでしょうか?どのタイミングでAHCIに切り替えたらよいのでしょうか? また、P5BのAHCIは糞だとか、不具合があるとか聞いたことがあるのですが、実際のところどうなのでしょうか? また、AHCIの使用でどれだけ快適になるのでしょうか?あまり変わらないようならば、すべてあきらめたいと思います。 そもそも知識のないような人が手を出すものではないのでしょうか? 長くへたくそな文章ですみません。

  • 動画キャプチャー時のカクカクについて

    自分は、ある動画をキャプチャー録画したく、さまざまなソフトや設定をを試してきました。 そして最終的にたどり着いたソフトは、Bandicamとアマレココなのですが、キャプチャ録画時にやや問題点が発生したため、質問させて頂きます。 まず、キャプチャ時のPCの環境ですが、 ノートPC windows7 CPU:core i7 740QM メモリ:4GB グラフィック:Geforce GT 330M です。 IE9で開いた動画をBandicamでキャプチャしたのですが,動画がややカクカクしてしまい、アマレココを試してみました。 すると、キャプチャ動画は綺麗にカクカクせず撮れたのですが、動画の所々に横線の歪みといいますか、線が入り、若干ずれてるような乱れが所々に発生しました。 これはカクカクする以上に嫌なので、原因を探ってみたところ、どうもwindows Aeroを切ってwindowsベーシック(クラシックも)にしてキャプチャした際に、アマレココ、Bandicam共にこの線が入ってしまうようです。 これは何故なのでしょうか。何が原因と考えられますでしょうか。ベーシックにするとカクカクがなくなるので、キャプチャ時はベーシックにしようと思っていたのですが、映像が乱れるのはカクカクする以上に嫌なので、困っています。 かといってAeroでキャプチャーすると、どうもカクカクしてしまいます。 これらの情報を踏まえて、原因や解決方法等、ご回答よろしくおねがいします。

  • ps3のゲーム映像をキャプチャーしたいと考えています。

    ps3のゲーム映像をキャプチャーしたいと考えています。 そこで質問なのですがps3をゲーム映像をキャプチャーする場合どうすればいいのでしょうか? PV3 PV4 MONSTER-x? 色々商品があるみたいで出来るだけ綺麗な画質がいいのですが何を買えばいいのかさっぱりわかりません>< 例えば接続の仕方としてD端子でPS3->TV->PCみたいな接続方法で映像と音をキャプチャー出来るのでしょうか? その際、キャプチャーボード以外に必要なケーブル類、あれば良い物など。オススメな接続方法があれば是非教えていただきたいです! あとTVを使うことでラグの問題を完全に解消出来るとの情報もありましたがwikiを見てもよくわかりません…泣。 お忙しいとは思いますが教えて頂けると嬉しいです♪

専門家に質問してみよう