• Sábado 26 de Septiembre de 2020, 15:08

Autor Tema:  pic16f887  (Leído 1771 veces)

siste

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
pic16f887
« en: Lunes 5 de Enero de 2015, 23:48 »
0
hola! como estan? espero que me puedan ayudar! la cosa, es que quiero encender dos led's rgb, la programcion esta, pero en un pic 12f675, y lo necesito en el pic16f887.... porq necesito generar 6 pwm en 6 patitas diferentes del pic, para haci variar los colores, hasta hacer 16 colores que es lo que quiero, aqui dejo el otro codigo!, me explicaron como cambiar a lenguaje ensamblador, cuando lo hago lo subo tambien! gracias por cualquier ayuda!

C
/*
  LED-PWM
  Version 2
  Controla 3 LEDS en 3 canales PWM.
  Controla el brillo de cada uno en forma independiente.
  Tiene 3 programas que cambian con el pulsador.
  -Secuencia de rampa triangular.
  -Secuencia de colores RGB de una tabla.
  -Flash con luz blanca.
 
  Los LEDS estan en GP0-1-2
  Un pulsador en GP5 para cambio de programa.
  Un pote de 100K en GP4/AN3 para la velocidad.
 
  Frecuencia del PWM = 100Hz, o sea, 10ms
  Pasos del ciclo de trabajo=256
  Se necesita un pulso minimo de: 10ms/256 = 39 uSec
 
  Calculo del valor del preload del timer, para 39 uSec:
  PreLoad = 256 - (InterruptPeriod / Prescale x Tcyc)
  PreLoad = 256 - (39 uSec / 2 x 1 uSec)
  PreLoad = 237
 
  04/01/2013, Javier Rambaldo
 */
 
// bits
#define LEDR GPIO.B0
#define LEDG GPIO.B1
#define LEDB GPIO.B2
#define BeginPWM Flags.B0
 
// macros
#define TIMER0_PRELOAD 237
#define HI(param) ((char *)&param)[1]
#define LO(param) ((char *)&param)[0]
#define SYNC while(BeginPWM==0);  BeginPWM = 0;
 
// tabla de colores RGB
const code char TablaRGB[] = {
        255,1,1,
        1,255,1,
        1,1,255,
        255,255,1,
        255,1,255,
        1,255,255,
        255,255,255,
        22,44,222,
        44,22,222,
        222,22,44,
        222,44,22,
        66,222,0,
        222,66,33,
        0,0,0 // fin de la tabla
        };
 
char BrilloR;
char BrilloG;
char BrilloB;
char DutyCount;
char Flags;
char Fase1;
char Fase2;
char Fase3;
char temp;
int  ADCValue;  // lectura del ADC
char NroPrograma;
 
/*
 Esta interrupcion genera 3 ciclos de trabajo en las salidas LEDR/G/B,
 dependiendo de los valores de BrilloR/G/B que van de 1 a 255.
 El 0 no esta permitido porque es el comienzo del ciclo de trabajo.
 Un valor de 1 es 0% de duty-cicle.
 Un valor de 255 es 100% de duty-cicle.
 La frecuencia del PWM es de 100Hz. De ahi que 10ms/256 = 39uS.
 La interrupcion es cada 39uS.
*/
void interrupt() {
  if (++DutyCount == 0) {
    LEDR = 1;
    LEDG = 1;
    LEDB = 1;
    BeginPWM = 1;
  }
  if (DutyCount == BrilloR) LEDR = 0;
  if (DutyCount == BrilloG) LEDG = 0;
  if (DutyCount == BrilloB) LEDB = 0;
  TMR0 = TIMER0_PRELOAD;
  INTCON.B2 = 0;
}
 
void main()
{
  DutyCount = 0;
  BrilloR = 0;
  BrilloG = 0;
  BrilloB = 0;
  Fase1 = 0;
  Fase2 = 0x55;
  Fase3 = 0xaa;
  NroPrograma = 0;
  Flags = 0;
 
  GPIO   = 0; // salidas en 0
  TMR0   = TIMER0_PRELOAD; // init timer0
  ANSEL  = 0b00001000;     // configure A/D inp as digital I/O, enable AN3.
  TRISIO = 0b00111000; // GP<2:0> as output, GP<3:5> as input
  CMCON  = 7; //salidas digitales
  OPTION_REG = 0b00000000;  // (prescaler /2 = 000)
  INTCON = 0b10100000; //habilito timer0 int.
  WPU.B5 = 1; //pullups en GP5
 
 // ADC_Init();
 
  for(;;){
 
    //el ADC lo uso para leer el pote de AN3
    ADCValue = ADC_Read(3);
 
    // leer pulsador y incrementar NroPrograma
    if (!GPIO.B5) {
       if(++NroPrograma == 3) NroPrograma = 0;
       Fase1 = 0;
       // Espero soltar pulsador:
       while(!GPIO.B5);
    }
 
    if (NroPrograma == 0){
 
      // delay que varia con el pote
      Vdelay_ms(100+ADCValue);
 
      // Genera tres rampas desfasadas 120 grados:
      Fase1++;
      temp = Fase1<<1;
      if(Fase1.B7) temp = 255 - temp;
      if(temp<2) temp=2;
      SYNC;
      BrilloR = temp;
 
      Fase2++;
      temp = Fase2<<1;
      if(Fase2.B7) temp = 255 - temp;
      if(temp <2) temp=2;
      SYNC;
      BrilloG = temp;
 
      Fase3++;
      temp = Fase3<<1;
      if(Fase3.B7) temp = 255 - temp;
      if(temp <2) temp=2;
      SYNC;
      BrilloB = temp;
    }
    else if (NroPrograma == 1){
      // secuencia de colores fijos, con tabla de RGB...
 
      Vdelay_ms(100+ADCValue);
 
      SYNC;
      BrilloR = TablaRGB[Fase1++];  // canal R de la tabla
      BrilloG = TablaRGB[Fase1++];  // canal G
      BrilloB = TablaRGB[Fase1++];  // canal B
 
      //fin de la tabla?
      if (TablaRGB[Fase1] == 0) Fase1 = 0;
    }
    else if (NroPrograma == 2){
      // Flash con luz blanca
      SYNC;
      BrilloR = BrilloG = BrilloB = 1;
      Vdelay_ms(20+ADCValue>>3);
 
      SYNC;
      BrilloR = BrilloG = BrilloB = 254;
      Vdelay_ms(33);
    }
  }
}