n_shinichi’s blog

日々の備忘録、 趣味のあれこれなど紹介 (すみません、メニュー、リンク、カテゴリー分けがうまくできてません、★記事一覧★で見てください...) NHK魔改造の夜ではDンソーのベテランアドバイザーってことで出ました♪

MENU

ATtiny、タイマTCBで赤外線通信用37.9kHzPWM出力

割込み処理をやめてレジスタ設定で37.9kHz、duty1/4 PWM波形の確認の様子 

 ある程度試してうまくいかない。原因が???なのであきらめてTCBでやった。

TCAではなぜかうまくいかなかったけどあまりちゃんと調べてない。 

ネットでTCAの方が後々使い回ししやすそうだったんだけど・・・

まだまだ、ATtinyわかってない。。。ってことだな...

 

注)37.9kHzはここから来てます。 マイクロロボの赤外線シリアル通信で使ってるこちらの同調周波数です。

https://akizukidenshi.com/goodsaffix/pic79603.pdf

 

最近使ってるマイコン、実はよくわかってない・・・

Arduinoマイコン使うようになってからそういうの増えた。

 そもそもATtiny、データシートをまともに読んだことない。

   昔のマイコン使いではちょっと考えられない。

 それでもおよそやりたいことが、超簡単にできるArduino&ネット環境に感謝。

 main()はどこに隠しちゃった?とか最初は気になったけど。。。

 

ESP32...M5Stackは仕事でもよく使うようになったけど

 ESP32はちゃんとわかってない。わかる必要がなくなった。

 整数の計算に置き換える必要がなくなってしまった。

 

ずっと昔、日立のH8、PICにしてもデータシート、、、データブックを

 読み込んでからじゃないと触れなかった。

 レジスタ等々おまじないをたくさんしないと思う動作で動きださなかった。

 

 

ATtiny1614のポート利用は今のとここんな感じにしてる。
 ArduinoPort2(AVR:PA6、Pin3)で赤外LEDの約38kHzを以前紹介した方法で

 出力してるけど、いけてない。

 他の以前のスケッチ、ESP32で割込みでカウント処理でPWMがぱっとポートを

 切り替え安いのでそのままATtinyでも使ってた。

 

 

ESP32だと他に凝った処理が入ってないなら割込みも全然かまわない。のだけど

 それをATtinyで使うのはあまりよろしくない。

 負荷が高い。。。 ESP32を使ってるとマイコンに負荷の掛からない処理で...

 っての忘れがち。

 

何度も紹介してる 倒立振子スティックくん あれのスケッチは

 割込みは使ってない。普通に?ポーリングTSSで動いてしまう。

 それも実数計算で。30年前の8bitマイコンではちょっと考えられない。

 

ATtinyはそれなりに昔の感覚でスケッチを作らないといけない。

 割込みを使うと他の処理がその分、当たり前だけど止められてしまう。

 32bit、ESP32の240MHz2コアに比べると

 8bit、ATtinyの20MHzは1コアは処理がすごく遅い。

  そんなんで38kHzのPWMduty絞りなんかしてるとCPU負荷が増えるばかり。

 

なので、CPUの負荷にならないタイマの機能だけでPWM出力する方法に

 変更してやらんと後々困る。

 ただタイマでそのまま出力しようとすると今度はポートの自由度はなくなる。

 

ATtiny1614ポートの構成

先のロボでのポート割り当てで

モータに使うポートはPWM使えるTCA0・・・は変えられない
なもんで

TCB1・・・AVR:PA3・・・ArduinoPort10 13番pin センサーの予定にしてたけど

 そのピンをこれまでPA6,ArduinoPort2 4番pin 赤外LED用からそっちへ

 変更することにした。

 

★ 重要と思ったとこ ★

で・・・・レジスタ設定の仕方はデータシート見て、ネット情報検索して

 なるほどねってまではすぐだったけど、、、

 わかったつもりになってからうまく動くまでが半日掛かった!!!

 

動かない・・・で検索して、、まずヒントになったのがこちら、

平凡な日々《夢広がる編》さんのブログ

okiraku346.sblo.jp

********************************************************************************

CLKCTRL.MCLKCTRLBはレジスターロックの対象となっているので

予め用意されているマクロで設定する必要があります。

********************************************************************************

これに気付くまでそこそこ時間掛かった

で、これでいいのかな。。。と思ったけど、、、 

ccp_write_io((void*)&(CLKCTRL.MCLKCTRLB), 0b00000001); 

   はなぜかコンパイル通らない

 

ここでまたしばらく時間の掛かるネットの検索のはじまり。。。

どうも ccp_write_io ではなくて _PROTECTED_WRITE じゃないといけないらしい。

https://avr.jp/user/AN/PDF/AN2711.pdf

_PROTECTED_WRITE( CLKCTRL.MCLKCTRLB, 0b00000001);  

   こちらはちゃんと2分周にできた♪

 5Mhzクロックで8bitのカウンタ、50μs周期(最遅20kHzから2.5MHz)

   までののPWMが0.2μs分解能でのパルスが出せる。

で最終的にはこのスケッチで最初の波形が出力できるようになった。

 

そもそも・・・

ESPマイコンでは簡単に数MHzのカウンタで

  ledcSetup();   ledcAttachPin();  ledcWrite();使って

37.9kHzで自由なPWMdutyの出力ができるけど、ATtinyではできない。。。と

思って上記のようなことやってますが。。。できるよっての知ってる方が

おられましたら教えて頂ければ幸いです。

 

他、参考

https://avr.jp/user/AN/PDF/AN2711.pdf