View previous topic :: View next topic |
Author |
Message |
filjoa
Joined: 04 May 2008 Posts: 260
|
knight rider effect |
Posted: Tue Jul 20, 2010 5:51 pm |
|
|
hi
I try make this effect with an PIC18F252 but I don't know how I can make fading effect.
Code: |
while(1)
{
output_b(0b00000001); delay_ms(time);
output_b(0b00000010); delay_ms(time);
output_b(0b00000100); delay_ms(time);
output_b(0b00001000); delay_ms(time);
output_b(0b00010000); delay_ms(time);
output_b(0b00100000); delay_ms(time);
output_b(0b01000000); delay_ms(time);
output_b(0b10000000); delay_ms(time);
output_b(0b01000000); delay_ms(time);
output_b(0b00100000); delay_ms(time);
output_b(0b00010000); delay_ms(time);
output_b(0b00010000); delay_ms(time);
output_b(0b00001000); delay_ms(time);
output_b(0b00000100); delay_ms(time);
output_b(0b00000010); delay_ms(time);
}
|
Someone can help how I can add fading? link this
http://www.youtube.com/watch?v=DHsjQSv8zMo&feature=related
best regards |
|
|
Jerson
Joined: 31 Jul 2009 Posts: 125 Location: Bombay, India
|
|
Posted: Tue Jul 20, 2010 6:58 pm |
|
|
Well it doesn't really matter which chip you use for this. This effect can be done even by a tiny pic. You need to use PWM channels for each LED and fade away the values on a timer. _________________ Regards
Jerson Fernandes |
|
|
RoGuE_StreaK
Joined: 02 Feb 2010 Posts: 73
|
|
Posted: Wed Jul 21, 2010 1:05 am |
|
|
And as you are working with 8 channels, you'll need to read up on software PWM. |
|
|
filjoa
Joined: 04 May 2008 Posts: 260
|
|
Posted: Wed Jul 21, 2010 6:43 am |
|
|
hi
I think in use PWM but on PIC18F252 I only have one PWM output.
is possible implement PWM in software to all pins of B port?
best regards |
|
|
Rohit de Sa
Joined: 09 Nov 2007 Posts: 282 Location: India
|
|
Posted: Wed Jul 21, 2010 7:02 am |
|
|
I've done 8 channels on a '628A. My code was based on Scott Dattalo's asm code which can be found here http://www.dattalo.com/technical/software/pic/pwm8.asm.
-Basically, for a 256-level resolution, what you need to do is maintain 8 registers (lets call them 'brightness' registers). The brightness registers hold the PWM value which needs to be output on the corresponding output pin.
-Copy these values into temporary registers.
-Run a loop 256 times; everytime you complete an iteration, decrement the temporary registers. Check the values in each of the registers; if it is greater than 0 then set the corresponding pin high, else set it low.
-After the loop has completed, reload the temporary registers with the brightness values, and repeat the process.
Now this may seem complicated, but it can all be acheived with some simple embedded assembly - BSF, MOV, AND, OR. The reason why I used assembly is beacause it affords me a higher degree of PWM timing accuracy (ie, I know exactly how long a complete PWM cycle will take).
Rohit |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19552
|
|
Posted: Wed Jul 21, 2010 7:22 am |
|
|
As a comment. Consider doing it a different way!.
Take the PWM output, and (if more than 25mA is neeed), feed this to an emitter follower, so it provides a variable duty cycle 'drive' to the 5v. Otherwise just use it directly, and connect to the top of a single resistor to feed the LED anodes. Then have your port B outputs (again buffered if more power is needed), connected to the LED cathodes.
Set PORTB 'all high'. LED's will be off. Now turn the individual bits 'low', and the corresponding LED comes on, but the intensity is now controlled by the PWM. So your code becomes (symbolically):
Code: |
while(1)
{
output_b(0b11111110);
Ramp PWM up then down
output_b(0b11111101);
Ramp PWM up then down
etc..
|
|
|
|
Rohit de Sa
Joined: 09 Nov 2007 Posts: 282 Location: India
|
|
Posted: Wed Jul 21, 2010 7:33 am |
|
|
Ttelmah wrote: | Consider doing it a different way! | Wow! Now that's some out of the box thinking! Respect!
Rohit |
|
|
Jerson
Joined: 31 Jul 2009 Posts: 125 Location: Bombay, India
|
|
Posted: Wed Jul 21, 2010 9:02 am |
|
|
Ttelmah
I beg to disagree with your scheme. You will not be able to achieve independent yet simultaneous dimming of all the 8 channels. Think of the problem like this.
Any bit set to 1 fades away in time. Now if I set this pattern
0000 0001
the 1 bit will fade away in some mS that is visible enough due to the softPWM
similarly a pattern 0000 1001 will cause the 1 bits to fade away in the fader time
Now, if the bit is rolled left - right and right - left, you can see what this will do. It will give the comet tail effect as seen in that video.
Cheers
Jerson _________________ Regards
Jerson Fernandes |
|
|
filjoa
Joined: 04 May 2008 Posts: 260
|
|
Posted: Wed Jul 21, 2010 9:07 am |
|
|
Hi
Ttelmah your suggestion all LEDs make fading at same time, dont like on video correct?
Rohit de Sa, thanks for your explanation I don't know how I can implement this in C.
best regards |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19552
|
|
Posted: Wed Jul 21, 2010 10:02 am |
|
|
That's down to decisions on your hardware. If you want to have one LED on full, and another dimmed, then you would need to arrange to switch the one 'on' directly to a non PWM source. It can be done, but gets more complex....
Best Wishes |
|
|
Rohit de Sa
Joined: 09 Nov 2007 Posts: 282 Location: India
|
|
Posted: Wed Jul 21, 2010 10:57 am |
|
|
filjoa wrote: | I don't know how I can implement this in C | The way I did is was to declare my variables and perform initializations using normal CCS-C. I then embedded assembly using the #asm and #endasm directives. I suppose you could do the same using C, but you'd probably need to look multiple times at the disassembly listing to ensure tight timing - I'd rather look just once and make sure that my code is doing the PWM loop at the correct frequency.
Rohit |
|
|
SherpaDoug
Joined: 07 Sep 2003 Posts: 1640 Location: Cape Cod Mass USA
|
|
Posted: Thu Jul 22, 2010 8:15 am |
|
|
I would consider using one cheap PIC12Fxx per LED. Either put them in a daisy chain or have a master PIC to trigger them, and let them deal with dimming their own LED. _________________ The search for better is endless. Instead simply find very good and get the job done. |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Thu Jul 22, 2010 5:31 pm |
|
|
Here a link to a ready made project using 8 leds. The project is very wel documented including PCB design etc. Too bad it is written in assembly, but well, the Microchip Assembler is a free tool so that shouldn't be a real problem.
A design simplification this project used is that the number of led levels was reduced to 4 (0=off, 3 = full brightness). If you look at the video's this is enough for great effects.
For only a few different PWM levels you can create a simple PWM in a loop using delay statements, or if you want more levels and flexibility use a timer interrupt like discussed here. |
|
|
arunb
Joined: 08 Sep 2003 Posts: 492 Location: India
|
|
Posted: Fri Jul 23, 2010 5:17 am |
|
|
Quote: | I would consider using one cheap PIC12Fxx per LED. Either put them in a daisy chain or have a master PIC to trigger them, and let them deal with dimming their own LED. |
Or a port expander like the MCP23016..
But I think the 'fading' effect will not be smooth even if you use the PWM method. |
|
|
Jerson
Joined: 31 Jul 2009 Posts: 125 Location: Bombay, India
|
|
Posted: Fri Jul 23, 2010 8:33 am |
|
|
The way to go is soft PWM. Here is my quick and dirty rendition of the scanner using a jumbled up 7 segment display of a setup I have at hand.
http://jerson.co.in/NewSite/886_Pwm.mp4
This video plays with VLC Player
edit : I think you need to save the file and then view it _________________ Regards
Jerson Fernandes
Last edited by Jerson on Fri Jul 23, 2010 11:38 am; edited 1 time in total |
|
|
|