GR-SAKURA
GR-KURUMI
GR-COTTON
GR-CITRUS
GR-PEACH
GR-KAEDE
GR-ADZUKI
GR-LYCHEE
GR-ROSE
GR-MANGO(*)
SNShield
Web Compiler
IDE for GR
TOPPERS関連
女子美コラボ
その他
※プロデューサミーティング中
作り方使い方資料
イベント関連
作品記事
体験記事
ライブラリ
ツール
その他・過去ファイル
WAVPを使うとモーター用PWMの周期がかわってしまうようです。
パルス幅は変わりませんが、周期が2ms程度から700us台になってしまいました。
void loop() { analogWrite(6,50); wavp.play("organ.wav"); wavp.play("okoto.wav"); wavp.play("jingle2.wav");}
WAVPを使うとモーター用PWMの周期がかわってしまうようです。 パルス幅は変わりませんが、周期が2ms程度から700us台になってしまいました。
GR-ADZUKI はどうだかわからないのですが、GR-KURUMI の標準のライブラリでのタイマ・アレイ・ユニットの各タイマの割り振りを今確認したところ
こんな感じで使用しており、恐らくは ADZUKI でも大して変わらないのではないかと思います。
Wavp は TCR00 をマスタ・チャネルとして使用し、チャネル1 と チャネル2 を出力にして残りのタイマのハードウェア PWM の使用は考慮されていない感じです。
http://gadget.renesas.com/ja/product/kemuri.html に GR-KURUMI のピンマップが掲載されておりハードウェア PWM とソフトウェア PWM に使用できるピンがわかりますが、実際この図は間違っており、ハードウェア PWM に割り当てられたピン以外は全てソフトウェア PWM に使用できるライブラリの作りとなっており、恐らくは ADZUKI でも変わらないと思うので、DC モーター制御程度ならソフトウェア PWM を試してみるというのも手だと思います。ソフトウェア PWM はハードウェア PWM の約490Hz の1/4、約122Hz で動作していたと思いますが DC モーター程度なら支障はないのでは。
GR-KURUMI のライブラリでは gr_common/RLduino78/cores/pintable.h の中 PinTable[] というテーブルでハードウェア PWM/ソフトウェア PWM の定義を行っており、ハードウェア PWM に設定されているピンをこゝを変更することでソフトウェア PWM に変更することも可能だった筈です。恐らくは ADZUKI でも同様の手は使えると思います。
Maenoさん、WAVPでplay後にPWMの周期、デューティをもとに戻すようにしてみましたので、ちょっと確認いただけないでしょうか。
Maenoさん、お手数をおかけしてすみませんでした。
WAVP再生中はピン6,9のPWM周期に合わせてデューティーを合わせるようにして、再生後はPWM周期を元に戻すように修正いたしました。
なお、GR-ADZUKIのソフトウェアPWMピン10, 11とToneがONの場合、WAVP再生速度に影響が出てきます。
Maenoさん、すみません、きちんと問題を把握できているか分かりませんが、
analogWriteの前にwavを再生したときに波形が出ない不具合を修正し、toneとwavp用のピンをシェアしていても大丈夫なようにしました。
noToneはArduino仕様ではポート入出力は何もせず(出力のまま)、Timerを止めているだけでしたので、RL78もそのようにしようと思います。変更したTone.cppも添付します。
幾度もデバッグにお付き合いいただいてすみません。
ありがとうございます。もう少しでゴールですね。
以下の問題がありました。
(1)TONE_PINとWAVPをピン5に重ねた場合、WAVP再生後にTONEが出ません(HIGH固定後HiZになる)
(2)TONE_PINをピン3、WAVPをピン5にしてその間に圧電スピーカーを接続した場合、
WAVP再生後にピン5がHiZになり、TONEの音が出ません(ピン3は出てます)。
→(2)に関してはWAVPピンもOUTPUT固定にして頂いた方がよいです。
Maenoさん、本件ご対応遅くなっておりすみません。LYCHEEとかいろいろと少し落ち着いたので開始しました。
ただ、考えていたよりちょっと難航中です。WAVP再生後、SAUが何かしらの設定で1を出していると思うのですが、なかなか見つけきれてないです。もう少しお時間いただきます。
もしかして,P1.5が入力(Hi-Z)のときにP1.1をビット操作したのではありませんか? そうだとすると,ビット操作によってP1.5の出力ラッチが書き換わっている可能性が考えられます。P1.5をTO02に設定して,出力に設定する直前にP1.5をビット操作でクリアしてみてください。
【修正】
そうか,SO1はSAU1の出力のレジスタでしたね,P1.5とは関係ない信号だったので勘違いしていました。
SO1レジスタは16ビットレジスタなので,リード・モディファイ・ライトでbit1をクリアしていると思いますが,そのときにbit8(CKO10:SCK20に相当)が変に書き換わっているのかもしれません。CKO10が0になれば,P1.5の値によらず,TO02は出せるかもしれません(P1.5を0にするのが正規の方法ですが)。
エイジさん、本件アドバイスをいただきましてありがとうございました。
まず、私にひとつ勘違いがありました。問題の発端としては①WAV再生(PWM)→②TONEでビープで②が動作しないというものなのですが、②はPWMでなく、タイマーによるポートパタパタで実現されていました。とはいえ、原因としては兼用機能の出力ラッチによる影響でした。
問題は2つあり、一つ目はエイジさんにアドバイスいただいたSO1レジスタで、16ビット操作専用にもかかわらずプログラムがビット操作になっており、該当ビットだけを0にするはずが、すべてのチャネル用のビットが0になってしまっており、P1.5の出力にも影響を与えていました。
二つ目は①WAV再生後にタイマー機能の出力TO0のビット2がクリアされておりませんでした。このため出力ラッチがORで入っているため、P1.5出力が固定され、正常に動作しませんでした。
>Maenoさんへ、
一応修正したwav_libを添付いたしますので、時間が経ってしまい恐縮ですが、試してみていただけるとありがたいです。
maenoさん、ありがとうございます。添付ファイルを見落としていました、すみません。原因はmaenoさんがおっしゃる通りでポートの構成上、出力ラッチをLOWにしておかないと、PWMが正しく出力されませんでした。
RL78では、ポートと兼用機能を切り替えるプログラムはなかなか難しいと感じますね。。
念のため修正ファイルしたファイルを添付いたします。