プログラミング初心者です。SH7144でエンコーダのパルス信号をそのまま出力する方法が分かりません。エンコーダ入力=出力だとエンコーダのエッジ検出が追いつきません。位相計数モードでカウントはできるのですが、出力波形をエンコーダのA相エッジカウント数(設定)で"1"を出力したいです。IRQでやるべきか、位相計数モードでうまくできるのかもわかりません。仕様としては、エンコーダから来る信号のA相エッジ数を検出し回数をカウント。あるカウント数になったら出力する。または出力を変える。分かる方教えてください。
「そのまま出力する方法が分かりません。」はマイコンの入力パルス信号をそのままマイコンが出力するで良いでしょうか?入出力ピンが無駄になるので、このようなことはしないと思います。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」を変数に設定してデバッグで表示しています。
よろしくお願いします。
おかれている状況(孤立無援?)からすると、ループ版で現状をしのぎつつ、裏で早期に一人前の階段を駆け上る必要がありそうですね。割り込みはこれからも必要になるはずですので、まずは簡単なサンプルを作成してトライしてみるのがマスターする早道だと思います。本にあればそれでも良いですし、MTUで一定時間毎に割り込み関数が呼ばれたら、例のトグルで信号を外部に出してみたり、LEDを点滅させてみたりすれば、わかってきますよ。
ここはマイコン掲示板なので、場違いな発言ですが、CPLDやFPGAでやった方が楽でしかも高精度なものが出来ます・・・やりたい事にフォーカスできれば、ベターな方法が幾らでもあるので1つの方法(マイコンを使う)に囚われないように頑張ってください。
Higetakaさん
本にはCMTの割込みは記載がなくて。。。
サンプル作成するにもどうやってパターンを作るかを考える時間も無く。。。
このプログラム作成で色々試して、勉強になりましたが、ずっと基板の開発をしているわけにもいかずなので。
この基板プログラムの作成が終わったらしばらくSH・C言語からは離れるでしょう。
下手に終わったのにプログラム作成とかしていると、上司の逆鱗にふれて怒鳴られるので。
まぁそういう職場なので。
実はこの基板のプログラムは先月末(6月末)までという期限でして、まぁまだ完成まではいきついてはいないと思うのですが。(もう違う仕事が...)
なかなかずーっとマイコンプログラムとにらめっこもできません。。。
2月からプログラムを本格的にやり始めて、LEDの点灯・点滅などから、スイッチ入力、デジタルスイッチ入力、デバック環境作りなど。途中3月中旬~5月末までは別の仕事していて、6月からプログラミング復帰。
上司に期限を言われ、かふぇルネでスレを立てて質問するようになりました。
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を割り込みでセットするならば、
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冊ほど自腹で購入しています。
知識武装なしの開発は竹槍で戦車と戦うようなもの。
戦場(開発現場)に出るときは戦死しないように知識武装してくださいね。
それにしてもセミナーや書籍費用も出さないなんてセコいなぁ。しかも、技術指導も無し(というか無能すぎて指導できない?)の放置プレーなんでしょ?良く言えば放任主義だが・・・これで、本棚に技術書とかが無かったら転職も視野に入れたほうが良いと思います。
一応、本棚?には技術書的なものはあります。
ただ、ここにこういう本があるという情報を仕入れたのはごく最近。
転職を視野に考えては年齢が厳しいので、知識武装を仮で武装しボロボロな状態で防御。。。
本日の午前中の進捗フォローも上司からのフォローは無い状態。(上司には逐一報告してます)
教えを乞うということをしても結局は「自分で考えろ」という職場です。
放置しては注意して、下手にインターネットで趣味的なサイトを閲覧したら、厳罰注意されるような会社で、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と同じようなことが書かれています。