Newbie PIC PWM question

I posted this to comp.arch.embedded, but the only suggestion I got was that timer 2 was not enabled, but that's why I put in the :
BSF T2CON,TMR2ON near the end. Does anyone here have any thoughts please? =================================================================I'm having problems with the PWM module on a PIC 16F627, and I wondered if anyone could help please.
The PIC is clocked at 4MHz, and I've got 6 LEDs on port B, including RB3/CCP1.
I can write simple light-chaser programs, but I'm trying to dim the LED on CCP1, but it is either on, or its off. My program looks like this:
RESET MOVLW B'00000111' ;Disable Comparator modules MOVWF CMCON
BSF STATUS,RP0 ;Switch to bank 1
;Disable pull-ups ;INT on rising edge ;TMR0 to CLKOUT ;TMR0 Incr low2high trans. ;Prescaler assign to Timer0 ;Prescaler rate is 1:256 MOVLW B'11010111' ;Set PIC options MOVWF OPTION_REG ;Write the OPTION register.
CLRF INTCON ;Disable interrupts MOVLW B'11000000' ;RB7 & RB6 are inputs. MOVWF TRISB ;RB5...RB0 are outputs.
MOVLW 0xFF ; all RA are inputs MOVWF TRISA
MOVLW 100 ; set period for PWM MOVWF PR2
BCF STATUS,RP0 ; Switch Back to Bank 0
MOVLW 5 ; set duty cycle (very low) MOVWF CCPR1L
CLRF T2CON ; Reset prescale and postscale to 1:1
MOVLW B'00001100' ; Set PWM mode MOVWF CCP1CON
BSF T2CON,TMR2ON ; enable TMR2
LOOP GOTO LOOP
Just lights the LED on RB3
Any thoughts anyone please?
--
Deep Reset






Add pictures here
<% if( /^image/.test(type) ){ %>
<% } %>
<%-name%>
Add image file
Upload
"Deep Reset" wrote

that
wondered if

LED on

1:1
Have you looked at the output pin with a scope?
Add pictures here
<% if( /^image/.test(type) ){ %>
<% } %>
<%-name%>
Add image file
Upload
Anthony Fremont wrote:

was
including
to
I don't have a scope, but I lit the adjacent LEDs and varied the duty cycle (CCPR1L) from something like 5 to 95 and could see no difference in brightness between the solid 'on' LEDs and the PWM one. I should've noticed a distinct difference at these sorts of values, I think. I'll see if I can borrow a scope.
Thanks
Deep.
Add pictures here
<% if( /^image/.test(type) ){ %>
<% } %>
<%-name%>
Add image file
Upload
"Deep Reset" wrote

<snip for brevity>

Your code looks ok to me, I don't see any reason for it to not work. I wanted to burn it into a PIC and test it, but I just can't find the time right now. The code below definitely works for me on a 16F628. I get a 256uS period with a duty cycle of 12.5% (32uS) on RB3. The code below was used when I was doing some experimentation, but I ended up needing two PWM pins, so I did it all in software; that's why the ints are disabled, but the comments may indicate otherwise. I left it in the program anyway (for times like this ;-) and it drives an LED directly as a power on indicator and it's quite bright.
BTW, are you sure you aren't being bitten by the watchdog timer and that it's not browning out? You didn't specify what your CONFIG word settings are. You also didn't use any ORG directives to skip over the interrupt vector, so that's a potential issue for later. But it does appear that you have disabled all ints so that really shouldn't be the problem. You could try making PR2 bigger than 100.
; ; Initialize PWM Module ; PWMInit
; Set Period to 255 bsf STATUS, RP0 ; Select BANK 1 bcf PIE1 & 0x07F, TMR2IE ; Turn off TMR2 ints movlw d'255' movwf PR2 & 0x07F bcf STATUS, RP0 ; Select BANK 0
; Set Duty Cycle to 32 movlw DutyCycle movwf CCPR1L
; Setup of Prescaler and TMR2 for different PWM rates (Based on 4Mhz clock) ; (4 Mhz clock) movlw b'00000000' ; TMR2 timer stopped, prescale /1, no post scale ; |||||||+-------------- T2CKPS0 ; ||||||+--------------- T2CKPS1 ; |||||+---------------- TMR2ON ; ||||+----------------- TOUTPS0 ; |||+------------------ TOUTPS1 ; ||+------------------- TOUTPS2 ; |+-------------------- TOUTPS3 ; +--------------------- Unused movwf T2CON
; Set CCP1CON for PWM mode movlw b'00001100' ; PWM Mode ; |||||||+-------------- CCP1M0 ; ||||||+--------------- CCP1M1 ; |||||+---------------- CCP1M2 ; ||||+----------------- CCP1M3 ; |||+------------------ CCP1Y ; ||+------------------- CCP1X ; |+-------------------- Unused ; +--------------------- Unused movwf CCP1CON
; Clear the interrupt flags bcf PIR1, TMR2IF
; Enable Peripheral interrupts bcf INTCON, PEIE
; Enable the timer clrf TMR2 bsf T2CON, TMR2ON ; Start counting
return
Add pictures here
<% if( /^image/.test(type) ){ %>
<% } %>
<%-name%>
Add image file
Upload

<CODE SNIPPED>
Thanks to all who replied/emailed - the code was working all the time - I'd just forgotten two things: 1) Don't trust the eye to measure relative brightness (!) 2) The duty cycle register has an extra 2 bits in CCP1CON.
Thanks again
Deep.
Add pictures here
<% if( /^image/.test(type) ){ %>
<% } %>
<%-name%>
Add image file
Upload

Polytechforum.com is a website by engineers for engineers. It is not affiliated with any of manufacturers or vendors discussed here. All logos and trade names are the property of their respective owners.