# PIC + Bluetooth + Celular (con pic basic pro) detallado



## Bertub (Ago 8, 2013)

Hola Amigos. Estoy enfrascado en este proyecto básico y me he trabado en un punto que debe ser cosa de nada pero no logro encontrar el error, ATENCION moderadores, abro un nuevo tema porque los que hay no son claros y en otros lenguajes y los que usamos PBP quedamos fuera, 

Este es el clásico hola mundo desde un celular a un pic mediante bluetooth.

Elementos empleados:

Pic 16F628A
Modulo Bluetooth HC-06 (en zócalo soldado)
Celular con android

Microcode Studio + Pic Basic Pro 3 (lenguaje del code)
App Inventor (lenguaje android)
Ic Prog (programador Pic)

Manos a la obra.

Utilizo un modulo HC-06 JY-MCU que viene en un zócalo con las tensiones niveladas entre 3.3 y 5v.
Así puedo trabajar todo con 5v.







a 9600 bps por defecto y configuracion 8N1 y pass 1234

aqui dejo la imagen del circuito en protoboad 






de los circuitos que he encontrado colocan el RX del bluetooth en potencial alto con una R 10k, el circuito debe recibir de un celular un 100 reconocerlo y encender un led, y al recibir un 200 debe apagar el led.

La aplicación que uso en el cel es de un ejemplo funcional, del cual obtuve el código fuente de :
http://www.4shared.com/file/B4u8TDen/HC06.html

el cual se conecta al modulo bluetooth y al pulsar un botón envía un 100 para encender un led y un 200 para apagarlo. Pero se puede cambiar a una letra y recibir la misma por ejemplo enviar A y recibir "A"

Este es el código que uso para el pic:


```
'*******************************************************************************
' DEFINICIÓN DE FUSES Y OSILADOR
DEFINE OSC 4
'*******************************************************************************
CMCON = 7                     
TRISA = %00000000
TRISB = %00010010
'*******************************************************************************
' INICIALIZANDO USART
DEFINE HSER_BAUD 9600
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 24h
DEFINE HSER_SPBRG 25
DEFINE HSER_Clear On               

LED var byte
'*******************************************************************************
PORTA = %00000000
PORTB = %00000000
'*******************************************************************************
pause 1000

PORTB.0 = 1                      '*************************
pause 1000                       'esto es para saber q el pic vive
PORTB.0 = 0                      '*************************
 
inicio:
    
Hserin 100,continuo,[led]

continuo:
if led = "A" then
PORTB.0 = 1
pause 500
endif

if led = "B" then
PORTB.0 = 0
pause 500
endif

goto inicio
END
```
por ultimo una imagen de los fuses al programar el pic






Para cualquiera que se inicie con bluetooth pic y pbp esto le servira de mucho, pero claro, hay que solucionar el pequeño problema.

Utilicé también un hyperterminal de android https://play.google.com/store/apps/details?id=es.pymasde.blueterm&hl=es-419, con el que puedo conectarme al módulo para enviar los datos A y B.

Iniciando el ensayo:

-Alimento el circuito.
-El led del módulo parpadea esperando la conexión de otro dispositivo.
-El led azul del pic se enciende y apaga indicando que el pic esta vivo.
-Abro la app y pulso conectar.
-El led del modulo queda encendido y la app dice estar conectado.
-Pulso encender led.
-El Led enciende.
-Pulso apagar.
-El pic responde apagando el led.

Desde aquí una vez que el pic responde el limite es la imaginación de cada uno.

Gracias a Reyvilla, Xae y Ricbevi por sus aportes y ayuda.

Desde ya, muchas gracias.


----------



## xae (Ago 8, 2013)

Según expones en tus pruebas con el emulador de terminal, me da la impresión de que estás enviando la cadena "100" en lugar del byte con valor 100.
Prueba a enviar el caracter ascii 'd' que se corresponde con el valor decimal 100.


----------



## Bertub (Ago 8, 2013)

Hola XAE  revisado, intente enviar la letra d desde el hyperterm sin exito, se establece la coneccion pero no enciende el led. gracias otra idea?


----------



## ricbevi (Ago 8, 2013)

Bertub dijo:


> Hola Amigos. estoy enfrascado en este proyecto basico y me he trabado en un punto que debe ser cosa de nada pero no logro encontrar el error, ATENCION moderadores, abro un nuevo tema porque los que hay no son claros y en otros lenguajes y los que usamos PBP quedamos fuera,


 
Hola...quita el tilde de WDT y tilda el PWRT al programar el pic ya que "el perro guardián" te puede estar interfiriendo con lo que quieres hacer.
Saludos.

Ric.


----------



## Bertub (Ago 8, 2013)

> Hola...quita el tilde de WDT y tilda el PWRT al programar el pic ya que "el perro guardián" te puede estar interfiriendo con lo que quieres hacer.
> Saludos.



Gracias Ric, saque el perro y coloque el PWRT y no hay cambios


----------



## reyvilla (Ago 8, 2013)

Hola compañero Bertub, estuve revisando tu codigo y tienes varios detalles, una esta en la definición del TX con el HSERIN no es TCSTA  es TXSTA. Lo otro como te comento el compañero xae envia un caracter como una letra y en el recepto tienes que colocarlo por 
ejemplo: if led = "B" then...
Y una recomendación solo si se quiere yo lo hago para evitar equivocarme por que se me olvide hacerlo luego, es realizar todas las configuraciones dentro del mismo código. Te dejo una simulación básica que hice rápido de tu circuito y el cogido corregido.  
PD : Esto fue como encontrar una aguja en un pajar...  ...Me recordo hace un tiempo un código que casi me saca canas y resulta que era un 1 mal ubicado. 
Mucho éxito prueba y me avisas...


----------



## Bertub (Sep 30, 2013)

Querido reyvilla sos un maestro, sabia que era un error de nada, pero error al fin. Ambas cosas tenia que cambiar. el TXSTA y enviar una de para recibir un 100, ahora a probar otras combinaciones como enviar una A y recibir A enviar un 100 recibir un 100 etc. muchas gracias cambiare el codigo en el post para quien lo siga 


Les hago una consulta, ya tengo funcionando todo como lo anuncie en el foro, pero ahora se me presento la inquietud siguiente:

hice una app en app inventor android que conecta 2 celulares por bluetooth uno como esclavo y el otro como maestro, el esclavo debe presionar CONECTAR para sincronizar y el maestro queda siempre en espera del esclavo. Quiero hacer lo mismo con el modulo bluetooth HC-05 como esclavo, que mande constantemente la peticion a cuaqueir maestro que se le acerque, y uso el celular como maestro pero no logro que se encuentre, como sucede entre los celulares. La idea es que el modulo y el cel se conecten al aproximarse uno a otro sin tener q presionar nada.

debido a que el celular maestro funciona con otro celular (esclavo) imagino que el problema esta en el esclavo del modulo hc-05, tal vez las configuraciones de paridad o no se que, es en este punto que necesito tu ayuda o sugerencia. 

muchas gracias


----------



## Alcocer Garcia Felix Davi (Feb 13, 2014)

Excelente mi proyecto es el siguiente con 16f877a .appinventor 1


----------



## darius360 (Feb 15, 2014)

Hola muy buen tutorial estaba buscando algo asi, bien detallado.
Me funciono de maravilla todo ok.
La pregunta que quiero plantear es si se puede cambiar el nombre:linvor y pass:1234 que viene por defecto en el modulo bluetot, vi tutoriales que lo hacen via pc con puerto lpt1 pero mi computadora no tiene ese puerto entonces supongo que se podria poner una cadena de comandos para que el pic configure estos datos al modulo bluetot lei por ahi que son comandos como:
AT+NAMEnombre : Cambia el nombre del dispositivo, por ejemplo AT+NAMEdispBT1 responde con OKsetname y ahora tendrá el nombre de dispBT1, el nombre es limitado a 20 caracteres.

AT+PINxxxx : Cambia el pin de seguridad de 4 digitos, podemos usar AT+PIN0000 para setear el pin a 0000, responde con OKsetPIN, por default viene configurado 1234.

AT+BAUDx : Modifica el baud rate del dispositivo, x puede tomar los siguientes valores

1———1200
2———2400
3———4800
4———9600 (Default)
5———19200
6———38400
7———57600
8———115200
9———230400
A———460800
B———921600
C———1382400

como se hace para que salgan los datos desde el pic? 
HSEROUT?


----------



## Polonio (Feb 28, 2014)

darius360 dijo:


> Hola muy buen tutorial estaba buscando algo asi, bien detallado.
> Me funciono de maravilla todo ok.
> La pregunta que quiero plantear es si se puede cambiar el nombre:linvor y pass:1234 que viene por defecto en el modulo bluetot, vi tutoriales que lo hacen via pc con puerto lpt1 pero mi computadora no tiene ese puerto entonces supongo que se podria poner una cadena de comandos para que el pic configure estos datos al modulo bluetot lei por ahi que son comandos como:
> AT+NAMEnombre : Cambia el nombre del dispositivo, por ejemplo AT+NAMEdispBT1 responde con OKsetname y ahora tendrá el nombre de dispBT1, el nombre es limitado a 20 caracteres.
> ...



Pues veras, no es el LPT1 el que se usa, sino el Serie, RS232, pero con niveles TTL, por lo que tendrás que conseguirte un conversor de niveles, o hacerlo con el MAX232.
También puedes programarlo con el PIC, con SerOut o HSerout, mandándole los comandos adecuados. No olvides que tienes que adecuar los niveles de tensión a 3,3 voltios para el RX del módulo Bluetooth.


----------



## memeduck (Mar 6, 2014)

reyvilla dijo:


> Hola compañero Bertub, estuve revisando tu codigo y tienes varios detalles, una esta en la definición del TX con el HSERIN no es TCSTA  es TXSTA. Lo otro como te comento el compañero xae envia un caracter como una letra y en el recepto tienes que colocarlo por
> ejemplo: if led = "B" then...
> Y una recomendación solo si se quiere yo lo hago para evitar equivocarme por que se me olvide hacerlo luego, es realizar todas las configuraciones dentro del mismo código. Te dejo una simulación básica que hice rápido de tu circuito y el cogido corregido.
> PD : Esto fue como encontrar una aguja en un pajar...  ...Me recordo hace un tiempo un código que casi me saca canas y resulta que era un 1 mal ubicado.
> Mucho éxito prueba y me avisas...





Hola ami me funciona de maravilla pero como prodria aser para poner unos 4 led mas en el programa eh intentado poniendo otra variable que ejemplo: hSERIN 101,continuo,[led] y asi y de otras formas, me podrian ayudar.


----------



## Polonio (Mar 6, 2014)

memeduck dijo:


> Hola ami me funciona de maravilla pero como prodria aser para poner unos 4 led mas en el programa eh intentado poniendo otra variable que ejemplo: hSERIN 101,continuo,[led] y asi y de otras formas, me podrian ayudar.



Declara la variable tal que así:
LED var byte[5]

y si quieres meterlos en la misma instrucción pones:

hSERIN 100,continuo,[led(0),led(1),led(2),led(3),led(4)]; espera 100 mseg antes de saltar.
'si hay datos de entrada sigue por esta linea
...
....
goto inicio

continuo:' saltará a esta etiqueta si no hay datos de entrada
....
....
return


----------



## juanc08 (Abr 20, 2014)

Bertub dijo:


> Hola Amigos. estoy enfrascado en este proyecto basico y me he trabado en un punto que debe ser cosa de nada pero no logro encontrar el error, ATENCION moderadores, abro un nuevo tema porque los que hay no son claros y en otros lenguajes y los que usamos PBP quedamos fuera,


 

Buena tarde amigo, me intereso este tema , me podrias dar ma informacion sobre (App Inventor (lenguaje android)) ya que la direccion de 4 share que dejaste ya no funciona, la idea es desarollar este tema y se nada de programar en android pero estoy decidido a aprender , muchas gracias por tu aporte


----------



## Bertub (Abr 21, 2014)

juanc08 dijo:


> buena tarde amigo me intereso es te tema , me podrias dar ma informacion sobre (App Inventor (lenguaje android)) ya que la direccion de 4 share que dejaste ya no funciona la idea es desarollar este tema y se nada de programar en android pero estoy decidido a aprender , muchas gracias por tu aporte



Ingresa a http://beta.appinventor.mit.edu/ esa es la unica pagina del MIT inventor, de alli se dara cuenta que no tienes los programas necesarios y te lleva a una guia de instalacion etc. ejemplos y demas. suerte


----------



## juanc08 (Abr 21, 2014)

Bertub dijo:


> Ingresa a http://beta.appinventor.mit.edu/ esa es la unica pagina del MIT inventor, de alli se dara cuenta que no tienes los programas necesarios y te lleva a una guia de instalacion etc. ejemplos y demas. suerte



muchas gracias por tu respuesta , me pondre en marcha con el proyecto


----------



## wilsonsinchi (May 2, 2014)

hola amigos me intereso mucho el proyecto queria saber si me pueden ayudar 
estoy recien incursionando en el mundo de los pic y queria saber el hserin 100 especificamente cual es su funcion ademas el programa de android como se lo hace les agradeceria mucho su ayuda


----------



## Bertub (May 4, 2014)

wilsonsinchi dijo:


> hola amigos me intereso mucho el proyecto queria saber si me pueden ayudar
> estoy recien incursionando en el mundo de los pic y queria saber el hserin 100 especificamente cual es su funcion ademas el programa de android como se lo hace les agradeceria mucho su ayuda



Hola, El mundo pic es emocionante, bienvenido, te recomiendo leas sobre hserin en el lenguaje que elegiste para programar, de poco te servira una explicacion de hserin aislada, el programa en android lo hice en AppInventor del MIT, los link estan mas arriba, te recomiendo empieces con encender un led Hola mundo y siguas, hay muchos tutoriales que estan muy buenos y entretenidos y haciendo pavadas vas aprendiendo y de pronto estas integrando todas ellas para hacer algo tuyo. espero te sirva la respuesta, si necesitas algo mas profundo tal vez te pueda ayudar.


----------



## cosmico74 (May 7, 2014)

¿Alguien me puede ayudar?Pues resulta que arme este circuito tal cual,es el mismo modulo Bluetooth con los parametros por default 9600 Baudios...etc.,y bueno mis resultados fue que todo marcha bien a 4 Mhz.Despues hice pruebas colocando un cristal de 20 Mhz,logicamente coloque en los fuses el cambio de configuracion en la cabecera @ device HS_OSC...DEFINE OSC 20...pero no responde solamente parpadea el led que coloco al inicio el compañero BERTUB,"para saber que esta vivo el pic".,si no me equivoco el detalle ha de estar aqui en esta parte de la cabecera:
  ' INICIALIZANDO USART
DEFINE HSER_BAUD 9600
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 24h
DEFINE HSER_SPBRG 25
DEFINE HSER_Clear On  
¿Osea alguien sabe como quedaria la configuracion para el cristal de 20Mhz?
¿Y una pregunta mas el PIN RX del pic quedaria como entrada cierto?


----------



## D@rkbytes (May 7, 2014)

cosmico74 dijo:


> ¿O sea, alguien sabe como quedaría la configuración para el cristal de 20Mhz?
> Y una pregunta más; ¿el PIN RX del pic quedaría como entrada cierto?


Si estás usando un PIC16F628A con PICBasic Pro, sería de esta forma:

```
@ Device PIC16F628A    ; Microcontrolador utilizado
; Palabra de configuración:
@ Device HS_OSC,WDT_OFF,PWRT_ON,BOD_OFF,LVP_OFF
;*******************************************************************************
Define OSC 20                ; Definir que se trabajará con 20MHz.
```
Y si, el pin Rx tiene que ser configurado como entrada.

Pero si usas las instrucciones SerIn, HSerin, SerOut, HSerOut, etcétera, las mismas se encargan de configurar los pines correspondientes como entradas o salidas.

Y la configuración del módulo USART  sería así:
; Configuración USART: (9600bps @ 20MHz. 9615bps reales y 0.16% de error.)
Define HSER_SPBRG    81h
Define HSER_BAUD    9600
Define HSER_TXSTA    24h
Define HSER_RCSTA    90h


----------



## Bertub (May 8, 2014)

> Mi duda es el Hserin 100 por qué ese valor es la velocidad, memoria o qué?
> respecto al programa appinventor, si lo estaba haciendo pero solo me permite hacer la interfaz, lo q se muestra en el dispositivo el screen, pero cuando doy click para crear la progamacn en bloques no me sale la pantalla, sino se descarga un archivo.



Hola, la sintaxis de hserin es la siguiente

HSERIN {Timeout ,Label ,} [ Item { . . . } 

Timeout y Label pueden ser incluídos en forma opcional para permitir al programa continuar si un carácter no es recibido dentro de un límite de tiempo . Timeout está especificado en unidades de 1 milisegundo .

En definitiva 100 es el tiempo en segundo para esperar una entrada

Utiliza este manual que a mi me guio siempre 

http://www.todopic.com.ar/pbp_sp.html



espero te sirva





			
				
¿Osea alguien sabe como quedaria la configuracion para el cristal de 20Mhz?
[/QUOTE dijo:
			
		

> que programa usas para programar el pic?, yo uso el IcProg y alli cuando uso cristales de 20 coloco HS en la seleccion de oscilador porque por mas que lo indique en el codigo, al programar me hace cualquier cosa, tal vez como a vos que te parpadea el led y nada mas. a parte de las indicaciones que ya te dieron


----------



## cosmico74 (May 14, 2014)

Que tal amigos! aqui pego un *breve fragmento del Gran Mario Sacco*...exNeoteo precisamente hablando sobre *enlaces Bluetooth:*

*"Cada botón estará asociado al simple envío de un texto gracias a la conexión Bluetooth del dispositivo Android que estemos utilizando hacia el PIC “remoto”. Recordemos que para encender un LED necesitábamos enviar un “100” y para apagarlo un “200”. La instrucción HSERIN utilizada en Amicus, necesita recibir (luego del número) un caracter “que no sea numérico” para interpretar que todo lo anterior es el número. Es decir, si le enviamos el 100 solo, se quedará esperando más datos numéricos, porque siempre espera eso, datos numéricos. Cualquier caracter “no numérico” finaliza la recepción y define lo recibido como la información útil. Es decir, si recibe un 100 se queda esperando más números. Si en cambio recibe 100A, detecta que la A es el caracter “no numérico” que cierra la recepción de datos. Por lo tanto, eso enviaremos nosotros."*

...y Bueno a mi funciono como sigue:
Utilize un PIC16F628A con USART RX/TX
D@rkbytes me ayudo a configurar el usart para 20 Mhz
Utilize el compilador proton ide 2.0.0.7
Modulo Bluetooth HC-06
APP inventor sobre la plataforma Android
*Enseguida envie por el serial comunicator de proton valores numericos ej.100,200 para encender o apagar 3 leds y todo sin problemas excepto que a veces tenia que darle 1 o 2 enter a mi teclado no se si este fallando o sea parte de la comunicacion Bluetooth,bueno lo di por bueno*.Despues ya con mi celular *envie atravez del diagrama de bloques de APP INVENTOR_ANDROID valores numericos como 100(encender leds),200(apagar leds) y no me funciono,despues envie letras como A,B,C,D (haciendo referencia al codigo ASCII),.y tampoco me funciono*,hasta que hice lo que dice el fragmento citado arriba agregar un valor no numerico al final y me funciono,encendi y apague los tres leds,*lo que no se es lo siguiente no se si alguien ya lo probo o ya lo soluciono resulta que en el codigo original esta declarada una variable LED del tipo byte (0-255) que es donde se guardan los valores recibidos del diagrama de bloques app inventor via bluetooth(celular),aqui la pregunta es ¿si estamos enviando valores del tipo 100A,200A,o mayores a estos,se tendria que cambiar la variable LED(0-255) a tipo WORD? o no le afectaria? o alguien lo ha probado con valores en decenas de este tipo 10A,20A,digo esto para no cambiar la variable LED tipo Byte...Gracias por su atencion.  *


----------



## cosmico74 (May 29, 2014)

Que tal a todos!!! Alguien sabe por que me aparecieron estos extraños caracteres hace unos dias me estaba funcionando correctamente y hoy lo volvi a retomar abriendo la consola serial de Proton ide y me sale con esta sorpresa.
Estoy usando lo siguiente: PIC16F628A,Cristal 20 Mhz,modulo bluetooth HC-06,el objetivo es lo siguiente:Con un 100 enciendo 3 leds,con 200 apago 3 leds de echo ya lo habia hecho trabajar con app inventor de Android,ademas cabe decir que el codigo esta en Proton ide,bueno pues sin mas palabras dejo algunas imagenes.


----------



## kowart (Sep 17, 2014)

Hola yo quiero trabajar con un modulo bluetooth por lo que pido tu ayuda,e leído que estas trabajando con un modulo bluetooth , tambien utilizo proton.Me gustaria que me digas el código del modulo bluetooth que utilizas y una idea del hardware en fotos .DE ANTEMANO GRACIAS POR TU RESPUESTA


----------



## cosmico74 (Sep 18, 2014)

kowart dijo:


> Dijo...Hola yo quiero trabajar con un modulo bluetooth por lo que pido tu ayuda,e leído que estas trabajando con un modulo bluetooth , tambien utilizo proton.Me gustaria que me digas el código del modulo bluetooth que utilizas y una idea del hardware en fotos .DE ANTEMANO GRACIAS POR TU RESPUESTA


 
Estimado Kowart este es el codigo lo realize en Proton IDE y bueno pues lo probe con la consola Serial Com de proton,de lado de la pc compre un adaptador USB dongle Bluetooth para enviar las señales al modulo receptor Bluetooth montado en protoboard y con esto logre activar y desactivar 3 leds.
2.-Tambien logre hacer lo mismo encender y apagar 3 leds esto lo realize con una pequeña aplicacion en La Plataforma Android y el resultado tambien fue okey.

Tips:nada mas hay que fijarse que las velocidades (baudios) sean los mismos al configurar el modulo Bluetooth y la consola serial y el puerto com entre el adaptador usb bluetooth y la consola,ademas yo le puse un cristal de 20Mhz,ademas se me olvidaba hay que conectar el RX del modulo bluetooth con el TX del pic y el TX del modulo con el RX del pic osea al inverso,dejame ver si te encuentro una imagenes es que ya desmonte el mio pero hay unos parecidos...continued




kowart dijo:


> Me gustaria que me digas el código del modulo bluetooth que utilizas y una idea del hardware en fotos .DE ANTEMANO GRACIAS POR TU RESPUESTA


Te anexo en unas imagenes la forma de conexion del modulo bluetooth es sencillisimo un pin a +5v,otro a gnd(tierra),el TX del modulo al RX del pic,el RX del modulo al TX del pic observa bien ese detalle para que te funcione a la primera claro esta que yo no utilize este pic yo utilize el PIC16F628A por que es mas economico y nada mas era para hacer esta practica cuando tengas el pic localizas en su datasheet el RX y TX y ahi conectas el modulo,te repito el 16f628a los trae por eso lo utilize...suerte.


----------



## gatito11 (Sep 27, 2014)

hola amigos, yo tengo una duda, estoy usando un hc 06 un pic y un celular T610 lo que quiero es hacer que el modulo bt le envíe datos al celular (comandos AT para envio de SMS), pero lo que no puedo hacer es enlazar al modulo y el telefono, en el telefono si se agregó el HC06, pero no se enlazan, como puedo solucionar ese problema? espero me puedan ayudar


----------



## cosmico74 (Sep 28, 2014)

gatito11 dijo:


> hola amigos, yo tengo una duda, estoy usando un hc 06 un pic y un celular T610 lo que quiero es hacer que el modulo bt le envíe datos al celular (comandos AT para envio de SMS), pero lo que no puedo hacer es enlazar al modulo y el telefono, en el telefono si se agregó el HC06, pero no se enlazan, como puedo solucionar ese problema? espero me puedan ayudar



gatito11 si posteas tu codigo y tus esquemas yo creo que sera mas facil asesorarte...


----------



## gatito11 (Sep 28, 2014)

El problema no lo tengo en el código, de hecho no creo que fuera problema del código, ya que lo único que necesito hacer es enviar por medio de comandos AT instrucciones a un celular, y yo quiero usar el HC-06 para que se conecte vía Bluetooth al celular que recibirá los comandos, pero el problema es que el módulo de Bluetooth no se enlaza con el celular, pero esto no tiene que ver con el código del PIC.

 El código que estoy utilizando es:


```
#include <16F883.h> 
//#device ICD=TRUE//si no utilizas el debugger debe de ir comentada
#FUSES NOWDT, HS, NOPUT, NOLVP 
#use delay(clock=4000000) 

//Configuración puerto serie
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) 
#byte TRISB=0x86
#byte PORTB=0x06
#byte TRISC=0x87
#byte PORTC=0x07
//Variables de configuración SMS
#define NUMERO_MENSAJES 1 //Número de mensajes a enviar 
char NUMERO[] = "4646535868"; //Número de teléfono a marcar 
char MENSAJE[] = "Primer prueba de envio tesis\r Emmanuel Razo";//Mensaje a enviar

int flag=0;//variable auxiliar

   #int_EXT 
   void EXT_isr(void){//función de tratamiento a la interrupción externa 
      flag=1; 
      }

//Función para configurar parámetros del modem 
   void configurar_Modem(){ 
      printf("at+cmgf=1\r");
      //configura el tipo de formato de mensaje de texto SMS (formato TEXTO) 
      delay_ms(200); 
   }

//Función para enviar mensajes SMS 
   void Envio_SMS(){ 
      char ctrlz = 26; //combinacion de teclas "ctrl+z" 
      printf("at+cmgs=\"%s\"\r",NUMERO); 
      delay_ms(200); 
      printf("%s",MENSAJE); 
      delay_ms(200); 
      printf("%c",ctrlz); //se envia el mensaje 
      delay_ms(200); 
   }

   void main() { 
      int i;
      //Configuración registros PIC 
      TRISB=0b00000001;
      PORTB=0x00;
      TRISC=0b00000000;
      PORTC=0x00;
      enable_interrupts(GLOBAL);//habilito interrupción global 
      enable_interrupts(INT_EXT);//habilito interrupción externa 
      ext_int_edge(L_TO_H);// flanco de activación ascendente 
      
      delay_ms(1000);//retardo para estabilizar 
      configurar_Modem();//llamada a la función de configuración del modem 
      
         while(true) { //Bucle infinito hasta interrupción 
            if (flag==1){ // si se produce alarma envió mensajes 
               for(i=0;i<NUMERO_MENSAJES;i++){
                   Envio_SMS(); 
                   } 
                flag=0;
             } 
         } 
   }
```


----------



## kowart (Ene 29, 2015)

y como mover desde labview via bluetooth un servomotor ,que el gráfico en labview actué como un potencio metro se puede,asi seria la programación  proton en basic.soy nuevo en labview por lo que pido me ayuden en ese punto.


```
Device 16F88
Xtal 20 

Declare Hserial_Baud =9600
Declare Hserial_RCSTA=%10010000
Declare Hserial_TXSTA=%00100100
Declare Hserial_Clear= On
Declare Adin_Res = 8
Declare Adin_Tad = FRC
Declare Adin_Stime =50
ADCON1=%00000
Dim  a As Byte
DATO VAR Byte 
TRISA=%11111
'TRISB=%00000100
INICIO:
Pot PORTA.0 ,255 ,DATO
 
 'a=ADIn 0
 'HSerout [a]
 ' PORTB.0= a
 HSerOut ["DATO ES  ",Dec dato,13]
 DelayMS 100
GoTo INICIO
```


----------



## unifim (Nov 25, 2015)

Hola, una pregunta alguien ha hecho el enlace entre un modulo bluetooth HC-05 y una aplicación hecho en android studio o eclipse? pretendo hacer la aplicacion en android studio ya que app inventor tiene alguna limitacion por ejemplo no permite activar 2 botones en simultaneo. Alguien que haya manejado bluetooth en android studio o eclipse?


----------



## Dareblix (Mar 21, 2016)

Hola. Hace días publiqué pidiendo ayuda con un control infrarrojo, pero sin éxito.
Busqué otras maneras de controlar a distancia y elegí hacerlo vía Bluetooth con un Módulo HC-05.

Uso éste programa para hacer encender y apagar un LED mediante la aplicación "Blueterm" y funciona.

```
CMCON = 7                     
TRISA = %00000000
TRISB = %00010010
'*******************************************************************************
' INICIALIZANDO USART
DEFINE HSER_BAUD 9600
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 24h
DEFINE HSER_SPBRG 25
DEFINE HSER_Clear On               

LED var byte
'*******************************************************************************
PORTA = %00000000
PORTB = %00000000
'*******************************************************************************
pause 1000

PORTB.0 = 1                      '*************************
pause 1000                       'esto es para saber q el pic vive
PORTB.0 = 0                      '*************************
 
inicio:
    
Hserin 100,continuo,[led]

continuo:
if led = "A" then
PORTB.0 = 1
pause 500
endif

if led = "B" then
PORTB.0 = 0
pause 500
endif

goto inicio
END
```
En los fuses activé el oscilador interno, MCLR y BODEN.
Usé una resistencia de 4k7 hacia MCLR y una resistencia de 10k en RX del módulo hacia 5 V.

Este programa funciona perfecto para el LED. Ahora bien, luego creé éste otro para lograr mover el servomotor:

```
CMCON = 7                     
TRISA = %00000000
TRISB = %00010010
'*******************************************************************************
' INICIALIZANDO USART
DEFINE HSER_BAUD 9600
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 24h
DEFINE HSER_SPBRG 25
DEFINE HSER_Clear On               

SERVO var byte
'*******************************************************************************
PORTA = %00000000
PORTB = %00000000
'*******************************************************************************
 
inicio:
    
Hserin 100,continuo,[SERVO]

continuo:
if SERVO = "a" then
gosub foward
pause 3000
endif

if SERVO = "b" then
gosub back
pause 3000
endif

goto inicio
END
FOWARD:
 PWM PORTB.0,1,50
RETURN
BACK:
 PWM PORTB.0,255,80
RETURN
```
Pues bien, esto funciona raramente, ya que al digitar "b" se mueve pero se mueve en sentido contrario, también mediante pulsos como vibrando, es decir, primero vibra en el sentido contrario y luego se mueve como debería y el cuando digito "a" hace lo mismo, como si el puerto estuviese mandando más pulsos (solo digito una vez y despacio).

Notase que en el programa quité la parte para saber si el PIC vive, porque si la pones, entonces si vibra como loco sin digitar nada.

Otro problema que tiene, es que tarda mucho en recibir la instrucción, tiene un retardo como de 3 segundos aproximadamente después de digitar, pero sé que es un error de programación.
Debe de funcionar y aún tengo la esperanza.

Los pulsos PWM funcionan correctamente cuando lo hago mediante un pulsador físico.
He tratado con distintos PAUSE variándolo, pero creo que con 3 segundos vibra menos (al parecer o es imaginación mía)
Intenté poner la pausa después del GoSub y dentro del GoSub, después del pulso PWM, pero nada.

Por favor, espero una respuesta, prometo que si funciona subo un tutorial de este proyecto que es un robot.
Muchas gracias por leer.


----------



## D@rkbytes (Mar 21, 2016)

Si usas la instrucción "HSERIN" (Recepción RS-232 por hardware), entonces también deberías usar la interrupción por recepción del módulo USART.


Dareblix dijo:


> Notase que en el programa quité la parte para saber si el PIC vive,  porque si la pones, entonces si vibra como loco sin digitar nada.


Eso es lógico porque la ejecución de instrucciones estará afectada por los retardos de encendido y apagado del LED.


Dareblix dijo:


> Otro problema que tiene, es que tarda mucho en recibir la instrucción,  tiene un retardo como de 3 segundos aproximadamente después de digitar,  pero sé que es un error de programación.


Este otro problema también es debido a los retardos de 3 segundos que pusiste cada vez que se recibe la orden correcta.


Dareblix dijo:


> He tratado con distintos PAUSE variándolo, pero creo que con 3 segundos vibra menos (al parecer o es imaginación mía)
> Intenté poner la pausa después del GoSub y dentro del GoSub, después del pulso PWM, pero nada.


No uses retardos cuando necesites una ejecución continua de las instrucciones.
El uso de retardos siempre detendrá la correcta ejecución del programa.
Para eso tienes los timers del microcontrolador.

Tampoco uses la instrucción "PWM" porque está condicionada por tiempos.
Es mejor que uses el módulo CCP y cambies a la instrucción "HPWM"


----------



## Dareblix (Mar 23, 2016)

Hola antes que nada gracias por responder, pues la verdad nunca he usado y no conocía la instrucción CPP y la instrucción HPWM supongo que solo la cambio por la instrucción pwm en el código, podrías escribir un ejemplo de como quedaría en este programa por favor?


----------



## D@rkbytes (Mar 23, 2016)

CCP no es una instrucción, es un módulo del microcontrolador dedicado especialmente a la captura y generación de pulsos. CCP = Capture Compare PWM
HPWM si es una instrucción nativa de PICBasic. HPWM = Hardware Pulse Width Modulation


Dareblix dijo:


> ¿Podrías escribir un ejemplo de cómo quedaría en este programa,  por favor?


Nunca lo he hecho de esa forma, yo lo hago usando el Timer 0.


----------



## chente276 (May 3, 2016)

Hola gente del foro, tengo un problema y quiero que me ayuden con PBP. Estoy trabajando con un modulo HC-05 y un pic16f628A, utilizo las instrucciones SERIN y SEROUT. logro tener comunicacion con el celular esto es que desde el pic mando un HOLA MUNDO y es recibido en el celular. El problema surge cuando del celular mando el hola mundo al pic este lo quiero mostrar en una lcd 16x2 y me muestra puros caracteres raros y nunca los mismos, he probado enviando dos veces el mismo caracter y estos no llegan igual, tambien he probado mostrar el caracter en decimal (LCDOUT,$FE,$80,DEC DAT, donde dat es la variable que guarda los datos recibidos) y este tampoco es el mismo. La instruccion es: SERIN portb.1,T9600,DATO espero de su ayuda


----------



## D@rkbytes (May 3, 2016)

¿A qué frecuencia estás usando el oscilador del PIC?


----------



## chente276 (May 3, 2016)

A 4MHz compañero D@rbytes. He intentado con el oscilador interno y tambien el externo, estoy pensando que tal vez el problema es en la configuracion de fabrica del HC-05 que este configurado a 3840 baudios y las instrucciones SERIN Y SEROUT solo soportan hasta T9600, tambien en mi desesperacion  he probado con T2400, N9600, N2400 y nada. estoy viendo la posibilidad de conseguir un convertidor usb a RS232 para poder ingresar a los comandos AT.


----------



## D@rkbytes (May 3, 2016)

chente276 dijo:


> A 4MHz compañero D@rbytes. He intentado con el oscilador interno y también el externo, estoy pensando que tal vez el problema es en la configuración de fabrica del HC-05 que esté configurado a 3840 baudios y las instrucciones SERIN Y SEROUT solo soportan hasta T9600


Tal vez quisiste decir; 38400 Baudios. Y sí, esa velocidad es con la que viene por defecto.
Necesitas entrar al modo de configuración por comandos AT y ver que velocidad tiene.
Porque se usan dos velocidades, en modo de configuración y en modo de operación.
En modo de configuración la velocidad siempre es de 38400 Baudios.


chente276 dijo:


> Estoy viendo la posibilidad de conseguir un convertidor usb a RS232 para poder ingresar a los comandos AT.


Si, esa es la forma más común de entrar al modo de configuración, pero también se puede hacer con el microcontrolador.
Pero como debes usar una velocidad de 38400 Bps, necesitas usar un cristal de 12 a 20 MHz.


----------



## chente276 (May 4, 2016)

Muchas gracias compañero D@rbytes estaba pasando por alto el cristal  , ya lo estoy probando con oscilador a 20MHz y he cambiado las instrucciones SERIN y SEROUT por HSERIN y HSEROUT para trabajar a 38400 con lo que ha mejorado mucho ya se muestran letras en la LCD sin embargo aun en ocasiones no muestra la letra enviada adjunto los archivos para ser mas claro, el envio del pic al celular sigue funcionando perfecto. Gracias por su ayuda


----------



## D@rkbytes (May 4, 2016)

OK. Las configuraciones sobre el BPRG están mal, y es que no debes colocar valores al azar tomados de la hoja de datos, porque son valores de ejemplo tomados para otros Baud rates.
Para generar los valores correctos, debes utilizar las fórmulas.
Aunque como ésto te puede resultar complicado, aquí te dejo los valores para 38400 Bps.

En PBP como puedes trabajar directamente con los registros, los puedes ingresar de dos formas.
Así usando las sentencias nativas:
; Configuración USART: (38400bps @ 20MHz. 37879 Bps reales -1.3% Error.)

```
Define HSER_SPBRG    20h
Define HSER_BAUD    38400
Define HSER_TXSTA    24h
Define HSER_RCSTA    90h
```
O así, utilizando la configuración de registros:

```
SPBRG =    $20    ; 00100000
TXSTA =    $24    ; 00100100
RCSTA =    $90    ; 10010000
```
También te recomiendo que incluyas la palabra de configuración:

```
[COLOR=Blue];*******************************************************************************[/COLOR]
[COLOR=DarkGreen]@ Device PIC16F628A[/COLOR]    ; Microcontrolador utilizado
; Palabra de configuración:
[COLOR=DarkGreen]@ Device HS_OSC,WDT_OFF,MCLR_OFF,PWRT_ON,LVP_OFF[/COLOR]
[COLOR=Blue];*******************************************************************************[/COLOR]
```
Y algo importante:
Por RS-232 y en PBP, no puedes recibir ni transmitir 16 bits, sólo 8 bits.
Así que la variable "LED" debe ser del tipo "Byte" y no "Word"
También debes considerar lo que recibas, ya que debe formatearse para poder ser mostrado en LCD.


----------



## chente276 (May 6, 2016)

Compañero D@rbytes las configuraciones sobre el BPRG son correctas 20h=dec 32.
Es cierto la variable puede ser tipo BYTE  
En cuanto a la palabra de configuración no la incluyo debido a que al compilar me arroja un error asi que los cambios los realizo directamente en el archivo 16F628A.INC de la carpeta pbp en disco C alli esta la palabra de configuración y de esa manera ya no tengo errores al compilar
Esperare a tener un convertidor usb-RS232 para continuar con la practica, en cuanto lo adquiera les cuento como me fue  . Gracias por su ayuda, volveré pronto jejejeje


----------



## alan980 (Jun 10, 2017)

hola, estoy intentando encender y apagar un led por bluetooth, pero tengos varias dudas,

como declaro en PBP un oscilador interno y uno externo? pregunto esto porque en mi diseño tengo un PIC18F4550 pero lo tengo anexado un crystal de 20Mhz, en el programa declaro

DEFINE OSC 20.....este DEFINE es para reloj interno o externo?? es necesario usar el crystal o lo tengo demas??

porque creen que no funcione, en proteus funciona bien pero al implementarlo no responde adecuadamente

gracias!


----------



## Polonio (Jun 10, 2017)

Esa definición es para el OSC Externo, para el interno tienes que buscar , asumiendo que tienes instalado el PicbasicPro en C:/PB3, el archivo INFO correspondiente a tu PIC y ahí están las configuraciones.

C:\PBP3\DEVICE_REFERENCE\PIC18F45K50.INFO

Las tienes que incluir en el programa al inicio del código de la siguiete manera:

'ESTA DECLARACIÓN ES VÁLIDA PARA PICBASIC PRO 3 con reloj interno

#CONFIG                             
 __CONFIG  _INTOSC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON & _MCLRE_ON & _LVP_OFF & _CP_OFF
;Estas directivas se pueden ver en la carpeta en la que instalasteis el PBP3
; en DEVICE_REFERENCE/PIC16F628A.INFO
#ENDCONFIG                   


Estas declaraciones serian para el 16f628A, tu tienes que buscarlas en el archivo correspondiente al PIC que uses.

The PBP default configuration for the PIC18F45K50 is:
;
;  #CONFIG
;    CONFIG PLLSEL = PLL3X	    ;3x clock multiplier
;    CONFIG CFGPLLEN = ON	    ;PLL Enabled
;    CONFIG CPUDIV = NOCLKDIV	    ;CPU uses system clock (no divide)
;    CONFIG LS48MHZ = SYS48X8	    ;System clock at 48 MHz, USB clock divider is set to 8
;    CONFIG FOSC = INTOSCIO	    ;Internal oscillator
;    CONFIG PCLKEN = OFF	    ;Primary oscillator shutdown firmware controlled
;    CONFIG FCMEN = OFF	    ;Fail-Safe Clock Monitor disabled
;    CONFIG IESO = OFF	    ;Oscillator Switchover mode disabled
;    CONFIG nPWRTEN = ON	    ;Power up timer enabled
;    CONFIG BOREN = ON	    ;BOR controlled by firmware (SBOREN is enabled)
;    CONFIG BORV = 190	    ;BOR set to 1.9V nominal
;    CONFIG nLPBOR = OFF	    ;Low-Power Brown-out Reset disabled
;    CONFIG WDTEN = ON	    ;WDT enabled in hardware (SWDTEN ignored)
;    CONFIG WDTPS = 512	    ;1:512
;    CONFIG CCP2MX = RC1	    ;CCP2 input/output is multiplexed with RC1
;    CONFIG PBADEN = OFF	    ;PORTB<5:0> pins are configured as digital I/O on Reset
;    CONFIG T3CMX = RC0	    ;T3CKI function is on RC0
;    CONFIG SDOMX = RB3	    ;SDO function is on RB3
;    CONFIG MCLRE = ON	    ;MCLR pin enabled; RE3 input disabled
;    CONFIG STVREN = ON	    ;Stack full/underflow will cause Reset
;    CONFIG LVP = OFF	    ;Single-Supply ICSP disabled
;    CONFIG XINST = OFF	    ;Instruction set extension and Indexed Addressing mode disabled
;  #ENDCONFIG



Puede que no te funcione por muchísimas razones.
La más probable puede ser que no conectes bien el módulo ya que dices que la simulación te va bien.
Igual te faltan resistencias PULLDOWN, porque en la simulación no las has puesto y suelen ser necesarias.

El circuito es muy simple, igual que los problemas que puede dar. 
No des nada por bien hecho y revisa todo a conciencia.


----------



## alan980 (Jun 10, 2017)

muchas gracias por tu respuesta, las resistencias pulldown para el Tx-Rx?? ok las colocare, que valor resistivo suelen usar para el modulo??


----------



## Polonio (Jun 10, 2017)

Suelen ser de 10K.


----------

