Llevo varios días con un problema de comunicación vía USB entre mi PC y un PIC18F4550.
El PC enumera el dispositivo y logro enviar (de la PC al PIC) exitosamente un dato y obtengo el resultado deseado, pero al momento de intentarlo de nuevo el PIC no responde.
He intentado cerrar la aplicación hecha para la PC y volverla a abrir, pero eso no arregla el problema. La única manera es desconectado el PIC de la PC. En verdad no entiendo cuál es el problema...
Las transmisiones que estoy haciendo son de 2 bytes nada mas, y según las pruebas que he realizado el problema se encuentra en que el comando USB_kbhit(1) solo "levanta" la primera vez...
Aqui les dejo el código con el que he estado batallando, estoy programando con CCS y mi cristal es de 20MHz:
Gracias de antemano
El PC enumera el dispositivo y logro enviar (de la PC al PIC) exitosamente un dato y obtengo el resultado deseado, pero al momento de intentarlo de nuevo el PIC no responde.
He intentado cerrar la aplicación hecha para la PC y volverla a abrir, pero eso no arregla el problema. La única manera es desconectado el PIC de la PC. En verdad no entiendo cuál es el problema...
Las transmisiones que estoy haciendo son de 2 bytes nada mas, y según las pruebas que he realizado el problema se encuentra en que el comando USB_kbhit(1) solo "levanta" la primera vez...
Aqui les dejo el código con el que he estado batallando, estoy programando con CCS y mi cristal es de 20MHz:
Código:
#include <18F4550.h>
#fuses MCLR,HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN
#use delay(clock=48000000)
#use fast_io(B) //para definir entadas y salidas del puerto B
#use fast_io(C) //para definir entadas y salidas del puerto C
#use fast_io(D) //para definir entadas y salidas del puerto D
#define abrir PIN_B7
#define alarma PIN_B6
#define dooropen PIN_B5
#define boton PIN_B4
#define TEST PIN_B3
#define conectado PIN_D0 //xxxxxxxxxxxxxxxxxxxxxxx///PARA PRUEBA
#define USB_HID_DEVICE FALSE //deshabilitamos el uso de las directivas HID
#define USB_EP1_TX_ENABLE USB_ENABLE_INTERRUPT
#define USB_EP1_RX_ENABLE USB_ENABLE_INTERRUPT
#define USB_EP1_TX_SIZE 2 //size to allocate for the tx endpoint 1 buffer
#define USB_EP1_RX_SIZE 2 //size to allocate for the rx endpoint 1 buffer
#include <pic18_usb.h> //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include "PicUSB.h" //Configuración del USB y los descriptores para este dispositivo
#include <usb.c> //handles usb setup tokens and get descriptor reports
int8 recibe[2]; //declaramos variables
int8 envia[1];
int8 topen=1; //programable
int8 talarma =5; //programable
int8 contal =0;
int8 divA=0;
int8 divB=0;
int8 divC=0;
int8 t1=0;
int8 t2=0;
int8 t3=0;
int8 t4=0;
void main(void)
{
set_tris_b(0x33);
set_tris_d(0x00);/////////////////////xxxxxxxxxxxxxxxxxxxxxxxxx/////////
set_tris_c(0x00);//////////////////////xxxxxxxxxxxxxxxxxxxxxxxxxxxx////////
OUTPUT_B(0);
OUTPUT_D(0);////////////////////xxxxxxxxxxxxxxxxxxxxxx//////////
OUTPUT_C(0);//////////////xxxxxxxxxxxxxxxxxxx///////////////////////
enable_interrupts(INT_USB);
enable_interrupts(GLOBAL);
output_low(conectado); //Apaga led para indicar que no ha sido detectado por pc
usb_init_cs(); //inicializamos el USB
while(TRUE){
usb_task(); //habilita periferico usb e interrupciones
if(usb_enumerated()) //si el PicUSB está configurado
{
output_high(conectado);
if (usb_kbhit(1))//si el endpoint de salida contiene datos del host
{
usb_get_packet(1, recibe, 2);
if(recibe[0] == 0xfe){
topen = recibe[1];
}
if(recibe[0] == 0xff){
talarma = recibe[1];
}
if(recibe[0] == 0xfd){
output_high(abrir);
delay_ms(t1*1000);
delay_ms(t2*1000);
delay_ms(t3*1000);
delay_ms(t4*1000);
output_low(abrir);
}
recibe[0] = 0;
recibe[1] = 0;
if(topen<65){
t1=topen;
t2=0;
t3=0;
t4=0;
}
else{
divA = topen - 65;
t1=65;
if(divA>=65){
divB= divA - 65;
t2=65;
}
else{
t2=divA;
divB=0;
divC=0;
}
if(divB>=65){
divC= divB - 65;
t3=65;
}
else{
t3=divB;
divC=0;
}
if(divC>=65){
t4=65;
}
else
t4=divC;
}
if(input(boton) == 1){
output_high(abrir);
delay_ms(t1*1000);
delay_ms(t2*1000);
delay_ms(t3*1000);
delay_ms(t4*1000);
output_low(abrir);
}
if(input(dooropen) == 1){
delay_ms(1000);
if(contal<talarma-1)
contal++;
else
output_high(alarma);
}
else {
contal =0;
output_low (alarma);
}
}
}
Gracias de antemano