Hola que tal,
Mi problema es el siguente: Tengo que realizar un proyecto en donde utilizo comunicacion usb por el pic 18f4550, pero los datos a enviar, tienen que llegarle de forma serial por el pin RX y TX, desde el Pic 16f877A, el problema es el siguente tengo el codigo y lo simule en proteus y funciona perfectamente, pero a la hora de ir al hardware no funciona, no realiza nada, es como si al 18f no le llegara ningun dato.
Codigo Pic 18
/////////////////////////////////////////////////////////////////
#include <18F4550.h>
#include <stdio.h>
#include <stdlib.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN
#use delay(clock=48000000)
#use rs232(baud=115200, xmit=PIN_C6, rcv=PIN_C7)
#define USB_HID_DEVICE FALSE // deshabilitamos el uso de las directivas HID
#define USB_EP1_TX_ENABLE USB_ENABLE_BULK // turn on EP1(EndPoint1) for IN bulk/interrupt transfers
#define USB_EP1_RX_ENABLE USB_ENABLE_BULK // turn on EP1(EndPoint1) for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE 32 // size to allocate for the tx endpoint 1 buffer
#define USB_EP1_RX_SIZE 32 // size to allocate for the rx endpoint 1 buffer
#include <pic18_usb.h> // Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include ".\include\Descripcion.h" // Configuración del USB y los descriptores para este dispositivo
#include <usb.c> // handles usb setup tokens and get descriptor reports
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define RecCommand recbuf[0]
#define COMMAND_ADC1 1
#define COMMAND_ADC2 2
///////////////////////////////////////////////////////////////////////////////////////////////////
// VARIABLES GLOBALES
///////////////////////////////////////////////////////////////////////////////////////////////////
const int8 Lenbuf = 32;
char OUT_ADC1[3],OUT_ADC2[3];
int data, a;
int8 recbuf[Lenbuf];
///////////////////////////////////////////////////////////////////////////////////////////////////
// INTERRUPCIONES : RDA Recepción USART
///////////////////////////////////////////////////////////////////////////////////////////////////
#int_rda
void rda_handler(void){
char ba;
ba= getc();
if( ba == 'a')
{
OUT_ADC1[0]= getc();
OUT_ADC1[1]= getc();
OUT_ADC1[2]= getc();
}
if(ba == 'b')
{
OUT_ADC2[0]= getc();
OUT_ADC2[1]= getc();
OUT_ADC2[2]= getc();
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////
// MAIN
///////////////////////////////////////////////////////////////////////////////////////////////////
void main() {
enable_interrupts(int_rda); // Habilitamos la interrupción por recepción serie
enable_interrupts(global); // Habilitamos las interrupciones
usb_init();// esta
usb_task();// esta
usb_wait_for_enumeration();// y esta establecen comunicación, se ejecutan despues de un reset.
while (1)
{
if(usb_enumerated())// la conexion esta establecida
{
if (usb_kbhit(1))
{
usb_get_packet(1, recbuf, Lenbuf);
if(RecCommand==COMMAND_ADC1){
usb_put_packet(1,OUT_ADC1,3,USB_DTS_TOGGLE);
}
if(RecCommand==COMMAND_ADC2){
usb_put_packet(1,OUT_ADC2,3,USB_DTS_TOGGLE);
}
}
}
}
}
//////////////////////////////////////////////////////////////
Codigo Pic 16
/////////////////////////////////////////////////////////////////////////////////////
#include <16F877A.h>
///////////////////////////////////////////////////////////////////////////////////////////////////
// Fuses y ajuste de Clock
///////////////////////////////////////////////////////////////////////////////////////////////////
#use delay(clock=48000000) /// declara la frecuencia del cristal
#fuses HS,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT,NOPROTECT
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define TTL_TX PIN_C6
#define TTL_RX PIN_C7
#use rs232(baud=115200, xmit=TTL_TX, rcv=TTL_RX)
#define Rojo PIN_B0
#define IRojo PIN_B1
#define on output_high
#define off output_low
//////// Bloque de Interrupciones ////////////
///////////////////////////////////////////////////
void Send_RS232(char canal,int a){
int i;
char Pr[3],Dat[4];
set_adc_channel(a);
delay_us(2);
i=read_adc();
itoa(i, 10, Pr);
Dat[0]=canal;
Dat[1]=Pr[0];
Dat[2]=Pr[1];
Dat[3]=Pr[2];
puts(Dat);
}
//long int contRTCC = 0;
int cont = 0,B1ms = 0,B500us = 0;
int Lectura_ADC1,Lectura_ADC2;
#int_RTCC //Interrupcion RTCC se ejecuta cada vez que el timer pasa de 255 -> 0
RTCC_isr()
{
cont++;
if(cont == 3)// pulso de a los 500us
{
on(IRojo);
Send_RS232('a',0);
B500us = 1; // Bandera para informar que se cumplio 500us
}
else if(cont == 6)// pulso de 1ms
{
on(Rojo);
Send_RS232('b',1);
cont = 0; // Reinicio contador
B1ms = 1; // Bandera para informar que se cumplio 1ms
}
}
//////// Bloque de Funciones ////////////
///////////////////////////////////////////////////
void pulso(int ancho,int canal)
{
switch(canal)
{
case 1: if(get_TIMER0() > ancho)
{
B1ms=0;
off(Rojo);
} break;
case 2: if(get_TIMER0() > ancho)
{
B500us=0;
off(IRojo);
} break;
}
}
//////// Programa ////////////
///////////////////////////////////////////////////
void main(void)
{
//Configurar las interrrupciones
setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
enable_interrupts(global);
set_TIMER0(0);
enable_interrupts(INT_RTCC);
//Configurar el conversor A/D
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(AN0_AN1_AN3);
while(1)
{
if(B500us == 1)
{
pulso(80,2);//activar infrarojo
}
if(B1ms == 1)
{
pulso(80,1);//activar rojo
}
}
}
Si alguien sabe por que no funciona le agradeceria....