Setting up Timer Module


Closed Thread
Results 1 to 13 of 13

Hybrid View

  1. #1
    Join Date
    Dec 2010
    Posts
    5

    Default Setting up Timer Module

    Total Newb here. Have been searching all over the forum with no luck at finding a clear simple way to do this. I am using MicroCode Studio to write code in BASIC, MELABS to program through a PICKIT3 onto a pic12F683. I want to setup a Timer module that will run in the background and output a square wave at 325hz with a duty cycle and frequency that can be defined in the program. I want to output the waveform to a pin and be able to turn ON and OFF the waveform from a mainloop without affecting the speed of the mainloop significantly. The mainloop can contain something simple like a pulsin comand to control the output pins' current state (on or off). Default clock is being used for the PIC.

  2. #2
    Join Date
    Nov 2006
    Location
    Murrieta, CA
    Posts
    62


    Did you find this post helpful? Yes | No

    Lightbulb oh boy...

    well the good thing is that your PIC12F683 has a PWM feature. so based on that...

    your best bet is to review this page referring to IR Communication.. as it explains a lot about the registers you need to set up.

    the tricky part here is setting your Duty cycle. assuming a 1:1 prescale

    (4Mhz / 4 x TMR2 prescale x 325) - 1
    (4Mhz / 4 x 1 x 325) -1
    ( 4,000,000/1300 ) - 1 = 3075 (3.075 ms)

    Not sure you can load 3075 into PR2 register...

  3. #3
    Join Date
    Aug 2005
    Location
    Michigan, USA
    Posts
    224


    Did you find this post helpful? Yes | No

    Default

    Can you elaborate on the following statement?
    ... output a square wave at 325hz with a duty cycle and frequency that can be defined in the program ...
    Do you want a frequency of 325-Hz or do you want a variable frequency?

    Happy Holidays. Mike

  4. #4
    Join Date
    Dec 2010
    Posts
    5


    Did you find this post helpful? Yes | No

    Default

    I want a frequency of 325Hz but if possible be able to change the frequency by adjusting a value in the code and reprogramming the PIC. It will only output one frequency at a time. If the frequency wishes to be changed then it must be done so by changing the 325Hz value in the code to a desired value - lets say 350Hz - and then reprogramming the PIC.

    Thanks for all the help you guys.

    RFEFX: I will take a look at what Reynolds Electronics has to offer - thanks

  5. #5


    Did you find this post helpful? Yes | No

    Default

    Hello,

    Have a look at the HPWM command in the manual. It does what RFEFX suggested, without having to setup the CCP1 registers. The minimum frequency for HPWM, depends on your mcu clock.

    Something like this should work, Regards

    Duty var Byte
    Freq var Byte

    Freq = 325
    Duty = 127 '50%

    Main:

    HPWM 1, Duty, Freq 'Output 325hz, 50% duty on pin 5 pic12f683

    If X happens then Duty = 0 'Pwm off - pin5 low
    If y happens then Duty = 127' Pwm on 50% duty
    If Z happens then Duty = 255, Pwm off - pin 5 high

    goto Main

  6. #6
    Join Date
    Dec 2010
    Posts
    5


    Did you find this post helpful? Yes | No

    Default

    Reynolds Electronics was nice in breaking it down but it won't give me a low enough frequency with the lowest value being 3.9kHz with a 4MHz clock - I need at least 325Hz. I don't really want to change the clock frequency since it affects the speed of my main program. I have posted my code below. It turns an LED on for 1 second and then off for one second while continually sending 3.9kH to a pin. Everyone helps is very much appreciated.

    'device PIC12F683

    DEFINE LOADER_USED 1'Setup for boot-loader programming
    OSCCON = %01100101 ' 01100101 - 4MHZ system clock
    TRISIO.2 = 0 ' GPIO.2 (GPIO.2 = Output)
    PR2 = 254 '(Max Value = 255 Set PWM Period for approximately 3.9KHz
    CCPR1L = 127 ' Set PWM Duty-Cycle to 50%
    CCP1CON = %00001100 ' Select PWM Mode
    T2CON = %00000100 ' Timer2 = ON + 1:1 prescale
    TRISIO.1 = 0


    LED_HIGH VAR BYTE
    LED_LOW VAR BYTE

    BEGIN:
    FOR LED_HIGH = 0 TO 10 'Turn ON LED for 1 Second
    HIGH GPIO.5
    PAUSE 100
    NEXT

    for LED_LOW = 0 to 10 'Turn OFF LED for 1 Second
    LOW GPIO.5
    PAUSE 100
    Next

    GOTO BEGIN

  7. #7


    Did you find this post helpful? Yes | No

    Default

    Madbass1,

    Try this I modified your code.

    DEFINE OSC 4

    TRISIO =%000000 'All outputs
    ANSEL = 0 'ALL I/O digital
    CMCON0 = 7 'comparator off
    OSCCON =$60 'set internal osc to 4mhz

    LED_HIGH VAR BYTE
    LED_LOW VAR BYTE

    BEGIN:

    HPWM 1, 127, 325 'GPIO.2 output 325hz

    FOR LED_HIGH = 0 TO 10 'Turn ON LED for 1 Second
    HIGH GPIO.5
    PAUSE 100
    NEXT

    for LED_LOW = 0 to 10 'Turn OFF LED for 1 Second
    LOW GPIO.5
    PAUSE 100
    Next

    GOTO BEGIN
    Last edited by mark_s; - 15th December 2010 at 18:41.

  8. #8
    Join Date
    Dec 2010
    Posts
    5


    Did you find this post helpful? Yes | No

    Default

    I think I'm just going to settle with changing my OSC value. I managed to complete the code and generate my 350Hz and being able to turn it on and off. Thanks for everyones help. My code is listed below:


    'device PIC12F683

    OSCCON = %00100101 '250kHZ system clock
    CCP1CON = %00001100 'Select PWM Mode
    T2CON = %00000100 'Timer2 = ON + 1:1 prescale

    PR2 = 177 'Max Value = 255 Set PWM Period for 350Hz
    CCPR1L = 150 'Set PWM Duty-Cycle to 85% (177*0.85 = 150)

    TRISIO.2 = 0 'GPIO.2 (GPIO.2 = Output)
    TRISIO.1 = 0

    PIN_VOLTAGE VAR BYTE

    INPUT GPIO.1 'Button input
    OUTPUT GPIO.4 'Red LED
    OUTPUT GPIO.5 'Green LED

    BEGIN:
    ADCIN 1, PIN_VOLTAGE 'ADCIN - Button Voltage Level
    IF PIN_VOLTAGE >= 163 THEN 'Voltage greater then 3.2V
    GOTO TURN_OFF_PULSE
    ENDIF

    IF PIN_VOLTAGE <= 160 THEN 'Voltage less then 3.2V
    GOTO TURN_ON_PULSE
    ENDIF

    TURN_ON_PULSE:
    TRISIO.2 = 0 'Turn ouput pulse on - make timer an output
    low GPIO.4 'Turn Red LED off
    HIGH GPIO.5 'Turn Green LED on
    PAUSE 32 'Wait 0.5sec
    LOW GPIO.5 'Turn Green LED off
    PAUSE 32 'Wait 0.5sec
    GOTO BEGIN

    TURN_OFF_PULSE:
    TRISIO.2 = 1 'Turn output pulse off - make timer an input
    HIGH GPIO.4 'Turn on Red LED
    goto begin

    END

Members who have read this thread : 0

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts