See Page 3 for latest video
I'm doing all multiplexing and pwm in a an ISR.
I can get to 16 step pwm per led with a framerate
of about 60.
How can i improve my code to get more pwm depth?
its a basic hardware setup:
-74595 for green cathodes & 74595 for red cathodes.
-8 anode rows from a PIC 8bit port buffered with transistors.
-PIC in video is PIC16F886 now I'm using an 18F14K22
PIC running at 64 Mhz (16mips) see code below
Here's a video at 8 PWM levels / pixels:
I'm doing all multiplexing and pwm in a an ISR.
I can get to 16 step pwm per led with a framerate
of about 60.
How can i improve my code to get more pwm depth?
its a basic hardware setup:
-74595 for green cathodes & 74595 for red cathodes.
-8 anode rows from a PIC 8bit port buffered with transistors.
-PIC in video is PIC16F886 now I'm using an 18F14K22
PIC running at 64 Mhz (16mips) see code below
Here's a video at 8 PWM levels / pixels:
Code:
if(INTCON.TMR0IF ) // TMR0 Interrupt? 64Mhz/4/8/256 = 7812hz ~ uS
{
//=== 8x8 matrix Bicolor ===== Payload ISR 46% at 16 level PWM ==
LEDRED=1;
if(slice < (PWMdepth-1) ) slice++;
else
{
slice=0;
if(Irow<7) Irow++; else Irow=0; // 8 rows
}
Ival<<=Irow; // translate row in rowvalue
for(Ia=7 ; Ia!=255; Ia--) // Send Green 8 bits to 74HC595's
{
if(slice>=Dgrn[Irow][Ia]) SER88=1; // PIXEL OFF
else SER88=0; // PIXEL ON
CLK88=1; // Send current bit to 74HC595
asm nop
CLK88=0;
}
for(Ia=7 ; Ia!=255; Ia--) // Send Red 8 bits to 74HC595's
{
if(slice>=Dred[Irow][Ia]) SER88=1; // PIXEL OFF
else SER88=0; // PIXEL ON
CLK88=1; // Send current bit to 74HC595
asm nop
CLK88=0;
}
PORTC = ~Ival; // Change to next row (row on ='0')
STC88 = 1; STC88 = 0; // Latch data in registers to output
Ival=0x01; // Initialize for next turn
LEDRED=0;
INTCON.TMR0IF = 0; // clear T0 Int flag
}
Last edited by a moderator: