Comunicación entre módulo bluetooth y un microcontrolador PIC

buenas amigos, estoy aprendiendo a manejar el virtual terminal con el pic 16f877a, conecte el tx del modulo al rx del pic y rx al tx del pic respectivamente como debe ser, hice el programa para que encendiera y apagara un led con valores de 100 para encender y 200 para apagarlo, pero al momento de simularlo en proteus no hace nada el led, copio los valores en la ventana del virtual terminal pero no hace nada, no se si sera un error del simulador o tengo mala la programacion... mas abajo dejo el programa para que me digan si algo esta mal, si me pueden ayudar es para un proyecto de la universidad y se trata sobre domotica

el programa lo realice en proton ide
¿Y cómo envías desde el Virtual Terminal, los números 100 y 200?
Porque no es lo mismo enviar el número 100 como cadena, que como un número entero.

Si desde la terminal RS-232 escribes el número 100, lo envía como tres bytes. "1","0","0"
Y si en el receptor quieres recibir el número 100 como un entero, de esa forma jamás lo identificará.
Todo lo que envías va en ASCII, pero los números enteros se deben procesar de forma diferente.

Y tampoco los puedes recibir de esa forma como cadenas.
O sea que no puedes escribir: If Cadena = "100" Then... Porque sólo se puede recibir y comparar un Byte.

Prueba enviando y comparando una sola letra o símbolo. Por ejemplo "$" o "&"
Y si se pueden recibir cadenas, pero el proceso se realiza de otra forma.
 
Depende del terminal, hay algunos que no envían nada hasta que pulsas un botón. Hay otros que van tecla a tecla.
Luego es cuestión de programar adecuadamente el puerto serie. No es tan difícil aceptar que funcione tecla a tecla o por cadenas
 
Termite tiene una función para enviar hexadecimal, si al inicio escribes el "0x" el resto de los números los toma como hexadecimal en lugar de caracteres, así que para enviar 100 será 0x64 y para 200 el 0xC8, yo lo uso para esas veces en las que programo comandos en lugar cadenas de caracteres, es bastante útil para pruebas rápidas en lo que programas la interfaz.
 
ya lo consegui lo que hice fue cambiarle una parte, le puse un valor mayor como si fuera el rango que tiene permitido no entiendo muy bien esa parte pero le cambie esa parte y funciono puse "250" en ves de "50" que tenia antes
Lazo:
HSerIn ""250"",Lazo,[dec LED]

no se como ponerlo para que acepte datos en letras, creo que cambiandole (DEC) pero no se como.

y al momento de mandar los valores por el virtual terminal lo que hago es abrir su ventana durante la simulacion, darle click derecho, pongo las opciones de "echo type charaters" y "hex display mode" este ultimo escribe los datos que introduzco en ASCII, luego introduzco los valores que son (100) seguido de enter y enciende luego (200) y se apaga, a veces se queda pegado pero al transcurrir un rato vuelve a responder

yo la verdad soy nuevo en la programacion, lo que he aprendido lo he sacado de aqui y de otras paginas de internet yo solo, y de ahi veo como agrupo todo el conocimiento pero he aprendido mas asi, que en otro lado
 
hola amigos, necesito ayuda otra ves jeje, sigo con el proyecto de domotica y lo que necesito ahora es solicitar datos a traves del modulo bluetooth, para que asi aparezca en mi telefono la informacion, como por ejemplo leer la temperatura cada ves que lo solicito o en tiempo real.

por favor si me pueden ayudar con esto, si hay algun comando en el que se me pida cierta informacion este la mande o como se pueda, abajo dejo mi programacion, por los momentos es sencillo luego le agrego mas cosas

PROTON IDE
device 16f877a
xtal = 20
all_digital = 1
cmcon = 7
trisb = %00000000
declare hserial_baud = 9600

dim LED as byte
delayms 100
portb = low

Lazo:
hserin 250,lazo,[dec led]

if led = 100 then
portb.0 = 1
end if
if led = 200 then
portb.0 = 0
end if

goto lazo
end
 
Saludos.
Cuando usas el modificador "DEC", se convierte la cadena a un número entero, pero la cadena enviada debe contener un espacio en blanco al final.
O sea que en el terminal debes escribir; "100 "
Sin ese espacio al final, la instrucción "HSerIn" omite la recepción, regresando a la etiqueta designada.
 
D@rkbytes pero esa parte ya lo lee, cuando mando el 100 y el 200 lee la informacion que entra, lo que yo quiero es enviar información desde el pic al teléfono para que en el teléfono me aparezca la información

Use el comando hserout pero no se usarlo bien soy nuevo en eso
Esa parte de la programacion la puse así:

If dato = 150 then
Hserout [temp]
End if

Esa parte se lo añadí pero no se como es el comando correcto
 
Bueno, eso ya es otra historia.
Necesitas crear una aplicación para el teléfono, y que reciba los datos que envías por Bluetooth.
No es nada complicado. Yo uso B4A (Basic For Android)

Y dependiendo de como envíes la información, es como la debes procesar en la aplicación.
Recuerda que no es lo mismo procesar cadenas que números enteros, aunque ambos se envíen en ASCII.
 
Justiciero24, hermano, oye no me deja el código, mi pic esta un poco raro en otro foro vi que tenian el mismo problema de conexion con el pic, el mio dejo de funcionar y alguien subió un archivo Hex para que funcione y efectivamente si parpadea mi led con ese .HEX (lo adjunto) pero si yo lo programo con mi microcode y mi quemador "pic master 2"(tableta) y el (software) del pic master es el "pic kit2" no me hace parpadear mi led

me podrías ayudar de favor?

Ya intenté con tu código y efectivamente SI indica que el pic vive con su led pero de ahí en fuera NO HACE NADA MAS. :(
en mi app que hice para android (la adjunto) envío 1byte number "1" para encender y otro bytenumber para apagar "2" y en tu programa le modifique el 100 a 1 y el 200 a 2

Saludos!

Haber intenta esto a ver que pasa:

Código:
*******************************************************************************
' DEFINICIÓN DE FUSES Y OSILADOR
DEFINE OSC 4
'*******************************************************************************
CMCON = 7                     
TRISA = %00000000
TRISB = %00000010
'*******************************************************************************
' INICIALIZANDO USART
DEFINE HSER_BAUD 9600
DEFINE HSER_RCSTA 90h
DEFINE HSER_TCSTA 20h
DEFINE HSER_SPBRG 25
led var byte
'*******************************************************************************
PORTA = %00000000
PORTB = %00000000
'******************************************************************************
pause 200
inicio:
Hserin 80,continuar,[led]
continuar:
if led = 100 then
PORTB.0 = 1
pause 500
endif
if led = 200 then
PORTB.0 = 0
pause 500
endif
goto inicio
END
A lo que entiendo Hserin esta estructurado asi: Hserin tiempo en ms antes de saltar a, etiqueta del salto, (variable donde se guarda lo recibido)

Y otra cosa en lugar de usar valores, usa las letras cuando envies los datos ya que aveces se envian en ascii y no en decimal lo que provoca que no responda el pic. Si no me equivoco el 100 equivale a una "d" y el 200 a un "È" tambien puedes poner letras en los if, por ejemplo: if led = "A" then....

Saludos, espero haberte ayudado
 

Adjuntos

Última edición:
Acudo a ustedes por una duda. Como enviar 4 bytes (32 bits) consecutivos sin utilizar librerías por el PIC? osea, como puedo enviar la palabra "HOLA" sin librerías? y en lenguaje C? No se si pido mucho :)

En mikroC se utiliza la librería UART1_Write_Text("HOLA"), pero sin ella como sería? Como lo harían en CCS o ensamblador?

Yo puedo enviar 1 byte a la vez sin librerías utilizando el TMR0 y los registros del modulo UART. Algo así,

Código:
[B]while[/B] (1) {
numero=25; 
[B]if[/B](TRMT==1 && segundo>=1) { //Si el registro de envió esta vació, cada segundo
TXREG=numero;               //cargar y enviar el numero,
[B]while[/B](!TRMT);               //espera que se vacié el registro para
segundo=0;                  //salir de la sentencia...
}
}
 
Última edición:
Lee la hoja de datos, enviar un byte solo es escribirlo en el registro de salida del USART, claro, previamente tener configurado el puerto, luego, de la forma fácil hacer polling en el bit de estado para saber cuando esta libre el registro y escribir el siguiente dato.
 
pues digamos que tenemos un ARRAY o STRING

char *cadena="pajaro";

la cadena mide la longitud mas el caracter nulo

yo diria que si haces una funcion de enviar un caracter digo CCS envia un caracter con putc();

lo que debes hacer es meterlo dentro de un while cuando encuentre nulo

while(cadena!='\0')
{
//funcion para enviar 1 byte
//podria ser putc(); o enviar directamente con el registro UART
i++;
}
 
Nuyel, mi código hace exactamente eso. Comprueba que el bit TRMT esté vacío para poder cargar el nuevo dato. Scooter, eh probado de las dos formas, con la librería delay, con el Timer0 como temporizador, con y sin interrupciones y el resultado es el mismo, un byte a la vez.

Trilo-byte, eh leído sobre lo que comentas, de hecho utilizó la función strncan() para unir dos o más variables del tipo string y guardarlas en otra variable independiente pero el resultado es el mismo. Lo que aún no entiendo es cómo descomponer esa variable para enviarla byte por byte.

Algo como,
1. Variable tipo char[]="HOLA";
2. Identificar byte por byte, "H", "O", "L", "A".
3. Aplicar una sentencia FOR o WHILE para enviar byte por byte por el puerto serial.
4. No hay más caracteres.
5. Fin de la sentencia, deshabilita envío de datos.
6. Espera nuevo carácter...
 
Lo que aún no entiendo es cómo descomponer esa variable para enviarla byte por byte.

Algo como:
1. Variable tipo char[]="HOLA";
2. Identificar byte por byte, "H", "O", "L", "A".
3. Aplicar una sentencia FOR o WHILE para enviar byte por byte por el puerto serial.
4. No hay más caracteres.
5. Fin de la sentencia, deshabilita envío de datos.
6. Espera nuevo carácter...
Seguramente esta rutina te puede servir: entero_a_bcd
 
no se que quieres hacer exactamente.

como dije tenemos una cadena "string" y lo queremos mandar byte a byte.

char *cadena="David Castillo 123";


y lo que quiero hacer es eviar letra a letra recuerda que los numeros son tambien letras.

para eso como dije en mi ejemplo anterior:

i=0; iniciamos i en 0
while(cadena!='\0') // '\0' es caracter nulo es decir cuando llegue a caracter nulo
{
putc(cadena); // enviara letra a letra
i++; //incrementamos i
}

terminado el bucle while puedes hacer lo que tienes que hacer, muy simple
 
D@rkbytes, hermano me puedes apoyar de favor? programo en Microcode, pero al parecer no me deja activar los fuses, me dice que es ilegal la declaración de fuses. Desconozco si es mi Programa que le faltan librerias, el punto es que antes si podía programar sin nigun problema, después intenté agregarle fuses y desde ahí se desconfiguró todo, el pic que más ocupo es el PIC16F628A y mi programador es un pic master 2, que es exactamente lo mismo que el pic kit2 de microchip.
Ahora que quiero programar mi pic 16F628A si se escribe el programa pero no hace absolutamente nada.
probé con un pic 12F508 y 509 y si se programa, ya compré otro 16F628A y nada :( :( :( :(

Me podrías ayudar por favor? en serio es mi dolor de cabeza
 
D@rkbytes Claro! te adjunto ambas imagenes, la primera es mi version y el programa que le grabo al pic, y la segunda es el error de fuses, ambas si se las grabo al pic, hace exactamente lo mismo, NADA :( :eek: :eek: :eek: :eek: :cry: :cry: :cry:
 

Adjuntos

Usa esta parte cómo base para tu programa:
PHP:
;*******************************************************************************
@ Device PIC16F628A    ; Microcontrolador utilizado
; Palabra de configuración:
@ Device INTRC_OSC_NOCLKOUT, WDT_OFF, PWRT_ON, BOD_OFF, LVP_OFF
;*******************************************************************************
Define OSC 4                ; Definir que se trabajará con 4MHz.

Inicio:
    CMCON = 7                ; Comparadores analógicos OFF

Programa:
    ; Aquí va tu programa...

    GoTo    Programa


    End
 
Arriba