p.478
これまではコンペア値を固定していたが、ここではプログラムの途中でコンペア値をロードし直して随時パルス幅が変更できるようにする。
; PD6 (OC0A)のIOをOUTにする。 SBI DDRD, PD6 BEGIN: ; Loの長さを設定する LDI R20, 0 OUT OCR0A, R20 ; コンペアマッチ時にOC0A (PD6)をセット。CTCモード。 LDI R20, (1 << COM0A1) | (1 << COM0A0) | (1 << WGM01) OUT TCCR0A, R20 ; 1024分周してカウント。 LDI R20, (1 << CS02) | (1 << CS00) OUT TCCR0B, R20 L1: ; コンペア値Aにマッチするまでとどまる。SBISはSkip if Bit in I/O Register is Set。 SBIS TIFR0, OCF0A RJMP L1 ; コンペア値AにマッチしたらコンペアマッチAフラグをクリアする。 SBI TIFR0, OCF0A ; Hiの長さを設定する。 LDI R20, 255 OUT OCR0A, R20 ; コンペアマッチ時にOC0A (PD6)をクリア。CTCモード。 LDI R20, (1 << COM0A1) | (1 << WGM01) OUT TCCR0A, R20 L2: ; コンペア値Aにマッチするまでとどまる。SBISはSkip if Bit in I/O Register is Set。 SBIS TIFR0, OCF0A RJMP L2 ; コンペア値AにマッチしたらコンペアマッチAフラグをクリアする。 SBI TIFR0, OCF0A RJMP BEGIN