Autor Tema: Ayuda comunicacion entre pic 16f877a y Pic 18f4550  (Leído 3129 veces)

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

Desconectado galonsoa

  • PIC10
  • *
  • Mensajes: 2
Ayuda comunicacion entre pic 16f877a y Pic 18f4550
« 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....



Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Ayuda comunicacion entre pic 16f877a y Pic 18f4550
« Respuesta #1 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();
No contesto mensajes privados, las consultas en el foro

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: Ayuda comunicacion entre pic 16f877a y Pic 18f4550
« Respuesta #2 en: 30 de Abril de 2009, 00:15:45 »
Hola, este post deberia estar ubicado en Lenguaje C para microcontroladores

Saludos
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Ayuda comunicacion entre pic 16f877a y Pic 18f4550
« Respuesta #3 en: 30 de Abril de 2009, 00:20:22 »
 Es cierto, el moderador que corresponda debería moverlo. Saludos!
No contesto mensajes privados, las consultas en el foro


 

anything