2020年7月30日木曜日

おしゃべり時計withUSB開発日誌(5)、RTCC_キャリブレーションコーディング

今まできちんと時間計測の部分をコーディングしてこなかったので、おしゃべり時計とはいっても時計の機能がキチンとしていなかった。

しかしながら、PIC32MX250F128BはRTCC(Real Time Clock and Calendar)のモジュールが付いているので、MCCでこいつを有効にすれば動き始める。
最近のMCCの設定は、おしゃれで簡単にRTCCの設定が行える。


それで、このRTCCのモジュールには、キャリブレーション機能が付いていて、月差±0.66秒までRTCCの進み具合を調整できるのだ。これは使わない手はない。 


しかしながら、このキャリブレーションはRTCCONレジスタのCALビットに値を格納するのだが、これが 10bitsのサイン付きインテジャーで値は+511~ー512を設定する。マイナス側は補数表記である。



この設定にハタと困った。 10bits の値についてどうやって足し引きしたらよいのか?
c言語では、charは8bits, shortは16bits, longは32bitsである。 10bitsの型なんて無い。
色々と悩んだすえ、shortの変数に6bitsシフトして入れて、足し引きしたのち、6bitsシフト戻してRTCCONbits.CAL にセットする事にした。


//*****************************************************************
// add RTCC Drift Calibration bits
//*****************************************************************
void vRTCC_CalAdd(
short value
)
{
    short cal;

    cal = RTCCONbits.CAL << 6;
    cal = cal + (value << 6);
    
    RTCCONbits.CAL = cal >> 6;
}

//*****************************************************************
// subtract RTCC Drift Calibration bits
//*****************************************************************
void vRTCC_CalSub(
short value
)
{
    short cal;

    cal = RTCCONbits.CAL << 6;
    cal = cal - (value << 6);
    
    RTCCONbits.CAL = cal >> 6;
}

20200730(+1.0h)




2020年7月28日火曜日

おしゃべり時計withUSB開発日誌(4)、スイッチメニューのコーディング・デバッグ

おしゃべり時計に使っているマイコンは PIC32MX250F128Bという、今では貴重なDIPタイプの28pinパケージです。 自作の用途には利用しやすいマイコンなのですが、いろいろと繋ぐとI/Oピンが足らなくなってきます。

そこで一つのピンを色々と共有したりして工夫をします。 今回は4っつあるスイッチのうちの2つを、ICSPプログラミングのコネクタのPGC,PGDと共有する事にしました。



このおしゃべり時計のスイッチ4っつには、それぞれ ”実行”、”アップ”、”ダウン”、”キャンセル” といった機能を割り振っているわけですが、PIC-KITプログラマをおしゃべり時計に繋げながらデバッグを行っていると、ピンを共有している2つのスイッチが使えなくなります。

ですので、スイッチメニュープログラムのコーディング/デバッグは、スイッチ2つだけで行わないといけません。 本来4っつのスイッチで操作するメニュープログラムを2つのスイッチだけを操作しながらコーディング・デバッグするので、やはり効率が悪く上手く動かないなーと思いながら今日もデバッグにいそしむのでした。
20200728(+2.0h)

2020年7月27日月曜日

おしゃべり時計withUSB開発日誌(3)、スイッチメニューの作成

今回のおしゃべり時計には、キャラクタディスプレイなどは付け無いので、スイッチを操作した時のメニューは音声案内のみとなる。

このメニューの音声案内は、以前作ったおしゃべり時計のロジックをほぼ流用して作れると考えていた。 しかしながら、以前のメニューはLCD表示と音声案内が一緒にコーディングされていた為、以前のロジックの半分程・LCD表示部分を削除する事になった。それでも300行程のSWITCH/CASE分がずらずらと並ぶ。

1時間ほどかけてロジックを削除して整理してようやく、メニューロジックがきれいになったので実行してみたが、またまた上手く動かない。

ロジックのあちこちにデバックプリントを入れて、ようやく音声案内を繰り返し実行しようとして、処理が詰まっていることに気が付いた。 

メニューの音声案内はボタンを操作した時に”一度”だけ音声案内するようにしなければならないのだ。 以前のロジックを色々と整理する過程で、この部分のロジックまで削除してしまったようである。

音声案内を出力する所のロジックは、下記のような感じで スイッチメニューのステータスに変化があった時に vWAVE_SEARCH_WORDS_TaskOpen処理で音声案内を発するような感じである。

前回とほぼ同じ内容のメニュー処理なのに、ほぼ全体的に修正が発生するのは、まったくもって移植性が悪いコーディングをしているのだなと反省。
20200727(+4.0h)

2020年7月26日日曜日

おしゃべり時計withUSB開発日誌(2)、SLEEP機能。

おしゃべり時計というからには、時計なのであって長時間電池で駆動したい。
PIC32MX250F128Bで35mA, USBで35mAの電流を消費し、スピーカーを鳴らして30mA消費する。 合計で100mA程となるけれども、それは一時的に消費するもので、大体の時間は稼働していないスリープ状態なのである。 し

スリープ状態の時は、できれば1mA以下の消費電流に抑えたい。

しかしながら、USBを停止しCPUを止めて スリープ状態に移行しても、1.6mAも消費している。 

あちこち弄って試していると、電源電圧を上げるとスピーカーからガサガサ音がする。 アンプICのチップセレクトのプルアップ抵抗を付け忘れた為に、電源電圧を上げるとアンプICが起動してしまったのだ。スピーカーを鳴らすアンプICは電源から直に電力を供給しているので、プルアップ抵抗をつけてPICのアウト端子はオープンドレインで駆動しないといけないのだ。

その他、CDSを暗くすると消費電流が1.0mA以下に下がる事に気が付いた。 電源電圧を監視したり、明るさを検知するCDSの部分はもっと消費電流が低いはずなのだが、、、しょうがない、もう空いているI/Oピンが無いが何とか電流をON/OFFする方策を考えなければ。。



コンパレータの機能を確認する為に、久しぶりに学生時代に作った可変電源を引っ張りだして動かした。 パネルに電圧のメータが付いてますが、適当なのを付けたので目安でしかありません。

20200726(+8.0h)

おしゃべり時計withUSB開発日誌(1)、USBメモリがリセット後に起動せず。

USBメモリを使った音声の再生がようやく安定してきたので、”おしゃべり時計withUSB(仮)"のプログラムの開発を進める。

まずは音声再生機能だが、今回USBメモリ内にある音声データ(waveデータ)を8bitsのPWMで音声出力するのだが、このUSBメモリの扱いに手こずっている。

USBメモリからデータを吸い出す為に何段階もの層/インターフェースが存在するのだ。
1.ペリフェラル層
2.USBインターフェース
3.SCSIインターフェース
4.ファイルシステム層(Fatfs)

またそれぞれのUSBメモリの特性にバラつきがあるのだ。 USBメモリ側に乗っているコントローラの性能なのか、各コマンドに対するレスポンスにかなり差がある。

今回PIC32MX250をリセットした直後にUSBメモリとのインターフェースの確立及びファイルシステムのマウントが時々出来ない事に気が付いた。USBのATTACHからCONFIG DESCRIPTORの取得しファイルシステムのマウントまでエラー無く完了するのだが、USBメモリのファイルが読み出せないのだ。

デバッグプリントを入れたりあちらこちらいじって、半日かけてUSB ATTACH直後のリセット時間に問題がある事を突き止めて、リセット時間を270msにする事で落ち着いた。
この270msは手持ちのUSBメモリの中で一番の古株の8GBバイトメモリが、起動するのに要した時間である。

またこれには電源電圧もかなり影響を受けており、5v以下では、失敗する確率が高くなる。
20200725(+4.0)

2020年7月23日木曜日

PIC32MX250F128Bのコンパレータモジュールの設定でトホホな話し。

PIC32MX250F128Bにおしゃべり時計のプログラムを構築している。
電源電池の電圧低下と明るさセンサーの検出にコンパレータモジュールCMP1/2を今回使用する事にしたので、そのロジックをテストしていたのだが、これがどうやっても動かない。 
結局1日かかってMCCの出力したコードが、CMP1/2のレジスタ設定をうまく出来ないという事が分かった。



MCCで下記のように設定して、CMP1の入力をCVREFとC1INBに設定する。

するとMCCの出力したレジスタ設定コードは、CM1CONSET = 0xA010;となるが、、

残念ながら CM1CON = 0xA010;とCM1CONの方に設定しないと、PIC32MX250F128Bのコンパレータは思った通りに動かない。


PIC32MX250F128Bのヘッダーファイルの中身は下記の通りで、COM1CONSETは記述されてはいる。


しかしながら、PIC32MX1xx/2xx DataSheetには、COM1CONSETの記載が無い。


ふと考えてPIC32MX3xx/4xx DataSheetを確認した所、こちらにはCOM1CONSETの記載がある。


思うに PIC32MX1xx/2xxのチップでは、COM1CONSETはマッピングされていないのではないだろうか。。。 20200723(+8.0h)

2020年7月13日月曜日

ダンボールスピーカー

ダンボールでスピーカーボックスを作りました。

スピーカーユニットは、アマゾンで購入したパナソニック 10cm フルレンジ 8Ω 10W スピーカー EAS10P622B ¥1,280-です。

スピーカーボックスの大きさは、幅12cmx高さ24cm×奥行24cmのダブルバスレフ構造となっています。 音の鳴り様は低音がかなり強くでていて、井上陽水の歌を再生するとちょうどボーカルの声あたりで箱鳴りのようなビビリが耳につくような感じとなってしまいました。 制作時間は5時間ほどで、費用は以下の通りとなっています。

・ダンボール・・・タダ(近くのスーパーから貰ったダンボール&アマゾン)
・スピーカーユニット・・・¥1,280-
・スピーカーを留める板・・・¥100- (ホームセンターの端材)
・木工ボンド・・・¥217-
・スピーカーの穴をあけるキリ・・・¥2,980-
・プレーヤー&アンプ・・・USBメモリ・おしゃべり時計ユニット

ダンボールスピーカー



USBメモリ・おしゃべり時計ユニット

KT0913 FMラジオの作成(8) 出来上がったPCB基板にミスあり。

  FusionPCB から基板がとどきました。20240121. 1月11日に発注したので10日で出来上がって届きました。 早速組み立てましたがが、イヤホンジャックのフットプリントが裏返っており、痛恨のミス。。。 しかしながら、他にも問題が無いか一通り組み立ててチェックしました...