Combinar PWM con comunicación serial en MikroC

Buenas noches, estoy utilizando el PIC16F887.

Si quiero modificar el brillo de un LED conectándolo a una salida del PWM se configura el valor de la función PWM1_Set_Duty(); pero ¿Como le puedo hacer para hacerlo con dos valores en el duty cada cierto tiempo? con comunicación serial PC-PIC.

Código:
#
define LED1 PORTC.F2 //Definimos a C2 como LED1
unsigned char DUTY = 128; //Definimos el porcentaje de ciclo DUTY (255=100%/3=1%)
void main() 
{
 ANSEL = 0;  //Configura los pines AN como INPUT/OUTPUT digital
 ANSELH = 0; //Configura los pines AN altos como INPUT/OUTPUT digital
 C1ON_bit = 0;   //Bit Comparador 1 ON/OFF
 C2ON_bit = 0;   //Bit Comparator 2 ON/OFF
 Trisc.f2=0; //Se declara C2 como salida digital
 PWM1_Init(500);//Inicializa el modulo PWM a una frecuencia de 500 Hertz
 PWM1_Set_Duty(DUTY);//Se establece un ciclo DUTY (ciclo de trabajo) igual al valor de la variable DUTY
 PWM1_Stop();//Detiene el PWM
 while(1)//Inicio del ciclo infinito
  {
  PWM1_Start();// Inicializa el PWM
  while(1);//Pausa el programa
  }
}

El código anterior es lo del brillo del LED controlado por el duty que se ponga, como seria la implementación en el código para utilizar la función UART1_Data_Ready() y UART1_Read() que tras recibir dos números por ejemplo el 30 y después el 90, se configure el PWM a ese porcentaje ingresado y después de 2 o 3 segundos cambie al siguiente. ...
 

D@rkbytes

Moderador
Obviamente podrá ser usando dos variables para la recepción y control, pero la verdad es que no entiendo muy bien qué es lo que quieres hacer.
O sea, sé más explícito al referirte a usar dos valores para el ciclo activo.
 
Hola D@rkbytes
Vale a lo que me refiero seria algo asi:

while(1){

PIC escribe
Ingrese el porcentaje de brillo 1:
PIC lee y guarda
(se ingresa 20)
PIC escribe
Ingrese el porcentaje de brillo 2:
PIC lee y guarda
(Se ingresa 90)

PIC pone el duty en 51 (20%)
PIC espera 2 segundos
PIC pone el duty en 230 (90%)
PIC espera 2 segundos
}
 

D@rkbytes

Moderador
OK. No le veo problema, aún usando retardos, porque supongamos que estás usando alguno de los módulos CCP. (En éste caso cualquiera de los dos módulos CCP - CCP1 o CCP2)
O sea, PWM por Hardware.

No sé cómo se podrían recibir las variables en mikroC, pero en C estándar, es algo así:
PHP:
printf("Continuar (S,N)?");
 do
    {
         respuesta = getch();
    }
while(respuesta != 'S' &&  respuesta != 'N');
Y en C de PIC C Compiler se puede hacer lo mismo, o usar gets(ArrayVar);
Donde, ArrayVar es un puntero hacia un arreglo de variables. P.E: int8 cadena[2];
gets(); en PIC C únicamente retorna hasta que el carácter final es un retorno de carro o el ASCII 13 ("\r")
Por eso siempre debe existir un vector extra. (0, 1, 2) = Var00, Var01, VarValid para recibir "\r"

Así que debes recibir los dos estados y posteriormente actuar con el ciclo activo después del tiempo establecido.

Si usas la interrupción por recepción del módulo USART, eso se solventa muy fácilmente, en vez de hacerlo por polling.
 
Arriba