SoloCodigo
		Programación Específica => Microcontroladores => Programadores para microcontroladores => Mensaje iniciado por: siste en Lunes  5 de Enero de 2015, 23:48
		
			
			- 
				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 *)¶m)[1]
 #define LO(param) ((char *)¶m)[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);
 }
 }
 }