( 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 ( = PWMA0 ( S1 = PWMA1 ( S2 = PWMA2 ( S3 = PWMA3 SCRUB DECIMAL VARIABLE PER# EEWORD 9091 PER# ! ( for 2199.978 KHz VARIABLE W1# EEWORD 909 W1# ! ( for 10% DUTY CHARGE VARIABLE W2# EEWORD 1818 W2# ! ( for 20% DUTY BETWEEN VARIABLE W3# EEWORD 2727 W3# ! ( for 30% DUTY DISCHARGE HEX 03 CONSTANT PWMCTL# EEWORD ( DIV BY 1 E05 CONSTANT PERIODREG EEWORD E07 CONSTANT DURATION1 EEWORD E08 CONSTANT DURATION2 EEWORD E09 CONSTANT DURATION3 EEWORD HEX 2VARIABLE RUN-AVE EEWORD VARIABLE RUN# EEWORD 40 RUN# ! DECIMAL 1.0E0 FCONSTANT SCALE EEWORD HEX : INIT 2003 0E80 ! ( ASSIGN ADC CONTROL REG 1 003D 0E81 ! ( ASSIGN ADC CONTROL REG 2 3210 0E83 ! ( ASSIGN ADC CHANNEL LIST REG 1 7654 0E84 ! ( ASSIGN ADC CHANNEL LIST REG 2 0.0 RUN-AVE 2! 40 RUN# ! ; EEWORD : ANA0 E89 @ 8 / ( OUTPUT REGISTER FOR ADC CHANNEL ZERO ; EEWORD : A/D RUN-AVE 2@ D>F FDUP RUN# @ S>F F/ F- F>D ANA0 S->D D+ RUN-AVE 2! ( running average ; EEWORD : SMOOTH. RUN-AVE 2@ D>F RUN# @ S>F F/ SCALE F* F. ; EEWORD ( TEST WORD ( DISPLAYS THE VALUE OF ADC REGISTER VS. SMOOTHED : Z DECIMAL BEGIN CR ANA0 . SMOOTH. ?TERMINAL UNTIL ; EEWORD HEX : PWMLOAD E00 @ DROP PWMCTL# E00 ! ; EEWORD HEX : PWMINIT 8000 E03 ! 0 E0C ! ( DEADTIMEREG 0 E0D ! 0 E0E ! 000E E0F ! ( CENTER ALIGN IND 5/4 2/3 0/1 COMP none PER# @ PERIODREG ! W1# @ DURATION1 ! W2# @ DURATION2 ! W3# @ DURATION3 ! PWMLOAD ; EEWORD 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 : C? ( CHARGE? 100 W1# @ PER# @ */ U. DURATION1 ? DURATION2 ? DURATION3 ? ; EEWORD DECIMAL : C% ( CHARGE% PER# @ 100 */ PER# @ MIN 1 MAX W1# ! PWMINIT C? ; EEWORD ( USE OF DUTY: PERCENT FOLLOWED BY "DUTY%" ( : 1 C% ( : 10 C% ( : 20 C% DECIMAL : B? ( BETWEEN? 100 W2# @ PER# @ */ U. DURATION1 ? DURATION2 ? DURATION3 ? ; EEWORD DECIMAL : B% ( BETWEEN% PER# @ 100 */ W1# @ MAX PER# @ W3# @ - MIN W2# ! PWMINIT B? ; EEWORD ( USE OF DUTY: PERCENT FOLLOWED BY "DUTY%" ( : 1 B% ( : 10 B% ( : 20 B% DECIMAL : DC? ( BETWEEN? 100 W3# @ PER# @ */ U. DURATION1 ? DURATION2 ? DURATION3 ? ; EEWORD DECIMAL : D% ( BETWEEN% PER# @ 100 */ PER# @ MIN W1# @ MAX W3# ! PWMINIT DC? ; EEWORD ( USE OF DUTY: PERCENT FOLLOWED BY "DUTY%" ( : 1 B% ( : 10 B% ( : 20 B% : FR- PER# 1+! PWMINIT FREQ? ; EEWORD : FR+ PER# 1-! PWMINIT FREQ? ; EEWORD : C+ W1# @ 1+ PER# @ MIN W1# ! PWMINIT C? ; EEWORD ( CHARGE + : C- W1# @ 1- PER# @ MIN W1# ! PWMINIT C? ; EEWORD ( CHARGE - : B+ W2# @ 1+ W1# @ MAX PER# @ W3# @ - MIN W2# ! PWMINIT B? ; EEWORD ( BETWEEN + : B- W2# @ 1- W1# @ MAX PER# @ W3# @ - MIN W2# ! PWMINIT B? ; EEWORD ( BETWEEN - : DC+ W3# @ 1+ W1# @ MAX PER# @ MIN W3# ! PWMINIT DC? ; EEWORD ( DISCHARGE + : DC- W3# @ 1- W1# @ MAX PER# @ MIN W3# ! PWMINIT DC? ; EEWORD ( DISCHARGE - HEX : ADJUST CR ." A,S FOR DT <,> FOR DUTY +,- FOR FREQ Z,X FOR SKIP TO ESCAPE" CR BEGIN ?TERMINAL IF KEY DUP 2B = IF DUP EMIT SPACE FR+ CR THEN ( + DUP 2D = IF DUP EMIT SPACE FR- CR THEN ( - DUP 41 = IF DUP EMIT SPACE C+ CR THEN ( A DUP 53 = IF DUP EMIT SPACE C- CR THEN ( S DUP 58 = IF DUP EMIT SPACE B+ CR THEN ( X DUP 5A = IF DUP EMIT SPACE B- CR THEN ( Z DUP 3E = IF DUP EMIT SPACE DC+ CR THEN ( > DUP 3C = IF DUP EMIT SPACE DC- CR THEN ( < 0D = ELSE FALSE THEN UNTIL ; EEWORD MACHINE-CHAIN ALL A/D ( ... ( ... END-MACHINE-CHAIN EEWORD DECIMAL : STARTUP INIT EVERY 2000 CYCLES SCHEDULE-RUNS ALL ( KEEP ON REPEATING 9091 PER# ! ( for 2199.978 KHz 909 W1# ! ( for 10% DUTY 909 W2# ! ( for 10% DUTY 909 W3# ! ( for 10% DUTY ( OR STORE VALUE IN THE HOLDING REGISTER ( xxxxx PER# ! ( for ????? ( xxxx W1# ! ( for ???? ( xxxx W2# ! ( for ???? ( xxxx W3# ! ( for ???? PWMINIT ( OR WRITE DIRECTLY TO THE REGISTERS ( xxxxxx PERIODREG ! ( xxxxxx DURATION1 ! ( xxxxxx DURATION2 ! ( xxxxxx DURATION3 ! ( FOLLOWED BY PWMLOAD CR FREQ? CR C? CR B? CR DC? ADJUST ; EEWORD HEX 7C00 AUTOSTART STARTUP DECIMAL SAVE-RAM