Autor Tema: Problema proyecto de comunicación bluetooth  (Leído 1594 veces)

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

Desconectado cazador131

  • PIC10
  • *
  • Mensajes: 3
Problema proyecto de comunicación bluetooth
« en: 22 de Febrero de 2014, 10:37:49 »
Buenas estoy haciendo un proyecto parecido al de J1M y me esta costando bastante, he conseguido la comunicación entre 2 pic en el proteus y el programa de appinventor lo tengo hecho y comprobado, pero al pasarlo al pic no hace nada ya sea comunicándolo desde el pickit2 con su funcion UART,desde el ordenador con el hyperterminar y  desde el modulo bluetooth(HC-06(linvor)),me he estado basando en el libro "Compilador C y simulador Proteus para microcontroladores" os agradecería bastante la ayuda por que no veo una solución.

El código seria este como estaba probandolo con los lcd de proteus tiene las librerías y funciones de la lcd.
Código: [Seleccionar]
#include <18F2550.h>
#fuses HSPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,CPUDIV2,VREGEN,NOPBADEN,PLL5
#use delay(clock=20000000)
#include <lcd_4.c>
  
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7,STREAM=BLUE)
#use standard_io(B)

#int_RDA
void RDA_isr(){
char recibido=' ';
    recibido=' ';
    if(kbhit()){        
      recibido=getchar();
      output_high(PIN_A4) //Dato recibido
      switch (recibido)
{
      case 'A':                        
         output_high(PIN_A0);          
         lcd_putc("\fRecibido...A");  
         break;
      case 'B':                        
         output_high(PIN_A1);          
         lcd_putc("\fRecibido...B");
         break;
      case 'C':                        
         output_high(PIN_A2);          
         lcd_putc("\fRecibido...C");
         break;
      case 'D':                        
         output_high(PIN_A3);          
         lcd_putc("\fRecibido...D");
         break;
      }
    }
}

void main()
{
lcd_init();                              //Iniciamos LCD
lcd_putc("\fRecibiendo..."); //Escribimos en la LCD  
 enable_interrupts(Global);          
 enable_interrupts(INT_RDA);          
for (;;){}      
                              
}

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema proyecto de comunicación bluetooth
« Respuesta #1 en: 22 de Febrero de 2014, 11:39:14 »
  Primeramente indicarte que tal vez tengas demasiado código en la rutina de interrupción. Suele ser conveniente simplemente dejar un flag en la interrupción que indique que "paso algo" (en tu caso, que llego un caracter) y luego en el programa principal evaluar dicho flag y actuar en consecuencia.

  A su vez, creo que tienes mal el "use delay", porque si bien estás trabajando con un cristal de 20MHz, por lo que veo estás habilitando el PLL y la frecuencia del CPU parece ser la del PLL/2. La frecuencia del PLL es de 96MHz y por lo tanto la del CPU es de 48MHz.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado cazador131

  • PIC10
  • *
  • Mensajes: 3
Re: Problema proyecto de comunicación bluetooth
« Respuesta #2 en: 22 de Febrero de 2014, 12:11:32 »
Gracias por tu respuesta Angel, he cambiado la interrupción como dices y he dejado solo
 
Código: [Seleccionar]
#int_RDA
void RDA_isr()
{
  recibido=' ';
  recibido=getchar();
}
Respecto a el PLL,creo, que la activación de HSPLL es para decirle que el cristal es mayor de 4mhz y el fuse PLL es para dividir la frecuencia del cristal en este caso 1 vez y se quedaría en 20MHz, repito creo.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema proyecto de comunicación bluetooth
« Respuesta #3 en: 22 de Febrero de 2014, 13:02:17 »
  Para tu interrupción debería quedar algo así...

Código: C
  1. void RDA_is()
  2. {
  3.   recibido = ' ';
  4.   recibido = getchar();
  5.   dato_recibido = TRUE;
  6. }

 y el programa principal...

Código: C
  1. void main()
  2. {
  3.   lcd_init();
  4.   lcd_putc("\fRecibiendo...");
  5.   enable_interrupts(Global);
  6.   enable_interrupts(INT_RDA);
  7.   while(TRUE)
  8.   {
  9.     if (dato_recibido == TRUE)
  10.     {
  11.       Hacer todas las evaluaciones de switch
  12.       dato_recibido = FALSE;
  13.     }
  14.   }
  15. }

Por supuesto dato_recibido tiene que ser una variable global para poder modificarla tanto en la interrupción como en el bloque principal

  No sé como manejará CCS los fuses, pero la idea es la siguiente...

  HSPLL le indica al pic que se usa un cristal de cuarzo HS (high speed), pero que la frecuencia de trabajo está dada por el PLL interno.
  PLL5 indica que la entrada del PLL viene dada por la entrada del cristal dividido 5. Esto es 20MHz/5 = 4MHz (siempre la entrada del PLL tiene que ser de 4MHz)
  CPUDIV indica cual es el factor de división a partir de la frecuencia del PLL para obtener la frecuencia del CPU. El PLL genera 96MHz, por lo tanto si tienes CPUDIV2, la frecuencia de CPU es 48MHz.

  En el datasheet tienes la información respecto a las distintas posibilidades del oscilador.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado cazador131

  • PIC10
  • *
  • Mensajes: 3
Re: Problema proyecto de comunicación bluetooth
« Respuesta #4 en: 22 de Febrero de 2014, 13:53:01 »
Gracias otra vez por tu respuesta, Te entendí mal en tu primera respuesta es cierto lo que dices, me pondre a mirarlo, y respecto al código me gusta mas tu solución que la mía .
Código: [Seleccionar]
for (;;)
{
if(kbhit()){         
      recibido=getchar();
      output_high(PIN_A4); //Dato recibido
      switch (recibido)
{
      case 'A':                       
         output_high(PIN_A0);           
         lcd_putc("\fRecibido...A");   
         break;
      case 'B':                       
         output_high(PIN_A1);           
         lcd_putc("\fRecibido...B");
         break;
      case 'C':                       
         output_high(PIN_A2);         
         lcd_putc("\fRecibido...C");
         break;
      case 'D':                       
         output_high(PIN_A3);         
         lcd_putc("\fRecibido...D");
         break;
      }
    }
No me gustaba usar el kbhit, que por lo que he visto en internet da problemas, ire actualizando.


 

anything