Autor Tema: Problema Serial RF PBP  (Leído 54 veces)

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

Desconectado nicouryn

  • PIC10
  • *
  • Mensajes: 3
Problema Serial RF PBP
« en: 12 de Octubre de 2017, 00:15:05 »
Hola a todos!

Les comento.. Estoy haciendo una especie de "turnero" por radiofrecuencia.
Estoy usando los modulos RF RWS 434 y el PIC 16F628A.

Tiene que funcionar de la siguiente forma:

  • El transmisor debe cambiar tres numeros independientes y enviar el numero de 3 digitos al receptor. Entonces el transmisor tiene 4 pulsadores, el 1º luego de mantenerse pulsado un tiempo selecciona un digito, el 2º y 3º pulsador permiten subir o bajar el numero de 0 a 9, si se aprieta una vez el 1º pulsador cambia al siguiente digito y si se mantiene pulsado otra vez por un tiempo vuelve a la etapa de visualizacion. El 4º pulsador envia los datos serialmente por RF.

Eso en parte esta funcionando bien hasta ahora, mi problema es con el receptor, que debe estar esperando la señal y al mismo tiempo mostrando el numero que ha recibido. Tengo ruido en el receptor asique le agregue una palabra clave para que solo cuando reciba esa palabra reciba el dato y creo que ahi esta el problema, que se queda esperando hasta recibir esa palabra y no me muestra el numero ya que no siguen avanzando los comandos.

Si retiro la palabra clave, el receptor toma cualquier dato.

Soy nuevo en esto asique no estoy del todo seguro si es ese realmente el problema pero es lo unico que se me ha ocurrido.
El programa esta hecho en Microcode Studio y usa la multiplexacion para mostrar el digito.

Aqui el codigo del transmisor:

Código: [Seleccionar]
INCLUDE "modedefs.bas"

cmcon=7
trisb=%00110000
trisa=%00001100

dato var  byte[10]
dato[0]=0
dato[1]=1
dato[2]=2
dato[3]=3
dato[4]=4
dato[5]=5
dato[6]=6
dato[7]=7
dato[8]=8
dato[9]=9

portb=0
porta=0

num var byte

p var  byte
q var  byte
r var  byte
a var porta.0
b var porta.1
c var porta.4

p=0
q=0
r=0

t Var Byte ' declaración de la variable X
t = 0 ' inicializa la variable X

t1 Var Byte ' declaración de la variable X
t1 = 0 ' inicializa la variable X

t2 Var Byte ' declaración de la variable X
t2 = 0 ' inicializa la variable X

t3 Var Byte ' declaración de la variable X
t3 = 0 ' inicializa la variable X

inicio:   
GOTO unidad

unidad:

    if portb.4 = 1 then
        Serout PORTB.6,N2400,["Unidad",p]
        pause 5
        Serout PORTB.6,N2400,["Decena",q]
        pause 5
        Serout PORTB.6,N2400,["Centena",r]
        pause 5 
    endif
    if porta.2 = 1 then
        t=0
        goto tiempo
    Else
        GOTO Mostrar
    endif

Tiempo:
    WHILE porta.2=1         
        PAUSE 1000
        T=T+1
        if T=2 THEN
            GOTO Parpadear1
            t=0
        ENDIF
    WEND
   
Mostrar:

    high b
    high c
    low a
    portb=dato[p]
    pause 5

    high a
    high c
    low b
    portb=dato[q]
    pause 5

    high a
    high b
    low c
    portb=dato[r]
    pause 5
    high c

    GOTO inicio

Cambiar1:
    portb=dato[p]
   
    ;Serout PORTB.4,N2400,[p]
   
    high b
    high c
    low a
    portb=dato[p]
    pause 5

    high a
    high c
    low b
    portb=dato[q]
    pause 5

    high a
    high b
    low c
    portb=dato[r]
    pause 5
    high c
   
    t1=0
   
    if porta.2=1 then
        WHILE porta.2=1         
            T1=T1+1
            PAUSE 1000
            if T1=2 THEN
                GOTO Mostrar
                t1=0
            ENDIF
        WEND
       
        goto Parpadear2
       
    else
        if portb.5=1 and porta.2=0 then
            portb=dato[p]   
            pause 250
            p=p+1 
            portb=dato[p]
            if p=10 then
                p=0
                portb=dato[p]
            endif
           
        else
            if porta.3=1 and porta.2=0 then
                portb=dato[p]   
                pause 250
                p=p-1 
                portb=dato[p]
                if p=-1 then
                    p=9
                    portb=dato[p]
                endif
            endif
        endif
    endif
   
    GOTO Cambiar1

Cambiar2:
    portb=dato[q]
   
    ;Serout PORTB.4,N2400,[q]
    PAUSE 5
   
    high b
    high c
    low a
    portb=dato[p]
    pause 5

    high a
    high c
    low b
    portb=dato[q]
    pause 5

    high a
    high b
    low c
    portb=dato[r]
    pause 5
    high c
   
    t2=0
   
    if porta.2=1 then
        WHILE porta.2=1         
            T2=T2+1
            PAUSE 1000
            if T2=2 THEN
                GOTO Mostrar
                t2=0
            ENDIF
        WEND
       
        goto Parpadear3
       
    else
        if portb.5=1 and porta.2=0 then
            portb=dato[q]   
            pause 250
            Q=Q+1 
            portb=dato[q]
            if Q=10 then
                Q=0
                portb=dato[q]
            endif
           
        else
            if porta.3=1 and porta.2=0 then
                portb=dato[q]   
                pause 250
                Q=Q-1 
                portb=dato[q]
                if Q=-1 then
                    Q=9
                    portb=dato[q]
                endif
            endif
        endif
    endif
   
    GOTO Cambiar2
       
Cambiar3:
    portb=dato[r]
   
    ;Serout PORTB.4,N2400,[r]
    PAUSE 5
   
    high b
    high c
    low a
    portb=dato[p]
    pause 5

    high a
    high c
    low b
    portb=dato[q]
    pause 5

    high a
    high b
    low c
    portb=dato[r]
    pause 5
    high c
   
    t3=0
   
    if porta.2=1 then
        WHILE porta.2=1         
            T3=T3+1
            PAUSE 1000
            if T3=2 THEN
                GOTO Mostrar
                t3=0
            ENDIF
        WEND
       
        goto Parpadear1
       
    else
        if portb.5=1 and porta.2=0 then
            portb=dato[r]   
            pause 250
            R=R+1 
            portb=dato[r]
            if R=10 then
                R=0
                portb=dato[r]
            endif
           
        else
            if porta.3=1 and porta.2=0 then
                portb=dato[r]   
                pause 250
                R=R-1 
                portb=dato[r]
                if R=-1 then
                    R=9
                    portb=dato[r]
                endif
            endif
        endif
    endif
   
    GOTO Cambiar3
   
Parpadear1:
    portb=dato[p]
    LOW a
    HIGH B
    HIGH c
    pause 250
    high a
    pause 250
    low a
    pause 250
    high a
    pause 250
    low a
    pause 500
    if porta.2=0 then goto Cambiar1

Parpadear2:
    portb=dato[q]
    LOW b
    HIGH a
    HIGH c
    pause 250
    high b
    pause 250
    low b
    pause 250
    high b
    pause 250
    low b
    pause 500
    GOTO Cambiar2

Parpadear3:
    portb=dato[r]
    LOW c
    HIGH a
    HIGH b
    pause 250
    high c
    pause 250                           
    low c
    pause 250
    high c
    pause 250
    low c
    pause 500
    GOTO Cambiar3

END


El del receptor:

Código: [Seleccionar]
INCLUDE "modedefs.bas"

cmcon=7
trisb=%00000000
trisa=%00001000

dato var  byte[10]
dato[0]=64
dato[1]=121
dato[2]=36
dato[3]=48
dato[4]=25
dato[5]=18
dato[6]=2
dato[7]=120
dato[8]=0
dato[9]=16

uni var byte
de var byte
cen var byte

datos var byte

date var byte
date1 var byte
date2 var byte

portb=0
porta=0

p var  byte
q var  byte
r var  byte
y var  byte
a var porta.0
b var porta.1
c var porta.2

date=0
date1=0
date2=0

inicio:

uni=date
de=Date1
cen=Date2

    high b
    high c
    low a
    portb=dato[uni]
    pause 5

    high a
    high c
    low b
    portb=dato[de]
    pause 5

    high a
    high b
    low c
    portb=dato[cen]
    pause 5
    high c
   
gosub ver_unidad

Ver_Unidad:
serin PORTA.3,N2400,50,inicio,["Unidad"],date

;serin PORTA.3,N2400,["Decena"],date1
;de=Date1
;serin PORTA.3,N2400,["Centena"],date2
;cen=Date2

return

end

Como veran el codigo tiene variables que no estoy ocupando y otros defectos.. Si pueden ayudarme a solucionar mi problema y si lo pueden exponer mas simple o mejor el codigo lo agradeceria mucho.. Espero sus respuestas y ojala pueda encontrar el problema.

Tambien les dejo los archivos en Microcode y el esquema por si quieren revisarlos mejor o usarlos para sus ideas..


Desconectado elreypic2

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 745
Re:Problema Serial RF PBP
« Respuesta #1 en: 12 de Octubre de 2017, 00:41:33 »
Que tal nicouryn,

Bienvenido al foro. Lo que puedes hacer es usar la "palabra clave" como la mencionas dentro de un if y si esta no es la palabra esperada entonces realizas el refresh de los displays.

La técina que usas no es muy confiable. Para usar estos módulos se recomienda usar alguna codificación (por ejemplo: manchester)de datos para garantizar que la información transmitida-recibida sea mas confiable. Hace casi un año publiqué información de como usar este tipo de módulos. Este es el link:
http://www.todopic.com.ar/foros/index.php?topic=46977.msg393024#msg393024

Si bien está en lenguaje C, se puede usar en PBP (yo lo he hecho).

En tu caso es un poquito más complicado porque tienes que usar dos cosas:
1) Realizar un if para esperar un primer byte de reconocimiento y si este no es entonces continuas con el refresh
2) Si, el byte es correcto, entonces esperas un segundo durante cierto tiempo (vas a necesitar un timer para esto) y si no es o no llega, entonces continuas con el refresh de los displays.

Lo que yo haría sería usar un micro PIC12FXXX solamente como receptor y que este se encargue de decodificar la información por RF y cuando esta es correcta usar un puerto serial hacia el micro que maneja los displays. Esto es mucho mas sencillo y elimina muchas complicaciones en el firmware de la parte de recepción.

Espero la idea te pueda servir.

elreypic.