Tengo problemas para comunicar un controlador led Shiftbrite A6281 con un PIC18F4550. Lo que estoy tratando de hacer es enviar los valores RGB al controlador para seleccionar el color del led, pero ni siquiera puedo encenderlo.
Mi principal problema es que nunca he usado bit-bang antes y me temo que un error de principiante en mi código puede estar causando el problema. (tales como configuraciones de puertos o retrasos). El objetivo es enviar 32 bits al controlador y luego hacer que se carguen (enclavar), y luego deberían iluminar los leds.
Estoy usando proteus para simular el circuito y XC8 como un compilador, aquí hay una captura de pantalla y el código utilizado:
#define_XTAL_FREQ8000000#include<p18f4550.h>#include"config.h"
#include <xc.h>
#define RA0 PORTAbits.RA0
#define RA1 PORTAbits.RA1
#define RA2 PORTAbits.RA2
#define RA3 PORTAbits.RA3
#define RA4 PORTAbits.RA4
#define DATA PORTBbits.RB0
#define CLOCK PORTBbits.RB6
#define LATCH PORTBbits.RB2
#define ENABLE PORTBbits.RB4
#define BLUE 0x3FF00000
#define GREEN 0x000FFC00
#define RED 0x000003FF
#define WHITE 0x3FFFFFFF
#define BLACK 0x00000000
typedef unsigned char byte;
void write_color(unsigned long int color)
{
LATCH = 0;
CLOCK = 0;
ENABLE = 0; // 0 = ON
for (int i=1; i<33; ++i) {
if ((color >> (32 - i)) & 1) DATA = 1;
else DATA = 0;
CLOCK = 1;
__delay_ms(1);
CLOCK = 0;
}
LATCH = 1;
CLOCK = 1; CLOCK = 0;
__delay_ms(1);
LATCH = 0;
// ENABLE = 1;
}
void main()
{
ADCON1 = 0xFF; // digital
TRISA = 0xFF;
TRISB = 0x00; // PORTB pins = output
while (1) {
if (RA0 == 1) write_color(BLUE);
else if (RA1 == 1) write_color(GREEN);
else if (RA2 == 1) write_color(RED);
else if (RA3 == 1) write_color(WHITE);
else if (RA4 == 1) write_color(BLACK);
__delay_ms(1);
}
}
Cualquier ayuda sería muy apreciada, gracias de antemano.