前回の「ATtinyをいっぱい並べるオシレーターの妄想」からもう少し考えてみた。マスターとスレーブのやり取りはシリアル通信かな~と思ってたが、アナログシンセの制御方法のCVとGATEをそのまま踏襲すればそれぞれ1線の計2線で済むのでは?と、妄想が広がった。IC間の通信をアナログ値でやるという(^q^;ATtiny13の周辺機能にはシリアル通信のハードウェアはないが(SPIでプログラムできるのだから本当はあるんだろうけど、よくわからない)立派なADCが搭載されているのでこれを使うという妄想。ATtiny13をVCOとして使う妄想図アナログっぽいところは赤、デジタルっぽいところは青で色分けした。CV、Gateというのは周波数と音量を設定する電圧値だ。ADCでデジタル値に変換してからマイコンで処理して、周辺機能のPWMで疑似アナログ値の波形を出力する。これをアナログ回路のLPFでパルス波形(高周波数)を取り去ってアナログ波形を出力するというもの。CV、Gateの電圧はマスターのAVR(とかPSoCとかLPCとか・・・)が計算して出力する。入力側のClockはシステム全体の同期をとるためのクロック。Latchはこの信号を受け取った時にスレーブ・オシレーター達がいっせーので出力電圧(PWM出力なのでPWMのDuty比)を切り替える。Selectは今設定されているCV、Gateの値が自分宛のものか判断する(SPIのSSのぱくり)メモ:Selectはスレーブごとに信号線を割り当てるので工夫すればここにシリアル・データを乗せられるかも?Latchで同期をとれればClockでシステム全体の同期をとる必要はないのかな?(よくわかりません)ATtiny13AでDDS波形出力とにかく周波数可変で波形を出力できないと妄想も深まらないので、今まで使ってきたDDSでテストプログラムを書いてみた。ADCの値取得とかLatchによる波形生成の同期は割愛した。あとで修正/拡張/いじりやすいように冗長ぎみに書いておいた。配線図ADC入力は実装していないのでPWM出力とタイミング計測用の「Check」のみ。ATtiny13のピンアサインPWM出力は使用によりP5(OC0A)かP6(OC0B)のどちらか。ATtiny13は8Pinなので周辺機能をいろいろ使おうと思うとPin割り当てをちゃんと考えないといけない。VCCという使い方にしようと思っている。計測PWMの素の出力Duty比50%の素のPWM波形で、周波数36.44kHzになっている。37.5kHzPWMだと意外と低いもんだなあ(^q^;ATtiny13を20MHz駆動させても78.125kHzだ。この辺をストップバンドにしてLPFを設計すればいいのかな。わからないので実験しながら。プログラムではサンプリング周波数8kHzでノコギリ波を出力させているが、途中で浮動小数点演算をしていてかなりメモリを食うみたいだ。浮動小数点演算をしているところをコメントアウトすると消費メモリー量がかなり減る。"RunOutputFileVerifyTask".浮動小数点演算のルーチンは引き算すると700byteぐらいなのかな?これを32bit整数演算に置き換えてメモリを節約できるかどうか。メモ:去年tozさんが書かれていた「tinyぴゅんぴゅん」の記事を読むとADCの待ち時間もなんか危なそうだ。5LPでI2SのExampleをやってみた。DAC(MCP4922)を動かす。