uControl
Julio 26, 2014, 10:08:29 *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?

Ingresar con nombre de usuario, contraseña y duración de la sesión
 
   Inicio   Ayuda Buscar Ingresar Registrarse  

La gente de Niple nos ofrece un descuento especial para usuarios de uControl.
Entérate de como puedes aprovechar esta oferta haciendo click aqui.

Súmate, y ayuda a uControl con tu participación en esta interesante oportunidad que nos oferece Niple.

Páginas: [1]   Ir Abajo
  Imprimir  
Autor Tema: Comunicación serial 12f675  (Leído 4189 veces)
0 Usuarios y 1 Visitante están viendo este tema.
lanpu
PIC10F
*
Desconectado Desconectado

Mensajes: 21


« : Octubre 24, 2010, 11:21:22 »

Hola amigos, estoy tratando de conectar 2 pic en forma serial, pero al hacer la simulación en proteus no me funciona correctamente, ojalá me pudieran ayudar, mi idea es luego utilizar led IR para establecer la comunicación.

Gracias!

emisor

Código:
@ DEVICE pic12F675, intrc_osc_noclkout, wdt_off, pwrt_on, mclr_off, bod_off, protect_off
INCLUDE "modedefs.bas"
define OSC 4
define OSCCAL_1K 1

botonA var gpio.1
botonB var gpio.2
botonC var gpio.4
led var gpio.0

high led
pause 500
transmitir:
if botonA=0 then envio1
if botonB=0 then envio2
if botonC=0 then envio3
goto transmitir

envio1:
serout gpio.5,N2400,["A"]
pause 500
goto transmitir

envio2:
serout gpio.5,N2400,["B"]
pause 500
goto transmitir

envio3:
serout gpio.5,N2400,["C"]
pause 500
goto transmitir

end


Receptor

Código:
@ DEVICE pic12F675, intrc_osc_noclkout, wdt_off, pwrt_on, mclr_off, bod_off, protect_off
INCLUDE "modedefs.bas"
define OSC 4
define OSCCAL_1K 1


ledr var gpio.1
leda var gpio.2
ledv var gpio.4
datos var byte

high ledr
pause 500
low ledr

recibir:

serin gpio.0,N2400,datos
if datos="A" then high ledr
pause 1000
if datos="B" then high leda
pause 1000
if datos="C" then high ledv
pause 1000

low ledr:low leda:low ledv
goto recibir
end

 me voy a pique

* simulacion.rar (13.62 KB - descargado 158 veces.)
En línea
Waldillo
Moderador
PIC16F
******
Desconectado Desconectado

Sexo: Masculino
Mensajes: 847


Casado con PIC infiel con ARM


WWW
« Respuesta #1 : Octubre 24, 2010, 02:02:34 »

Yo ese lenguaje de programación no lo entiendo, que es Basic? En cuanto al hardware yo encuentro cosas k me llaman mucho la atención a la espera de que lo confirmen los Mr hardware del foro.

1.- He mirado el datasheet del micro y no tiene ningun modulo para la comunicacion entre circuitos integrados, tipo SPI.
2.- La patilla de MCLR está al aire.
3.- No estoy al 100% seguro pero creo k con el protocolo Serie no se puede comunicar micros. Lo que parece seguro es que este micro no tiene el protocolo Uart por lo que no creo que se pueda, aunque son solo mis conjeturas


« Última modificación: Octubre 24, 2010, 02:10:39 por Waldillo » En línea

xocas
Administrator
PIC16F
*****
Desconectado Desconectado

Sexo: Masculino
Mensajes: 605



« Respuesta #2 : Octubre 24, 2010, 03:17:49 »

Hola

te faltan solamente un par de pequeños detalles para que funcione amigo lanpu...

ese pic tiene puertos analógicos que has de convertir en digitales, y si no recuerdo mal el comando serin de picbasic tiene un parámetro relacionado con el tiempo que tu no estás usando.

ahora no me es posible pero si mañana no lo has resuelto te comento por donde tirar, porque como te digo son un par de detalles nomás...

salu2
En línea
Waldillo
Moderador
PIC16F
******
Desconectado Desconectado

Sexo: Masculino
Mensajes: 847


Casado con PIC infiel con ARM


WWW
« Respuesta #3 : Octubre 24, 2010, 03:23:59 »

Y como se comunican?
En línea

lanpu
PIC10F
*
Desconectado Desconectado

Mensajes: 21


« Respuesta #4 : Octubre 24, 2010, 03:36:41 »

Y como se comunican?

yo estoy recien empezando, pero hasta donde entiendo esta comunicación serial es establecida por software, en PIc Basic existen los comandos SERIN Y SEROUT, ahi tu especifícas los parametros para establecer la comonicación.

 
Ojala pudieras ayudar xocas, yo he probado de mil maneras mas :S,hejjee, espero tu ayuda...y gracias!
En línea
Ivan
Amigo de uControl
PIC16F
******
Desconectado Desconectado

Sexo: Masculino
Mensajes: 553



« Respuesta #5 : Octubre 25, 2010, 09:58:01 »

Te muestra algo el monitor serie? si la parte de envio esta bien me parece que el problema es que tenes mal el diagrama del programa, tendrias que hacerlo asi

inicio:
serin gpio.0,N2400,datos
if datos=0 then goto inicio    
if datos="A" then high ledr
if datos="B" then high leda
if datos="C" then high ledv

pause 1000
low ledr
low leda
low ledv
goto inicio

lo que hace el programa es un bucle cerrado en la etapa de la deteccion de los datos serie y una vez que ingresa un dato, ahi es cuando sale del bucle y hace la comparacion para encender el led que corresponda, despues de eso hace la pausa
y apaga los leds; el unico problema seria esa pausa de 1 segundo donde el micro no responde, podrias sacar la pausa si el micro que envia los datos enviara un dato que apague todos los leds para que quede algo asi:

inicio:
serin gpio.0,N2400,datos
if datos=0 then goto inicio    
if datos="A" then high ledr
if datos="B" then high leda
if datos="C" then high ledv
if datos="X" then goto apago_todo
goto inicio

apago_todo:
low ledr
low leda
low ledv
goto inicio

de esta manera eliminas toda pausa del micro
« Última modificación: Octubre 25, 2010, 10:01:51 por Ivan » En línea

¿Qué es un circuito?
Es un lugar donde hay elefantuitos, caballuitos, payasuitos...
lanpu
PIC10F
*
Desconectado Desconectado

Mensajes: 21


« Respuesta #6 : Octubre 25, 2010, 11:09:48 »

Te muestra algo el monitor serie?

Hola Ivan, el monitor me  muestra solo 'xº' repetidamente.

Intentaré lo que me dices.

Saludos!!
En línea
xocas
Administrator
PIC16F
*****
Desconectado Desconectado

Sexo: Masculino
Mensajes: 605



« Respuesta #7 : Octubre 25, 2010, 11:13:02 »

hola de nuevo...

La parte del emisor:

Código:
'***********************************************************
'* Nombre : emisor con 12f675                              *
'***********************************************************

INCLUDE "modedefs.bas"
DEFINE OSCCAL_1K 1
DEFINE OSC 4

@ DEVICE pic12F675, 0x1f84   ' oscilador interno IO. PWRTE enable

TRISIO = %011110    ' GP1, GP2 y GP4 son entradas; GP0 y GP5 son salidas
CMCON = %00000111   ' deshabilita comparadores
ANSEL = %00000000   ' deshabilita conversión A/D. Puertos digitales
GPIO = 0            ' pone a 0 todas las salidas

'********** Declaracion de variables *****************

boton_1 VAR GPIO.1
boton_2 VAR GPIO.2
boton_3 VAR GPIO.4
led VAR GPIO.0
emite VAR GPIO.5

'********* Inicio ************************************

main:               ' Chequea estado de los botones  
IF boton_1 = 0 THEN GOSUB envio1
IF boton_2 = 0 THEN GOSUB envio2
IF boton_3 = 0 THEN GOSUB envio3
GOTO main
 

'envia datos serie a 2400bps -inverted-

envio1:
SEROUT emite,N2400,[$FF,$FF,"OK","A"]
RETURN

envio2:
SEROUT emite,N2400,[$FF,$FF,"OK","B"]
RETURN

envio3:
SEROUT emite,N2400,[$FF,$FF,"OK","C"]
RETURN
        
END

Y el receptor:
Código:
'***********************************************************
'* Nombre : receptor con 12f675                            *
'***********************************************************

INCLUDE "modedefs.bas"
DEFINE OSCCAL_1K 1
DEFINE OSC 4

@ DEVICE pic12F675, 0x1f84   ' oscilador interno IO. PWRTE enable

TRISIO = %001001    ' GP0 entrada; resto son salidas
CMCON = %00000111   ' deshabilita comparadores
ANSEL = %00000000   ' deshabilita conversión A/D. Puertos digitales
GPIO = 0            ' pone a 0 todas las salidas

'********** Declaracion de variables *****************

led_1 VAR GPIO.1
led_2 VAR GPIO.2
led_3 VAR GPIO.4
recibe VAR GPIO.0
dato VAR BYTE

'********* Inicio ************************************

main:
    SERIN recibe,N2400,["OK"],dato
    IF dato="A" THEN GOTO uno
    IF dato="B" THEN GOTO dos
    IF dato="C" THEN GOTO tres
GOTO main
 

'*************** Subrutinas para los leds ********************

uno:
    led_1 = 1
    PAUSE 500
    led_1 = 0
GOTO main

dos:
    led_2 = 1
    PAUSE 500
    led_2 = 0
GOTO main

tres:
    led_3 = 1
    PAUSE 500
    led_3 = 0
GOTO main

END

No puedo probarlo y estoy haciéndolo de memoria, así que no descarto algún error indeseado.

Recuerda que en el monitor de Proteus has de tener la misma configuración (velocidad, etc), de lo contrario tendrás caracteres extraños o incluso nada.

No menciono GPIO.3, que has habilitado como digital, porque tan sólo puede ser una entrada. Si no la usas lo mejor es establecer MCLR en ON y colocar una resistencia a VDD.

SEROUT emite,N2400,[$FF,$FF,"OK","A"]:
Las cadenas $FF se encargan de 'despertar' al micro, de lo contrario el primer byte recibido puede no ser el correcto; es una forma de decirle 'prepárate para lo que viene a continuación' y es posible que te sea suficiente con un único $FF, dependerá de las condiciones.
El "OK" es simplemente una cadena de verificación que le permitirá al receptor saber que el dato a seguir es para él. Podrías hacer por ejemplo que un único emisor enviara datos a diferentes receptores...

SERIN recibe,N2400,["OK"],dato:
¿Se trata de una cadena "OK"? pues almaceno el siguiente dato recibido en la variable 'dato'
Hay un pequeño problema con esto: La instrucción espera la cadena "OK" y ahí se queda hasta que le llega, de manera que si necesitamos que el programa haga otra cosa hace falta variar el formato de la instrucción.

main:
SERIN recibe,N2400,5,loop,["OK"],dato:
Si en 5ms no se recibe nada salta a loop
...
loop:
...comprueba si alguien pulsó un botón... (por ejemplo)
     si: haz tal cosa y vuelve a main
     no: vuelve a main

espero haberte ayudado. un saludo
En línea
Ivan
Amigo de uControl
PIC16F
******
Desconectado Desconectado

Sexo: Masculino
Mensajes: 553



« Respuesta #8 : Octubre 25, 2010, 02:24:06 »

xocas ¿si se envia una cadena de caracteres del tipo "$FF,DATO,$FF,DATO,$FF,DATO" en un bucle cuando se presiona una tecla y en el receptor se usa un par de bytes de esa cadena no es mejor en este caso para usar con IR?
Para aclarar, en el micro emisor se emite $FF,DATO,$FF,DATO.. y en el receptor se reciben los bytes y se usan 4 consecutivos, luego se comparan el primer byte con el tercero y el segundo con el cuarto, si son iguales la transmision se realizo bien y luego solo queda revisar el byte que NO sea $FF.
En línea

¿Qué es un circuito?
Es un lugar donde hay elefantuitos, caballuitos, payasuitos...
xocas
Administrator
PIC16F
*****
Desconectado Desconectado

Sexo: Masculino
Mensajes: 605



« Respuesta #9 : Octubre 25, 2010, 03:00:35 »

Hola Iván

La intención es hacerlo sencillo para que tenga un punto de partida y los errores, de presentarse, sean más evidentes. Traté de basarme en su código

El valor $FF simplemente inserta un espacio que luego se desprecia, y podría ser cualquier otro valor. No sé cual es la causa pero si se envía directamente el dato buena parte de las veces su valor no coincide, al menos en pbp. Por eso hablaba de 'despertar' previamente al receptor.
Este valor solamente es necesario al principio y luego podría enviarse la cadena de caracteres usando un bucle tal como dices.

El "OK" también es prescindible y lo añadí para que le aparezca en el monitor de Proteus, de nuevo como orientación visual. Si obtienes un "OK A" en el monitor serie vas bien de lo contrario algo está fallando. De todas formas, usando un valor de comparación te permitiría enviar desde un único transmisor datos a diferentes receptores. Por ejemplo:
pulso boton_1 y envío "OK" + "A" -> responde receptor1
pulso boton_2 y envío "RM" + "A" -> responde receptor2

No sé exactamente lo que quiere hacer y por eso lo hago tan simple...

un saludo
En línea
Ivan
Amigo de uControl
PIC16F
******
Desconectado Desconectado

Sexo: Masculino
Mensajes: 553



« Respuesta #10 : Octubre 25, 2010, 03:05:52 »

Citar
Hola amigos, estoy tratando de conectar 2 pic en forma serial, pero al hacer la simulación en proteus no me funciona correctamente, ojalá me pudieran ayudar, mi idea es luego utilizar led IR para establecer la comunicación.
por eso decia de el envio de la cadena de datos y la verificacion de los mismos en el receptor.
« Última modificación: Octubre 25, 2010, 03:07:42 por Ivan » En línea

¿Qué es un circuito?
Es un lugar donde hay elefantuitos, caballuitos, payasuitos...
xocas
Administrator
PIC16F
*****
Desconectado Desconectado

Sexo: Masculino
Mensajes: 605



« Respuesta #11 : Octubre 25, 2010, 03:29:41 »

upppssss.. que torpe !!  cabezaso a la pared

me fui directamente al código tras la primera frase...

hace años que no toco pbp pero apostaría que hay alguna forma de chequear la paridad y actuar en consecuencia, pero el comando no sería SERIN me temo.

salu2
En línea
lanpu
PIC10F
*
Desconectado Desconectado

Mensajes: 21


« Respuesta #12 : Octubre 25, 2010, 05:02:19 »

 Huh? me enredaron un poco con lo ultimo (no es lo mejor esto para hacerlo en IR??..tendré mucho ruido??)...jejeje..pero veré que  puedo hacer.

Saludos y muchas gracias!!!.
En línea
Ivan
Amigo de uControl
PIC16F
******
Desconectado Desconectado

Sexo: Masculino
Mensajes: 553



« Respuesta #13 : Octubre 30, 2010, 02:06:20 »

la cosa seria que el emisor transmitiera una cadena algo asi "$FF,DATO" durante el tiempo que se presione el pulsador y en el receptor haces que reciba 4 Bytes para compararlos y filtrar los bytes $FF y DATO como dije en un mensaje anterior.
« Última modificación: Octubre 30, 2010, 02:09:01 por Ivan » En línea

¿Qué es un circuito?
Es un lugar donde hay elefantuitos, caballuitos, payasuitos...
Páginas: [1]   Ir Arriba
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.19 | SMF © 2011, Simple Machines
SMFAds for Free Forums
XHTML 1.0 válido! CSS válido!
Página creada en 0.056 segundos con 29 consultas. (Pretty URLs adds 0.009s, 3q)