Golpear un controlador led ShifBrite con un PIC

1

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.

    
pregunta Str1101

2 respuestas

0

Finalmente, descubrí que el principal problema era que Proteus estaba teniendo conflictos con el controlador led, pero no pude encontrar la configuración del proyecto por mi cuenta para solucionarlo. Finalmente, lo que he hecho es usar el proyecto vacío que creó mi profesor y ahora todo funciona bien.

He cambiado algunos detalles:

  • Circuito : he conectado las resistencias en el lado derecho de los botones (10KOhms)
  • Código final :

    void main()
    {
    
    ADCON1 = 0x0F; // config. digital
    TRISA = 0xFF;
    TRISB = 0x00;
    ENABLE = 1;          
    unsigned long int color;
    
    color = 1; // default
    while(1) {
        if(RA0 == 1) color=BLUE;
        else if (RA1 == 1) color=GREEN;
        else if (RA2 == 1) color=RED; 
        else if (RA3 == 1) color=WHITE;
        else if (RA4 == 1) color=BLACK;          
    
        if(color != 1){
            ENABLE = 1;
            int i;
            for(i=0; i<32; i++){
                CLOCK = 0;
                if(((color>>(31-i))&0x00000001) == 0x00000001) DATA = 1;
                else DATA = 0;
                CLOCK = 1; //
            }
            CLOCK= 0;
            LATCH= 1;
            ENABLE=0; // activates the led driver!
            LATCH= 0;
            color=1;
        }
    }
    

    }

Gracias a todos los que han dedicado su tiempo a ayudarme.

    
respondido por el Str1101
0

Nunca trabajé con el controlador led Shiftbrite A6281, pero esto es lo que puedo pensar mirando el código:

void write_color(unsigned long int color)
{
    LATCH = 0;
    CLOCK = 0;   
    ENABLE = 0; // 0 = ON

    for (int i=0; i<32; ++i) { 
        if (((color >> (32 - i)) & 0x01) == 0x01)
          {
              DATA = 1;
          }
        else 
         {
            DATA = 0;
         }
        CLOCK = 1; 
        __delay_ms(1);
        CLOCK = 0;           
    }

    /************* HERE I CHANGED ****************/
    //I am assuming when Latch is set to 1, It accepts value
    LATCH = 1;
    //Send a Clock pulse!
    CLOCK = 1; 
    __delay_ms(1);
    CLOCK = 0;
    LATCH = 0;
    // ENABLE = 1; 
}

También sugeriría, si es posible, ¡pruebe este circuito en el simulador primero y verifíquelo!

    
respondido por el Swanand

Lea otras preguntas en las etiquetas