読者です 読者をやめる 読者になる 読者になる

ロボコニストの技術日記

知見や技術を備忘録として書こうかな

RX631の初期設定について(1) ~入出力&CMT編~

RX631

こんばんちは、ひふみです。

 

今回はRX631についての備忘録を書きたいと思います。

すーぐ忘れるんですよね、勉強したこと。事実、入出力とか少し忘れてます(大したことじゃないけど)。

雑談は置いておきまして、本題ですね。

今回の記事は、データシート読んでレジスタいじれるぜ!って人には向いてないかもしれません。データシート読んでもよく分からない。。。レジスタ・・・?うーん?って人に向いてるかもしれません。

 

それでは、始めていきます。

 

ひとつめは入出力についてです。入出力が出来たらLEDぺかーとかスイッチぽちーとかが出来ます。幸せですよね。かっこいいですよね。

それでも、入出力を自在に操るにはある程度データシートが読めないといけません。

入出力入出力と言っているように、大半のポート(ピン)は、入力と出力のどちらも行うことが出来るのです。それの何が問題かといいますと、そのポートを入力で使うのか出力で使うのか指定してあげないといけなくなるのです。そこで、データシートを眺めてみると、IOレジスタなるページがあります(IOについては特に説明しません、流石にこんなブログに来る人はわかってますよね)。そこのIOレジスタアドレス一覧をひたすらに眺めていくと、ありました。ポート方向レジスタです。レジスタシンボルはPDRと言うそうです。だからなんだ💢、と言いたくなりますよね、分かります。そこでおもむろに開発プロジェクトを開きましょう。そして、iodefine.hでなぜだかは知りませんがtrl+Fを押して、PDRと入力してEnterを押してみましょう。そこからは自明ですよね。

このレジスタを"0"か"1"にしてあげると入出力どちらかになるそうです。データシート参照のこと。

さて、入出力の設定が終わりました。次は、実際にIOを叩いてみましょう。IOレジスタアドレス一覧をそう長くない時間眺めてみると、ポート出力データレジスタと、ポート入力データレジスタといった文字列を発見することが出来るでしょう。ここからは、ポート方向レジスタと同じです。頑張って。

はい、IOについては以上です。1時間もかからない内に終わるでしょう。僕はだべりながら20分くらいで終わりました(書き込みに72時間かかったことは秘密です)。

IOが出来ると、ステッピングマウスを作っている場合は励磁が出来るようになります。楽しい。

 

さてさて、次はCMT(コンペアマッチタイマ)についてです。なぜコンペアマッチというかと言うと、タイマカウンタと任意に設定された定数の一致(match)を比較(compare)しているからです。RX631のCMTは2 チャネルの16 ビットタイマによって構成されるCMTを2 つ(ユニット0、ユニット1)、すなわち、4 チャネル内蔵しているらしいです。そして、4種類の分周クロックとコンペアマッチ割り込みを各チャネル独立に選択出来ます。

簡単なCMTの紹介は以上にして、次はCMTの動作の説明をしていきます。

まず、クロック選択ビットで分周クロックの選択をします。

次に、コンペアマッチタイマスタートレジスタを1にします。

そうすると、コンペアマッチタイマカウンタがカウントアップしていきます。そのカウンタがコンペアマッチタイマコンスタントレジスタにて設定された値とマッチした場合にカウンタの値が0hになり、コンペアマッチ割り込みが"1"になります(これには、コンペアマッチ割り込み許可を設定しておく必要があります)。そして、またカウンタがカウントを開始します。以下この繰り返しとなります。

これだけで見ると大変簡単なように見えますよね。僕も簡単やん!何これ簡単やん!って言ってました。過去形です。

 

・・・その理由は後ほど説明するとして、次はカウントのタイミングについて軽く触れます。ここは読み飛ばしても問題ありません。僕の趣味です。

分周クロック(PCLKの分周になりますが、RX631においてPCLKとはPCLKBのことを指します。)とコンペアマッチタイマカウンタのカウントタイミングです。これは、カウントクロックが発生し、これは立ち下がり("1"から"0"に切り替わる瞬間のこと)にカウンタが1増える、いわゆるネガティブエッジトリガと呼ばれるフリップフロップですね。このように、カウントクロックが発生してそれが立ち下がる毎に、カウンタの値が1ずつ増えていきます。以上がカウントのタイミングについての説明でした。フリップフロップ好きなんですよね。(勉強不足であります故、間違いがある可能性が高いので、強い人が読んでたら是非訂正してほしいです。)

同様に、コンペアマッチ割り込みが入るタイミングも、コンペアマッチ信号の立ち下がりによって発生します。

 

最後にCMT(他の機能もだいたいそうですが)を使う時の注意点だけ書いておきます。

RX631には、モジュールストップ機能というやつが存在しています。こいつが素人には中々厄介。。。こいつによって、CMTの動作禁止/許可を設定しないといけません。初期値ではCMTの動作は停止されていることになっています。それを解除することによって、レジスタアクセスが可能となります。こんな感じでデータシートを読みつつやれば動くと思います。

僕はまだ動いてません。ハハハ。

※追記:PCLKBの設定をしていませんでした。クソ楽しい。

※(7/5追記):7/1、先輩に最適化を取り除いてもらったところ、きちんと動作しました。 while(条件文) ; の何をどう最適化しているのでしょうね。最適化停止前にwhileでプログラムが停止していることは確認していました。なので、while自体が取り除かれている訳ではありません。よくわかりませんね。考えることはやめましょう。最適化の勉強もしないといけないですね。というか、プログラムの勉強からですかね。制御やらプログラムやら、処理的に綺麗なプログラムやらやることは盛りだくさんだ・・・。

 

あ、番外編として、メインクロックの設定についてもお話しようか。

メインクロックの設定は、クロック発生回路のブロック図辿れば誰でも設定出来ると思います。大して書くことはないですが、個人的にここのレジスタ叩くのが大好きです。論理回路好きだから、あ!逓倍した!あ!分周した!ってなっておもしろいんだよね。このクロック発生回路は、マイコンにおいて命の源とも呼べる機能なので、僕に直接聞いてくれると、熱く語り出すかもしれません。熱く語らないかもしれません。

 

それでは、また進捗が出次第ブログを書きたいと思います。ここまで読んでくださってありがとうございました。おやすみなしあ~