Hola, abajo tngo un cacho de un programa, en teoria, que hace esto:
Bien, el problema que encontré es que no cambia de un led al otro. tiene 6 fases: R-->RG-->G-->GB-->B-->RB-->R
por lo tanto será la variable FASE(de 6 valores:1..6).
luz1, luz2, y luz3 son variables del puerto B.
contador: sirve para prolongar el tiempo de cada fase
crece: sirve para saber si el tiempo es creciente(tiempo=tiempo+1;) o decreciente:(tiempo=tiempo-1;)
color: es una variable para otras funciones q no esta escrita aqui.
La funcion AUTOMATICO hace PWM de unos puertos direccionados por LUZ1 y LUZ2, el periodo es 1000us. LUZ1 y LUZ2 cambian de valor en la funcion CAMBIO_COLOR dependiendo del valor de FASE.
Despues de simular para un TIEMPO menor, veo que funciona pero en el protoboard no cambia de led. Y no entiendo por que... alguien me puede echar una mano? o intentar mejorar este codigo. gracias
/* Led rojo --> RB.1
/* Led azul --> RB.2
/* Led verde --> RB.3
/********************/
#include <16lf84a.H>
#use delay(clock=4000000)
#byte puertab=06
#byte puertaa=05
int contador,fase;
int luz1,luz2,luz3,tiempo;
int crece,color;
void automatico(void)
{
bit_set(puertab,luz1);
bit_set(puertab,luz2);
delay_us(tiempo-1000);
bit_clear(puertab,luz2);
delay_us(2000-tiempo);
bit_clear(puertab,luz1);
}
void cambio_color(void)
{
switch (fase)
{
case 1:
{
luz1=1;
luz2=2;
break;
}
case 2:
{
luz1=2;
luz2=1;
break;
}
case 3:
{
luz1=2;
luz2=3;
break;
}
case 4:
{
luz1=3;
luz2=2;
break;
}
case 5:
{
luz1=3;
luz2=1;
break;
}
case 6:
{
luz1=1;
luz2=3;
break;
}
}
}
/*************************************************************/
/* RUTINA QUE SIRVE PARA CALCULAR SI HAY CAMBIO DE LED */
/* Y EL TIEMPO SI ES CRECIENTE O DECRECIENTE */
/*************************************************************/
void rutina_automatico(void)
{
if (contador==3)
{
if (crece==1)
{
if (tiempo>2000)
{
tiempo=tiempo-1;
if (fase==7)
{fase=0;}
fase=fase+1;
cambio_color();
crece=0;
}
else tiempo=tiempo+1;
}
else
{
if (tiempo<1000)
{
tiempo=tiempo+1;
if (fase==7)
{fase=0;}
fase=fase+1;
cambio_color();
crece=1;
}
else tiempo=tiempo-1;
}
contador=0;
}
}
/****************************/
/* PROGRAMA PRINCIPAL */
/****************************/
void main(void)
{
set_tris_a(0xFF); /* configuro la puerta A como entradas*/
set_tris_b(0x00); /* configuro la puerta B como salidas*/
puertab=0; /* apago los leds */
tiempo=1000;
luz1=1;
luz2=2;
contador=1;
fase=1;
crece=1;
color=1;
do
{
if ((puertaa & 0x04)==0x00)
{
automatico();
contador=contador+1;
rutina_automatico();
}
while(true);
}