組み込みプログラミングをしているとき、構成レジスタを設定するときに意図していることを正確に説明するコメントを追加すると非常に便利です。そうすれば、データシートに戻って0x01001010
、次にコードを変更する必要があるときにコードを取得しようとしたときに何が起こるかを理解する必要がありません。(コメントを変更と同期させてください)。
私がデコードできることから、PWMレジスタが設定されているように見えますが、希望の間隔で周波数を変更する方法はありません。それを行うにはいくつかの方法があります。ここに2つのアイデアがあります。
- 起動時にタイマーを読み取り、目的の間隔を追加して目標時間を取得し、whileループでタイマーをポーリングすることができます。タイマーがターゲットに到達したら、新しいPWMデューティサイクルを設定し、次の間隔をターゲット時間に追加します。バックグラウンドループで他のことを開始する必要があるまで、これは正常に機能します。
- timer0のカウントを
0xFFFF-interval
に設定し、ロールオーバー時に割り込みをかけるように設定できます。ISRで、新しいPWMデューティサイクルを設定し、timer0カウントを次の間隔にリセットします。
組み込みプロセスでタイミングを制御する一般的な方法の1つは、次のようになります。
int flag=0;
void main()
{
setup_interrupt(); //schedule interrupt for desired time.
while (1)
{
if (flag)
{
update_something();
flag = 0;
}
}
どこflag
に設定されますか?割り込みハンドラーの場合:
void InterruptHandler()
{
flag = 1;
acknowledge_interupt_reg = 0;
}
あなたはあなたの例のすべての部分を持っています、あなたはそれらを適切な場所にまとめる必要があります。あなたの場合、update_something()
PWMを更新します。ロジックは次のようになります。「オンの場合はオフにし、そうでない場合はオンにします。必要に応じてトーン(デューティサイクル)を更新します」
メインのwhileループで追加の遅延や一時停止を行う必要はありません。目標は、何かが行われるのを待って、何度も何度も実行されることです。プログラムが別の速度で何かを行う必要がある場合は、完全に独立してトリガーされる別のフラグを追加できます。これにより、2つのタスクのタイミングが互いに干渉することはありません。