Raspberry Pi Pico の NTSC水平同期信号生成を PWM 割込に変更した
今日は早めで帰宅は18時過ぎ。Raspberry Pi Pico で NTSC モニタに出力したときには、水平同期のタイミングは結構いい加減に(自分でタイミングを合わせるように)作ってました。これをタイマを用いた割込ベースのタイミング生成にしようとしてたのですが、タイマ使用中はsleep_us()が使えないので、水平同期信号の時間が制御できませんでした。っちゅうことで、タイマの代わりにPWMのカウンタが設定値になったときにかかる割込(PWM_IRQ_WRAP)を使って、一定間隔で水平同期信号を発生させることにしました。この割込を有効にするには、まず PWM で使用するピンを決めてスライス番号を設定する必要があります。// GPPWM pin is the PWM outputgpio_set_function(GPPWM, GPIO_FUNC_PWM);// Figure out which slice we just connected to the GPPWM pinuint slice_num = pwm_gpio_to_slice_num(GPPWM);この後に、スライス番号に対するPWM割込をクリアしてからPWM割込を有効にします。pwm_clear_irq(slice_num);pwm_set_irq_enabled(slice_num, true);次に、PWM割込(PWM_IRQ_WRAP)に対する割込ハンドラ(水平走査線の処理=垂直同期+水平同期+フォント描画を行う関数、ここではhorizontal_line)を設定してから、PWM割込を有効にします。irq_set_exclusive_handler(PWM_IRQ_WRAP, horizontal_line);irq_set_enabled(PWM_IRQ_WRAP, true);この時点ではまだPWMが有効になってないので割込はかかりません。さて、割込の周期を決めてやる必要があります。Raspberry Pi Pico のクロックは125MHzなので、クロック1発分の長さは 8[ns] です。水平同期信号として 64[us] = 64000[ns] の周期にしたいので、クロックを 64000/8 = 8000 回カウントアップしたところで PWM のカウンタが 0 になる(PWM_IRQ_WRAP割込がかかる)ように wrap 値を設定して PWM を有効にしてやります。// Set counter wrap value to generate PWM interrupt by this valuepwm_set_wrap(slice_num, 7999);// Load the configuration into our PWM slice, and set it running.pwm_set_enabled(slice_num, true);これで64us周期のPWM割込(PWM_IRQ_WRAP)毎に水平走査線の処理を行うことができます。プロジェクトはpa-art/test_ntscに置いてあります。見た目は前と変わらんけど... (^^;前は無限ループの中で水平走査線処理を行っていたのですが、今回は割込で水平走査線処理を行うので、無限ループの中では好きな処理ができます。VRAM操作をすれば画面に反映されます。かなりウェイトをかけないと速すぎて困るぐらいです。(^^;; っちゅうことで、ゲームなんかも作れると思います。行ったり来たりしてるバーの表示もかなりウェイトかけてるちなみにコンパイルはデバッグモードで行ってます。--- 20:00 ---