SH7144

プログラミング初心者です。
SH7144でエンコーダのパルス信号をそのまま出力する方法が分かりません。
エンコーダ入力=出力だとエンコーダのエッジ検出が追いつきません。
位相計数モードでカウントはできるのですが、出力波形をエンコーダのA相エッジカウント数(設定)で"1"を出力したいです。
IRQでやるべきか、位相計数モードでうまくできるのかもわかりません。

仕様としては、エンコーダから来る信号のA相エッジ数を検出し回数をカウント。あるカウント数になったら出力する。または出力を変える。
分かる方教えてください。

Parents
  • 「そのまま出力する方法が分かりません。」はマイコンの入力パルス信号をそのままマイコンが出力するで良いでしょうか?入出力ピンが無駄になるので、このようなことはしないと思います。CPUあってのマイコンです。エンコーダのパルス信号を分岐してマイコンと他の回路に入力すれば良いように思います。

    「エンコーダ入力=出力だとエンコーダのエッジ検出が追いつきません。」は、エンコーダーの回転数が早くてマイコンがエッジ検出できないということでしょうか?7144だと50MHz以上では動作できなないのでこれ以上の信号は根本的に無理だと思います。また、汎用ポートで読み込んで汎用ポートで出力する場合の遅れが問題とも読み取れます。汎用ポートを読み込んで、汎用ポートから出力を続けて実行する以上のスピードは出せません。

    「カウントはできる」と「仕様としては、・・・・」からコンペアマッチで割り込みをかけて汎用ポートをセットするで行けそうな感じもしますが、やはりそれなりの遅延があります。PLDやACシリーズでカウンターとデコーダー回路を作っても数十nSの遅れは発生します。

  • ありがとうございます。参考になります。

    初めてC言語の制御プログラムを書くのと、SH7144の資料も乏しいので、できれば参考になるソースがあるといいのですが。

    エンコーダの入力はA相は(PA8)をTCLKCとして設定してあり、B相は(PA9)をTCLKDとして設定しています。

    (PA6)TCLKAと(PA7)TCLKBの足は壊れた??ので、入力できません。

    特に設定している記述は下記です。

    PFC.PACRL1.BIT.PA8MD=1

    PFC.PACRL1.BIT.PA9MD=1

    MTU2.TMDR.BIT.MD=4;

    カウントできるというのは、「MTU2.CNT」を変数に設定してデバッグで表示しています。

    よろしくお願いします。

  • 作りたいもの(実現したいこと)がハッキリしませんね(私の理解不足ですね)。私の勝手な推測ですが、具体例で言うとAerotech社で言うところのPSO(Position Synchronized Output)

    www.aerotech.com/.../advanced-controller-capabilities.aspx

    のようなものを実現したいのでしょうか?

    もしそうだとするとエンコーダAB相のカウンタ値を位相計数モードで取り込んで、そのカウンタ値はハードウェア(タイマユニット)で比較して出力しないと応答時間のジッタが無視できないと思います(直前までの書き込みを見ていると今のやり方ではジッタが数十マイクロ秒レベルで発生、一定ではない)。

    メインループ処理とかの議論が出ていますが、位相計数モードのカウンタ値をコンペアマッチで比較するという方法は試されたでしょうか?(それの実現の仕方が知りたいんですかね?)

    それとも本当に単純に、AB相入力のカウンタ値で位置情報を取得し、A相の変化だけを外部に出力したい?

    ちなみにですが、もし位置情報が16ビット以上必要なら位相計数モードのカウンタ値では飽和してしまうので、16ビットの位相計数モードのカウンタ値を定期的に取得し、前回の取得した値との差分を累積する方式にすれば32ビットなどへ拡張可能です(位相計数モードのカウンタ値は自動的に一周する、つまり0xFFFF→0x0000もしくは0x0000→0xFFFFになるように設定をお忘れなく)。

    あと、エンコーダは以前の書き込みから最大周波数で5MHzとなっていますが、接続しているエンコーダのインタポレーターの周波数は5MHz未満ですかね?たとえ、モーターが低回転でも、インタポレーターの周波数が5MHz以上ならパルス欠け(位置ズレ)が起こります。

  • 老婆心ながら、仕様の解釈があっているのか不安です。(たぶん、Shoji Yamamotoさんもそこを気にされているのでは?)

    通常、エンコーダで制御するという事は、速度もしくは移動量をある精度でスムーズに行いたいという意図があるはずです。

    システム全体の中で、担当されている部分が達成すべき仕様の客観的な指標(もしくは数値)はありますか?

    もし、ジッタ(ゆらぎ)が大きくなったとしたら、システム全体にどのような影響がありますか?

    それにより、今の処理の延長のままで良いかどうかが決まってきます。

  • Shoji Yamakmotoさん 、 Higetakaさん

    PSOの仕様を斜め読みしましたが、似ています。

    エンコーダのパルス10回に対して9回出力,1000回に対して999回出力を1000P/Rで1000rpm程度(30kHz程度までなので聞き違いかも)まででリニア出力というのが要求仕様です。何回出力するかを外部デジスイッチで設定します。

    コンペアマッチは試していません。

    方法が分からないというのが事実です。

  • もしかすると失礼な書き込みかもしれません。あらかじめお詫びします。

    私の予想では、mizuさんはほとんどマイコンプログラムの経験が無く具体的なタイマーの動作や割り込み処理の書き方の具体的なイメージが無いように感じます。7月1日のShoji Yamamotoさんの(それの・・・)の通りだと思います。6月16日に示唆してますが、SHは比較的シンプルなのでハードウエアマニュアルだけで何とかなるはずなので、11.1.MTUの特長・11.3.レジスタの説明・11.5.動作説明・11.5割り込み要因を読んでコンペアーマッチ機能の割り込みを使うのが良いと思います。11.6.動作タイミングも読んで詳細な遅れの確認も必要そうです。割り込みの具体的な書き方は、intprg.c内のINT_MTU2_TGIA2あるいはINT_MTU2_TGIB2が実行されるので、/* sleep(); */を書き換えればOKです。

    mizuさんの勤務先や上司がどのように考えているかは不明ですが、匿名の暇つぶしの掲示板(失礼な表現で申し訳ありません。)に部分的な情報で頼っていると時間がかかるだけでなく間違えも発生します。6月29日のmizuさんの書き込みからmizuさんの上司はすでに全体を把握しているように思えます。時間をとってもらってアドバイスをもらうのが良いと思います。「子供は社会が育てるんだ」と言う行政や有識者の発信で本来は親がすべきことを社会や学校に頼っている親が増えていることに似てます。立場的に難しいのかもしれませんが、この私の書き込みを見せるなどして、上司の考え方を変えてもらうのが最善に思えます。

  • 入力Nパルスに対してMパルスを出力するという処理ですね?

    パルス入力タイプの装置につないでモーターに連動させるための装置でしょうかね?(これが実際の開発だとしたら、秘密にする必要があるでしょうからこのコメントは見なかったことにしてください)。

    1/Nとかはコンペアマッチだけで簡単に出来そうですが、M/Nを出力するのはタイマだけでは出来ない気がします。電子ギアプログラムを書いて、位相計数モードの位置情報を電子ギアによりN→Mに変換して出力を取り出すのがいいかな?その時ですが、内部を一定のサンプリング時間を決めて動作ささせるようにすると良いかと思います。

    <周期タイマによる割り込み処理>

    ・入力エンコーダ値(位置情報)をサンプリング

    ・位置情報を電子ギアでN→M変換(割り算があるので余りを捨てないように気をつけてください)

    ・出力パルス吐き出し処理(タイマユニットを使うと上手く行くと思う、周期タイマに連動させる)

    「電子ギアってなんですか?」とかは流石にないですよね?こういうことを業務でやっているなら恐らく過去に作った資産(先輩のプログラム)があると思います。先輩や上司に聞いてみてください。

  • kijoさん

    ご指摘の通り、マイコンのプログラムは初めてです。

    シーケンサのラダーとかCシェルでテキスト文書変換(awk、sed等)は経験が多少あります。

    上司はSHを使用した経験は無く、HM63003をアセンブラでプログラミング経験があり、「俺は一人で設計したので、mizuもできる筈だから頑張れ」としか言われません。(たぶん、他界した人が最初にプログラムは起こしたと思う)

    今の基板の回路は他界した方(僕の入社前)が考えて、それを私が入手性からSH7144に置き換えて作りました。

    あと、強いて言うなら「開発(今から覚えるなら)するならC言語でやったほうが良い」ということを言われています。

    intprg.c内のINT_MTU2_TGIA2あるいはINT_MTU2_TGIB2が実行されるのは分かるのですが、そこにどのように記述すれば良いのかが分かっていません。

    関数を呼び出せば良いのでしょうか?

  • Shoji Yamamotoさん

    ご指摘の通りのプログラムを作ろうとしています。

    過去の資産は上記記載のとおり、HM6303のアセンブラしかありません。

    位置情報は不要です。位相計数モードのカウント値でサンプリングという表現が正しいのか、今はそのようになってます。

    私が経験不足でエンコーダの入力をリニアにコンペアマッチ出力する方法が分からないので、このようになってしまいました。

  • おかれている状況(孤立無援?)からすると、ループ版で現状をしのぎつつ、裏で早期に一人前の階段を駆け上る必要がありそうですね。割り込みはこれからも必要になるはずですので、まずは簡単なサンプルを作成してトライしてみるのがマスターする早道だと思います。本にあればそれでも良いですし、MTUで一定時間毎に割り込み関数が呼ばれたら、例のトグルで信号を外部に出してみたり、LEDを点滅させてみたりすれば、わかってきますよ。

  • ここはマイコン掲示板なので、場違いな発言ですが、CPLDやFPGAでやった方が楽でしかも高精度なものが出来ます・・・やりたい事にフォーカスできれば、ベターな方法が幾らでもあるので1つの方法(マイコンを使う)に囚われないように頑張ってください。

  • Higetakaさん

    本にはCMTの割込みは記載がなくて。。。

    サンプル作成するにもどうやってパターンを作るかを考える時間も無く。。。

    このプログラム作成で色々試して、勉強になりましたが、ずっと基板の開発をしているわけにもいかずなので。

    この基板プログラムの作成が終わったらしばらくSH・C言語からは離れるでしょう。

    下手に終わったのにプログラム作成とかしていると、上司の逆鱗にふれて怒鳴られるので。

    まぁそういう職場なので。

    実はこの基板のプログラムは先月末(6月末)までという期限でして、まぁまだ完成まではいきついてはいないと思うのですが。(もう違う仕事が...)

    なかなかずーっとマイコンプログラムとにらめっこもできません。。。

    2月からプログラムを本格的にやり始めて、LEDの点灯・点滅などから、スイッチ入力、デジタルスイッチ入力、デバック環境作りなど。途中3月中旬~5月末までは別の仕事していて、6月からプログラミング復帰。

    上司に期限を言われ、かふぇルネでスレを立てて質問するようになりました。

Reply
  • Higetakaさん

    本にはCMTの割込みは記載がなくて。。。

    サンプル作成するにもどうやってパターンを作るかを考える時間も無く。。。

    このプログラム作成で色々試して、勉強になりましたが、ずっと基板の開発をしているわけにもいかずなので。

    この基板プログラムの作成が終わったらしばらくSH・C言語からは離れるでしょう。

    下手に終わったのにプログラム作成とかしていると、上司の逆鱗にふれて怒鳴られるので。

    まぁそういう職場なので。

    実はこの基板のプログラムは先月末(6月末)までという期限でして、まぁまだ完成まではいきついてはいないと思うのですが。(もう違う仕事が...)

    なかなかずーっとマイコンプログラムとにらめっこもできません。。。

    2月からプログラムを本格的にやり始めて、LEDの点灯・点滅などから、スイッチ入力、デジタルスイッチ入力、デバック環境作りなど。途中3月中旬~5月末までは別の仕事していて、6月からプログラミング復帰。

    上司に期限を言われ、かふぇルネでスレを立てて質問するようになりました。

Children
  • Shoji Yamamotoさん

    CPLDやFPGAも経験はありませんが知識としてはあります。

    この基板プログラムも「FPGA化しても良いよ」と言われましたが、今の職場環境(WSやPC)の事を考えるとマイコンで考えてあった回路図(他界した人の回路)から考えた方が良いかなぁと。

    まぁマイコンなら簡単だろうという知らないのに勘ぐっている部分が多々ありまして。。。

    教えてくれる人も居ない。セミナーも受講させてもらえず。

    で今に至ります。

    自画自賛ですが、まぁよくここまで完成に近づけた?と思ってます。

    入社後に紙の回路図を渡されて、「これ作って」と言われ。

    中抜けでやり続けて、実質7ヶ月かかりましたが。

  • 一旦、欲しいソフトウエアから離れて具体的な割り込み処理の書き方をクリアにしましょう。MTUチャンネル2のTGRA_2 のインプットキャプチャ/コンペアマッチを例にしますが、SCIなど他の割り込みも同じです。MTUとCMTは異なる周辺モジュールですよ。

     

    ステップ1:

    intprg.cに割り込み要因ごとにとりあえず何もしない

    // 104 MTU2 TGIA2

    void INT_MTU2_TGIA2(void){/* sleep(); */}

    のようなファンクションが用意されてます。ここでPC0を割り込みでセットするならば、

    // 104 MTU2 TGIA2

    void INT_MTU2_TGIA2(void){

      MTU2.TSR.BIT.TGFA = 0;  /* 割り込みフラッグのクリア */

      PC.DR.BIT.B0 = 1;       /* ポートPC0(DSW0)をセット  */

    }

    でOKです。CQ出版TECH I Vol.41 SH-2マイコンで学ぶ組み込み開発入門109ページのリスト1の(b)と同じです。割り込み処理が増えてきたら、別ファイルに書いてexternal宣言が良いです。

     

    ステップ2:

    MTUのレジスタで割り込みがかかる設定にしておくのは当然ですが、割り込みコントローラーのレジスタで優先順位を設定しておかなければなりません。hwsetup.cなどの周辺モジュール初期化ファンクションで

    void HardwareSetup(void)

    {

      /* ・・・その他、周辺モジュールの初期化・・・ */

       MTU2.TIER.BIT.TGIEA = 1;    /* MTU2の割り込み許可 */

      INTC.IPRE.BIT._MTU2G=7;     /* 0~15でレベルを設定する。数字が大きい方が優先度が高い。0だと割り込みがかからない。*/

      /* ・・・その他、周辺モジュールの初期化・・・ */

    }

    のように設定します。CPUステータスレジスタでも割り込みをマスクできますが、デフォルトのままで割り込みは許可されているはずです。そのうちに勉強してください。

     

    SH7147を勉強した際のソースが見当たらないのでSH7144のハードウエアマニュアルを拾い読みして昼休み等に書いてます。誤り等は諸先輩方にご指摘いただけるでしょう。また、ハードウエアマニュアルもこのスレッド全体も丁寧に読んでいる余裕がありません。いまだに、mizuさんの欲しいもののイメージや上司の思い描いいているシステムが掴み切れません。とりあえず、SHの割り込みのきっかけになるように書き込みしてみました。

     

     

    私見です。ルネサスマイコンもリストラが必要と思います。なんとなくですがSHはフェードアウトしてRXと思ってます。だから、無料でも有料でもSH2のセミナーは無いようです。RXなら無料入門トレーニングコースもあります。私はいまだにMIL記号で負論理も使いながらロジック回路図を書いてますが、最近のPLDはHDLで設計することも多いようです。ソフトウエアとハードウエアはすでに境目があいまいです。私は、細かいことも後輩に教えることに賛成です。しかし、早く後輩が私を追い越して行ってほしいと思ってます。金で時間を買うことにも積極的です。この件も、ルネサス有料セミナーを受講していれば1ヶ月で解決したように思います。5ヶ月間のmizuさんの人件費を考えると費用は安くなったと思います。この考え方がないと、中国や東南アジアにも勝ち目は無く企業が生き残っていけないと思います。Mizuさんが時給で働く労働者なら期限は気にしなくても良いとおもいますよ。期限やできばいを予想あるいはモニターして具体的な指示を出すのが会社側の責務です。もし、経営者と一体の管理監督者なら自分で考える必要がありますが、イグゼンプトと言うことですから政府が発表した最低賃金は1070万円です。もらってますか?いつかは経営者だったころは考える労働者だったのですが、今の社会は違います能力主義、社外取締り役、輝く女性、グローバル化、ホワイトカラーイグゼンプションとはそういうことなんです。

  • kijoさん

    ありがとうございます。

    午前中、上司とその上の上司等に状況報告しまして、やはり「いつまでもやってるんじゃない」「いったいいつまでかかるんだ?」と問い詰められましたが、明確には答えられませんでした。。。

    今回の開発で割込みのプログラムを試す時間は無いかもしれません。(検証データ取りの量が多いので)

    でも解りやすい説明ありがとうございます。

    ちなみに、ルネサスマイコンセミナーの受講も上司には言ったのですが、却下されていますし、SH7144に関する書籍も2冊ほど自腹で購入しています。

  • 知識武装なしの開発は竹槍で戦車と戦うようなもの。

    戦場(開発現場)に出るときは戦死しないように知識武装してくださいね。

    それにしてもセミナーや書籍費用も出さないなんてセコいなぁ。しかも、技術指導も無し(というか無能すぎて指導できない?)の放置プレーなんでしょ?良く言えば放任主義だが・・・これで、本棚に技術書とかが無かったら転職も視野に入れたほうが良いと思います。

  • Shoji Yamamotoさん

    一応、本棚?には技術書的なものはあります。

    ただ、ここにこういう本があるという情報を仕入れたのはごく最近。

    転職を視野に考えては年齢が厳しいので、知識武装を仮で武装しボロボロな状態で防御。。。

    本日の午前中の進捗フォローも上司からのフォローは無い状態。(上司には逐一報告してます)

    教えを乞うということをしても結局は「自分で考えろ」という職場です。

    放置しては注意して、下手にインターネットで趣味的なサイトを閲覧したら、厳罰注意されるような会社で、PCのモニタを常に監視されている状態です。

    このカフェルネの投稿も上司の目を掻い潜って投稿。もしくは帰ってから投稿してます。

  • えっと。

    検証を続けていく上で。やはり、MTU.CNTの65536(=2^16)でリセット(=0)になる問題が発生しました。(たぶん)

    まぁ、自分のプログラムが悪いのは否めません。

    で。

    位相係数モードのカウント中でMTU.CNTをリセットするのは可能なのでしょうか?

    6/26のソースでいう、DIG1(変数)が0になったらリセット(=0)というのは動作中に可能なのか。知りたいです。

    カウントをスタートしている最中は(MTU.CNT)リセットできないという事がマニュアルに記載されていた様な。。。

    またそれに代替えする割込み処理などあれば、教えてほしいです。

    甘え過ぎですみません。。。

  • 私ごとですが、経験があるのはMTU2ユニット(SH7286)ですので完全に話が同じか分かりません。TCRレジスタにはCCLRビットというのがあって、これを設定すれば、一致条件でクリアできると思います(試したことはないです)。SH7286のデータシートの内容になりますが、位相計数モードでもCCLR1とCCLR0ビットは有効と書かれています。TGRAやTGRBの設定値でクリアできると思います(試したことは無いです)。

    SH7144のデータシートもSH7286と同じようなことが書かれています。

  • 今回の課題は「エンコーダA/B相入力のうち、A相エッジのカウント数により出力を切り替えたい」と認識してコメントします。
    (A相N分周波形を出力のイメージ)

    >位相係数モードのカウント中でMTU.CNTをリセットするのは可能なのでしょうか?

    位相計数を利用する場合は期待するアップ/ダウンカウントでTCNTがクリアされるように設定します。

    1. A相エッジ検出を行いたいので位相計数モード2を選択します
    2. CCLR(TCNTクリア要因)をTGRコンペアマッチにします
    3. TIORはコンペアマッチでトグル出力にします(初期状態は任意に選んでください)
    4. TGRにA相エッジカウント数を入力します(本件ではアップ/ダウンで2でしょうか)

    以上で期待するエッジ入力数があったときに自動で出力が切り替わります。(割り込み処理は不要です)

    的はずれでしたらご容赦ください。

  • Shoji Yamamotoさん Kon Nozomuさん

    ありがとうございます。

    別件の仕事でSH7144のプログラム開発から少し離れることとなりました。

    再開するときに試したいと思います。

    なかなか続けてプログラミングできる仕事環境ではないのが厄介です。。。

    私の要領の悪さもありますが。

  • 規模がおおきくない限り、専従の仕事ってのは少ないですよね。

    期間が開くと忘れてしまいがちですが、再開時にはスレッドから復習できるといいですね。