使用しないポートは出力に設定し値を0にしておいた方が良いらしい。VPORTA_DIRも同じ機能で、IN、OUT命令でアクセスできる。PORTA_OUT出力値。0でLow(GND電位)、1でHigh(VDD電位)。VPORTA_OUTも同じ機能で、IN、OUT命令でアクセスできる。PORTA_OUTTGL出力値切り替え。出力値を切り替えたいビットに1を書き込むと、出力値が反転する。このプログラムの場合はビット6に1を書き込んでいるので、この動作を実行する度にPA6に接続したLEDが点灯したり消灯したりする。TCA0_SINGLE_INTCTRLタイマA標準動作割り込み制御。ビット0がオーバーフロー割り込み許可ビット”TCA_SINGLE_OVF_bp”で、1を書き込む事でタイマAオーバーフロー割り込み要求フラグがセットされた時に割り込みが起こる。TCA0_SINGLE_INTFLAGSタイマA標準動作割り込み要求フラグ。ビット0がオーバーフロー割り込み要求フラグ”TCA_SINGLE_OVF_bp”で、タイマAのカウンタが桁溢れするとセットされる。割り込みが起こっても自動で解除されず、解除するにはプログラムで1を書き込む必要がある。TCA0_SINGLE_CTRLAタイマA制御A(標準/分割動作共通)。0ビット3~1のCLKSEL2~0でプリスケーラを設定する。1024データシートによれば、ATtiny202はデフォルトで20MHzを6分周しているので、設定を触らなければ3.333333MHzで動作している事になる。マイコンの動作クロック周波数をMCLK(MHz)、プリスケーラをPSCLとすると、16ビットタイマで作り出せる最大の時間は(65536*PSCL)/(MCLK*10^6)となる。今回はプリスケーラを8とすると、最大時間が約157msとなり、肉眼でわりと早くLEDが点滅しているのが分かるということでこれを採用した。タイマAのCTRLAレジスタのビット0に1を書き込むとカウントを始めるということで、ビット3~1のプリスケーラ8は011で、ビット0は1なので未使用のビット7~4と合わせて0B00000111となる。この値をCTRLAレジスタに書き込む事で、タイマAはプリスケーラ8でカウントを始める。マイコンが起動すると、157msごとにタイマAがオーバーフローし割り込みが発生する。PORTA_OUTTGLのビット6に1を書き込む命令が実行され、結果として157msごとにLEDの点灯、消灯が切り替わる。LEDが点滅し、Lチカプログラムが完成した。タイマAの割り込みルーチンでは前回の記事で説明した通り、自動で全割り込み禁止にはならず、割り込み要求フラグは自動で解除されないので、プログラムでこれを実行している。Synthesizer)を制御するプログラムについて説明する。black-mantアドレス空間の違いとレジスタの名前の違い前回の記事で、ATtiny202はATmega328PやATtiny13Aとはレジスタの名前や機能の設定値からして違うという話をした。私はAVRの開発は基本的にアセンブリ言語でしているので、どういう風にプログラムの記述が変わるのかアセンブリ言語で説明する。以下、ATmega328PやATtiny13Aの事を「以前のマイコン」と表記する事がある。ATtiny202と以前のマイコンでは、レジスタのアドレスの振り方が違う。データシートから抜粋した両者のメモリ配置図を見て欲しい。(データシートより引用)以前のマイコンではメモリアドレス0x0000~0x001Fに汎用作業レジスタのR0~R31が割り当てられ、I/Oレジスタのアドレスはその続きの0x0020からになっている。対して、ATtiny202では汎用作業レジスタは別のメモリ空間に割り当てられており、I/Oレジスタはアドレス0x0000から始まっている。そのおかげで、ATtiny202にはI/Oアドレスという少しややこしい概念がない。以前のマイコンでは各機能設定用のレジスタの一部がI/Oレジスタ領域にあるが、ATtiny202では各機能設定レジスタは基本的に拡張I/Oレジスタ領域にしかない。I/Oレジスタ領域にあるのは仮想のポート設定レジスタとCPU用レジスタ(ステータスレジスタ等)くらいだ。レジスタの名前ATtiny202のデータシートを読むと、各機能の制御用にCTRLAやCTRLBといったレジスタがある。様々な機能で同じようにCTRLAやCTRLBという名前になっており、ソースコードにそのまま記述しても設定したい機能のレジスタを特定できない。そこで、ATtiny202の様々なレジスタ等の定義値を記している”tn202def.inc”というファイルを開くと、例えばSPIのCTRLAレジスタは”SPI0_CTRLA”と定義されている。この定義値はデータシートに書いてないので、データシートと合わせて”tn202def.inc”の中身を見ながらプログラムを記述する必要がある。対して、以前のマイコンでは基本的に各機能のレジスタ名はデータシートに書いてある名前がそのまま使える。ATmega328Pのデータシートでは、SPIの設定をするレジスタは”SPCR”となっていて、ソースコードに”SPCR”と書けばプログラムはそのままアセンブルできる。ATtiny202のタイマATtiny202のタイマも、データシートを読むとかなり多機能なようだ。タイマAには標準動作モードと分割動作モードがあり、標準動作モードでは普通の16bitタイマなのだが、分割動作モードでは8bitタイマ2つとして使う事が出来るようだ。分割動作モードは今回は使用しておらず、データシートもちゃんと読んでいないのでこの記事では割愛する。以前のマイコンでは、タイマの動作開始は制御レジスタにプリスケーラ設定値を書き込んだ時点だったが、ATtiny202ではCTRLAレジスタにENABLEというビットがあり、このビットに1を書き込む事でタイマは動作を開始する。確かに、慣れれば「プリスケーラを設定した時点で動作開始」より「ENABLEビットに1を書き込んだ時点で動作開始」の方が直感的で分かりやすいかもしれない。ATtiny202ではタイマに限らず、殆どの機能のCTRLAレジスタにENABLEビットがあり、このビットを1にすることでその機能が有効になる。タイマオーバーフロー割り込みと割り込みベクタ以前のマイコンでは、割り込みがかかると自動的にステータスレジスタのIフラグが0になり全割り込み禁止になる。割り込み要求フラグも自動的に解除される。ATtiny202では、割り込みがかかった後の全割り込み禁止処理と割り込み要求フラグの解除が必要な場合は、プログラムに記述しなければならない。特別な理由がない限り、通常は記述しておいた方が良いと思われる。割り込みがかかってもステータスレジスタの退避が自動で行われないのは以前のマイコンと同じなので、通常はこちらもプログラムに記述しておく必要がある。ATtiny202のタイマAオーバーフロー割り込みベクタは0x0008なのだが、これも”tn202def.inc”に定義値が記載されており、”TCA0_OVF_vect”となっている。この記事を書くために改めて確認したら、実は以前のマイコンのincファイルにも記載されていたが、知らずに今までは即値をそのまま使っていた。以前のマイコンでは、ポート関連のレジスタは基本的にI/Oレジスタ領域0x0020~0x005F(I/Oアドレスでは0x0000~0x003F)の範囲内にあるが、ATtiny202では冒頭でも述べたように拡張I/Oレジスタ領域にある。ポートAの入出力方向を設定する”PORTA_DIR”レジスタは0x0400にある。ポート設定へは頻繁にアクセスするし、ピンの値によって処理を分岐させる際等に使用するSBICやSBIS命令が使えないのはあまりにも不便という配慮なのか、仮想ポートというレジスタが用意されている。”PORTA_DIR”に対応する仮想ポートレジスタは”VPORTA_DIR”で、アドレス0x0000だ。アドレス0x0000~0x001Fの間に入っているので、SBICやSBIS命令も使える。“VPORTA_INTFLAGS”で、アドレスは0x0000~0x0003となっている。“PORTA_INTFLAGS”(アドレスはそれぞれ0x0400、0x0404、0x0408、0x0409)へのアクセスと同じ結果になる。通常は仮想ポートの方へのアクセスで良さそうである。この4レジスタ以外のポート設定を変更したい場合は本来のアドレス0x0400以降のレジスタにアクセスするしかないのだが。以前のマイコンより便利なレジスタがいろいろと増えていて、例えば今回のプログラムでも使用している”PORTA_OUTTGL”などがある。このレジスタはその名の通り、PORTAの出力値を反転させるというものだ。トグルスイッチのようにON-OFFを切り替えるイメージがしやすい。使い方は簡単で、ポートAの切り替えたいビットに1を書き込むだけだ。ポートAのビット7の出力値を切り替えたかったら”PORTA_OUTTGL”に0B1000000(0x80)を書き込めば良い。するとポートA7ピンの出力値が0なら1、1なら0になる。いちいち現在の出力値を確認する手間が省けて楽だ。実は、同じ事はポートAの入力値を返す”PORTA_IN”レジスタの該当するビットに1を書き込むことでも出来、それは以前のマイコンでも実装されていた(“PINx”レジスタの該当するビットに1を書き込む)のだが、OUTTGLという名前の専用レジスタが用意されたのは、より直感的にプログラム出来て良いと思う。ポート設定だけでもここには書き切れない程の多数の機能があるので、詳しくはデータシートを参照されたい。次回は、ATtiny202で“Lチカ”してみた時のプログラムを説明する。black-mant最近(2022年11月現在)、AVRでATtiny202-SSNRが熱い。円安やインフレの影響で値上がりしてしまったが、それでも1個60円でこんな高性能のマイコンが手に入るのはお買い得だ。2022年11月現在売り切れている(前に買ったときは5個まとめて買ったのだが、どうせなら10個くらい買っておけばよかった...)。同じ8ピンのATtiny13Aと比べて、完全上位互換だ。小さいながら、通信機能が充実しているのが嬉しい。外部機器(例えばDDSとかLCDとか)を制御出来るし、プログラムメモリもSRAMも同じ8ピンのATtiny13Aと比べると倍の容量だ。AVRで8ピンのマイコンが欲しいとなったら趣味レベルでは殆どATtiny202でいいと思う。廣田修一・著を片手にしている。この本は2010年1月1日発行で、題材としてATmega88を使用している。ATmega328PやATtiny13Aをプログラムする時は、レジスタのアドレスや割り込みベクタの違いなど細かい相違点に気を付ければそう戸惑うことはなかった。このATtiny202-SSNRはレジスタの名前からして全く違う。ポート設定やタイマなど、御馴染みの機能を使うにしても今まで触ったことがあるATmega328PやATtiny13Aとは違う設定用レジスタやビットがある。World”に当たる“Lチカ”プログラムを組むのも少し苦労したので、また別記事で取り上げようと思う。black-mant7月19日に、突然水温計がHまで振り切るという事象が発生した。ラジエターを見てみるとファンが回っていない。ここで、故障は以下の三点が考えられる。ファンモータ自体の故障サーモスイッチの故障ファンモータ系統の配線の断線サーモスイッチはエンジンをかけて水温を上げて接点が導通するかどうかテスターで調べた。水温が上がれば接点は繋がるし、水温が下がれば接点は切れる。配線の断線は、ちゃんと調べようと思ったらテスターで導通を調べないといけないが、とりあえずヒューズを見た。ヒューズは溶断していた。これで配線がどこかでショートしていると考えるのは早計だ。モータ自体の故障でも過電流が流れる可能性はある。試しにファンをドライバーでつついて回そうとしてみたが、回らなかった。モータが固着しているようだ。ヒューズはファンが固着したことにより過電流が流れて切れたと思われる。サービスマニュアルの手順では、ラジエターを外してからファンを外すことになっているが、ラジエターを外すにはクーラントを抜いて配管を外して...とかなり大掛かりな作業になってしまう。試しにラジエターの下の部分だけ外して手で押し広げて隙間からレンチを突っ込んだらファンのボルトが外れたので、ラジエターを車体に付けたままファンを外せた。ラジエターを横から見る。コネクタやサーモスイッチが見える。これだけ隙間があれば、ラジエターを外さなくても隙間からレンチを突っ込んでファンを外せる。ファンをモータ側から見る。ファンをファン側から見る。ファンのフレームに異物が付着している。サーモスイッチに接続するコネクタ。250型の平型端子メス。ファンモータのコネクタ。車体側のコネクタと分離するには、赤丸で囲った爪を矢印の方向にずらして引き抜く。この爪は車体に付いている状態では反対側を向いているので少々作業しにくい。コネクタは初めて見た形だ。配線コムで調べたところ、住友電装製HM防水シリーズ3極Mコネクタだった。ファンを車体から外す前は確かに固着していたのだが、外してみたら固着していなかったので試しに回してみた。ヒューズの容量10Aをわずかに超えるが、一瞬なので溶断する程では無い。4A弱と、10Aのヒューズの負荷としてはいたって普通だ。不具合が再現しなくて困ったが、次の日にもう一度調べたら固着していた。動かすと固着が解かれる。これはもうモータ自体の故障で決まりだ。パーツカタログでモータの品番を調べたらV,W(自分のはV)は19030-MAT-003だが、廃番になっていた。試しにX,Yの19030-MAT-E00とIの19030-MAT-021も調べたが、どちらも廃番だった。CBR1100XXの純正のモーターAssyは全て廃番だ。仕方ないので、Webikeで似たような形のモーターAssyが無いか探してみた。CB400D19030-MBW-610CBR600F19030-MCA-003ゴールドウイング19030-MER-D01CBF600S、CBF60019030-MT3-003ST1100パンヨーロピアン19032-MCA-003ゴールドウイング似たような形のファンモータがこれだけ引っかかったが、全てCMS経由なので、注文してから来るまでに3週間とかかかってしまう。これらの部品の品番で純正部品検索をして、値段が極端に高くないものという条件にしたら、ゴールドウイング用の19032-MCA-003が22880円だったのでそれを選んだ。自分が注文したのが最後の1個だったらしく、後にもう一度検索したら廃番になってしまっていた(ゴールドウイング乗りの方、ごめんなさい!)。19032-MCA-003の箱。“新品”の筈だが随分年季が入っている。19030-MAT-003と19032-MCA-003の比較。コネクタの形が違うが、モータは全く同じ形だ。モータのメーカはDENSO辺りかと思っていたが、どうやらPanasonic製らしい。このモータはそのままではCBR1100XXにはつかないので、先ほど配線コムで調べたコネクタも注文した。モータが届いたら、早速配線をぶった切ってコネクタや配線を取り付ける。貴重な新品の純正部品に元に戻せない加工をするのはかなり抵抗があったが、そのままでは使えなくて押入れの肥やしになるだけでありそれも勿体無いので仕方ない。配線コムで注文したコネクタと端子。1.25mm2の緑色の配線とφ6mmの丸型端子。配線はチューブで隠れて殆ど見えなくなるので別に色に拘らなくてもいいのだが。新しいモータの配線を元々のモータと同じように加工する。チューブは新しいモータの配線をぶった切ったときに取れたものを加工して流用した。モータと並列に繋がっている謎の黒い部品は不要なので外した。外した後で気付いたが、この部品はどうやらモータのノイズ除去用コンデンサらしい。0.47と書いてあるので、おそらく耐圧250Vで容量が0.47μFなのだろう。コンデンサなら別にあっても困らないし、付けたままにしておけばよかった。このモータを取り付けるゴールドウイングはECUがついていて、誤作動防止のためにノイズ除去をした方がいいのだろう。キャブレターのCBR1100XXにはECUがついておらず、それっぽいものと言えばエンジンの点火タイミングを制御するイグニッションコントロールモジュールがあるくらいだ。多少のノイズは大丈夫なのだろう。φ6mmの丸型端子と写真には無いが250型の平型端子と小さいタイラップが必要だ。モータを交換したファンをモータ側から見る。モータを交換したファンをファン側から見る。ファンを車体に元通りに取り付ける。ファンのヒューズが切れている。切れたファンのヒューズを交換した。その後、冷却水が温まったらファンは無事に元気よく回り、修理が完了した。自宅からそれほど遠くない通勤経路で起こった故障だったので大した被害は出なかったが、ロングツーリングの出掛けた先で起こったらと思うとぞっとする。作業時間自体は多分合計3、4時間程だと思うのだが、モータを注文して部品待ちだったり、仕事の絡みで明るい時間に作業時間を取れなくて結局直るまでに11日かかってしまった。今回は何とか別の車種のモータを流用出来て事無きを得たが、次にまた同じ不具合が出たらその頃はもうモータが無いかもしれない。その場合はオーバーホール屋さんに出してモータをオーバーホールして貰うしかない。設計した回路を下図に示す。画像クリックで拡大HK829とNJM386の周辺は殆どデータシートの回路例の通りなので、何も難しい事は無い。HK829のメッセージ再生用スイッチの代わりにマイコンを接続した部分は、今回アレンジした点。HK829のスピーカー出力の部分はデータシートに386では無い別のアンプICに繋ぐ例が載っていたので、それを参照した。導入編でも述べたが、HK829のM0~M3のピンはIC内部でプルアップされており、開放電圧を測ったらほぼ電源電圧だった。マイコンのGPIOも待機状態でHigh(=電源電圧が出力されている)であり、HK829のデータシートを読んだ限りではM0~M3にHighが入力される事は想定されていないようなのでそこが少し心配だが、HK829のHighもマイコンのHighもほぼ同電位なら殆ど電流は流れないから大丈夫だろうと勝手に納得することにした。間にトランジスタかMOSFETを挟んで開放状態を作り出す事も可能だが、面倒臭かったので。ICが突然壊れたらこれが原因という事で対策の候補の一つになるだろう。ブレッドボードで組んで実験した。ICに録音する際は、TVの音声を一旦PCに録音し編集してWalkmanに移し、Walkmanの出力をブレッドボードに接続した。PCから直接接続して録音してもノイズだらけで使い物にならなかったので、面倒だがこの手順を踏んだ。テスト再生は見事に成功した。して設計した回路をユニバーサル基板に組んだ。この際、回路図上でHK829のMIC+、MIC-、MICG、/RECに接続されている部品はメッセージを再生する上では必要無いので省略した。基板裏ケースはタカチのSW-85S。ある72×47mmの基板の回路を収納するのにちょうどいい。当初はモバイルバッテリを電源にしようと思っていたが、ケースに入りそうなモバイルバッテリを見つけられなかったので単4電池3本にすることにした。始めは電源電圧は5Vの想定で回路を設計していたが、データシートを見る限り4.5Vでも全てのICの定格電圧範囲に入っていたのでよしとする事にした。基板との接続はXHコネクタにして、道具を使わなくても着脱できるようにした。XHコネクタ拡大ハンドグリップに付けるスイッチは秋月電子通商で売っていたSS-10GL13というレバー付きのマイクロスイッチにした。接点の定格はAC250V10.1Aで、機械等に使う工業用と思われる。ロジックのHigh、Lowを切り替えるという数mAオーダーの電流しか流れない用途には明らかにオーバースペックだが...。大きさやレバーがあることなどが今回の用途にちょうど良かったので選定した。ハンドグリップはダイソーで25kgのものにした。ハンドグリップにスイッチを固定するのは、ホームセンターで配線を束ねるための金具を購入してスイッチのねじ穴に合うように穴を開けて加工した。ケースにホームセンターで売っていた4mmの雄ねじが切ってあるヒートンを取り付け、ハンドグリップの輪の部分とカラビナで繋げた。スピーカーは秋月電子通商で売っているDXYD50N-22Z-8A-F。5cm程度でフレームにねじ穴がついていてケースに取り付けるのが楽なのが選定理由。ケース加工の寸法を下図に示す。上面に電源スイッチとヒートン取り付け穴を開ける図は省略したが、この他に電源スイッチとヒートン取り付け穴を開けた反対の面の中心辺りにハンドグリップに取り付けるスイッチの配線用の穴を開ける必要がある。基板に組んだ後で改めてブレッドボードでHK829と最低限の部品で回路を組み、試しにスピーカー端子に直接スピーカーを繋いでみたら、なんと結構な音量で音が鳴ってしまった。386のアンプ回路は要らなかったことになる。基板を組み直すのも面倒なので、そのままにした。完成写真を以下に示す。WordPress.。