esta última semana estuve realizando pruebas para la comunicación con el pic18f4550 y el pc, el cual les dejo el código en ccs versión 5 que mide las entradas analógicas para pasarlas por usb a la pc y visualizarlas.
sin embargo, al momento de hacer la transmisión me dice que el dispositivo no se reconoce, tanto la implementación como en simulación en proteus, por lo cual sospecho que debe ser por los controladores, por ello hago uso de los controladores que me ofrece microchip, pero al instalarlo no me deja, debido a mi sistema operativo que es windows 10 de 64 bits, cosa que tiene que ser necesariamente en este sistema operativo.
ya intenté cambiar la instalación de controladores no firmados y aún así no me deja instalar.
si alguien encontró una solución del problema o similar, para que me pueda ayudar, por favor.
c:
///////////////////////////////////////////////////////////////////////////////
/// programa v2.0 ///
///////////////////////////////////////////////////////////////////////////////
#include <18f4550.h>
///////////////////////////////////////////////////////////////////////////////
/// configuracion del pic ///
///////////////////////////////////////////////////////////////////////////////
#device adc=10 // 10 bits de conversion
#fuses hspll // oscilador de cristal: >4mhz (20mhz)
#fuses nowdt // watch dog timer deshabilitado
#fuses noprotect // proteccion contra la lectura de la memoria
// flash deshabilitada
#fuses nolvp // programacion en baja tension deshabilitado
#fuses nodebug // modo debug para icd deshabilitado
#fuses usbdiv // clock del modulo usb: pll/2 (48mhz)
#fuses pll5 // divisor de pll: 1 (4mhz)
#fuses cpudiv1 // clock del procesador: pll/2 (48mhz)
#fuses vregen // regulador interno de 3.3v habilitado
#fuses nopbaden // configura el puerto b como e/s digitales
#fuses mclr // pin master clear habilitado
#use delay (clock=48mhz) // frecuencia del oscilador: 48mhz
#include <usb_cdc.h> // libreria de funciones para usb-cdc
int16 canal1,canal2,canal3,canal4; // variable de lectura del adc
float v1,v2,v3,v4,muestra=5; // variable de tension de y de
// cantidad de lecturas por canal
int i; // variable contador
char dato; // variable de dato recibido
///////////////////////////////////////////////////////////////////////////////
/// firmware ///
///////////////////////////////////////////////////////////////////////////////
void main() { // menu principal
// configuracion conversor ad
setup_adc_ports(an0_to_an3); // canal an0 analogico
setup_adc(adc_clock_div_64); // fuente de reloj para la conversion
// inicializacion puerto usb-cdc
usb_cdc_init(); // inicializa puerto virtual com
usb_init(); // inicializa el hardware usb
usb_wait_for_enumeration(); // espera hasta que sea enumerado
while(!usb_cdc_connected()){
}
do{ // blucle infinito
usb_task(); //
if (usb_enumerated()){ // ¿el dispositivo esta enumerado?
if (usb_cdc_kbhit()){
dato=usb_cdc_getc();
if (dato=='a'){
v1=0;
v2=0;
v3=0;
v4=0;
// lectura de v1
for (i=1; i<=muestra; i++){
set_adc_channel(0); // habilita canal 0
delay_us(20); // retardo de tiempo de 20us
canal1=read_adc(); // canal 1 igual a lectura en an0
v1=v1+5.0*canal1/1023.0; // calculo para v1
}
v1=v1/muestra; // promedio de v1
// lectura de v2
for (i=1; i<=muestra; i++){
set_adc_channel(1); // habilita canal 1
delay_us(20); // retardo de tiempo de 20us
canal2=read_adc(); // canal 1 igual a lectura en an1
v2=v2+5.0*canal2/1023.0; // calculo para v2
}
v2=v2/muestra; // promedio de v2
// lectura de v3
for (i=1; i<=muestra; i++){
set_adc_channel(2); // habilita canal 2
delay_us(20); // retardo de tiempo de 20us
canal3=read_adc(); // canal 1 igual a lectura en an2
v3=v3+5.0*canal3/1023.0; // calculo para v3
}
v3=v3/muestra; // promedio de v3
// lectura de v4
for (i=1; i<=muestra; i++){
set_adc_channel(3); // habilita canal 3
delay_us(20); // retardo de tiempo de 20us
canal4=read_adc(); // canal 1 igual a lectura en an3
v4=v4+5.0*canal4/1023.0; // calculo para v4
}
v4=v4/muestra; // promedio de v4
// transmision de datos
printf(usb_cdc_putc,"%2.2f%2.2f%2.2f%2.2f",v1,v2,v3,v4);
}
else if (dato=='b'){
printf(usb_cdc_putc,"b");
}
}
}
}while(true);
}