TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: galonsoa en 26 de Abril de 2009, 21:06:10

Título: Ayuda comunicacion entre pic 16f877a y Pic 18f4550
Publicado por: galonsoa en 26 de Abril de 2009, 21:06:10
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....


Título: Re: Ayuda comunicacion entre pic 16f877a y Pic 18f4550
Publicado por: Suky en 26 de Abril de 2009, 21:17:25
Bienvenido galonsoa al foro!
Si vas a recibir varios bytes en la interrupción, solo el primero puedes leerlo directamente, los demás debes esperar a que llegue, prueba con colocar while(kbhit()==0){}, antes de cada getc().
Osea:
Código: C
  1. while(kbhit()==0){}
  2.       OUT_ADC1[0]= getc();
  3.       while(kbhit()==0){}
  4.       OUT_ADC1[1]= getc();
  5.       while(kbhit()==0){}
  6.       OUT_ADC1[2]= getc();
Título: Re: Ayuda comunicacion entre pic 16f877a y Pic 18f4550
Publicado por: KALLITOS en 30 de Abril de 2009, 00:15:45
Hola, este post deberia estar ubicado en Lenguaje C para microcontroladores (http://www.todopic.com.ar/foros/index.php?board=4.0)

Saludos
Título: Re: Ayuda comunicacion entre pic 16f877a y Pic 18f4550
Publicado por: Suky en 30 de Abril de 2009, 00:20:22
 Es cierto, el moderador que corresponda debería moverlo. Saludos!