ExampleByUltiblade

I finally accomplished this by using a 18F1230 @ 8Mhz , DT-INTS and a few lines of code.

The code below produces a 30Hz PWM that increments it's dutycycle every interrupt until it reaches 100%, it will then decrement to 1% and start over. It uses a 'base' frequency of 60Hz (PTPER 519), and distributes the dutycycle over the 30Hz periods.

Code:
'==== Set fuses
@ __CONFIG    _CONFIG1H, _OSC_INTIO2_1H & _FCMEN_OFF_1H & _IESO_OFF_1H
@ __CONFIG    _CONFIG2L, _PWRT_OFF_2L & _BOR_OFF_2L & _BORV_3_2L
@ __CONFIG    _CONFIG2H, _WDT_OFF_2H & _WDTPS_1_2H
@ __CONFIG    _CONFIG3L, _HPOL_HIGH_3L & _LPOL_HIGH_3L & _PWMPIN_ON_3L
@ __CONFIG    _CONFIG3H, _FLTAMX_RA5_3H & _T1OSCMX_HIGH_3H & _MCLRE_OFF_3H
@ __CONFIG    _CONFIG4L, _STVREN_OFF_4L & _BBSIZ_BB256_4L & _XINST_OFF_4L & _DEBUG_OFF_4L
@ __CONFIG    _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L
@ __CONFIG    _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H
@ __CONFIG    _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L
@ __CONFIG    _CONFIG6H, _WRTB_OFF_6H & _WRTC_OFF_6H & _WRTD_OFF_6H
@ __CONFIG    _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L

'==== Include DT interrupts
INCLUDE "DT_INTS-18.bas" ;Base Interrupt System
INCLUDE "ReEnterPBP-18.bas" ;Include if using PBP interrupts

'==== Dec's for OSC
OSCCON  = %01110000 'Int OSC @ 8 MHz
'OSCTUNE = %00000000  'PLL disabled, center freqency
DEFINE OSC 8 'Int OSC @ 8 MHz, for PBP

'==== Initialize DT_INTS
ASM
INT_LIST  macro    ; IntSource,	  Label,   Type,	ResetFlag?
        INT_Handler		PT_INT,	_pwmINT,	PBP,	YES
    endm
    INT_CREATE ;Creates the interrupt processor
ENDASM                     

'==== Set port associated registers
ADCON0  = %00000000 'A/D convertor disabled
ADCON1  = %00001111 'All ports configured digital
ADCON2  = %10000000 'Right justify results
CMCON   = %00000000 'Comparator modules disabled
CVRCON  = %00000000

PTCON0  = %00001100 'Fosc/4 Prescale 1:64, Free running mode
PWMCON0 = %00110111 'PWM0,1,2,3 enabled, independent mode
PWMCON1 = %00000001 'Special event on count upwards, Sync PWM timebase 

PORTA   = %00000000
PORTB   = %00000000
TRISA   = %01100000
TRISB   = %00000100

'==== Dec's for pin aliasing INPUT'S
'none  

'==== Dec's for pin aliasing OUTPUT'S
'none

'==== Reset PWM duty registers
PDC0L = 0: PDC0H = 0 'Reset duty register 0
PDC1L = 0: PDC1H = 0 'Reset duty register 1
PDC2L = 0: PDC2H = 0 'Reset duty register 2

'==== Dec's for variables
pwmFREQ var word
pwmDUTY_TGT var word
pwmDUTY var word
pwmDIR  var bit
pwmTOG  var bit
pwmFL   var bit


'==== Initialise variables
pwmFREQ = 0
pwmDUTY_TGT = 0
pwmDUTY = 0
pwmDIR  = 0
pwmTOG  = 0
pwmFL   = 0


'==== Wait for hardware settle
Pause 500 'Settle for 0,5 seconds

'==== Enable PWM interrupts
@ INT_ENABLE   PT_INT ;Enable PWM to PTPER match interrupts            

'==== SET PWM frequency and dutycycle
pwmFREQ = 519 'Makes 60,010 Hz, 100% dutycycle = 2076
pwmDUTY = 1 'Initial dutycycle
PTPERL = pwmFREQ.lowbyte 'Set PWM frequency lowbyte
PTPERH = pwmFREQ.highbyte 'Set PWM frequency lowbyte
'pwmFREQ_CO = 2076 '100% dutycycle

'Find out if desired PWM is below 50% or over.
'Double the ammount of dutycycle because 
'the frequency will be half the base frequency .. 
if pwmDUTY <= 1038 then
	pwmDUTY_TGT = pwmDUTY * 2
	pwmDIR = 0
else
	pwmDUTY_TGT = (pwmDUTY - 1038) * 2
	pwmDIR = 1
endif

PTCON1 	= %10000000 'Start PWM output 

'==== Main program loop
main_loop:
@ nop 'Do nothing

goto main_loop

'==== The End
theend: 'Endless loop
goto theend 'Endless loop

'==== Routines
pwmINT:
PWMCON1.1 = 1
    if pwmDIR = 0 then	
        if pwmTOG = 0 then
            PDC0L = 0 
            PDC0H = 0
            PDC1L = pwmDUTY_TGT.lowbyte 
            PDC1H = pwmDUTY_TGT.highbyte
            pwmTOG = 1
	   		else     
            PDC0L = pwmDUTY_TGT.lowbyte 
            PDC0H = pwmDUTY_TGT.highbyte
            PDC1L = 0 
            PDC1H = 0
            pwmTOG = 0
	   		endif
    else
        if pwmTOG = 0 then
            PDC0L = 2076 
            PDC0H = 2076
            PDC1L = pwmDUTY_TGT.lowbyte 
            PDC1H = pwmDUTY_TGT.highbyte
            pwmTOG = 1
	   		else
            PDC0L = pwmDUTY_TGT.lowbyte 
            PDC0H = pwmDUTY_TGT.highbyte
            PDC1L = 2076 
            PDC1H = 2076
            pwmTOG = 0
	   		endif
    endif

		if pwmfl = 0 then
    		pwmduty = pwmduty + 1
		else
    		pwmduty = pwmduty - 1
		endif

		if pwmduty >= 2076 then pwmfl = 1
		if pwmduty <= 0 then pwmfl = 0    

		if pwmDUTY < 1038 then
				pwmDUTY_TGT = pwmDUTY * 2
				pwmDIR = 0
		else
				pwmDUTY_TGT = (pwmDUTY - 1038) * 2
				pwmDIR = 1
		endif
PWMCON1.1 = 0
@ INT_RETURN

Page last modified on March 04, 2018, at 08:49 PM