ラッチアップ
ラッチアップとは、CMOS系のIC内部に発生してしまうダイオードやトランジスタによって引き起こされる現象です。一度ラッチアップが発生してしまうと、電源を切るまでVDD端子からVSS端子に電流が流れ続け熱暴走が発生し、最悪の場合にはICを永久的に破壊してしまいます。
この現象がよく起きる場合として考えられるのがCMOS同士のICを接続した場合です。ラッチアップは、VDD端子に印加されてる電圧以上の電圧がCMOSのプッシュプルで構成されるピンに印加される場合などに発生します。そのため、CMOS同士のICを接続したとき、両ICに電源が正しく印加された状態でピンに出力信号(Highにする)を出さないとラッチアップが発生することになります。
簡単な防止策として挙げられるのは、
1. 電流制限抵抗の挿入
ラッチアップが発生する可能性が考えられるピン同士に直列に抵抗を挿入することによって流れる電流を制限します。これによってラッチアップ発生時にも過大な電流が流れることを止めることができます。しかし、これはあくまでラッチアップは発生してしまうので、防止策というよりは最悪の場合を回避する方法と考えられます。この場合、CMOSのプッシュプル回路を駆動させるのには一般的にほとんど電流を消費しないため、10kΩ程度の抵抗を挿入しても問題はないと考えられます。(これによってICに内部に形成されたトランジスタが増幅する電流を制限することができます。)ただし、高周波回路では抵抗を挿入することによって、配線に存在する寄生容量や寄生インダクタンと抵抗によってフィルターが形成され信号の劣化を引き起こす恐れがあります。
2. クランプ
ショットキーダイオードといった、降伏電圧が小さい電圧をVDDとPinの間に挿入することによってVDD端子よりPin端子の電圧が高くなることを回避します。これによってラッチアップを未然に防ぐことができます。しかし、CMOS系のICの接続をする場合において、多数のPinをパラレルで接続する際などでは多量のクランプ用のダイオードが必要となり回路規模の増大に繋がります。
3. 電源の印加手順
この現象を回避する方法の一つとして、すべてのCMOS系ICに電源が印加されたことを確認してから、Pinの電圧を操作することです。これによって未然にラッチアップを防ぐことができます。しかし、この方法ではすでに電源が投入されているICとの接続などで回避できない問題が発生することが考えられます。なので、小規模の回路などではプログラムと連携することによってこの問題を回避できるはずです。
このようにCMOS系のICにおいては電源の印加手順などを想定しこのような問題が発生しないように工夫するか、対策用の部品をつけることでこの問題を回避できます。
しかし、これは割と旧世代のICの話でありまして、最近のICではこのラッチアップが発生しないように内部が構成されているものもあるようです。
その見分け方としましては、ICのAbsolute Electric Characteristicなどの電源電圧の項目でVDD:0.3 to VDD+0.3のように書いてあるものはラッチアップが発生する可能性があります。
電源電圧の項目において、印加電圧が0-3.7Vのように指定されている場合はこれを回避しているICの可能性が高いです。いずれにしても、データシートで確認する必要がある項目の一つであると考えられます。
なぜ、このような記事を書いたかというとここ最近共同で回路を作ることがあり指摘されたからです笑
こういった知識は一つでも多くあると便利ですね。これまで製作してきた回路では、このような対策をしている箇所はごくわずかですが動作しているものもあります。必ずしも発生するわけではありませんが、予想することができないエラーを回避するということが回路製作では非常に重要であると考えられるので、このような知識は重要であると思います。
参考リンク
noritan-micon.blog.so-net.ne.jp
http://ednjapan.com/edn/articles/1407/news005.htmlednjapan.com
http://www.microchip.jp/docs/DS00763B_JP.pdf
CーMOS ICは電源をショートすることがある
RS Component Search
最近、回路図を制作する際にこちらのサイトがとてもとてもとても役に立っております。
もうこれなしでは回路図を作れない身体になりそうです笑
どんなサイトかというと、回路図に組み込みたいパーツを検索して、そのCADデータを提供してくれるサービスです。(会員登録は必要です。無料。)
今まで、ちまちまCADデータを作っていたのがまるで嘘みたいです。初期のライブラリにないようなCADデータがたくさんあるような回路は作るのも億劫になりますからね・・・笑
使い方は至極簡単です。
1. 欲しいパーツを検索する。
試しにFT231XS
一覧が表示されるので、
このマークをクリックします。
こっちのマークはCADデータがありません。
2. CADデータをダウンロードする。
このマークを押してダウンロードする。
一緒にRSでのPRICE・STOCKやデータシートが見れるのは神ですね。
3. CADデータを使う!
中身がこんな感じのzipファイルをダウンロードできるので、EAGLEフォルダのFT231XS-R.lbrをEAGLEのlbrに追加すればあら簡単にCADデータを入手できます。
とても素晴らしいサービスです。これからも重宝しそうです。
ただ、無料のサービスなのでCADデータを信じるかどうかはまた別のお話ですね。
ちなみにCADデータがない部品も
package categoryを選んで、LAUNCH WIZARDでCADデータを設計することができます。ただこれはある程度知識がある人がやったほうがいいとは思います。REQUESTを出すこともできます。
Fusion PCB 発注 基板到着編
Fusion PCBから基板が届きました。
注文1(8/7)
embedded-blog.ccwo.net
注文2(8/14)
embedded-blog.ccwo.net
2つ注文しました。バラバラに頼んだのですが両方同時に来ました。あと、困ったのがずっと注文のステータスがProcessingだったのですが、突然来てびっくりした。
というわけで
注文1 | 注文2 | |
注文 | 8/7 | 8/14 |
到着 | 8/23 | 8/23 |
日数 | 16 | 9 |
値段 | $23.37 | $23.52 |
とよくわからない結果になりました。同じところに送る注文が来たから一緒に送ったのですかね?
届いたもの(変なシールが一緒に入ってた。あとクーポン。)
注文1 表
注文1 裏
注文2 表
注文2 裏
割りとシルクもきれいだしおおむねよいのでは?ただ、位置が微妙にずれてるのがあるのと、少し小さすぎるフォントは潰れかけてる気がします。(よくないのかこれ
追記:シルクがベクターに変わっていたの忘れていた。brd書くときはベクターにしていたけど、基板届いて違和感があったのはそのためか。あと、基板のどこかにfusion pcb側から製造番号みたいなのが印字されるみたい。
何枚か実装してみた
注文1 実装後
注文2 実装後
久しぶりにたくさんはんだ付けしたら疲れましたね・・・
注文1 試作品
注文2 試作品
動作確認もしたのでプログラム進めていきたいですね~~~!
Fusion PCB 発注 注文編2
ちょっと前から使っているマイコンがあって、ようやっとプログラムとかが整理できたので使いたい機能をあらかた引き出して基板にしました。
これもAD変換の関連なのですが、電源とグランドに少し気を配ってみましたとさ。
今回は青色で頼んでみました。
来るのが楽しみです。
注文するのもだいぶ慣れてしまいました。
gerber viewer便利だな~って思ってましたけど、ガーバーデータを見ることのできるソフトもあるんですね・・・これで確認すればよかったのか・・・
gervっていうソフトを使ってみましたけど、よかったです。
Fusion PCB 発注 注文編 1
Fusion PCBがセールをしてるとのことなので発注してみました。
ただし、10枚$4.9に送料がDHL(4~5営業日)で$18かかるので、ある程度まとめて注文するほうがいいのかな?
今回は簡単なAD変換のモニター基板を注文しました。
Fusion PCBで注文するのは初めてだったので、公式ページなどなど参考にしながら注文してみました。(過去にはElecrowでの注文経験があります。)
- 開発環境
EAGLE 8.2.2 premium
- 注文
Knowledge Base – Feedback & Ideas for seeed
公式の手順を参考に順に進めていきます。
手順としては、
0. 基板図を完成させる。
1. デザインルールチェック用のdruファイルとガーバーデータ出力用のcamファイルを入手する。
2. デザインルールチェックを行い基板図がルール違反していないかを確認する。
3. ガーバーデータを出力する。
4. 必要なファイルをまとめて、注文する。
という具合です。順にみていきます。
ちなみに
デザインルールチェック:設計した基板図が実際に製造できるルールを守っているかをチェックします。回路図が問題なければ基本的にここに違反がなければ動くはずです。
ガーバーデータ:製造側が用いる設計データ。
という感じです。またこれらは、各業者によってルールなどが違うのでその都度確認しておく必要があります。また、課金すれば柔軟に対応してくれるオプションが存在したりもします。
0. 基板図を完成させる。
今回はこんな感じ。むっちゃ簡単たいしたものではない。
1. デザインルールチェック用のdruファイルとガーバーデータ出力用のcamファイルを入手する。
上記のリンクの3. Design rules EagleにDRU for 2-layer boardというリンクがあるのでダウンロードしてこれをdruに適応します。
上記のリンクの4. check the error of your designの下にSeeed Gerber Generatre 2-layer boardというリンクがあるので、ダウンロードしておきます。
2. デザインルールチェックを行い基板図がルール違反していないかを確認する。
ダウンロードしたdruファイルをEAGLEに適応して、デザインルールチェックを行います。これは基板図の設計と同時に行ったほうがいいとは思います。
3. ガーバーデータの出力
ガーバーファイルを出力する方法 – Feedback & Ideas for seeed
Eagle9.2からガーバーファイルを出力する方法 – Feedback & Ideas for seeed
今回はEAGLEを使ったのでこちらを参考にしました。
4. 必要なファイルをまとめて、注文する。
必要なファイルは今回ですと、
Top Layer: pcbname.GTL
Top Solder Mask: pcbname.GTS
Top Silkscreen: pcbname.GTO
Bottom Layer: pcbname.GBL
Bottom Solder Mask: pcbname.GBS
Bottom silkscreen: pcbname.GBO
Board Outline:pcbname.GML/GKO
Drills: pcbname.TXT
Inner Layer: pcbname.GL2(for 4 layer)
Inner Layer: pcbname.GL3(for 4 layer)
が必要になるみたいです。
Fusion PCB プリント基板の製造・設計・実装 - Seeed Studio
最後に実際の注文はこちらから行いました。特に初期から設定は変えませんでした。電流も電圧もたいした量は扱わないので。また、選択肢の意味がわからなくても、?マークにマウスを持っていけば簡単な説明があるので、大丈夫ですね。
というわけでさっくりと注文してみました。届くのが楽しみです。
ちなみにこのファイルアップロード後に表示できるFusion Gerber Viewerはむっちゃくちゃ便利ですね。今までElecrowだと実際の仕上がりが届くまで不安だったのですが、これならある程度シルクやビアの感じが事前に把握できるので重宝しました。今回これのおかげでGNDビアのName変更を忘れていたビアを見つけることができましたし非常に助かりました。
MacでEAGLE!プリント基板製作入門(26)│ツール・ラボ
Eagleの使い方:ボード図での部品スマッシュ | easy labo
また、EAGLEでの基板図の設計後こちらで注文前の下準備もしました。今回始めてSMASHなども気にしてしっかりと基板図を完成させました。
Printed Circuit Board Trace Width Tool | Advanced Circuits
こういったサイトを使って、線幅やOzを見積もったりもします。(モータードライバ等の大電流系や高周波基板なら気にしたほうがもちろんよい。)ただ、今回は試作をエッチング基板でしたので、動くという経験則から線幅等は設定しました。
ざっくりとした説明になってしまいました。EAGLEの細かい設定等も説明するとえらいことになるので、EAGLEをある程度使える人向けで・・・すいません。
MDK-ARMとHAL Driver メモ書き
STM32CubeMXのメモ書き
STM32CubeMXがMDK-ARM V5に生成するものの
- main.c
内蔵モジュールの初期化するコードが含まれるので基本的にユーザはmain.cのみを修正する。
Clock,GPIOもここに生成される。
- stm32f4xx_hal_it.c
割り込み関連の設定が生成される。割り込み関数はここで定義されている。
- stm32f4xx_hal_msp.c
内蔵モジュールの初期化コードから呼び出される関数が生成される。
- Time base: System tick timer
デフォルトでEnableになっている。これはCMSISに基づくライブラリ。
の3つが基本的に生成されあとは各モジュールごとのファイルがDrivers/STM32F4xx_HAL_Driverフォルダに生成される。
MDK-ARMのメモ書き
- MDK-ARMの最適化設定は
左のプロジェクトツリー最上位のプロジェクトを選択し、Project→Options for Target 'Project Name'を選択し、C/C++タブに存在する。
- デバッグボタンは押しても最新のビルドが更新されるわけではない。
STM32 開発環境の構築<3>
またまた、STMを使ってみようかなと思いまして開発環境を構築しました。
なんと・・・
embedded-blog.ccwo.net
embedded-blog.ccwo.net
前回STMの開発環境を調べていたのがちょうど1年ほど前で、時の流れは残酷です。
今回はSTM32F303K8を使って、ペリフェラルを徐々に使えるようにしてモータードライバのマイコンにしてみたいと思います。
なので、PWMとENCODERとかCANとかADCとかDACとかもろもろ使えると便利なのかな。
開発環境は前回に引き続き、
ハード:STM32 Nucleo Board Nucleo STM32F303K8
ソフト:CubeMX + AC6 System Workbench for STM32
でやっていきたいと思います。無料でフルサイズコンパイルできるし、GUIでペリフェラルの設定ができて、関数等(HAL Driver)も生成してくれるから、これが今かなり現実的で比較的楽な開発環境なのではないでしょうか?1年前に記事を書いたときはまだまだ日本語の記事が少なかったのですが、最近調べているとこの組み合わせでやってる人が増えていてかなり嬉しいです。
簡単に構築方法を
- the System Workbench for STM32のインストール
1. OpenSTM32 Communityに会員登録をします。
http://www.openstm32.org/HomePage
2. インストーラーをダウンロードします。
http://www.openstm32.org/Downloading+the+System+Workbench+for+STM32+installer
Zipped installer: install_sw4stm32_win_64bits-v2.1.zip
これをダウンロードして解凍して、インストールします。exeじゃなくてzipじゃないとwinはだめ。
- Cube MXのインストール
http://www.st.com/content/st_com/ja/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-configurators-and-code-generators/stm32cubemx.htmlhttp://www.st.com/content/st_com/ja/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-configurators-and-code-generators/stm32cubemx.html
STに会員登録して、一番下からダウンロードしてインストール。
と言った感じで簡単です。
参考サイト
- 開発環境構築方法
- STM32F4のHALの資料
http://www.st.com/content/st_com/ja/products/embedded-software/mcus-embedded-software/stm32-embedded-software/stm32cube-embedded-software/stm32cubef4.htmlwww.st.com
UM1725: Description of STM32F4 HAL and LL drivers
UM1743: STM32CubeF4 demonstration platform
- ボードの資料
http://www.st.com/ja/evaluation-tools/nucleo-f303k8.htmlwww.st.com
UM1727: Getting started with STM32 Nucleo board software development tools
UM1956: STM32 Nucleo-32 board
- チップの資料
http://www.st.com/ja/microcontrollers/stm32f303k8.htmlwww.st.com
RM0316: STM32F303xB/C/D/E、STM32F303x6/8、STM32F328x8、STM32F358xC、および、STM32F398xE 高性能 ARM ベース 32 ビット MCU
PM0214: STM32F3, STM32F4 and STM32L4 Series Cortex®-M4 programming manual
それにしても資料はすごい充実してますね。
なんか最近すごいやる気がなにごとにも起きなくて、ブログに書けばある程度やる気がでるかなと短絡的な思いから書いてみます。
STM32 開発環境の構築<2>
ここまでいろいろと開発環境見てきましたが、とりあえず使っていくもの決めました。
IDE
- STM32CubeMX(ハードウェアのGUI IDEということで)
- System Workbench for STM32
- MDK-ARM
で行こうと思います。プロジェクは適宜いろいろと使っていきたいです。
mbedから、CubeMXから、STMサンプルから、IDEデフォからとありますが、プロジェクトに合わせて選んでみたいです。
今はCubeMXから使っています。
ここでSystem Workbench for STM32とMDK-ARMを選んだのは、
prtimes.jp
記事にある通り、コード・サイズの制限がなく、無償であり、各種評価ボードのハードウェアの準備があるところです。(見た目もIARほど悪くはないですし(´・_・`))
追記(2016/9/14):MDK-ARMはコード制限32kBになっています。
メインはSystem Workbench for STM32を使いたいと思います。RX等でもEclipseベースのe2 studio使ってるので、既視感多いですし、なにかと使い勝手がよさそうだと感じだからです。
サブにはMDK-ARMを使いたいと思います。MDK-ARMを使用されている方が多いということもあり、HAL Libraryの使い方が同じIDEでデバッグできるようにしておくと便利かと思います。加えて、友人から
定番!ARMキット&PIC用Cプログラムでいきなりマイコン制御[DVD-ROM付き] (マイコン活用シリーズ)
- 作者:芹井 滋喜
- 発売日: 2016/01/29
- メディア: 単行本
という感じで、STM32がしがし使っていきたいです。
STM32 開発環境の構築<1>
STM32の評価ボードNucleoシリーズを何個か買って放置してたので、開発環境を構築したい(願望
もっているNucleoシリーズは
- F401RE
STM32 Nucleo Board STM32F411RE: マイコン関連 秋月電子通商-電子部品・ネット通販
F401で開発している記事が多かったのでとりあえず出来そうなのはこれかな~って選んでみた。
- F411RE
STM32 Nucleo Board STM32F411RE: マイコン関連 秋月電子通商-電子部品・ネット通販
F4シリーズでハイスペックなのはどれかな~ってみていて、これがピンときたので選んでみた。
- F303K8*2
STM32 Nucleo Board STM32F303K8: マイコン関連 秋月電子通商-電子部品・ネット通販
これはCANが付いてたので、迷うことなきと思って選んでみた。
とりあえずCAN通信試すために2つ買ってみた。チップも買ってみたけど、ハードの最小回路ぜんぜんわからないのでとりあえず放置。
今のところ調べてみた結果まずはIDEについて。
- mbed Online
- KEIL社 MDK-ARM
- IAR社 EWARM
- Atolic社 TrueSTUDIO
- ST社 System Workbench
- gccが使用可能なIDE
となっています。とりあえず全部入れてみましたが・・・どれがいいのかわからないっす(´・_・`)
System Workbenchはeclipseのエラーでうまくビルドできない・・・全部x32でやったほうがいいのかな~一部x64でやるとダメかもしれない。
(どの開発環境もMPLABXもびっくりなくらい大きいのでSSDの中身が~~~~!はやいとこ選んで消してしまおう(´・_・`)あと何回ST-LINKのドライバーがインストールされたんだこれw)
TrueSTUDIOとSystem WorkbenchはEclipseベースになってます。
しかし、TrueSTUDIOはプロジェクトがStandard Peripheral Libralyで作成されます。現状ではHAL Driverに移行しているため、あまり現実的ではないかと。(サポートがなくなる。)
他のIDEはHAL Driveでの開発となります。
EWARMは見た目がHEW並でe2 studioとか豪華なIDEに慣れてるとつらそう(小並感
ボード、マイコンのライブラリをあとづけするのもあるのですが・・・どれもでかいよ~~・・・
デバッガについて。
- ST社 ST-LINK/V2
- KEIL社 U-LINK
- IAR社 I-Jet
- Raisonance社 R-LINK
- 他にも何個か
となっています。とりあえずST-LINK買ってみたいと思います。
NucleoにはST-LINKと同等の回路がついてるのでそのままデバッグ可能です。
ソフトウェアについて。
ハード、コンフィギュレーションの設定をしてくれるSTM32CubeMXというものがあります。これは評価ボードも含めてマイコンの初期設定をGUIで行えます。
とりあえず使っていきたいと思います。
他にもプロジェクトを作る方法として、
- 各IDEそれぞれでプロジェクトを作成する。
- STM32CubeMXから、各IDEへプロジェクトを出力する。
- STM32の各シリーズのテンプレートプロジェクトが各IDEに対してSTMから配布されています。
- mbed Onlineから各IDEへプロジェクトを出力する。
ざっとこれくらいでしょうか。あとは各IDEで自分でレジスタを埋めていくとかですかね・・・
この中でとりあえず使えそうな組み合わせを選びたいと思います。
Renesas RX Flash Programmer 追記
RX631開発でRenesas Flash Programmerでの書き込み方法を書いたのですが・・・(両方ともほぼおなじ内容、USB directかCOMでの書き込みかの違いくらい)
RX631→
embedded-blog.ccwo.net
なんと今は!v2.05.03ではなくてv3.01.00が出ていると今日教えてもらいました。知らなかった!
こちらでダウンロード可能です。(2016/8/25現在)
Renesas Flash Programmer (Programming GUI) | ルネサス エレクトロニクス
シリアルポートを使用した書き込み回路例のPDFもあったので→
https://www.renesas.com/ja-jp/doc/products/tool/doc/001/r20ut0857jj0300_rfpsplcrct.pdf
とりあえずRX621のCOM接続で使ってみました。
少しシンプルになった気がします。
ファイル→新しいプロジェクトを作成を選択します。
これもプロジェクトの場所はわかりやすい場所にしたほうが良さそうですね。
マイクロコントローラ→RX62x
ツール→COM
を選択します。
RXの接続されたCOM番号を選択し、OKを選択します。
ココに戻って、接続を押します。
メインクロック12MHzを入力し、OKを選択します。(マイコンに入力しているメインクロックをいれればいいかと思います。)
接続が成功しました。
あとはプログラムファイルから「 ~/(e2studioプロジェクト名)/HardwareDebug/(e2studioプロジェクト名).mot」
を選択し、スタートを押せば書き込み完了です。
接続設定タブで115200bpsに変更したほうが書き込みは速くなります。
ひとまず他にも設定あるみたいですが、これで以前のように使えそうです。
なんとなく使いやすくなっているような気がします。気がするだけかもだけど。
Renesas RX621 余談<1>
これでRX621の通信以外の主だった機能の初期化を完了できたと思います。
ここまででhardware_setup.c内のHardwareSetup関数は
void HardwareSetup(void) { Clock_initialize(); Pin_initialize(); SCI1_initialize(); CMT0_initialize(); CMT1_initialize(); S12AD_initialize(); RTC_initialize(); }
となっていると思います。
RX631ではピンの設定が一括されている反面RX621ではモジュールによってまちまちなところが使いにくかったりしますかね。
ただ、RX621はクロック設定が非常に簡単なので、その面ではいいかもしれません。
RX621,RX631ともに設定方法はあまり変わらないと感じていただけたらいいかと思います。
あわてず、じっくり、参考ブログ等を参考に、データシートをよみ、正確に設定していけば、つまづくところもあるとは思いますが、なんとかやれるとは思います。
通信関係はどこで止まっているかデバッグが難しかったりしますが、根気よく丁寧に通信関数等を作成していけば、きっといけると思います。
もし、自分がRXを使う機会があれば通信部分を追記するかもしれせんが、今のところ予定はありません。普段はPIC、STM、Arduinoを使用しているので・・・
自分の使用しているPIC、STMのことがまたいつかかければいいと思います。
RX621、RX631は一旦ここで終わりにしたいと思います。
ただ、割り込みの設定はRX621,631で共通しているので書くつもりでいます。
まだ、DMA、DAC、CAN、I2C、SPIなど面白い機能もたくさんあるので、ぜひ開発していってください。
コメント等いつでも大歓迎なので、下の方にコメントお願いします!
Renesas RX621 RTC
RTCの設定をしたいと思います。
RTC=リアルタイム・クロックとは、正確に1sなどを計測したり、カレンダー機能を使用するために用いられます。
今回は正確に1sを計測し、1s毎に割り込みを呼びたいと思います。
hardware_setup.cにて以下のRTC_initialize関数を作成し、HardwareSetup関数で呼びましょう。
ただし、サブクロックに32.768kHzの水晶発振子等を接続する必要があります。
RTC_initialize関数等をhardware_setup.cに追加
#include "vect.h" #pragma interrupt (RTC_PRD_interrupt(vect=VECT(RTC, PRD))) unsinged int time; void RTC_initialize(void){ RTC.RCR1.BIT.PIE = 1; // Enable Period Interrupt RTC.RCR1.BIT.PES = 6; // 1s Period RTC.RCR2.BIT.START = 1; // Enable RTC IPR(RTC, PRD) = 11; // Interrupt level 11 IEN(RTC, PRD) = 1; // Enable PRD interrupt while(!RTC.RCR2.BIT.START) ; // Wait RTC.RCR2.BIT.RESET = 1; // Clear PreScaler, 64HzCount, Alarm Register } void RTC_PRD_interrupt(void) { time++; }
それではRTCの設定手順を見ていきましょう。
1.モジュールスタート(消費電力低減機能の解除)
2.ピンの設定
3.RTCの設定
4.ユーザ関数の定義
1.モジュールスタート
RTCの消費電力低減機能はありません。
2.ピンの設定
同期等して使うピンは今回設定しません。1s周期で出力するピンを設定することもあります。
3.RTCの設定
RTC.RCR1.BIT.PIE = 1; // Enable Period Interrupt RTC.RCR1.BIT.PES = 6; // 1s Period RTC.RCR2.BIT.START = 1; // Enable RTC IPR(RTC, PRD) = 11; // Interrupt level 11 IEN(RTC, PRD) = 1; // Enable PRD interrupt while(!RTC.RCR2.BIT.START) ; // Wait RTC.RCR2.BIT.RESET = 1; // Clear PreScaler, 64HzCount, Alarm Register
上記のようし1sでPRD割り込みが呼ばれるように設定します。
4.ユーザ関数の定義
#include "vect.h" #pragma interrupt (RTC_PRD_interrupt(vect=VECT(RTC, PRD))) void RTC_PRD_interrupt(void) { time++; }
これまでと同様にpragmaにてベクト番号=VECT(RTC,PRD)でRTC_PRD_interrupt関数を呼ぶように設定します。
これで計測が開始されてから変数timeが1秒おきにカウントアップしていきます。
ただし、変数timeはunsigned intなので65535になるとオーバーフローし、0に戻ります。
20160822の記事
Renesas RX621 12bitADC
12bitADCの設定をしていきたと思います。
12bitADCとは12bit Analog Digital Converterの略で、マイコンのAVDDとAVSS間に印加された電圧を基準に、ピンに印加された電圧を12bitのディジタル値に変換することができます。
これにより、アナログ電圧を出力するセンサー等の値をマイコンで扱えるようにすることができます。
ここで、RX621では8chの12bitADCがあるのですべてを使いたいと思います。
それでは、S12AD機能を用いて、AD変換の設定をしていきたいと思います。
まず、e2 stduio左側プロジェクトエクスプローラのプロジェクトフォルダ内のsrcフォルダを右クリックし,
新規→ソース・ファイルからS12AD.c
新規→ヘッダ・ファイルからS12AD.h
を作成します。
ソースコードの追加はプロジェクトファイルのsrcフォルダに直接作成することでも可能です。
つぎに、hardware_setup.cにてS12AD.hをインクルードし、HardwareSetup関数でS12AD.cのS12AD_initialize関数を呼びます。
S12AD.h
#ifndef S12AD_H_ #define S12AD_H_ extern unsigned short ADC12[8]; void S12AD_initialize(void); #endif /* S12AD_H_ */
S12AD.c
#include "iodefine.h" #include "machine.h" #include "vect.h" #pragma interrupt (S12AD_ADI_interrupt(vect=VECT(S12AD, ADI))) unsigned short ADC12[8]; void S12AD_initialize(void){ MSTP(S12AD) = 0; // Wake up S12AD S12AD.ADCSR.BIT.EXTRG = 0; // Trigger = ADSTRGR: Software Trigger S12AD.ADCSR.BIT.CKS = 0; // PCLK/8 S12AD.ADCSR.BIT.ADIE = 1; // Enable S12ADI0 S12AD.ADCSR.BIT.ADCS = 1; // Continuous scanning S12AD.ADCSR.BIT.ADST = 0; // Stop S12AD S12AD.ADANS.WORD = 0xFF; // S12ADC: AN0-7 S12AD.ADADS.WORD = 0x00; // Disable ADD result Mode S12AD.ADCER.BIT.ACE = 1; // Auto clearing S12AD.ADCER.BIT.ADRFMT = 0; // Right -justified S12AD.ADCSR.BIT.ADST = 1; // Start S12AD IPR(S12AD, ADI) = 6; // Interrupt level6 IEN(S12AD, ADI) =1; // Enable ADI interrupt } void S12AD_ADI_interrupt(void){ ADC12[0] = S12AD.ADDR0; ADC12[1] = S12AD.ADDR1; ADC12[2] = S12AD.ADDR2; ADC12[3] = S12AD.ADDR3; ADC12[4] = S12AD.ADDR4; ADC12[5] = S12AD.ADDR5; ADC12[6] = S12AD.ADDR6; ADC12[7] = S12AD.ADDR7; }
つぎに、vect.hの
// S12AD ADI #pragma interrupt (Excep_S12AD_ADI(vect=102)) void Excep_S12AD_ADI(void);
をすべてコメントアウトします。
また、メイン文にて
main関数
#include "iodefine.h" #include "machine.h" #include "S12AD.h" #include <stdio.h> void main(void) { static unsigned int i; while(1){ printf("ADC[0]:%4d\tADC[1]:%4d\tADC[2]:%4d\tADC[3]:%4d\nADC[4]:%4d\tADC[5]:%4d\tADC[6]:%4d\tADC[7]:%4d\n", ADC12[0],ADC12[1],ADC12[2],ADC12[3],ADC12[4],ADC12[5],ADC12[6],ADC12[7]); for(i = 0; i < 65000; i++) nop(); } }
などと、記述してデバッグを行いましょう。おそらく値が震えているはず。その状態で成功となります。
No Connection Pin(未処理ピン)は、Hi-Z状態のため値が震えます。
それではS12ADの設定手順をみていきます。
- モジュールスタート(消費電力低減機能の解除)
- ピンの設定
- S12ADの設定
- ユーザ関数の定義
1.モジュールスタート(消費電力低減機能の解除)
MSTP(S12AD) = 0; // Wake up S12AD
消費電力低減機能を解除します。RX631のようにアクセスロックはないので、そのまま解除します。
MSTPCTRレジスタがiodefine.hでMSTP(****)というようにデファインされているのでこれを使用します。
2.ピンの設定
S12AD設定内でchを有効にすると自動的にS12ADにピンは接続されます。
3.S12ADの設定
S12AD.ADCSR.BIT.EXTRG = 0; // Trigger = ADSTRGR: Software Trigger S12AD.ADCSR.BIT.CKS = 0; // PCLK/8 S12AD.ADCSR.BIT.ADIE = 1; // Enable S12ADI0 S12AD.ADCSR.BIT.ADCS = 1; // Continuous scanning S12AD.ADCSR.BIT.ADST = 0; // Stop S12AD S12AD.ADANS.WORD = 0xFF; // S12ADC: AN0-7 S12AD.ADADS.WORD = 0x00; // Disable ADD result Mode S12AD.ADCER.BIT.ACE = 1; // Auto clearing S12AD.ADCER.BIT.ADRFMT = 0; // Right -justified S12AD.ADCSR.BIT.ADST = 1; // Start S12AD
S12ADはデータシートに初期化手順が示されているわけではないので、今回は連続スキャンモードを参考に設定していきます。
しかし、ここで余談ですが、RXに限らずマイコンのAD変換の設定はおおまかに
・AD変換クロックの設定(モジュールの動作周波数の設定)
・トリガ、割り込みの設定(AD変換のトリガの設定)
・AD変換chの設定(何個AD変換を使用するの設定)
・加算、フィルタの設定(精度を上げたりするための設定)
・データ型の設定(右詰め、左詰め(Little,Big Endian=Byte-order)の設定)
・サンプリング周期の設定(AD変換には一般的にある程度の時間を要さないと構造的に精度が出ないためサンプリング時間の設定をする。)
RX621もほぼ例に漏れることなく設定していく。
つぎに、タイマー割り込み同様に割り込みの設定をする。
IPR(S12AD, ADI) = 6; // Interrupt level6 IEN(S12AD, ADI) =1; // Enable ADI interrupt
4.ユーザ関数の定義
#include "vect.h" #pragma interrupt (S12AD_ADI_interrupt(vect=VECT(S12AD, ADI))) void S12AD_ADI_interrupt(void){ ADC12[0] = S12AD.ADDR0; ADC12[1] = S12AD.ADDR1; ADC12[2] = S12AD.ADDR2; ADC12[3] = S12AD.ADDR3; ADC12[4] = S12AD.ADDR4; ADC12[5] = S12AD.ADDR5; ADC12[6] = S12AD.ADDR6; ADC12[7] = S12AD.ADDR7; }
ベクタ番号=VECT(S12AD, ADI)でS12AD_ADI_interrupt関数が呼ばれるようにpragmaにて設定をします。
これでS12ADの設定は完了です。割り込みを使用しない場合はS12AD.ADDR0~7に値が入っているのでこれをタイマー割り込み等でバッファするのがいいかと思います。
20160822の記事
Renesas RX621 エンコーダ
RX621では最大4つエンコーダを計測することができるので、MTU1,2,7,8を位相係数モード1に設定していきます。
hardware_setup.cにて以下のMTU2_initialize関数にMTU9(PWM)の設定に続けて設定していきます。
MTU2_initialzie関数
void MTU2_initialize(void) { // MTU1,2,7,8 MSTP(MTU1) = 0; // Wake up MTU1 MSTP(MTU2) = 0; // Wake up MTU2 MSTP(MTU7) = 0; // Wake up MTU7 MSTP(MTU8) = 0; // Wake up MTU8 PORTC.ICR.BIT.B0 = 1; // Enable PC0 receive buff PORTC.ICR.BIT.B1 = 1; // Enable PC1 receive buff PORTC.ICR.BIT.B2 = 1; // Enable PC2 receive buff PORTC.ICR.BIT.B3 = 1; // Enable PC3 receive buff PORTC.ICR.BIT.B4 = 1; // Enable PC4 receive buff PORTC.ICR.BIT.B5 = 1; // Enable PC5 receive buff PORTC.ICR.BIT.B6 = 1; // Enable PC6 receive buff PORTC.ICR.BIT.B7 = 1; // Enable PC7 receive buff IOPORT.PFDMTU.BIT.TCLKS = 0; // PC0-3 Enable MTCLK-A IOPORT.PFCMTU.BIT.TCLKS = 1; // PC4-7 Enable MTCLK-B MTU1.TMDR.BIT.MD = 4; // MTU1 Phase coefficient MTU2.TMDR.BIT.MD = 4; // MTU2 Phase coefficient MTU7.TMDR.BIT.MD = 4; // MTU7 Phase coefficient MTU8.TMDR.BIT.MD = 4; // MTU8 Phase coefficient MTUA.TSTR.BIT.CST1 = 1; // Count Start MTUA.TSTR.BIT.CST2 = 1; // Count Start MTUB.TSTR.BIT.CST1 = 1; // Count Start MTUB.TSTR.BIT.CST2 = 1; // Count Start // MTU9 = PWM Mode 1(省略) }
となります。
それではMTU1,2,7,8(位相係数モード1)の設定手順を見ていきます。
- モジュールスタート(消費電力低減機能の解除)
- ピンの設定
- MTU1,2,7,8の設定
- ユーザ関数の定義
1.モジュールスタート
MSTP(MTU1) = 0; // Wake up MTU1 MSTP(MTU2) = 0; // Wake up MTU2 MSTP(MTU7) = 0; // Wake up MTU7 MSTP(MTU8) = 0; // Wake up MTU8
消費電力低減機能を解除します。RX631のようにアクセスロックはないので、そのまま解除します。
MSTPCTRレジスタがiodefine.hでMSTP(****)というようにデファインされているのでこれを使用します。
2.ピンの設定
PORTC.ICR.BIT.B0 = 1; // Enable PC0 receive buff PORTC.ICR.BIT.B1 = 1; // Enable PC1 receive buff PORTC.ICR.BIT.B2 = 1; // Enable PC2 receive buff PORTC.ICR.BIT.B3 = 1; // Enable PC3 receive buff PORTC.ICR.BIT.B4 = 1; // Enable PC4 receive buff PORTC.ICR.BIT.B5 = 1; // Enable PC5 receive buff PORTC.ICR.BIT.B6 = 1; // Enable PC6 receive buff PORTC.ICR.BIT.B7 = 1; // Enable PC7 receive buff IOPORT.PFDMTU.BIT.TCLKS = 0; // PC0-3 Enable MTCLK-A IOPORT.PFCMTU.BIT.TCLKS = 1; // PC4-7 Enable MTCLK-B
使用するピンの受信バッファを有効にし、PC0-7をMTCLKに割り当てます。
3.MTU1,2,7,8の設定
データシートp.943の表18.49、図18.30を参考に設定します。
MTU1.TMDR.BIT.MD = 4; // MTU1 Phase coefficient MTU2.TMDR.BIT.MD = 4; // MTU2 Phase coefficient MTU7.TMDR.BIT.MD = 4; // MTU7 Phase coefficient MTU8.TMDR.BIT.MD = 4; // MTU8 Phase coefficient MTUA.TSTR.BIT.CST1 = 1; // Count Start MTUA.TSTR.BIT.CST2 = 1; // Count Start MTUB.TSTR.BIT.CST1 = 1; // Count Start MTUB.TSTR.BIT.CST2 = 1; // Count Start
MTU1,2,7,8を位相係数モードに振り当てます。
次に、MTU1,2,7,8のカウントを開始します。エンコーダの計測データは16bitのレジスタであるMTU1,2,7,8.TCNTにそれぞれ収納されます。
これでエンコーダの測定が開始されました。
main文にて
#include "iodefine.h" #include "machine.h" #include <stdio.h> void main(void) { static unsigned int i; while(1){ printf("MTU1.TCNT:%6d\tMTU2.TCNT:%6d\tMTU7.TCNT:%6d\tMTU8.TCNT:%6d\d", MTU1.TCNT, MTU2.TCNT, MTU7.TCNT, MTU8.TCNT); for(i = 0; i < 65000; i++) nop(); } }
TeraTerm等に表示して、エンコーダを回して計測ができていれば成功です!
TCNTのままで扱いにくい場合にはマクロしたり、一度タイマー割り込みでバッファしておくのもいいかと思います。
また、書き込みとデバッグに同様のCOMを使用していると、両立はできないので、かならずどちらかの接続は解除して下さい。
20160822の記事
Renesas RX621 PWM
PB0をMTIOC9Aに設定し、PWMモード1を用いてPWMを出力していきます。
hardware_setup.cにて以下のMTU2_initialize関数を作成し、HardwareSetup関数で呼びましょう。
MTU2_initialize
void MTU2_initialize(void) { // MTU9 = PWM Mode 1 MSTP(MTU9) = 0; // Wake up MTU9 MTU9.TCR.BIT.TPSC = 4; // PCLK/256 MTU9.TCR.BIT.CKEG = 1; // Count rising edge MTU9.TCR.BIT.CCLR = 1; // Compare Match TGRA MTU9.TMDR.BIT.MD = 2; // PWM mode 1 MTU9.TMDR.BIT.BFA = 0; // TGRA, TGRC normal mode MTU9.TMDR.BIT.BFB = 0; // TGRB, TGRD normal mode MTU9.TIORH.BIT.IOA = 6; // Initial High compare match High MTU9.TIORH.BIT.IOB = 5; // Initial High compare match Low MTU9.TGRA = 29999; // 1KHz MTU9.TGRB = 14999; // Duty 50% MTU9.TCNT = 0; // Clear Count MTUB.TSTR.BIT.CST3 = 1; // Count Start }
これでビルドをし、PB0から1kHz50%のPWMが出ていれば成功です。
それでは、MTU9(PWM)の設定手順を見ていきます。
- モジュールスタート(消費電力低減機能の解除)
- ピンの設定
- MTU9の設定
- ユーザ関数の定義
1.モジュールスタート
MSTP(MTU9) = 0; // Wake up MTU9
消費電力低減機能を解除します。RX631のようにアクセスロックはないので、そのまま解除します。
MSTPCTRレジスタがiodefine.hでMSTP(****)というようにデファインされているのでこれを使用します。
2.ピンの設定
MTU9のMTIOC9Aを設定すると自動的に出力されます。
3.MTU9の設定
データシートp.940の図18.26を参考に設定していきます。
また、動作はデータシートの図18.27を参考にします。今回の設定ではTGRBの値をそのままDuty比に変換したいため、MTIOC9AのHighとLowが入れ替わっています。
MTU9.TCR.BIT.TPSC = 4; // PCLK/256 MTU9.TCR.BIT.CKEG = 1; // Count rising edge MTU9.TCR.BIT.CCLR = 1; // Compare Match TGRA MTU9.TMDR.BIT.MD = 2; // PWM mode 1 MTU9.TMDR.BIT.BFA = 0; // TGRA, TGRC normal mode MTU9.TMDR.BIT.BFB = 0; // TGRB, TGRD normal mode MTU9.TIORH.BIT.IOA = 6; // Initial High compare match High MTU9.TIORH.BIT.IOB = 5; // Initial High compare match Low MTU9.TGRA = 29999; // 1KHz MTU9.TGRB = 14999; // Duty 50% MTU9.TCNT = 0; // Clear Count MTUB.TSTR.BIT.CST3 = 1; // Count Start
まずMTU2にはMTU0~11までのユニットがあります。今回はPWMモード1を使用できるMTU9を用いて、MTIOC9AからPWMを出力します。
また、各ユニットは持っている機能と出力できるピンが指定されているので、設定するときは注意しましょう。
(MTU2という周辺機能にMTU0~11があるのですが、思いっきりMTU2が被っててわかりにくいですよね(´・_・`))
レジスタの設定を見ていきましょう。MTU9ユニット内のレジスタを設定していきます。
TCRレジスタの
TPSC: 4→カウント周期をPCLK/256に
CLEG: 1→立ち上がりエッジでカウント
CCLR: 1→TGRAとTCNTがコンペアマッチしたときにTCNTをクリア
TMDRレジスタの
MD: 2→PWMモード1に
BFA,BFB: 0→TGRA~Dはノーマルモード
TIORHレジスタの
IOA: 6→初期値HighコンペアマッチでHighに
IOB: 5→初期値HighコンペアマッチでLowに
MTU9.TGRAレジスタを1kHzとなるように設定
MTU9.TGRBレジスタをDuty比50%になるように設定
TSTRレジスタの
CST3: 1→MTU9のカウントスタート
となっています。
4.ユーザ関数の定義
今回はユーザ関数は作成しないので省略。
これでMTU9にてPWMの設定が完了しました。
20160822の記事