( PMCTL ( ( LDFQ 0000 LOAD ON EVERY OPPORTUNITY ( HALF 0 DISABLE HALF CYCLE RELOADS ( IPOL0 0 DUNNO ( IPOL1 0 DUNNO ( IPOL2 0 DUNNO ( PRSC 00 DIVIDE IP BUS BY 1 ( PWMRIE 0 INTERRUPT REQUEST DISABLED ( PWMF 0 CLR INT FLAG ( ISENS 00 TOP BOTTOM ISSUES ( LDOK 1 LOAD NEW VALUE ( PWMEN 1 ENABLE OUTPUTS OUTCLT ? ( ( PMCTL 0000000000000011 ( PMCTL 0003 ( PMFCTL xxxxxxxx000000000 FAULT INTERRUPTS, IGNORE ( PMFSA 00000000000000000 FAULT STATUS IGNORE ( PMOUT ( PAD EN 1 OUTPUT PAD ENABLE NO TRISTATE ON OUTPUT ( X RESERVE ( OUTCTL5 0 ( OUTCTL4 0 ( OUTCTL3 0 ( OUTCTL2 0 ( OUTCTL1 0 ( X RESERVE ( X RESERVE ( OUTCTL5 0 ( OUTCTL4 0 ( OUTCTL3 0 ( OUTCTL2 0 ( OUTCTL1 0 ( ( PMOUT 1000000000000000 ( PMOUT 8000 ( PMCNT READ ONLY COUNT ( PWMCM SET AS NECESSARY ( PWMVALx THIS IS THE VALUE FOR PWM. SET AROUND 10% ( PWMDEADTM DEAD BAND BETWEEN S1 AND S2/3 ( PWMDISMAP1 ALL ONES ( PWMDISMAP2 ALL ONES ( PMCFG ( XXX RESERVED ( EDG 0 CENTER ALIGNED ( TOPNEG 000 TOP POS/NEG IGNORE ( BOTNEG 000 BOT POS/NEG IGNORE ( INDEP 100 MAKE TWO LOWER CH DEPENDENT ( WP 0 WP LEAVE ZERO SO CAN REWRITE ( ( PMCFG 00010000001000 ( PMCFG 0008 ( PMCCR ( ENHA 0 DISABLE TO VLMODE SWAP ETC. ( X RESERVE ( MSKx 000000 UNMASKED ( XX RESERVE ( VLMODE 00 EACH VALUE REGISTER INDEPENDENT ( X RESERVE ( SWAPxx 000 ( ( PMCCR 000000000000000 ( PMCCR 0000 ( PMPORT ( XXXXXXXXX RESERVED ( PORTx UUUUUU ( ( PMPORT 003F READ ONLY ( 0 PMCTL 0083 ( 1 PMFCTL IGNORE ( 2 PMFSA IGNORE ( 3 PMOUT 8000 ( 4 PMCNT READ ONLY COUNT ( 5 PWMCM SET AT 2.2KHz ( 6 PWMVAL0 THIS IS THE VALUE FOR PWM. S1 ABOUT 10% VARIALBE ( 7 PWMVAL1 THIS IS THE VALUE FOR PWM. COMPLEMENT LESS DEADBAND ( 8 PWMVAL2 ( 9 PWMVAL3 ( A PWMVAL4 ( B PWMVAL5 ( C PWMDEADTM VARIABLE ( D PWMDISMAP1 ALL ONES ( E PWMDISMAP2 ALL ONES ( F PMCFG 0008 ( 10 PMCCR 0000 ( 11 PMPORT 003F READ ONLY ( Code for hardware PWM follows ( Let's see. 40MHz /1 prescaller gives ( 40,000,000 cps so a 2.2KHz cycle is 18182 or 4706HEX ( But Center aligned gets divide by 2 ( HOOKUP ( S1 = PWMA0 ( S2 = PWMA1 ( = PWMA2 ( S3 = PWMA3 SCRUB DECIMAL VARIABLE PER# EEWORD 9091 PER# ! ( for 2199.978 KHz VARIABLE S1# EEWORD 909 S1# ! ( for 10% DUTY VARIABLE DT# EEWORD 255 DT# ! ( for MAX DEAD TIME VARIABLE SKP# EEWORD 0 SKP# ! ( for NO SKIP VARIABLE SKPCNT EEWORD SKP# @ SKPCNT ! ( for NO SKIP HEX 03 CONSTANT PWMCTL# EEWORD ( DIV BY 1 E05 CONSTANT PERIODREG EEWORD E06 CONSTANT DURATION1 EEWORD E08 CONSTANT DURATION2 EEWORD E0C CONSTANT DEADTIMEREG EEWORD HEX : PWMLOAD E00 @ DROP PWMCTL# E00 ! ; EEWORD HEX : PWMINIT 8000 E03 ! DT# @ DEADTIMEREG ! 0 E0D ! 0 E0E ! 0008 E0F ! ( CENTER ALIGN COMP 2/3 0/1 PER# @ PERIODREG ! S1# @ DURATION1 ! S1# @ DURATION2 ! PWMLOAD ; EEWORD : CHASER E00 @ 0010 AND ( CHK PWMF BIT, CHK IF NEW RELOAD IF REDLED ON 0001 E00 ! ( CLR PWMF BIT WITHOUT LDOK SKPCNT 1-! SKPCNT @ 0< IF ( 8000 E03 ! ( 0008 E0F ! ( CENTER ALIGN COMP 0/1 2/3 SKP# @ SKPCNT ! ELSE 8A00 E03 ! ( OUT2,4 IS CLR, DISABLES THESE OUTPUTS 000E E0F ! ( INDP 2/3 0/1 THEN ELSE REDLED OFF THEN ; EEWORD ( END-MACHINE-CHAIN DECIMAL : FREQ? 20.000000 PER# @ UM/MOD U. DROP PERIODREG ? ; EEWORD DECIMAL : FREQ 20.000000 ROT UM/MOD PER# ! DROP PWMINIT FREQ? ; EEWORD ( USE OF FREQ: CYCLES FOLLOWED BY "FREQ" ( : 2200 FREQ ( : 2000 FREQ ( : 2222 FREQ DECIMAL : DUTY? 100 S1# @ PER# @ */ U. DURATION1 ? DURATION2 ? ; EEWORD DECIMAL : DUTY% PER# @ 100 */ PER# @ MIN 1 MAX S1# ! PWMINIT DUTY? ; EEWORD ( USE OF DUTY: PERCENT FOLLOWED BY "DUTY%" ( : 1 DUTY% ( : 10 DUTY% ( : 20 DUTY% DECIMAL : DT? DT# @ 100 S1# @ */ . DEADTIMEREG ? ; EEWORD DECIMAL : DT% S1# @ 100 */ 255 MIN DT# ! PWMINIT DT? ; EEWORD ( USE OF DEADTIME%: PERCENT FROM 0 TO 14 FOLLOWED BY "DT%" ( : 5 DT% ( : 10 DT% ( : 25 DT% : SKP? SKP# @ . ; EEWORD : FREQ- PER# 1+! PWMINIT FREQ? ; EEWORD : FREQ+ PER# 1-! PWMINIT FREQ? ; EEWORD : DUTY+ S1# 1+! PWMINIT DUTY? ; EEWORD : DUTY- S1# 1-! PWMINIT DUTY? ; EEWORD : DT+ DT# @ 1+ 255 MIN DT# ! PWMINIT DT? ; EEWORD : DT- DT# @ 1- 0 MAX DT# ! PWMINIT DT? ; EEWORD : SKP+ SKP# @ 1+ DUP 0< IF DROP 32535 THEN SKP# ! SKP? ; EEWORD : SKP- SKP# @ 1- 0 MAX SKP# ! SKP? ; EEWORD HEX : ADJUST CR ." A,S FOR DT <,> FOR DUTY +,- FOR FREQ Z,X FOR SKIP TO ESCAPE" CR BEGIN ?TERMINAL IF KEY DUP 41 = IF DUP EMIT SPACE DT+ CR THEN ( A DUP 53 = IF DUP EMIT SPACE DT- CR THEN ( S DUP 3E = IF DUP EMIT SPACE DUTY+ CR THEN ( > DUP 3C = IF DUP EMIT SPACE DUTY- CR THEN ( < DUP 2B = IF DUP EMIT SPACE FREQ+ CR THEN ( + DUP 2D = IF DUP EMIT SPACE FREQ- CR THEN ( - DUP 58 = IF DUP EMIT SPACE SKP+ CR THEN ( X DUP 5A = IF DUP EMIT SPACE SKP- CR THEN ( Z 0D = ELSE FALSE THEN UNTIL ; EEWORD DECIMAL : STARTUP 9091 PER# ! ( for 2199.978 KHz 909 S1# ! ( for 10% DUTY 255 DT# ! ( for MAX DEAD TIME ( OR STORE VALUE IN THE HOLDING REGISTER ( xxxxx PER# ! ( for ????? ( xxxx S1# ! ( for ???? ( xxx DT# ! ( for ??? SKP# @ SKPCNT ! PWMINIT ( EVERY 1000 CYCLES SCHEDULE-RUNS CHASER EVERY 50 CYCLES SCHEDULE-RUNS CHASER ( OR WRITE DIRECTLY TO THE REGISTERS ( xxxxxx PERIODREG ! ( xxxxxx DURATION1 ! ( xxxxxx DURATION2 ! ( xxxxxx DEADTIMEREG ! ( FOLLOWED BY PWMLOAD CR FREQ? CR DUTY? CR DT? ADJUST ; EEWORD HEX 7C00 AUTOSTART STARTUP DECIMAL SAVE-RAM