Autor Tema: Windows No detecta USB 16F1455  (Leído 980 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado tito melli

  • PIC12
  • **
  • Mensajes: 83
Windows No detecta USB 16F1455
« en: 09 de Noviembre de 2019, 20:02:39 »
Hola!

Estoy intentando conectar el PIC16F1455 al PC por USB, pero Windows (10) no me reconoce el dispositivo.

Alguien me podría decir por qué?

He intentado usar también el Wizard de CCS Compiler, pero tampoco funciona. Aquí os dejo el código:

Código: [Seleccionar]
#include <16F1455.h>
#device ADC=10

#FUSES NOWDT                    //No Watch Dog Timer

#use delay(internal=48MHz,USB_FULL,ACT=USB)

#define USB_CABLE_IS_ATTACHED()  input(PIN_A5)
#define USB_CONFIG_VID 0x04D8
#define USB_CONFIG_PID 0x0000
#define USB_CONFIG_BUS_POWER 500
#include <usb_cdc.h>

void main() {

   usb_cdc_init();
   usb_init();

   while(TRUE) {

      usb_task();
      if (usb_enumerated())
         printf(usb_cdc_putc, "hola mundo");
   }

}




Las conexiones de HW son:

Vcc Pic --------> Vcc USB
Vss Pic --------> GND USB
RA5 Pic -------> Vcc USB
D+ Pic --------> D+ USB
D- Pic ---------> D- USB
V3.3USB Pic --> Condensador elec. 470nF, y este a GND

Alguien me puede ayudar?

Gracias!

Desconectado remi04

  • PIC18
  • ****
  • Mensajes: 387
Re:Windows No detecta USB 16F1455
« Respuesta #1 en: 10 de Noviembre de 2019, 06:11:48 »
La vez que yo me volví loco con un caso similar fue por que al soldar el conector en la placa se quedó cortocircuitado D- a GND. Por la cara superior, es decir,  bajo el conector.

No veas la de vueltas que le di al pic, al programa, a los registros, al 3,3v interno, al capacitar, a los cables.....    hasta que me dio por comprobar si había derivación de alguno.  ;-)

Desconectado tito melli

  • PIC12
  • **
  • Mensajes: 83
Re:Windows No detecta USB 16F1455
« Respuesta #2 en: 10 de Noviembre de 2019, 07:18:03 »
Justo eso me ha pasado a mi. Después de revisar todos los registros, mirar miles de ejemplos y esquemas... veo que D+ y D- estaban al revés conectados  :5]

Los he reconectado esta mañana y todo funciona bien :)

Muchas gracias!

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5412
Re:Windows No detecta USB 16F1455
« Respuesta #3 en: 10 de Noviembre de 2019, 13:12:17 »
Eso es la ley de Murphy en acción  :D

Un saludo.

Desconectado tito melli

  • PIC12
  • **
  • Mensajes: 83
Re:Windows No detecta USB 16F1455
« Respuesta #4 en: 26 de Noviembre de 2019, 16:38:14 »
Hola! Sigo por aquí para no abrir un nuevo hilo.

Despues de tener todo el programa 100% operativo, he decidido migrar de CCS Compiler a MPLAB XC8. Las razones, entre otras, son que puedo compartir el código con un compañero a través de la nube y puede editarlo desde la aplicación online de MPLAB, y que además, a priori, me ofrece más opciones para debuggear, ya que con CCS Compiler nunca he conseguido que se conecte con PicKit 3.

El caso es que MPLAB me esta defraudando, con to "ortopédico", lioso y problemático que es, sin hablar de que no encuentro funciones básicas como delay_ms, pero eso ya lo resolveré más adelante.

El caso es que consigo que el PC detecte el PIC, pero no recibe nada de nada, y no se por qué. Mirando por internet, cada uno usa una función diferente, y en el AN1164 de Microchip usa unas funciones que diría que ya ni existen.

El caso es que no paro de probar opciones y no hay manera de dar con la tecla. Con lo directo que es con CCS (quién lo diría..)

Os dejo el código por si alguien ve qué puede estar pasando:


// main.c
Código: [Seleccionar]
#include "mcc_generated_files/mcc.h"

/*
                         Main application
 */
void main(void)
{
    // initialize the device
    SYSTEM_Initialize();

    // When using interrupts, you need to set the Global and Peripheral Interrupt Enable bits
    // Use the following macros to:

    // Enable the Global Interrupts
    INTERRUPT_GlobalInterruptEnable();

    // Enable the Peripheral Interrupts
    INTERRUPT_PeripheralInterruptEnable();

    // Disable the Global Interrupts
    //INTERRUPT_GlobalInterruptDisable();

    // Disable the Peripheral Interrupts
    //INTERRUPT_PeripheralInterruptDisable();

   
    while (1)
    {
        putsUSBUSART("hola");
}
}


// mcc.c
Código: [Seleccionar]
#include "mcc.h"


void SYSTEM_Initialize(void)
{

    PIN_MANAGER_Initialize();
    OSCILLATOR_Initialize();
    USBDeviceInit();
    USBDeviceAttach();
}

void OSCILLATOR_Initialize(void)
{
     
    OSCCON = 0x3C;
     
    OSCTUNE = 0x05;
   
    ACTCON = 0x98;
     
    BORCON = 0x80;
   
    while(PLLRDY == 0)
    {
    }
}


// pin_manager.c
Código: [Seleccionar]
#include "pin_manager.h"





void PIN_MANAGER_Initialize(void)
{
    /**
    LATx registers
    */
    LATA = 0x00;
    LATC = 0x08;

    /**
    TRISx registers
    */
    //TRISA = 0x30;
    TRISC = 0x37;

    /**
    ANSELx registers
    */
    ANSELC = 0x00;
    ANSELA = 0x00;

    /**
    WPUx registers
    */
    WPUA = 0x00;
    OPTION_REGbits.nWPUEN = 1;


    /**
    APFCONx registers
    */
    APFCON = 0x00; 
}


//interrupt_manager.c
Código: [Seleccionar]
#include "interrupt_manager.h"
#include "mcc.h"

void __interrupt() INTERRUPT_InterruptManager (void)
{
    // interrupt handler
    if(INTCONbits.PEIE == 1)
    {
        if(PIE2bits.USBIE == 1 && PIR2bits.USBIF == 1)
        {
            USB_USBDeviceTasks();
        }
        else
        {
            //Unhandled Interrupt
        }
    }     
    else
    {
        //Unhandled Interrupt
    }
}
/**
 End of File
*/


Gracias de antemano! :)

Conectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7682
Re:Windows No detecta USB 16F1455
« Respuesta #5 en: 26 de Noviembre de 2019, 20:23:07 »
tito, para hacerlo en XC8 es mucho mas complejo. No creo que sea conveniente por lo que comentas.

Respecto al delay_ms , lo tenes con dos guiones al frente. __delay_ms() y __delay_us(), estos se basan en la funcion __delay() el cual pones los ciclos. Y el maximo de ciclos es de 50 millones aproximadamente, por lo que los delays usualmente no pueden ser de varios segundos.

Sugiero que vuelvas CCS, y corrijas el driver/descriptor que pones en la PC para detectar el micro.
Actualmente esta bien el driver en la PC, pero esta mal el programa del micro, te lo reconoce porque el stack USB que posee Microchip lo hace todo por interrupciones y el codigo ya esta escrito. Lo bueno de este stack es que podes modificarlo a tu gusto, entonces adaptar a cualqueir cosa. Pero en fin, tenes que saber de stack USB, como funciona, etc. Para poder programarlo. Aunque sea un minimo

Desconectado tito melli

  • PIC12
  • **
  • Mensajes: 83
Re:Windows No detecta USB 16F1455
« Respuesta #6 en: 27 de Noviembre de 2019, 13:12:06 »
Sí, creo que volveré a CCS, pues lo conozco todo mucho mejor.

Con CCS me bastaba con iniciar el USB, preguntar si está enumerado por el host e iniciar una task. Entonces ya podía empezar a enviar datos.

Con XC8 he usado el Code Generator, y he visto que hace algo similar, pero no se si es que no estoy iniciando bien el USB, que no estoy usando la función correcta para enviar datos, o qué es lo que está pasando

Gracias igualmente! :)

Desconectado tito melli

  • PIC12
  • **
  • Mensajes: 83
Re:Windows No detecta USB 16F1455
« Respuesta #7 en: 05 de Diciembre de 2019, 18:39:19 »
Bueno pues sigo exponiendo los problemas que voy teniendo con el USB  :D

Ahora mi problema es que al intentar sacar por pantalla unas frases, sólo me saca las últimas.

He probado a enumerar el PIC con un bucle while y a preguntar si el buffer esta vacío (aunque según he visto, el comando printf lo debería hacer automáticamente no?), pero sigue sin funcionar. Lo único que he visto que me da resultado es poner un delay antes de eso, pero incluso con 4s no llega a sacarlo todo.

Ya me paso con el RS232, que me sacaba unos caracteres extraños al inicio, pero al menos me sacaba todo.

Os dejo un fragmento del código para ver si me podéis ayudar:

Código: [Seleccionar]
int1 RelayInternal_flag = 1;

void main (void) {
   usb_init();                               // Initialize USB and connect PIC to the BUS
   delay_ms(1000);                     
   
   while (!usb_enumerated()) {}          // Check if the device was enumerated by the PC. If so, transmission can be started
      printf(usb_cdc_putc, "\r\n\r\n--------------------------------------------");
      printf(usb_cdc_putc, "\r\n---                EJEMPLO             ---");
      printf(usb_cdc_putc, "\r\n--------------------------------------------");
      printf(usb_cdc_putc, "\r\n--- Developed for XXXXXX ---");
      printf(usb_cdc_putc, "\r\n--------------------------------------------");
      printf(usb_cdc_putc, "\r\n---                by XXXXXX                ---");
      printf(usb_cdc_putc, "\r\n--------------------------------------------");

   if (RelayInternal_flag == TRUE) {
   
      configure_PIC (RelayInternal_flag);       // Aquí configuro los registros TRISA = 0x00; y TRISC = 0x00; LAT a 0 para ambos; habilito WPUA3 (tengo un boton conectado); inhabilito Analog y configuro TIMER1 y TMR1Gate

      while (!usb_enumerated()) {}         
         //---------------------------------------------
         // A PARTIR DE AQUÍ, EMPIEZA A SACAR POR PANTALLA, DEPENDIENDO DEL TAMAÑO DEL DELAY
         //---------------------------------------------
         printf(usb_cdc_putc, "\r\n\r\n********************************************");
         printf(usb_cdc_putc, "\r\n******* xxxxxxxxxxxxxxxxxxxxxxxxxxxx *******");
         printf(usb_cdc_putc, "\r\n********************************************");

}


 

anything