TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: navaismo en 14 de Septiembre de 2005, 13:21:00
-

hola estoy haciendo un control remoto usando unos transmisores de rf basados en modulacion ASK y tambien usando un pic 16f84a.
Resulta que en la etapa de prueba lo k hice fue encender un led y apagarlo usando el comando serout para el transmisor y el serin para el receptor.
Los problemas k tengo esk mi control remoto esta condicionado a dos switches uno para encender y otro para apagarlo, lo k yo kiero es usar solo un switch. Pero el problema va mas alla pork si uso un swtch digamos k kuando esta abierto mande un "5" y cuando este cerrado un "7"; pues el problema radica en que mientras este cerrado mandara iindefinidamente el numero 5 entonces lo k yo kiero es k lo mande solo una vez
mi programa lo hice asi
tx:
if onn=1 then
serout datout, N2400,{7}
endif
if onn=0 then
serout datout,N2400,{5}
endif
goto tx
y el del receptor lo hice asi:
rx:
serin datain, N2400,dato
if dato=5 then OPEN
if dato=7 then CLOSE
OPEN:
high ledver
CLOSE:
low ledver
lo k estaba leyendo es k el comando serin posee la capacidad de compara los datos de entrada con los que se requieren patra asi filtrar los no deseados y ademas posee la capacidad de meter tiempo de retardo para poder leer los datos que entrar sin k se puedan perder o encimar.
El problema es k uso el micro code studio y no me permite poner llaves solo corchetes.
Alguien podria decirme un ejemplo del serin o alguna sugerencia
-
Que tal mi pana navaismo!
Que modulos rf son los que tienes, ya que algunos tienen sus detalles a la hora de enviarle los datos.
Y asi te podre ayudar a hecharlos a andar!
Saludos
-
Gracias Ralf2 pero en realidad el problema no es de los transmisores ya que si los he usado hasta una distancia de 80mts, el problema esta en mi programa.
-
hola mi cabeza ya de plano tiene muchos golpes, komo volvi hacer todo, hagamos de cuenta k no uso los modulos rf ahora solo comunico los pics con un cablecillo directamente, pero no me sale nada se supone que con un switch mando un dato para prender un led y si esta cerrado mando otro para apagarlo y no lo hace ya revise los pics y si funcionan, ya me canse de cambiar el programa y nada la verdad ya no se k hacer. les juro k ya me duele la cabeza de estar piense y piense y nomas no. he hecho otros programillas pero este en particular como me ha ddado dolores de cabeza
alguna ayuda aki los kodigos:
"TX CODIGO TRANSMISOR
INCLUDE "MODEDEFS.BAS"
TRISA=1 "marco el porta.o como entrada
BOTON VAR PORTA.0 "swtich
VIATX VAR PORTA.1 "pin de salida serie
LEDVE VAR PORTA.2 "indicadores segun estado del swtch
LEDRO VAR PORTA.3
TX:
IF BOTON=1 THEN "aqui si oprimo el boton segun hago k envie el dato 7
GOSUB SEND1
ENDIF
IF BOTON=0 THEN "aqui si esta abierto mando un 0
GOSUB SEND2
ENDIF
GOTO TX
"subrutinas
SEND1:
SEROUT VIATX,N9600,[7]
LOW LEDRO
HIGH LEDVE
RETURN
SEND2:
SEROUT VIATX,N9600,[0]
LOW LEDVE
HIGH LEDRO
RETURN
......................................................................
" RX CODIGO RECEPTOR
INCLUDE "MODEDEFS.BAS"
TRISB=1
VIARX VAR PORTB.0
LEDRO VAR PORTB.1
LEDVE VAR PORTB.2
DATO VAR BYTE
RX:
SERIN VIARX,N9600,DATO
IF DATO=0 THEN
HIGH LEDVE
LOW LEDRO
ENDIF
IF DATO=7 THEN
LOW LEDVE
HIGH LEDRO
ENDIF
GOTO RX:
............................................
alguien puede ayudarme que esta mal es mi programa k puedo hacer
porfavor!!!!!!!!!!

![Helado Helado]()
-
Que tal mi pana navaismo!
Te voy a colocar un programa para que lo pruebes con el puerto serial y con los modulos RF y me cuentas como te fue.
Codigo para el transmisor
include modedefs.bas
boton var portb.0
loop: if boton=0 then
gosub led_on
else
gosub led_off
endif
goto loop
led_on: serout portb.1,n2400,[$FF,$FF,"OK","A"]
return
led_off: serout portb.1,n2400,[$FF,$FF,"OK","B"]
return
end
Explicacion: pregunta si el boton=0, si es asi salta a la etiqueta led_on alli envia serialmente dos veces FF (hex), para sincronizar el transmisor con el receptor, luego envia la direccion corespondientes al receptor al cual le quieres enviar los datos (en este caso la direccion consta de los caracteres ascii "OK"
y luego envias los datos en este caso es la letra "A".
En caso de que boton sea diferente de cero salta a led_off y envia la letra "B".
Codigo del receptor
datos var byte
led_rojo var portb.1
led_verde var portb.2
Loop: serin portb.0,n2400,["OK"],datos
If datos="A" then led_on
lf datos="B" then led_off
goto Loop
led_on: High led_rojo
low led_verde
goto Loop
led_off: low led_rojo
high led_verde
goto Loop
end
Explicacion:espera que llegue los caracteres ascii "OK" sino no recibe datos, sino se coloca el wait "OK" el receptor capatara ruido y los leds podrian encenderse de manera aleatoria, mosca con esto.
Una vez que el receptor recibe los caracteres "OK" guarda el dato "A" o "B" en la variable datos.
Si el caracter que llega es la "A" salta a la etiqueta led_on y si es el "B" saltara a led_off, luego de encender los led correspondientes a la etiqueta que salto vuelve a Loop a la espera de un nuevo dato.
La velocidad la baje a 2400 baudios hay que ver si en el data sheet de tus modulos estos pueden trabajar a mas velocidad.
Recuerda que los caracteres FF son solo para sincronizar el transmisor con el receptor y no tienen ningun otro cometido prueba el circuito primero conectando el transmisor con el receptor con un cable y si todo anda bien prueba luego con los modulos y muy importante no olvides decirme o mejor dicho decirnos como te fue.
Este programa lo adapte a lo que lo que entendi que era lo que querias hacer pero obviamente lo podemos poner mas interesante.
Y tienes varios errores en tu programa cuando terminas los endif el programa sigue a la siguienrte linea de tu program y por eso te falla debes colocar un goto despues del endif para mandarlo a preguntar por el boton.
Saludos!
-

gracias ralf2 pense k nadie mas me iba a kontestar; si probe tu programa (en proteus para evitarme las molestias de hacerlo) antes de simularlo lo compile y pues el transmisor tenia unos errores al menos eso me marcaba en el code studio y le añadi unos gosub. el receptor estaba bien ("solo detallitos"
.
regresando al tema pues le añadi al receptor unos lineas para ver si en un lcd el dato k entra y pues komo k no pasa de mostrarme los FF, es decir no pasa de ahi. De todos modos voy a checarlo kon kalma y te vuelvo a dar las gracias.
te envio uno parecido al primero prog:
"TX CODIGO TRANSMISOR
INCLUDE "MODEDEFS.BAS"
TRISA=1
BOTON VAR PORTA.0
VIATX VAR PORTA.1
LEDVE VAR PORTA.2
LEDRO VAR PORTA.3
c var byte
TX:
IF BOTON=1 THEN
GOSUB SEND1
ENDIF
IF BOTON=0 THEN
GOSUB SEND2
ENDIF
GOTO TX
SEND1:
for c=0 to 10
SEROUT VIATX,T300,[6]
LOW LEDRO
HIGH LEDVE
IF BOTON=0 THEN
GOTO TX
ENDIF
pause 3000
next c
RETURN
SEND2:
for c=0 to 10
SEROUT VIATX,T300,[0]
LOW LEDVE
HIGH LEDRO
IF BOTON=1 THEN
GOTO TX
ENDIF
pause 3000
next c
RETURN
.....................................
" RX CODIGO RECEPTOR
INCLUDE "MODEDEFS.BAS"
TRISB=1
VIARX VAR PORTB.0
LEDRO VAR PORTB.1
LEDVE VAR PORTB.2
CLEAN VAR PORTB.6
DATO VAR BYTE
RX:
SERIN VIARX,T300,DATO
IF DATO=0 THEN
LCDOUT #DATO
HIGH LEDVE
LOW LEDRO
ENDIF
IF DATO=6 THEN
LCDOUT #DATO
LOW LEDVE
HIGH LEDRO
ENDIF
GOTO RX:
.............................
nota segun otros programas k he hecho no es necesario poner un goto debajo de cada endif ya que seria un gasto innecesario de memoria. pork el micro esta haciendo un loop constante desde el rx: hasta el goto rx y lo mismo para el tx.
estos progs ya los cheke en proteus y si funcionan pero los paso a un Circuito fisico y no funciona k sera. voy a checar bien tu programa
gracias de nueva cuenta es bueno saber k no estamos solos. pongo el sch de proteus de mi prog. no pude subirlo
-
Que tal mi pana!
Ya correji el programa que te envie previamente para el transmisor revizalo.
Lo que veo y que no me di cuenta es que de esta manera el transmisor va a estar constantemente enviando datos dependiendo del estado de boton (0 o 1), seria mejor colocar dos pulsadores cuando uno se active me enciende el led rojo y apaga el verde y cuando el otro este pulsado invierta los estados de los led, como una sugerencia podrias colocar esto:
loop: if botonA=0 then led_on
if botonB=0 then led_off
goto loop
Aqui coloco el goto para que solo cuando alguno de los pulsadores este activado, envie los datos en caso contrario no.
Ahora en cuanto a lo tuyo veo varias cosas que me paresen que no estan bien.
coloco el codigo del transmisor
TX:
IF BOTON=1 THEN
GOSUB SEND1
ENDIF
IF BOTON=0 THEN
GOSUB SEND2
ENDIF
GOTO TX
SEND1:
for c=0 to 10
SEROUT VIATX,T300,[6]
LOW LEDRO
HIGH LEDVE
IF BOTON=0 THEN ; esto no hace falta ya que boton=1
GOTO TX ; aqui lo estas mandando de nuevo al inicio, no va ENDIF ; esto no va, se usa con if then
pause 3000
next c
RETURN
Con send1 vas a enviar 11 veces (0 al 10) el 6 al receptor cada 3 segundos es lo que quieres hacer?
SEND2:
for c=0 to 10
SEROUT VIATX,T300,[0]
LOW LEDVE
HIGH LEDRO
IF BOTON=1 THEN
GOTO TX
ENDIF
pause 3000
next c
RETURN
.....................................
Aplica lo mismo que para send1 y de esta forma te trabajara.
Reviza esto y luego me comentas
Saludos
-

Gracias Ralf la verdad es tu programa el anterior me sirvio de mucho ya que me pude dar una idea de como usar mejor los comandos basandome en ese hice uno k mande los datos cada 2 segundos y me funciono de maravilla.
lo estuve haciendo segun tus recomendaciones y la verdad funciono muy bien ya lo probe con los modulos y funciona perfecto.
De nuevo muchas gracias, sin tu ayuda y sin tus ejemplos me hubiese atascado mucho y ya se pork no jalaban ninguno de los progs fisicamente como tengo el Tx y el Rx en protos separados los probe sin los modulos y no tenia juntas las tierras de cada proto por eso no funcionaba
osea k un detalle basico de electronica me tenia en stop total.
Gracias seguire probando todo para hacerlo mas complejo.
en realidad lo k kiero es un control remoto para un robot k estoy haciendo y kon esto ya esta mas k hecho
Gracias



-
Que tal mi pana navaismo!
Me alegro mucho haberte podido ayudar, y que todo te alla funcionado bien!!!
Para eso estamos aqui para ayudarnos entre todos!
Saludos