• ベストアンサー

PICマイコンができること

thyristorの回答

  • thyristor
  • ベストアンサー率76% (13/17)
回答No.2

RCカーには詳しくないので的外れになってしまうかもしれませんが・・・ ご使用のRCカーは、機械式スピードコントローラをサーボモータで制御するタイプで、このサーボモータと受信機の間にPICを入れる、という理解でよろしいでしょうか?そして、現在の入力パルスのON時間とニュートラル時のパルスのON時間を比較して出力ポートを切り替えたいわけですね?それならばヒントだけですが、こんな感じでどうでしょうか(間違いがあるかもしれません) /* 入力ポートにパルスを入力、出力ポート1とスピードコントローラ用サーボを接続、出力ポート2とブレーキ用サーボを接続、タイマ割り込み周期0.1[ms]、ニュートラル時のON時間が1[ms]の場合 */ int OnTimeNeutral; //ニュートラル時のON時間 int OnTimeNow; //現在のON時間 int Counter; //現在のON時間をカウント int BeforInput; //前回の入力 メイン関数(){ //グローバル変数を初期化 OnTimeNeutral = 10; //ニュートラル時のON時間 OnTimeNow = 0; //現在のON時間 Counter = 0; //現在のON時間をカウント BeforeInput = 0; //前回の入力 タイマ割り込みを許可 } タイマ割り込み関数(){ //現在のON時間をカウント if(入力ポート == 1) Counter ++; //現在のON時間を取得 if((BeforInput == 1) && (入力ポート == 0)){ OnTimeNow = Counter; Counter = 0; } //現在のON時間によって出力ポートを切り替え //(現在のON時間がニュートラル時より小さい時に前進する場合) if(OnTimeNow < OnTimeNeutral){ 出力ポート1 = 入力ポート; 出力ポート2 = 0; }else{ 出力ポート1 = 0; 出力ポート2 = 入力ポート; } BeforeInput = 入力ポート; } なお、このプログラムでは後進はできず、前進・ブレーキのみ可です。希望する動作に合わせて変更してください。

trial
質問者

補足

本当にありがとうございます。 私がやっていたプログラムよりも全然スマートなのでかなり焦りました。 順に追っていってもできると思ってやってみたんですが、あと一息で動きそうなのでもう一つ質問させてください。 上記のプログラムは、入出力ポートと各関数名と割り込みの設定をすれば、あとはニュートラルのON時間を所望の値にすればOKでよろしいでしょうか? 思ったのですが、割り込みのプリスケーラは設定なしでフラグも0に戻さなくても大丈夫でしょうか? 実行してみた結果、入力パルスをいじっても常にelseの条件のループに入ってしまう状況でした。 #include <pic.h> __CONFIG(0x3FF2); int OnTimeNeutral; //ニュートラル時のON時間 int OnTimeNow; //現在のON時間 int Counter; //現在のON時間をカウント int BeforeInput; //前回の入力 void main(void){ //グローバル変数を初期化 OnTimeNeutral = 16; //ニュートラル時のON時間 OnTimeNow = 0; //現在のON時間 Counter = 0; //現在のON時間をカウント BeforeInput = 0; //前回の入力 PORTB = 0x00; PORTA = 0x00; TRISB = 0x00; // PORTBの入出力設定 0 - output, 1 - input TRISA = 0x01; // PORTAの入出力設定 //タイマの割り込み許可 OPTION= 0b10000000; // prescaller なし INTCON= 0b10100000; /* T0IE=1; // Timer overflow interrupt enable GIE =1; // 割り込み自体の許可 TMR0=0; // タイマーリセット T0IF=0; // タイマフラグリセット */ } static void interrupt isr(void){ //現在のON時間をカウント if(RA0 == 1) Counter ++; //現在のON時間を取得 if((BeforeInput == 1) && (RA0 == 0)){ OnTimeNow = Counter; Counter = 0; } //現在のON時間によって出力ポートを切り替え //(現在のON時間がニュートラル時より小さい時に前進する場合) if(OnTimeNow < OnTimeNeutral){ RB0 = RA0; RB1 = 0; } else{ RB0 = 0; RB1 = RA0; } BeforeInput = RA0; }

関連するQ&A

  • PICマイコンに関して

    大学でエンジンの研究室に入っている者です。 PICマイコンで点火時期を決定させようと試みています。 (教授の考えからPICマイコンをどうしても使用するつもりです。) PICおよびエンジンに関してまだ知識が深くありません。 上死点と上死点(TDC)の間におけるCLKを360°刻みにし、初めから244°目が来た時にコイルに充電開始(出力を立ち上げる)、90°の間充電期間、TDC前26°で立ち上げていた出力を戻し(点火プラグに信号がいくようにし)たいです。エンコーダを用います。 しかし、PICがどのようにクロックのカウントをするかが分かりません。どうやって244°を読み取るかと言うか表現が難しいのですが・・・ちなみにPICマイコンは機械語を使います。 クロックをカウントさせる方法(できたら機械語)を教えてほしいです。お願いしますm(。。)m

  • PIC10F系で参考プログラムを伝授ください。

    PIC10F系でパルス波形検知の参考プログラムを伝授ください。 マイコン初心者です。 ネットと本を数冊読んで、何とかPICマイコンにアセンブラで書き込み スイッチでLEDをオンーオフするぐらいはできるようになりました。 そこからかなりのステップアップかもしれないのですが、 皆さんのご教授をお願いします。 あるパルス波形のみ検知し それ以外は無視する場合、タイマーとかカウントとか 使用したりするみたいですが、 具体的にはどのようなプログラムになるのでしょうか? 検知したい矩形波形は200Khzでデューティー比20%と仮定し 波形入力中は出力をし 内部クロック4MHzを使用したいです。 なるべく、入力する波形の5カウントぐらいで判別したいです。 参考文献等もございましたら、お願いします。 以上、よろしくお願いします。

  • PICマイコンを使った分解能1μsの時間差測定とPCへのデータ取込み方

    PICマイコンを使った分解能1μsの時間差測定とPCへのデータ取込み方法について PICマイコンを使って、レベル0-5Vの2つの信号A、Bの立ち上がり時間の差を、分解能1μs・最大時間100ms程度で測定し、USBコネクタでPCに時間差データを転送する方法を教えてください。 信号A、B は通常はLレベルで、Hレベルのパルス幅が10μsから1ms程度の単発パルスです。信号A、B のパルス幅は同じですが、Bのほうが数μs から数十msの遅延があります。 マイコンのクロックに10MHzとか20MHzなどの切りのいい周波数を使い、PICマイコンの割り込みを使う方法があるようなのですが、適切なPICマイコンの型番とプログラミング法、PCとインターフェースの方法などが書かれたサイトなど紹介して頂けると助かります。

  • PICマイコンを使った分解能1μsの時間差測定とPCへのデータ取込み方

    PICマイコンを使った分解能1μsの時間差測定とPCへのデータ取込み方法について PICマイコンを使って、レベル0-5Vの2つの信号A、Bの立ち上がり時間の差を、分解能1μs・最大時間100ms程度で測定し、USBコネクタでPCに時間差データを転送する方法を教えてください。 信号A、B は通常はLレベルで、Hレベルのパルス幅が10μsから1ms程度の単発パルスです。信号A、B のパルス幅は同じですが、Bのほうが数μs から数10msの遅延があります。 マイコンのクロックに10MHzとか20MHzなどの切りのいい周波数を使い、PICマイコンの割り込みを使う方法があるようなのですが、適切なPICマイコンの型番とプログラミング法、PCとインターフェースの方法などが書かれたサイトなど紹介して頂けると助かります。

  • 【PICマイコン】一般製品にPICシリーズが使われてるって本当ですか?

    最近PICをはじめて大分アセンブラもなれてきて楽しめるようになってきました。 それで教えてGOOで色々見てるときにPICシリーズのマイコンは一般製品の中にも組み込まれているって書いてあったんですが本当ですか? 僕の中でPICやAVR等はそれなりにコアな趣味を持つ人たちのおもちゃ的な物だと思ってました。 もし本当に入ってるんだったら具体的にどんな製品にどのマイコン(例PIC16F877A等)が使われてるのか教えてください。凄く興味があります。 また、何処のサイトだったか忘れましたが「これからマイコンをはじめるならAVR!PICをやるメリットなし!」ぐらいの勢いで書いてあったんですがその通りなんでしょうか? もひとつ、、PICの勉強をはじめるときにアセンブラかCかで迷ったんですがアセンブラではじめた方がCPUの構造をより理解しやすいとの事でアセンブラで進めてきたんですが、いまいちその実感がわきません。具体的にどういう所でCPUの構造を理解しやすいのでしょうか? それっぽいなぁと思うのはクロックでタイミングを与え、そのタイミング毎に命令を実行しレジスタのBITで条件判断をしたり計算をしたりしてポートに出力する的な部分でしょうか?そもそもCPUの構造ってどういう事なんでしょうか?何て言うか例えて言うならエクセルは仕事で使うから詳しいけどWindowsの設定は全然解りませんみたいな感じです。 よろしくお願いしますm(_)m

  • PICマイコンPIC12F509について

    これからPICを勉強しようとしているPIC未経験者です。 とりあえず使用するPICはPIC12F509を考えています。ネットの情報量からすると本当はPIC12F683の方が良いのかも知れませんが価格面からPIC12F509を検討しています。 PICはこれから購入しますが一番最初に触るPICマイコンとしてPIC12F509を選択しても大丈夫でしょうか? 一応言語はアセンブラを勉強しようと考えています。また、最初の目標として入力1に5Vがかかった時に出力1から何ミリ秒か遅れて5Vが出力され、入力1の加わる5Vが不定期に素早くON-OFFを繰り返えしてもPICの電源をOFFするまでずっと繰り返し動作する程度の物を組みたいと思っています。 現在の開発環境はPCにMPLAB X IDE v3.26等のソフトをインストール、PICkit3を入手程度です。 先日、MPLAB IPE v3.26を使用しHEXファイルをPIC18F2550に書込みを初めてしてみました。これが初めてのPICとのふれあいです。 以上、PIC知識人の皆さまご教示を宜しくお願い申し上げます。

  • マイコンの入力読み飛ばしPIC

    PICマイコンを使用して、インバータ駆動の三相モータのモータ回転回数を、フォトセンサで計数しています.フォトセンサとPICの入力はフォトカプラで絶縁して接続しています. PICには、モータが10回転(センサから10回出力を受けたら)したら1回外部に出力するという分周回路機能を持たしています. しかし特定の周波数(今回の場合は約42.1Hz)の時のみ、10回ではなく11回出力を受けないと1回出力しなくなってしまいます.しかも絶対ではなく、10回の時もあれば11回の時もあるという動作です. センサの出力をオシロで観察したところ、特にノイズや立ち上がりのもたつきなどはありませんでした. 多分ですが、マイコンが誤動作していると考えられますが、どのようにな対策案がありますでしょうか?電源ピン付近にパスコンは接続済です. 何卒ご教授宜しく御願い致します.

  • マイコンとロジック信号

    NPNオープンコレクタのロジック信号を、マイコンに入力したいと考えています。 PIC、H8マイコンが手軽なのですが・・・ そのままつなげてもいいもんなんですか?

  • picで24時間タイマーを自作したい

    picマイコンを使って、家庭用100vの電気を24時間のうち決めた時間にだけ電気を流す制御できるタイマースイッチを作りたいのですが、 マイコンからの弱い信号で100vの電気を本当に制御できるんでしょうか? 後マイコン一つでこのタイマーは作れるでしょうか?

  • 自動車の診断コネクタの信号をマイコンに引き込みたい

    自動車の診断コネクタの信号をマイコンに引き込みたいです。 やりたい事としては、エンジンの回転信号のパルス幅を計測して回転数を計測したいのです。 信号レベルを調べると12Vでそのままでは5V系マイコンには直接引き込めないですよね? 抵抗の分圧回路でレベルシフトしたりトランジスタでレベルシフトしてみました。 12Vレベルのパルスを作って、レベルシフトして正常にパルス幅を計測出来るか試してみると問題なく計測出来ます。 しかし、実際の車の回転信号を計測するとノイズを拾うのか、時々異常にに短い幅のパルスを拾うのです。 お手上げ入ってます…。 車側の回路と絶縁して試してみたいですが部品の都合で試せてません。 抵抗やトランジスタ利用する方法で何か良い方法は無いでしょうか? もしくは、ヒントになりそうなホームぺージを知っておられる方教えていただけませんか?