desktop

Control de Pic mediante PC

Creé este programa para el PIC funciona algo así como un dimmer (control de fase)... el asunto concreto es que el programa funiona como lo esperaba. mediante una entrada anologo digital regulo los distintos tiempos de disparo...pero mi conflicto es que necesito controlar estos tiempos de disparos mediante el PC..... (el circuito de conecxion PIC PC está bastante claro y no tengo problema con esto)..... pero no se como utilizar los conmandos del compilador C para lograr el objetivo.
en otras palabras que modificaciones debo hacer al programa??

Espero que se entienda la duda.

PROGRAMA
------------------------------------------
#include <16F873.h>
#fuses HS,NOWDT,NOPROTECT
#use delay(clock=2000000)


void main ()
{
BYTE entrada;
BYTE salida;
BYTE i;


setup_adc_ports(AN0); //A0 imput analogo
SETUP_ADC(ADC_CLOCK_DIV_32); //

set_tris_b(0b00000100); //

while(TRUE)
{
entrada = READ_ADC();
salida = entrada/13;
OUTPUT_BIT(PIN_B0,0);
OUTPUT_BIT(PIN_B1,0);

if(INPUT(PIN_B2)==1)
{
OUTPUT_BIT(PIN_B0,1);
if(salida<10)
{
for(i=salida;i>0;i--) // retardo del disparo semiciclo positivo.
{
delay_ms( 2 );
}
OUTPUT_BIT(PIN_B1,1); // comienza el disparo semiciclo positivo.
while(INPUT(PIN_B2)==1)
{
delay_us( 125 );
}
OUTPUT_BIT(PIN_B1,0); // se detine el disparo semiciclo positivo.
}
else
{
if(salida==10) // Sin disparo
{
OUTPUT_BIT(PIN_B1,0);
While(INPUT(PIN_B2)==1)
{
delay_us( 125 );
}
}
else
{
While(INPUT(PIN_B2)==1)
{
delay_us( 125 );
}
for(i=20 - salida;i>0;i--) // retardo del disparo semiciclo negativo.
{
delay_ms( 2 );
}
OUTPUT_BIT(PIN_B1,1);
while(INPUT(PIN_B2)==0) // comienza el disparo semiciclo negativo.
{
delay_us( 125 );
}
OUTPUT_BIT(PIN_B1,0);
}
}
}
}

}
---------------------------

Atte
 
vamos por pasos y no te hago la faena.

Si miras los ejemplos que estan en c:\archivos..programa....\Picc\examples casi todos envian datos y los recogen desde el puerto serie, el mas facil de utilizar por nosotros.
Debes construirte un adaptador con un max232 y finalmente en el pc utilizas el hiperterminal que ya trae el windows.
uno es el prinft y el otro getc y similares (si no pone nada el compilador por defecto lo compila para el serie)


El tema de utilizar interrupciones viene dado a que tienes el micro ocupado perdiendo tiempo (delay_ms) y en cambio no puedes hacer otras tareas como leer el PC o el ADC sin generar destellos en la lampara por fallos de sincronizacion.
Cuando utilizas interrupciones es como siprogramaras pequeños programas independientes, esto facilita mucho el trabajo.
Las variables utilizadas por las interrupciones deben ser grobales o sea definidas fuera de la funcion, por ejemplo despues de los define (nunca se libera esa memoria)



Te recomiendo que mires la ayuda donde te indican los ejemplos que podras facilmente reutilzar.



Una forma para hacerlo con interrupciones seria la siguiente.

Patilla del detector de paso por cero conectado a la patilla INT (interrupcion externa), unicamente borra el timer=0xff-angulo y pone a nivel bajo la salida;
Segunda interrupcion generada por el timer y que lo unico que hace es poner la salida a nivel alto.


otra forma para multibombillas.
el detector paso por cero aplica señal a INT y pone todas las salidas a nivel bajo y pone a cero el contador de grados y termina.

El timer genera una interrupcion cada 5º y mira si debe activar alguna bombilla, la activa y aumenta el contador de grados y termina




Finalmente siquieres ahorarte un poco mas de software puedes utilizar el modo especial de comparador del timer 1 y 3 y CPP1 y3 como salida.
 
Me gustaría saber si ya termisnaste el proyecto, yo estoy haciendo algo parecido pero tengo problemas con la función que convierte de cadena a enteros atoi. Esto es necesario para poder controlar los intervalos de retardo. Cualquier cosa por favor necesito ayuda.
 
Atrás
Arriba