1はM8Cという8bitのCPUがコアなのでマイコンとしてはちょっとしょぼい。8Pinのパッケージがあって他のPSoCにはないスイッチトキャパシタも搭載されているので使ってみることにした。Designer」を使う。DesignerでBuildできない以前少しだけ触ったときはPCのOSがXPだったが、8.1にしてから全然触っていないかった。path(s)というエラーがでてBuildできない。メッセージを見るとMakeのパス名の処理で引っかかっているようなので、インストール場所をドライブのルート直下にしたりしたがダメ。Programmer」を使うのでこちらだけ8.1でOKかなと思ったが、これもダメ。Guide」をやってみた。POTの値をADCで読み取ってLチカの速度を変化させるというもの。POTというピン割り当てになっている。配線図3連POT基板は、うち一つだけ使っている。Cortex-M7ベースになるみたいだ。1ベースマシンの構想(メモ)リズムマシンがそろそろ一段落しそうなので次に作りたいベースマシンの構想。図の右半分はシーケンサーとUIの部分だ。それぞれI2Cで接続する。LCDは別だが基板同士をI2Cでつなぐのはリズムマシンでやったので、がんばればできそう。左半分はアナログシンセでいうVCO、VCF、VCAだ。これも制御信号としてI2Cでつなぐ。各基板にI2C信号を解釈するマイコンが必要。黒・オレンジのラインはアナログの波形信号だ。メモ:打ち込み用のタクト・スイッチがリズムマシンよりかなり増えそうなので(音階だけで13個いる)LEDの表示はなくして別基板のLCDで表示。Kitを制御用に想定。Display基板はグラフィックLCDを考えているが、パラレルのやつをMaster基板に載せた方がいいかな?OSC、Filter、Ampの実現方法はまだ全然考えてないの最初はここから実験する予定。修正PWM出力のあたりを少し改良した。PWMのモード7にすると周期を可変にできるようだ。OCR0Aで周期を設定、OCR0BでDuty比を設定する。確認したわけではないがモード7の場合PWM出力はOC0A(PB0)は使えなくて、OC0B(PB1)に限定されるみたいだ。PWMがうまく使えなかった原因はこれかな?16bitのTimer1より8bitのTimer0の方が設定するレジスタが少なくて多少わかりやすいかも。波形テーブルの要素数と分解能OCR0Aを64に設定した。すると周期が64になってOCR0Bを0..63に設定してDuty比を設定できる。64段階なのでbit数にすると6bit。6bitのなんちゃってDACだ。150kHzと、波形をのせる基本のパルス波の周波数を上げられた。オシロで波形をみると※オシロ画面のキャプチャーだと横幅が狭くて見づらいのでUSB経由でPCのオシロに付属していたユーティリティ・ソフトで表示させた。(このソフトあんまり使い勝手がよくないのでほとんど使っていない(^q^;)ch1(赤)がOC0Bの出力波形、ch2(黄色)がプログラムで波形計算の前後でH/Lさせたものch1は143.799kHzとなっていて粗密がノコギリ波的な感じになっている。ch2はHiの区間が波形を計算するのに使った時間でだいたい100uSぐらいだ。本当は外部割り込み(ラッチ)でサンプリング周期を与えようと思っているが、今回は単純にメインループで順次処理している。出力波形をオーディオインタフェース経由でPCのWaveSpectraで見てみた。無事ノコギリ波が出力されている(^q^/パルス波が150kHzで可聴帯域外なのでLPFをいれなくてもパルス波は除去されているようだ(オーディオインタフェースがLPF)6bitなのでガタガタだが。メモ:スレーブをいっぱい並べると駆動クロックは同期させておかないとやっぱりマズそう。スレーブごとに内部クロックで動かすと波形がずれてジッターみたいになりそう。→それはそれで面白いかもしれない(^q^;tuningWordを求めるときに浮動小数点演算をしているのでメモリを90%以上使ってしまっている。これを整数演算にしないと後はもう何もできない。振幅も可変にできるようにしたいが、和音とかSuperSawなら別にスレーブごとに音量を変えなくてもいいかのか?う~ん。PSoC1Tiny85とLPC810を代替案に考えていたが、PSoC1に8pinのものがあったのを思い出した。240円@秋月I2CありSPIあり9bitDACあり14bitADCありいっぱいならべるとまあまあ高いが5個なら1,200円か。ハードウェアでけたはんだ付け終わった(^q^/表面LCDは結局普通のHD44780互換のパラレルのものを使った。5LPとLCDを外した状態LCDの下に拡張用のSPI端子を出している。はんだ面2層目の配線にはポリウレタン線を使った。シーケンサー基盤とつないで動作USBケーブルは電源供給のためだけに使っている。ファームウェアをいじってからもう少し詳しい記事書きます。前回の「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をやってみた。ExampleのInterICSoundというプロジェクト。実際にI2Sのデバイスを動かすのではなく、PSoCのI2Sコンポーネントのsdo(データ出力)からsdi(データ入力)にループバックさせるというものだった。CPUからI2SへDMAを経由してデータ転送するあたりに重点が置かれている。実際PSoCのコンポーネントのなかでもDMAは使い方がちょっとややこしい感じだ。PSoCで作るMyスペシャル・マイコン」の付属基板を使った。Exampleでデフォルトで指定されているPINを変更せずにそのまま配線した。CreatorのTopDesign動作させるとLCDに送信データと受信データが表示される(ループバックされているので同じ値)タクトスイッチを押すとデータの1byte目がインクリメントされる。FF」と表示されるので、細かいことはわからないがまあ動作してるんだと思う。LEDがつながっているClipはRXがClipしたらうんぬんと書いてあるが、まだちゃんとDATASHEETを読んでないのでよくわからない。タクトスイッチを押しっぱなしにしていると点灯するようだ。<追記:2016.02.28>ClipはI2SコンポーネントがRXモードで受信したときにConfigureダイアログで設定した値内に収まっていない場合を判定するようです。測定中I2SコンポーネントのSCLKとWSは配線されていないので、ブレッドボードに引き出してオシロで確認してみた。ch2:SCLKSCLKの周波数が約3MHzになっている。Rateを指定するところがない。<追記>TopDesignをよく見たらI2SのコンポーネントにClockを入力するところがあった(^q^;;;6MHzのクロックが入力されて3MHzのSCLKが出ているようだ。66.75なので数が合わない。」にI2Sの記事が載っていたので買ってきた。近所の本屋にはトラ技は置いてないのにインターフェイスは毎号おいている。インターフェイスの方が売れてるのかな?ともかくもう少し調べて見る予定。DAC(MCP4922)を動かす。5LPでは使えるSPIのコンポーネントが違うので簡単にテスト。PSoCで作るMyスペシャル・マイコン」の付属基板を使った。1usのサンプリング間隔でノコギリ波を出力させている。4MHzまずは基本的なスペックで動作させてみた。ch2:SCLKLDACはプログラムで出力しているので、SPI通信の処理時間はコミコミで6.960us。ch2:SCLKSPI通信が終わる前にLDACがLに落ちている。←これではダメなので待ち処理は必要だ。Clockを上げてみた。Clockは以下のとおり設定。ch2:SCLKSCLKの周波数は、表示では「(2)15.03MHz」となっている。Masterコンポーネントでは20MHzに設定しているので謎。ch2:SCLKSPI通信にかかる時間を2.412us(だいたい414.6kHz)まで減らせた。M4なので少し調べてみることにした。mbedの使い方はhttps://developer.mbed.org/compiler/にアクセスして「インポート」でサンプルプログラムをインポートして「コンパイル」して落ちてきた「*.bin」ファイルを、mbedターゲットをつないだ時に現れるフォルダにDrag&Dropすればいい。これで、「mbed_blinky」や「Nucleo_blink_led」のLチカはできる。→オン・ボードのLEDがチカチカする。その後がよくわからないのでほっておいた。「Nucleo_pwm」を開いてみると「PWM_OUT」という定義っぽいものが出てきて、さらっとprintf()も出てくる。printf()はUART通信で文字列を表示するのかな?と思うが、「PWM_OUT」というのがどこで定義されているのか?と思って探してみたらhttps://developer.mbed.org/platforms/ST-Nucleo-F401RE/の「Information」の囲みのところでPWM_OUT=PB_3となっている。これかな?main.cppを見ると10ms間隔で1msのパルスを発生させる様な感じだ。今日はオシロをしまってしまって引っ張りだすのがめんどくさいのであきらめた。frdm_gpio少しソースをいじったら動作した。このexampleはオン・ボードのLチカとGPIOのPINチカ(?)のプログラムのようだ。D0と定義されている。「Nucleo-F401RE」では「LED_RED」はないと怒られるので「LED1」に変更。gpoも「D0」だと動作しないので「D12」に変更。ArduinoのPIN番号で指定するのかな?LED1がD13に割り当てられてるのもArduino互換な感じだ。M7というのが出たみたいだ。nucleoATtinyをいっぱい並べるオシレーターの妄想ATtiny13のデータシートを眺めながらもう少し妄想。スレーブのATtinyが何をすればいいのかというと、アナログシンセの制御方法にあやかって、CV(周波数)とGate(音量)を受け取って波形を出力する。図でいうと「(3)データ」でCVとGate(とその他もろもろ)をマスターからスレーブに送る。ラッチの間隔がサンプリング周波数になる(と思う)スレーブは与えられたCVとGateから出力波形を計算して「(2)ラッチ」が送られた時にPWMで電圧を出力する。並べるので(5~7個ぐらい?)ピン数が多いと実装がしんどそうなので8Pinぐらいがよさそう。矩形波はPWMで大丈夫そうだが、ノコギリ波もやりたいのでDDSの波形生成も実装したい。ROMが足りない場合は外付けでEEPROMをつけて、それぞれのスレーブで共有して要求にしたがってSRAMに読み込んで使う。電源に2PIN、I2Cに2PIN、クロックに1PINとして、のこりは3PINなので8PINのマイコンを使おうと思うとこれでぎりぎりだ。ROMは1kBなのでプログラムで消費する量を考えると128サンプルぐらいにしないと波形テーブルは乗せられなそうだ。I2CのEEPROMを使おうと思っても、USI(シリアル通信用の基本のハードウェア)もない。調べてみるとATtiny13にはタイマー(PWM)が1つしかない。PWM出力でTimer1個、波形生成でTimer1個、合計2個使いたいたいのでちょっと困った。→Timerはやりくりすれば1個で済ますこともできそうだが、自信なし(^q^;マイコンの選定8Pinであまり高くないやつATtiny85秋月で160円、マルツで215円PWM用のTimerと別にもう一つTimerがついている。表面実装タイプもあり(実装面積を節約できそう)。CortexM0でこの値段は安すぎる気がしないでもない。一度使ってみようかな。5LPにデジタルフィルタの処理を追加してみた。今のところ8kHzのサンプリング・レートでやっている。サンプリング間隔のうちどれぐらい時間がかかっているかオシロで見てみた。ch2:Timer_Sampling_TCch2はサンプリング周期でパルスを発生させて補足したもの。ch1は波形生成処理の前後でH/Lさせている。サンプリング周期は0.126ms(126us)で波形生成は60.400us。8kHzだと約半分で処理が完了しているようだ。プログラムはほとんど最適化していないので最終的にはサンプリング周波数をもう少しあげられるかもしれない。ch2:Ext_Checkch2はデジタル・フィルタの処理の前後でH/Lさせたもの。2usで済んでいるようだ。メモ:8kHzのサンプリング周波数だとカットオフ周波数は4kHzに制限される。ナイキスト周波数だからしかたない。5LPのFilterコンポーネントは実行時にパラメータをいじれないようだ。カットオフ周波数ぐらいは変化させたかったので残念。自力でDFBをいじればできるかもしれないが、DSPプログラミングはやったことがないので保留。BlackFinをいじってからまた考えよう。部品並べ(メモ)拡張用SPIは外付けDACを想定。Kitのポートによって動いたり動かなかったりするので一通りチェックしてみた。ExampleのCharLCD_CustomFontでチェック。配線図(P2[6:0])接続表(P2[6:0]])結果P2とP12ではうまく動くが他は動かせなかった。使ったLCDは共立で買ったHD44780互換のやつです。5LPでI2SのExampleをやってみた。DAC(MCP4922)を動かす。