Hola a todos, por motivos de salud he estado un tiempo apartado de los PIC, así que lo mismo estoy un poco oxidado y digo alguna burrada, pero creo que una solución del PWM por software es totalmente factible.
Veamos las características del aparatejo:
- 24 rpm
- 502 leds de resolución horizontal
- 32 leds de resolución vertical
- 96 PWM ( 3 x led)
- 64 colores
Esto nos da:
1000000us / 24 / 502 =83 us por columna de leds
A partir de aquí es donde veo el error en vuestros cálculos.
83us / 96 PWM= 0,165us por PWM
Evidentemente esto es demasiado rápido para la velocidad de los PIC.
¿Por qué hacer los PWM uno por uno (en serie) y no todos de golpe (en paralelo)?.
Me explico, en la controladora de 28 servos que diseñe conseguí sacar 28 PWM en 5us con un 16f877 a 20Mhz con un sistema muy parecido al que explica Bruno en este
post Bien, como queremos conseguir 64 colores (4x4x4) y estos se pueden conseguir con sólo 4 PWM diferentes. Utilizamos la interrupción del TMR, teniendo una interrupción cada 83us / 4 = 20,75us.
Guardamos en memoria el estado de cada PWM (1 bit) en cada interrupción. Como tenemos 96 PWM eso son 96 / 8 = 12 bytes. Leer 12 bytes y sacarlos por los puertos del PIC se puede hacer perfectamente en 20,75us.
Un ejemplo para una columna de 8 leds RGB (24 pines = 24 PWM = 8 leds por columna)
ORG 4
MOVF PWM_1_A_8, W
MOVWF PORTB
MOVF PWM_9_A_18, W
MOVWF PORTC
MOVF PWM_19_A_24, W
MOVWF PORTD
CALL NUEVOS_PWM ; Esta rutina debe cargar los registros con el estado de los PWM de la siguiente interrupción
RETFIE
Todo dependería de la rutina NUEVOS_PWM. El tiempo invertido en esto dependerá de donde guardemos la información si en una SD, eprom, etc y en como se guarde la información de cada píxel.
Saludos