Fork me on GitHub

Microcontrolandos

O Blog está passando por uma fase de mudanças. Todos os posts estão sendo atualizados, códigos, links e imagens estão sendo arrumados. Conteúdos novos ainda estão por vir.

PIC: Controle de LED RGB com PIC16F628A

Share:

PIC: Controle de LED RGB com PIC16F628A



Neste tutorial será mostrado uma maneira simples de controlar um LED RGB com o PIC16F628A sem utilizar o canal PWM.

O Led RGB é um LED que reproduz três cores: vermelho, verde e azul. Ele possui 4 terminais, um para cada cor e o GND.




 É possível acender cada uma das cores com diferentes intensidades, resultando em cores diferentes das primárias. Como o PIC possui apenas um canal PWM, utilizaremos a interrupção do TIMER1 e três portas do PIC, emulando um canal PWM.

Para cada interrupção gerada, uma variavel (i) é incrementada e comparada com as variáveis (R, G, B), se o valor de (i) é menor, a porta terá nível lógico 1, caso for maior a porta terá nível lógico 0.

No Circuito coloquei apenas 3 botões para incrementar os valores das cores.

O timer1 foi configurado para disparar a cada 100us, com um clock de 8Mhz.

CÓDIGO
MikroC PRO PIC
/*
   Controlando um LED RGB com o PIC16F628A
   
   Autor: Tiago Henrique
*/

sbit Led_R at PORTB.B5;
sbit Led_G at PORTB.B6;
sbit Led_B at PORTB.B7;

typedef struct
{
  char R;
  char G;
  char B;
}Colors;

Colors RGB = { 127, 127, 250 };

char i = 0;

void Interrupt()
{
  if ( TMR1IF_bit )
  {
    if( i <= RGB.R )
       LED_R = 1;
    else
       LED_R = 0;
       
    if( i <= RGB.G )
       LED_G = 1;
    else
       LED_G = 0;
       
    if( i <= RGB.B )
       LED_B = 1;
    else
       LED_B = 0;

    i++;
    
    TMR1IF_bit = 0;
    TMR1H = 0xff;
    TMR1L = 0x37;
   
   }
}

void InitTimer1()
{
  T1CON = 0x01;
  TMR1IF_bit = 0;
  TMR1H = 0xff;
  TMR1L = 0x37;
  TMR1IE_bit = 1;
  INTCON = 0xC0;
}

char flag = 0;

void main()
{
   InitTimer1();
   TRISB = 0x0F;

   while(1)
   {
      if( PORTB.B0 ) flag.B0 = 1;
      if( PORTB.B1 ) flag.B1 = 1;
      if( PORTB.B2 ) flag.B2 = 1;

      if( !PORTB.B0 && flag.B0 )
      {
        RGB.R += 2;
        flag.B0 = 0;
      }
      
      if( !PORTB.B1 && flag.B1 )
      {
        RGB.G += 2;
        flag.B1 = 0;
      }
      
      if( !PORTB.B2 && flag.B2 )
      {
        RGB.B += 2;
        flag.B2 = 0;
      }
      
   }
}

11 comentários:

  1. Qual compilador C você utiliza para programar os PICs ?

    ResponderExcluir
  2. Você teria um arquivo em .HEX para esse efeito, não teria precisão para 17 efeitos, o que mais preciso são quatro saídas para efeito, com controle de velocidade, ...e-mail alenice-s-s@bol.com.br .....agradeço. . http://www.youtube.com/watch?v=p5Mbk3TOLyQ

    ResponderExcluir
  3. Você teria um arquivo em .HEX para esse efeito, não teria precisão para 17 efeitos, o que mais preciso são quatro saídas para efeito, com controle de velocidade, ...e-mail alenice-s-s@bol.com.br .....agradeço. . http://www.youtube.com/watch?v=p5Mbk3TOLyQ

    ResponderExcluir
  4. Boa noite alguen pode min ajudar tenho um modulo HC-11 433mhz comonicaçaõ serial como faso pra se Comonica entre dois pic 16f628a com um pic e um pc já concegui esto tentando entre dois pic

    ResponderExcluir
  5. BOA TARDE EU QUERIA FAZER UM PROJETO TIPO O DE CIMA MAS COM ALGUMAS DIFERENÇAS.
    O PIC 12F683 + ACS712+ LED RGB . O MICROCONTROLADOR LÊ A CORRENTE DO ACS712 E O RGB VAI MUDANDO DE COR DE ACORDO COM A LEITURA . TERIA COMO ME AJUDAR OU ME DA UMA IDEIA DE COMO FAZER ?

    ResponderExcluir
  6. Olá!
    Você poderia postar algo sobre PID, para controlar um motor DC por exemplo.

    Desde já grato.

    ResponderExcluir
  7. TEstei esseCodigo mas o led RGB estasempre alterando as cores sem carregar nos botoes, vai desdea instensidade mais fraca a mais intensa.

    o que podera ser?

    Cumprimentos

    ResponderExcluir