下図のようにATMEGA8のtimer0のPWMモードでPWM波を発生させたいです。
デューティ サイクルは 20% ですが、PWM モードだけでは実装できません。逆モードで高速 PWM モードを使用してみました。TCNT0 が 64H になるまでチェックして、OC0 PIN に到達したらクリアできるようにしました。
OC0 を手動でクリアしているときに、この方法が正しく機能するかどうか疑問に思っていましたか?
そして、ここに私のコードがあります:
.DEF A = R16 ;GENERAL PURPOSE ACCUMULATOR
.ORG $0000
ON_RESET:
SBI DDRB,3 ;SET PORTB3(OC0) FOR OUTPUT
LDI A,0b01011011 ;SET TO FAST PWM MODE
OUT TCCR0,A ;SET PRESCALER/DIVIDER TO /32
LDI A,32 ;DIFFERENT VALUE
OUT OCR0,A ;FOR COMPARE
MAIN_LOOP:
PLOOP: IN A,TCNT0 ;COMPARE TCNT0
ANDI A,0x64H ;COMPARE TCNT0 TO 64 TO MAKE IT ZERO
BRNEQ PLOOP
CBI PINB,3
RJMP MAIN_LOOP;A CHECK FOR TIMER LOOP