saludos compañeros, les escribo en mi desesperación por resolver un problema con la conversión ADC a 10 bits con el microcontrolador PIC18F4550.
Les cuento que hace tiempo lograba comunicarme via usb con este tipo de conversión, sin embargo hace unas 3 semanas para acá ha dejado de funcionar y cuando conecto al computador sale un mensaje de error diciendo algo referente a que el hub no reconoce el dispositivo, luego me voy a panel de control/sistema/dispositivos de hardware y chequeo que aparece como "Dispositivo Desconocido", le doy click derecho y en detalles me doy cuenta que su PID y VID estan en 0000 y 0000...algo que me parece muy curioso, ya que esos dos valores siempre son distintos a eso que muestra y son los que se modifican en el controlador para cuando ocurren este tipo de errores.
Voy a adjuntarles la programación que no me quiere funcionar (En Proteus lo simula perfectamente, peor al llevarlo al protoboard no funciona).
_______________________________________________________________________________
_____________________________________________________________________________
Les cuento que hace tiempo lograba comunicarme via usb con este tipo de conversión, sin embargo hace unas 3 semanas para acá ha dejado de funcionar y cuando conecto al computador sale un mensaje de error diciendo algo referente a que el hub no reconoce el dispositivo, luego me voy a panel de control/sistema/dispositivos de hardware y chequeo que aparece como "Dispositivo Desconocido", le doy click derecho y en detalles me doy cuenta que su PID y VID estan en 0000 y 0000...algo que me parece muy curioso, ya que esos dos valores siempre son distintos a eso que muestra y son los que se modifican en el controlador para cuando ocurren este tipo de errores.
Voy a adjuntarles la programación que no me quiere funcionar (En Proteus lo simula perfectamente, peor al llevarlo al protoboard no funciona).
_______________________________________________________________________________
Código:
#include <18F4550.h>
#device ADC=10 //Convertidor A/D a 10bit
#include <stdlib.h> //Permite hacer conversiones entre tipos numericos
#fuses HSPLL,NOWDT,NOPROTECT,NODEBUG,NOBROWNOUT,USBDIV,PLL5,CPUDIV1,VREGEN,PUT,MCLR,NOLVP,NOPBADEN, NOSTVREN, NOWRTC
#use delay(clock=48M)
#define ledv PIN_C0
#define ledr PIN_C1
#USE FAST_IO(A)
#USE FAST_IO(B)
#USE FAST_IO(C)
#USE FAST_IO(D)
#byte ADCON2=0xfc0
#byte adresl=0xfc3 //Registro donde se almacena el resultado de la conversion ADC
#byte adresh=0xfc4 //Registro donde se almacena el resultado de la conversion ADC
#include <usb_cdc.h>
#include <ltc1298.c> // libreria para manejo LTC1298
////////////Declaración de Variables/////////////////////
long int data;
char Anc0L[4],Anc0H[4], Anc2[5];
int16 dato, AL, AH;
int a=0, b=0, prueba, local;
//////////////////////////////////////////////////////////////////////
///////////////////Programa Principal////////////////////
void main(void)
{
set_tris_a(0b0000011);
set_tris_b(0b00010000);
set_tris_c(0b00000000);
set_tris_d(0b00000000);
output_low(PIN_C0);
output_high(PIN_C1);
usb_cdc_init();
usb_init(); // Inicializa el USB
usb_wait_for_enumeration(); //Espera hasta que el PicUSB sea configurado por el host
output_low(PIN_C1);
output_high(PIN_C0);
/////////////////// Configuración Modulo ADC ////////////////////
SETUP_ADC(ADC_CLOCK_INTERNAL); //Configuración del Reloj interno ADC_CLOCK_DIV_64
SET_ADC_CHANNEL(0); // Selección de canal A0
SETUP_ADC_PORTS(ALL_ANALOG );
//////////////////////// Inicializa Rutina SPI //////////////////////////
adc_init(); //Inicializa la conversión Analógica/Digital
while(!usb_cdc_connected()){ // espera a detectar una transmisión de la PC
while(true)
{
usb_task(); //Habilita periférico usb e interrupciones
if (usb_enumerated()) // retorna verdadero si el dispositivo está enumerado
{
if (usb_cdc_kbhit()) // en espera de un nuevo caracter en el buffer de recepción
{
data = usb_cdc_getc();
output_low (PIN_D0);
if ((data== '1' )) //
{
output_low(Pin_b5);
output_low(Pin_b6);
output_low(Pin_b7);
if (input(pin_a1)== 1)//SIMULA LA CONDICIÓN DE LOS PINES 5&9
{
if (input(pin_b4)== 1)//SIMULA EL PULSO DE 50MSEG POR LOS PINES 7&8
{
a=1;
}
if (a=1)
{
output_high (PIN_D0);
delay_ms(100);
SET_ADC_CHANNEL(0); //canal RA0
read_adc();
AL = adresl; //Guarda el byte bajo del resultado
AH = adresh; //Guarda el byte alto del resultado
itoa (AL,10,Anc0L); // Función que convierte número entero a string
itoa (AH,10,Anc0H); // Función que convierte número entero a string
prueba = bit_test (local,4);
dato = read_analog(prueba);
convert_to_volts(dato,Anc2);
printf (usb_cdc_putc,"A%sB%sC%s;",Anc0L,Anc0H, Anc2);
}
}
usb_cdc_putc(data);
}
else {//
if (data=='2') // INICIAR PROGRAMA DE TEMPERATURA
{
output_high(Pin_b5);
}
else
{
output_low(Pin_b5);
}
if (data=='3') // HABILITAR OPCION DE: "INTERFAZ PREPARADA"
{
output_high(Pin_b6);
}
else
{
output_low(Pin_b6);
}
if ((data=='4') && (b==0)) // HABILITAR "INICIO REMOTO" (PULSO DE 5MS)
{
b=1;
output_high (PIN_b7);
delay_ms(10);
output_low (PIN_b7);
}
else
{
}
if ((data== '5' )) //
{
if (input(pin_a1)== 1)//SIMULA LA CONDICIÓN DE LOS PINES 5&9
{
if (input(pin_b4)== 1)//SIMULA EL PULSO DE 50MSEG POR LOS PINES 7&8
{
}
if (a=1)
{
output_high (PIN_D0);
delay_ms(100);
SET_ADC_CHANNEL(0); //canal RA0
read_adc();
AL = adresl; //Guarda el byte bajo del resultado
AH = adresh; //Guarda el byte alto del resultado
itoa (AL,10,Anc0L); // Función que convierte número entero a string
itoa (AH,10,Anc0H); // Función que convierte número entero a string
prueba = bit_test (local,4);
dato = read_analog(prueba);
convert_to_volts(dato,Anc2);
printf (usb_cdc_putc,"A%sB%sC%s;",Anc0L,Anc0H, Anc2);
}
}
usb_cdc_putc(data);
}
}
}
}
}
}
}
Última edición por un moderador: