• ベストアンサー

タイマーを多用するプログラムに適したCPU

手元のフローチャートを何かしらのプロセッサに 実装できるか検討しています。通常のANDやORに加えて この制御ルーチンには3秒~40秒程度のタイマー分岐や ループが10ヶ所あります。 PIC、FPGA、H8など候補がありますが、 数少ないカウンタを使ってどう対処すべきか悩んでいて、 叩き台となるプロセッサを決めかねています。 これら以外に最適な何かがあれば採用しても構わないと思います。 PLC(シーケンサ)は今回候補から外していますが どなたか良いプロセッサをご存知でしょうか。

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

  • ベストアンサー
  • ore100
  • ベストアンサー率54% (34/62)
回答No.1

どのようなプロセッサでも可能と思います。 プロセッサのインターバル・タイマーを使い、3秒~40秒の時間を計測します。 たとえば、プロセッサのインターバル・タイマーを100ミリセコンドで割り込みをかけるように設定します。3秒測定するには、30回割り込みを実行すれば3秒になります。400回割り込みを実行すれば40秒になります。つまり何回割り込みを実行すれば良いのかというカウンターを使えば、時間は計測できます。 プログラムでは、メインでカウンターに値をセットします。(カウンタは割り込みの回数を数えます) そのカウンターの値をタイマー割り込み毎にカウントダウン(-1)します。-1したカウンターが0になったらカウントアップで所定の時間を図ることができます。

earl_gray
質問者

お礼

ご教示いただいた方法を、実際にマイコンを使ってやってみまして、うまくいきました。多重ループを使ってみますと、思い通りのタイマーが実現できました。 ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • PICで内部タイマーを使わずカウントダウンする方法

    こんにちは。 今回、PICのプログラムをアセンブラで組むことになりました。 その中で「100ミリ秒間、あるポートからの入力を監視する」という部分があり、 これを内部タイマーなどは使わずに実装するとします。 自分なりには、 PICのクロック数とループ内のサイクル数で 何回ループを回せばよいのかを予め計算しておいて その回数だけループを回せばよいのかな? と考えました。。。 しかしループ内のサイクルがせいぜい数μSですので、 100mSecとなると10万回単位でループを回さなければなりません。 しかしPICでは変数が8Bitしか無いので255までしかカウントできないと思うのですが、 こういう大きい数字のカウントをしたい場合、どうしたら良いのでしょうか? 宜しくお願いします。

  • シーケンサ(PLC)の内部時計の誤差を少なくする…

    シーケンサ(PLC)の内部時計の誤差を少なくする方法について情報をください シーケンサ(PLC)を使って設定時刻になれば接点が閉じて、設定時刻になれば接点が開くという比較的単純な動作をするタイマーです。 このタイマーの時刻情報には、シーケンサの内部時計を用いています。 シーケンサはMELSEC FX1SやFX1Nです。 ところが、時刻が1年で2~3分の誤差を生じます。 この誤差をせめて掛け時計程度(1年で45秒程度)の範囲に収める方法はないでしょうか。 外部からシーケンサに対して何らかの(ほぼ)正確な時刻情報を入れる、例えば外部の時計が毎時0分0秒にシーケンサに対して時刻を教えてやるとか・・・と思いWebを検索してみました。 パッと出てきたのは、トライステート社の電波時計キットでした。 http://www.tristate.ne.jp/rf-clock-v2.htm タイマーは社内で使うだけなのでこれでも良いかとも思うのですが、もっと別の方法やモノがあれば情報をお願いします。 トライステート社のTopページ http://www.tristate.ne.jp

  • PICについての質問です。使用PIC(PIC16F88)

    PICについての質問です。使用PIC(PIC16F88) LEDを0.5秒点灯、0.5秒消灯させるプログラムを書いています。 追加でLEDを駆動するFETが故障してショートモードになったときを考えて、通電監視プログラムを 組み込みましたが、わからないところがあります。 タイマー1を使用して、0.1秒ごとに割り込み、通電検知させて、3秒連続して通電状態の場合はハード的にOFFにするという回路を組み込みました。 0.1秒ごとに割り込みさせて、通電と判断したらカウンターをカウントダウンさせて、0回になったらフラグをたてています。 メインルーチンで フラグチェック処理→0.5秒点灯、0.5秒消灯処理→(はじめに戻る)というフローにより、通電監視フラグを1秒ごとにチェックして、フラグが立ててあれば、強制的にOFFにします。 そのカウンターの設定値ですが、30回にすると3秒後の消灯になりません。いろいろ試した結果23回であれば、最短3秒後以降消灯できるようになりました。 自分で理解したいと思うのですが、なぜこれでうまくいくのかわかりません。 解説書、webも調べましたがわかりません。 どなたか推測でもいいので、教えていただけませんでしょうか?

  • 機械式タイマーでエアブロー制御

    加工工程においてサイクルタイムを縮めるため、ねじ穴における ハンドブローの工程を自動化することになりましたが、 シーケンサ制御(厳密には電気レス)を一切行わないことが 前提となっており、大変困っています。 上の主張としては、あまり電気を使いたくない=装置にお金を 掛けたくない、だそうですが、どう考えても 機械式にした方が大掛かりで面倒な気がします。 本当に機械式タイマーでエアブローを制御する事は可能 なのでしょうか?また、それはシーケンス(非PLC)より 安価で収まるのでしょうか? どなたか御存知でしたら御教授ください。 因みにエアブローの条件は ・ブロー時間は10秒 ・電気を一切用いない です。(冶具等設備は別が担当) 電気を使用しないで10秒を計測、そしてブロー停止なんて どうすればできるんでしょうか・・・。

  • シーケンスのラダーについて

    三菱のPLC FX-1Nを使用しています。 下記の動作をさせるのに、どのようなラダーにすればよいでしょうか? ○設備立上げ後、一定時間(1.5時間程度,任意設定)IN信号が入力されなかったら、OUT信号を出力する。 内部タイマーを使用すると、3276秒までしかカウントできず。 タイマーとカウンタ両方使ったりするんでしょうか? 100秒経過したら、カウント 1 UP とか。 以上、よろしくお願いいたします。

  • PIC タイマー0の使い方

    PIC16F886を触り始めたのですが、タイマー割り込みで苦戦しています。 タイマー割り込みを使ったLEDの点滅の間隔が、自分の思った時間にならないのです。 下に今のプログラムを載せておきます。 私の今の考え方はこうです。 ・内部クロックは4MHzに設定してある ・TMR0のカウントはクロックの1/4らしい→1MHzなので周期は1μsec ・プリスケーラは1:128に設定→128μsecでTMR0がカウントアップ ・TMR0の初期値を61に設定→195回のカウントアップでT0IF=1 ・128μsec*195μsec=2496μsec≒0.025msec←タイマー割り込み ・40回カウントすると1秒 と、1秒ごとにLEDのON,OFFが切り替わるはずだと考えているのですが、書き込んで計測したところ、約0.8秒でon,offを繰り返しています。 私の考え方やプログラムに間違いがあるのでしょうか? もしくはPICがハード的に壊れているのでしょうか?(picに5Vをかけても動かず、mainが実行中に点灯するLED(この時点では点いていない)の端子の両端を指で触ると何故か動き出します。) 以下プログラムです。(注釈などは省いたので見難いかもしれません) #include <stdio.h> #include <stdlib.h> #include <xc.h> #include <pic.h> #pragma config FOSC = INTRC_NOCLKOUT #pragma config WDTE = OFF #pragma config PWRTE = OFF #pragma config MCLRE = OFF #pragma config CP = OFF #pragma config CPD = OFF #pragma config BOREN = ON #pragma config IESO = OFF #pragma config FCMEN = OFF #pragma config LVP = ON void interrupt tc_int(void); volatile unsigned int cnt = 0; volatile unsigned int cnt1 = 0; #define sw RB0 #define led RA0 #define led2 RA1 #define led3 RA2 #define _XTAL_FREQ 4000000 void init(void) //初期設定 { OSCCON=0b01101000; // 内部クロック設定 4MHz TRISA=0b00000000; TRISB=0b00000000; TRISC=0b00000000; ANSEL=0x00; /* 割り込み初期設定 */ GIE = 1; // すべての割り込みを許可 T0IE = 0; // タイマー割り込みを禁止 T0CS = 0; // TIMAR0モジュールをタイマーとして使用 PSA = 0; // プリスケーラをTIMER0モジュール用にセット OPTION_REG |= 0x06; // CPUクロックを128分周 TMR0 = 61; // カウンタ値をリセット T0IE = 1; // タイマー割り込みを許可 T0IF = 0; // 割り込みフラグをクリア } int main(void) { init(); sw=1; led=1; led3=0; cnt1=0; LEDflg=0; while(1) { if(cnt1>=10){ led3=~led3; cnt1=0; } } } void interrupt tc_int(void){ // 割り込みハンドラ if(T0IF == 1){ cnt++; TMR0=61; T0IF = 0; // 割り込みフラグをクリア if(cnt>=40){ cnt=0; cnt1++; led2= ~led2; } } }

  • H8 3664Fのプログラム

    タクトスイッチのチャタリングを回避し、奇数回めのONで LEDの交互点灯を(タイマを使って) やろうとしていますが、なかなかうまくいきません。 入門者でお恥ずかしいですが、下記コードの誤りをご指摘頂けませんでしょうか? 宜しくお願い致します。 以下、コード。 #include <3664.h> //プロトタイプ宣言 void main(void); int SW_Read(void); // 入力SWの状態読み込み 関数 void wait(int); // nミリ秒待つウエイト 関数 void wait1ms(void); // 1ミリ秒待つウエイト 関数 void IOinit(void); // I/O の初期化 関数 void main(void) { if (SW_Read()==1) { IO.PDR8.BIT.B0 = 1; // ポート8のビット0を出力ON IO.PDR8.BIT.B1 = 0; // ポート8のビット1を出力OFF DI; // 割り込み禁止 TA.TMA.BYTE = 0x0A; // タイマーA、低速発信・0.25sec設定(タイマーのカウント開始) IRR1.BIT.IRRTA = 0; // タイマーA 検知フラグをゼロクリア IENR1.BIT.IENTA =1; // 割り込み許可 EI; // 割り込み許可 } else { } while(1) { } } /////////////////// I/Oの初期化 void IOinit(void) { IO.PCR8 = 0x03; // ポートコントロールレジスタ: ポート8のビット0・1を出力に設定 // その他のビットは入力に設定 IO.PDR8.BIT.B0 = 0; // ポート8のビット0を出力OFF IO.PDR8.BIT.B1 = 0; // ポート8のビット1を出力OFF IO.PCR1 = 0x00; // ポートコントロールレジスタ: ポート1を全ビット0とし、入力に設定 } /////////////////// タイマーA関数 void int_timera (void) // タイマーA関数 { IO.PDR8.BIT.B0 = ~IO.PDR8.BIT.B0; // ポート8のビット0を反転して出力(赤)LED用 IO.PDR8.BIT.B1 = ~IO.PDR8.BIT.B1; // ポート8のビット1を反転して出力(緑)LED用 IRR1.BIT.IRRTA = 0; // タイマーA検知フラグをゼロクリア } /////////////////// スイッチの状態読み込み int SW_Read(void) { int sw1; //スイッチ状態読み込み1回目 int sw2; //スイッチ状態読み込み2回目 int val; //スイッチの状態判定値の入力値 int memval; //入力信号の全回の値 int numcnt; //奇数偶数判定ループ用カウンタ while(1) //モニタリング { sw1 = IO.PDR1.BIT.B7; // スイッチの状態読み込み1回目 wait(10); // 10mS待つ sw2 = IO.PDR1.BIT.B7; // スイッチの状態読み込み2回目 memval=val; //現行のスイッチ状態判定値をメモリに入れ替える if(sw1==1 & sw2==1) // スイッチ読み込み1回目と2回目共にONだったら { //スイッチ状態判定を<押した>と見なして、 val=1; } else { val=0; } if(memval==0 & val==1) //パルスの前後状態を比較し、新規に立ち上がりONであれば、 { numcnt=++numcnt; if(numcnt%2!=0) //ループカウンタが奇数だったら { return(1); // 1を返す } else { } } else { } } } //////////////////// nミリ秒待つウェイト関数 void wait(int time) { int i; // ループカウンタ for(i = 0 ; i < time ; i++) // time回数分ループ wait1ms(); // 1ミリ秒のウェイト関数を呼び出す } //////////////////// 1ミリ秒待つウェイト関数 void wait1ms(void) { int i; // ループカウンタ for(i = 0 ; i < 2662 ; i++); // 1ミリ秒の間ループする } 以上、宜しくお願い申し上げます。

  • カウンタ回路製作

    只今、カウントー回路を製作しようと考えておりますが、なかなかできず頭膿んでいます。回路の知識は10年前ぐらいにおさわり程度。 仕様 デジS/Wで0~999(秒)まで任意に設定でき、例えばカウント値を20秒に設定した場合、スタート信号(S/W入力)が入力され20秒たったら、ブザーを2秒程度鳴らしそこから自動的に初期値に戻り、停止(信号)が入力されるまでこの動作を無限に繰り返すものです。 部品は74シリーズ構成で考えております。 カウンター部はHC390を使用したいと思います。 基板はユニバーサル基板を使用します。 キッチンタイマーを使用しては?と言う意見がございますがキッチンタイマーはループ することがない為、設定時間に到達するたびにスタートS/Wを押さなくてはならない為、使用出来ないと考えております。 何方か助けて下さぁ~い。

  • PICで豆の1秒あたりのカウントプログラムについて

     PICの初心者です。回路図を見て、基板を作れる程度、プログラムは書いてあるのを打ち込める程度で、意味はまったくわかりません。  PIC16F84のPICでカウントする公開の回路を見つけて、光りセンサ-回路でON.OFFさせるかいろも作りました。プログラムは作成者のものです。 見て書き込んで、なんとかカウントしました。合計数は、わかりました。 質問は、 1,このプログラムを直して、1秒間あたり、何粒落ちるかカウントしたいと考えました。  どのように、すれば良いのか教えてください。 2,合計のカウンタ-と秒速何粒落ちているかプログラムを1つのPICに入れて、動作の最初時に選 択できるようにしたいのですが、どのようにしたらよいでしょうか。  PICの回路図とプログラム(テキスト形式)を下に添付しています。   お願いします。私の連休中の宿題で困っています。 7セグメントLED表示4桁カウンタ ;(クロック 4MHz) ; [ ご注意 ] ;PIC プログラムには秋月電子製のライター・キットを使用しているため、アセン ;ブルにはキットに付属のアセンブラを使用しています。 ;プログラム本体は PIC の基本命令だけでの構成に書き替えていますが、ヘッ ;ダー部分などが異なる場合がありますので、他のアセンブラを使用する場合は ;適宜変更してご利用下さい。 include16f84.h .16f84 .oschs .pwrton .wdtoff .protect off countswequrb.0;カウント入力ポート org0ch d1ds1;カウント用 d2ds1 d3ds1 d4ds1 swlcds1;swait でのループ回数 sdds1;表示データ (0~9) lcds1;汎用、ループ用 org0 gotostart org4 gotostart start;初期設定 bsf3h,5;ページ 1 movlw10000b movwf85h;ポート ra の初期化 movlw00000001b movwf86h;ポート rb の初期化 bcf3h,5;ページ 0 clrfd1;カウントデータの初期化 clrfd2 clrfd3 clrfd4 ct10:btfsccountsw;入力が 0 なら次をスキップ gotoct12 callswait btfsccountsw;入力が 0 なら次をスキップ gotoct12;確かでないなら戻る incfd1,1;加算 movlw10 subwfd1,0 btfss3h,2 gotoct11 clrfd1 incfd2,1 movlw10 subwfd2,0 btfss3h,2 gotoct11 clrfd2 incfd3,1 movlw10 subwfd3,0 btfss3h,2 gotoct11 clrfd3 incfd4,1 movlw10 subwfd4,0 btfss3h,2 gotoct11 clrfd4 ct11:callswait btfsscountsw;入力が 1 なら次をスキップ gotoct11;入力が 1 になるのを待つ callswait btfsscountsw;確かに入力が 1 に戻ったかを確認 gotoct11 ct12:movlw11111110b movwfrb movlw01101b movwfra;桁4へ表示 movfd4,0 movwfsd calll7ptset callwait movlw11111110b movwfrb movlw01110b movwfra;桁 3 へ表示 movfd3,0 movwfsd calll7ptset callwait movlw11111110b movwfrb movlw00111b movwfra;桁 2 へ表示 movfd2,0 movwfsd calll7ptset callwait movlw11111110b movwfrb movlw01011b movwfra;桁 1 へ表示 movfd1,0 movwfsd calll7ptset callwait gotoct10 ;********************************************************************* l7ptset:;sd に指定された 0~9 の数字をセットする bcf3h,0;キャリフラグのクリア rlfsd,1;4倍 rlfsd,1 movfsd,0;sd の値を w にコピー addwfpc,1;プログラム・カウンタに加算 movlw00000010b;0 movwfrb gotopt10 nop movlw11100110b;1 movwfrb gotopt10 nop movlw10010000b;2 movwfrb gotopt10 nop movlw11000000b;3 movwfrb gotopt10 nop movlw01100100b;4 movwfrb gotopt10 nop movlw01001000b;5 movwfrb gotopt10 nop movlw00001100b;6 movwfrb gotopt10 nop movlw11100010b;7 movwfrb gotopt10 nop movlw00000000b;8 movwfrb gotopt10 nop movlw01100000b;9 movwfrb pt10: return ;********************************************************************* swait:;カウント入力時のウェイト・ルーチン movlw6;6回のループ movwfswlc swt10movlw11111110b movwfrb movlw01101b movwfra movfd4,0 movwfsd calll7ptset callwait movlw11111110b movwfrb movlw01110b movwfra movfd3,0 movwfsd calll7ptset callwait movlw11111110b movwfrb movlw00111b movwfra movfd2,0 movwfsd calll7ptset callwait movlw11111110b movwfrb movlw01011b movwfra movfd1,0 movwfsd calll7ptset callwait decfszswlc,1 gotoswt10 return ;********************************************************************* wait:;ウェイトルーチン(1桁の表示時間) movlw100 movwflc wt10decfszlc,1 gotowt10 return

  • プログラムタイマーを探しています。

    昔買ったオーディオ用のタイマーの調子が 最近あまり良くないので、 新しい物を買おうと思いますが、 インターネットで検索しても 製品の機能が詳しく表示されていないので、 どれを買えば良いか分かりません。 現在使っているソニーのプログラムタイマーは 1985年頃購入したPT-D555ES で これは プログラム予約が7つ ACアウトレットは 連動3系統(A,B,C.)5個、 非連動1個 です。 これくらいの機能が備わっている物が希望です。 値段は2万円以下が良いのですが、 高くても構いません。 どなたか具体的な商品名(型番)や、 入手方法(地方に住んでいるので通販を希望)を 紹介して下さいませんか? 現在一般的に入手可能な物に限ります。 「もう昔あった様なプログラムタイマーは作られていない」 の様な話も聞きますので、 オーディオに詳しい方、どうかアドバイスを! よろしくお願い致します。