PICBasic newbie problem


Closed Thread
Results 1 to 33 of 33

Hybrid View

  1. #1
    skimask's Avatar
    skimask Guest


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by krohtech View Post
    Can each channel have different duty cycles?
    As many as can be had. Only limitation is processor cycles. Depending on what freq the PWM gets run at, you end up running out of enough cycles to adjust all of the channel's PWM's in the main loop and might run out of cycles in the interrupt loop to update all of the channels before the next interrupt hits.

  2. #2
    Join Date
    Feb 2008
    Posts
    8


    Did you find this post helpful? Yes | No

    Default

    I need at least 16-24 channels, i will investigate more on the forum, if anyone have spotted something useful please be nice to post it here

    Just a simple Tmr0 overflow running as fast as it can... When the interrupt hits, I update the channels/pins according to their duty cycle 'register' variable. Outside the interrupt sub, in the main loop, I update the duty cycle 'register' itself depending on whatever I'm doing.
    That's exactly what I've done in C but that wasn't refresh at the same speed at yours... i was running the outputs @ 220.4 hz but the effects that i need to do with the leds wasn't good , kinda jerky sometimes even with 48mhz (12mips) clock, I ran out off juice :S !

    Btw,skimask why not post it to the code examples or a little example here? I respect your work, if you don't want to share your code it's ok i understand that ...

    Have a nice day you guys!

    You really helped me

    I really love this forum, every time i come, i learn something :P

    Best Regards,
    Laurent
    Last edited by ELCouz; - 9th February 2008 at 10:27.

  3. #3
    skimask's Avatar
    skimask Guest


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by ELCouz View Post
    Btw,skimask why not post it to the code examples or a little example here? I respect your work, if you don't want to share your code it's ok i understand that ...
    Exactly which piece of work do you respect the most?
    Most people don't respect my work at all, if only because it's basically unreadable, as I'm sure it would be to you. The style of coding I've chosen and use is almost unreadable to the person that's not used to it. Ask anybody that's been around awhile, they'll tell you the same thing. The High Colonic Master...yep...that's me...

  4. #4
    Join Date
    Jul 2003
    Posts
    2,405


    Did you find this post helpful? Yes | No

    Default

    And: what : makes : your : coding : style : different : than : anyone : elses :....;o}
    Regards,

    -Bruce
    tech at rentron.com
    http://www.rentron.com

  5. #5
    skimask's Avatar
    skimask Guest


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by Bruce View Post
    And: what : makes : your : coding : style : different : than : anyone : elses :....;o}
    I like to think of it in these terms:
    My code takes up less space on the screen...
    Most other's code takes up less space in the brain...
    :::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::

  6. #6
    Join Date
    Aug 2006
    Location
    Look, behind you.
    Posts
    2,818


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by skimask View Post
    I like to think of it in these terms:
    My code takes up less space on the screen...
    Most other's code takes up less space in the brain...
    :::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::
    I'm : having : a : stack : overflow :
    Last edited by Archangel; - 9th February 2008 at 20:35.
    If you do not believe in MAGIC, Consider how currency has value simply by printing it, and is then traded for real assets.
    .
    Gold is the money of kings, silver is the money of gentlemen, barter is the money of peasants - but debt is the money of slaves
    .
    There simply is no "Happy Spam" If you do it you will disappear from this forum.

  7. #7
    skimask's Avatar
    skimask Guest


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by Joe S. View Post
    I'm : having : a : stack : overflow :
    Me too :::::::::::::::::::)))))))))))))))))))))

    At any rate, just to prove I'm not an _ _ _ (insert word here)...here's some cut down 3 channel code I use on a 16F628A running at 20Mhz.
    Interrupt driven 8 bit, 76Hz software PWM for RGB.
    You got a timer (Timer 0) running as fast as it can, interrupting at 19,531.25 Hz. That increments a byte counter, pwmcount.
    You got 3 duty cycle registers (reddcr, greendcr, bluedcr). If the individual duty cycle register is less than the pwmcounter, the LED stays on, if not the LED goes out.
    Change the DCRs in the mainloop and it should work.
    Like I said, this is cut down code. The full code works just fine for me, but I took out all of the serial interface code, the 5 button interface code and the serial LCD code. Might work, might not. Pay attention to how the hardware hooks up (3 LEDs on PortA, that's it).
    The code should fade the 3 LEDs each in turn in about one second from off to full brightness, over and over again, 3 seconds for all 3 LEDs, wash lather rinse repeat.

    But if you can't make an LED blink in the first place, DO THAT BEFORE YOU TRY THIS!

    Code:
    'PWM loop is @ 19,531.25 hz, w/ 256 cnt res, Freq of PWM is 76.2939hz
    @ DEVICE PIC16F628A , HS_OSC , WDT_OFF , PWRT_ON , MCLR_ON , BOD_ON , LVP_OFF , PROTECT_OFF	'HS 20mhz osc, watchdog off, powerup timer on, mclr external, brown out detect on, low volt program off , code protect off for now
    resetplaceholder:
    DEFINE		OSC		20	'20mhz
    DEFINE		NO_CLRWDT	1	'don't clear the watchdog timer, I'm not using it anyways
    DISABLE				'disable software interrupt checks
    CLEAR					'clear out the ram and do a software 'reset'
    redled var porta.0:greenled var porta.1:blueled var porta.2:chx var porta:reddcr var byte:greendcr var byte:bluedcr var byte:ledtemp var byte:pwmcount var byte
    temp var byte : temp2 var word
    startupholder:	goto skipsubs		'skip over all the commonly used subroutines
    ON INTERRUPT GOTO INTHANDLER
    DISABLE INTERRUPT
    INTHANDLER:	if intcon.2 = 1 then						'if tmr0 rolled over
    			intcon.2 = 0						'reset timer 0 overflow flag
    			if pwmcount = 0 then				'if pwmcounter has rolled over
    				if reddcr <> 0 then ledtemp.0 = 1	'turn off red leds if dcr is 0 (dcr = duty cycle register for LED), otherwise turn it on
    				if greendcr <> 0 then ledtemp.1 = 1	'turn off green leds if dcr is 0
    				if bluedcr <> 0 then ledtemp.2 = 1	'turn off blue leds if dcr is 0
    				chx = ledtemp		'update port pins of led status (on or off), can do this because all the LEDs are on the same port
    				endif
    			endif
    			if reddcr < pwmcount then ledtemp.0 = 0	'if the channel's dcr (duty cycle register) is less than the pwmcounter, turn that channel off, otherwise, leave it on ( < rather than <=, fixes problem with pulsing at high rates)
    			if greendcr < pwmcount then ledtemp.1 = 0
    			if bluedcr < pwmcount then ledtemp.2 = 0
    			chx = ledtemp : pwmcount = pwmcount + 1	'update the port pins and increment the pwmcount
    		endif
    intfinish:	RESUME
    'commonly used subroutines start here
    alloff:		reddcr = 0 : greendcr = 0 : bluedcr = 0 : return	'turn off all leds thru dcr's
    allon:		reddcr = 255 : greendcr = 255 : bluedcr = 255 : return     'turn on all leds
    skipsubs: option_reg=8:pie1=$20:trisa=0:porta=0:trisb=$ef:portb=$10:t1con=0:t2con=0:cmcon=7:ccp1con=0:vrcon=0:pir1.5=0:ledtemp=0:redled=0:blueled=0
                   greenled = 0 : intcon = $e0
    ENABLE INTERRUPT
    mainloop:
    for temp=0 to 255:reddcr=temp:for temp2=0 to 2603:pauseus 1:next temp2:next temp:for temp=0 to 255:greendcr=temp:for temp2=0 to 2603:pauseus 1:next temp2
    next temp:for temp=0 to 255:bluedcr=temp:for temp2=0 to 2603:pauseus 1:next temp2:next temp:goto mainloop	'do it over again
    END
    And for those that don't like colons...
    Code:
    'PWM loop is @ 19,531.25 hz, w/ 256 cnt res, Freq of PWM is 76.2939hz
    @ DEVICE PIC16F628A , HS_OSC , WDT_OFF , PWRT_ON , MCLR_ON , BOD_ON , LVP_OFF , PROTECT_OFF	'HS 20mhz osc, watchdog off, powerup timer on, mclr external, brown out detect on, low volt program off , code protect off for now
    resetplaceholder:
    DEFINE		OSC		20	'20mhz
    DEFINE		NO_CLRWDT	1	'don't clear the watchdog timer, I'm not using it anyways
    DISABLE				'disable software interrupt checks
    CLEAR					'clear out the ram and do a software 'reset'
    redled var porta.0
    greenled var porta.1
    blueled var porta.2
    chx var porta
    reddcr var byte
    greendcr var byte
    bluedcr var byte
    ledtemp var byte
    pwmcount var byte
    temp var byte
    temp2 var word
    startupholder:
    goto skipsubs		'skip over all the commonly used subroutines
    ON INTERRUPT GOTO INTHANDLER
    DISABLE INTERRUPT
    INTHANDLER:
    if intcon.2 = 1 then						'if tmr0 rolled over
    intcon.2 = 0						'reset timer 0 overflow flag
    if pwmcount = 0 then				'if pwmcounter has rolled over
    if reddcr <> 0 then
    ledtemp.0 = 1	'turn off red leds if dcr is 0 (dcr = duty cycle register for LED), otherwise turn it on
    endif
    if greendcr <> 0 then
    ledtemp.1 = 1	'turn off green leds if dcr is 0
    endif
    if bluedcr <> 0 then
    ledtemp.2 = 1	'turn off blue leds if dcr is 0
    endif
    chx = ledtemp		'update port pins of led status (on or off), can do this because all the LEDs are on the same port
    endif
    endif
    if reddcr < pwmcount then
    ledtemp.0 = 0
    endif
    'if the channel's dcr (duty cycle register) is less than the pwmcounter, turn that channel off, otherwise, leave it on ( < rather than <=, fixes problem with pulsing at high rates)
    if greendcr < pwmcount then
    ledtemp.1 = 0
    endif
    if bluedcr < pwmcount then
    ledtemp.2 = 0
    endif
    chx = ledtemp
    pwmcount = pwmcount + 1	'update the port pins and increment the pwmcount
    endif
    intfinish:
    RESUME
    'commonly used subroutines start here
    alloff:
    reddcr = 0
    greendcr = 0
    bluedcr = 0
    return	'turn off all leds thru dcr's
    allon:
    reddcr = 255
    greendcr = 255
    bluedcr = 255
    return     'turn on all leds
    skipsubs:
    option_reg = 8
    pie1 = $20
    trisa = 0
    porta = 0
    trisb = $ef
    portb = $10
    t1con = 0
    t2con = 0
    cmcon = 7
    ccp1con = 0
    vrcon = 0
    pir1.5 = 0
    ledtemp = 0
    redled = 0
    blueled = 0
    greenled = 0
    intcon = $e0
    ENABLE INTERRUPT
    mainloop:
    for temp = 0 to 255
    reddcr = temp
    for temp2 = 0 to 2603
    pauseus 1
    next temp2
    next temp
    for temp = 0 to 255
    greendcr = temp
    for temp2 = 0 to 2603
    pauseus 1
    next temp2
    next temp
    for temp = 0 to 255
    bluedcr = temp
    for temp2 = 0 to 2603
    pauseus 1
    next temp2
    next temp
    goto mainloop	'do it all over again
    END
    Last edited by skimask; - 10th February 2008 at 00:17.

  8. #8
    Join Date
    Sep 2007
    Posts
    50


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by ELCouz View Post
    I need at least 16-24 channels, i will investigate more on the forum, if anyone have spotted something useful please be nice to post it here
    Hi Laurent

    I have had great sucess with Darrel's DT_INTS-18 and SPWM_INT . I am doing 16 ch of PWM on a pic 18F2410 32 MHz. The pwm is running at 100Hz 8 bit resolution.

    Thanks Darrel (I never tire of saying that)

    take a look at this thread:
    http://www.picbasic.co.uk/forum/showthread.php?t=8088
    Best Regards,

    Kurt A. Kroh
    KrohTech

    “Goodbye and thanks for all the fish”

  9. #9
    Join Date
    Feb 2008
    Posts
    8


    Did you find this post helpful? Yes | No

    Default

    Hi,

    Just a little update, sorry for being late to answer I've be on a road trip to Quebec all the weekend ... yeah rock - on :P

    Well I'm tired so i will investigate further your nice posts guys tomorrow.

    See ya kids :P hehe

    Best Regards,
    Laurent

  10. #10
    Join Date
    Feb 2008
    Posts
    8


    Did you find this post helpful? Yes | No

    Default

    It works !!!

    I'm using the Darrel Taylor's DT_INTS-18 & SPWM_INT code.

    Everything is running smooth!

    Thanks everyone for the help!

    Have a nice day,

    Best Regards,

    Laurent

Similar Threads

  1. Newbie? Problem with LCD
    By lew247 in forum mel PIC BASIC Pro
    Replies: 10
    Last Post: - 7th December 2009, 19:48
  2. Picbasic Newbie Problem
    By Stargazer3141 in forum mel PIC BASIC
    Replies: 4
    Last Post: - 21st August 2007, 17:40
  3. Problem on writing EEPROM in Winpic800 with picbasic pro
    By selimkara in forum mel PIC BASIC Pro
    Replies: 1
    Last Post: - 4th May 2007, 16:33
  4. PicBasic Pro Math Problem??
    By Glen65 in forum mel PIC BASIC Pro
    Replies: 4
    Last Post: - 5th March 2006, 04:36
  5. DMX & PicBasic coding problem
    By magicmarty in forum mel PIC BASIC Pro
    Replies: 2
    Last Post: - 20th September 2004, 15:35

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