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);
}
}
}