Gracias por tu sugerencia, de hecho el error lo tenía en el visual basic y es que en ocasiones no se cargaba el valor en la variable y pues me mandaba un dato "vacío" por el puerto serie y el pic se colgaba. Existe alguna forma de prevenir esto en el pic?
Por otro lado si había pensado en usar el PWM pero voy a manejar frecuencias bien pequeñas (0.33 - 50 Hz) y pues tal vez tenga problemas con el cristal. Y pues como voy a estar variando esos valores pues ya te imaginarás.
Ahorita estoy haciendo por partes mi programa porque quiero hayar la mejor forma de mandar ésta señal al driver de un motor de pasos y al mismo tiempo recibir datos y meterlos al convertidor para posteriormente graficarlos en tiempo real. Y pues es ahí donde me estoy atorando. De hecho como te dije ya tengo ambos programas pero ahora no se como unirlos.
Si me pueden echar la mano se los agradecería bastante.
Para el motor es el programa de arriba y para los datos es este:
Codigo:
#include <16f874A.h>
#fuses HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP,NOCPD,NOWRT
#device ADC=10
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#include<lcd.c>
long i, dato, muestras;
int tmuestreo;
char datohigh, datolow, temp;
void adquirir()
{
delay_us(tmuestreo);
dato = read_adc();
datolow=dato;
temp=(dato>>
;
datohigh=temp&3;
putc(datohigh);
putc(datolow);
}
main()
{
long dato;
char valor, canal;
int periodohigh, periodolow, muestrashigh, muestraslow;
int tmuestreo;
long periodo, muestras;
setup_adc_ports( ALL_ANALOG );
setup_adc( ADC_CLOCK_INTERNAL );
lcd_init();
while(!kbhit()); //Espera la recepcion de un caracter
valor=getc();
if (valor=="j")
{
output_high(PIN_B7);
putc("8");
while(!kbhit()); //Espera la recepcion de un caracter
muestrashigh=getc();
while(!kbhit()); //Espera la recepcion de un caracter
muestraslow=getc();
while(!kbhit()); //Espera la recepcion de un caracter
periodohigh=getc();
while(!kbhit()); //Espera la recepcion de un caracter
periodolow=getc();
muestras=muestrashigh*256+muestraslow;
periodo=periodohigh*256+periodolow;
tmuestreo=(50*periodo)/muestras;
lcd_putc("f");
lcd_gotoxy(1,1);
printf(lcd_putc,"p=%4lu",periodo);
lcd_gotoxy(9,1);
printf(lcd_putc,"m=%4lu",muestras);
lcd_gotoxy(1,2);
printf(lcd_putc,"tm=%3u",tmuestreo);
while (TRUE)
{
while(!kbhit()); //Espera la recepcion de un caracter
valor=getc();
if (valor=="i")
{
for (i=1;i<=muestras;i++)
{
set_adc_channel( 0 );
adquirir();
set_adc_channel( 3 );
adquirir();
}
}
else reset_cpu();
}
}
}