Вы находитесь на странице: 1из 21

Control de Reles a Distancia por Radio Frecuencia (RF)_______________________

Aquí presento una pareja de circuitos para poder practicar con radio frecuencia (RF),
esta compuesto de un mando emisor y uno o varios receptores, en este caso el receptor
permite ser configurado con una serie de BIT para distinguirlo del resto de receptores
que pueden ser comandados por el mismo mando de control.
La comunicación entre el emisor (Tx) y circuitos receptores (Rx) se consigue fácilmente
usando unos módulos híbridos de Aurel. Como Tx he utilizado tanto el modulo C-0503
de 2mW y el hermano mayor el modulo C-0507 de 500 mW. Con este ultimo realizando
pruebas he podido verificar una distancia aproximada de 700 mtrs en ciudad, pero claro
esta es una distancia que hay que tomar solo como referencia ya que varia según la
altura a la que se encuentran los módulos emisor y receptor uno del otro y también
interviene la cantidad de edificaciones con sus alturas.
La antena que utilice es la misma en ambos circuitos y se trata de un simple cable de
cobre 0.7mm de sección y 17cm de longitud protegido con su funda ya que a esta
potencia si tocamos la antena durante la transmisión es posible que nos queme, desde
luego yo no pienso correr el riesgo.
El modulo C-0503 tiene una cobertura aproximada de 100mtrs según el fabricante pero
queda reducida a 50 o 60 mtrs con paredes de por medio, por lo que funciona bien para
ser utilizado en casa.
Tengo que añadir que los módulos de Aurel de tx, se pueden sustituir uno por el otro en
este diseño, ya que el modulo C-0503 también puede trabajar a 12Vdc, tan solo tener en
cuenta que tiene dos pin de entrada de datos uno que se usa cuando esta alimentado a
5Vdc y el otro cuando trabaja alimentado a 12Vdc.

Los módulos mostrados en la imagen son de Laipac y Aurel que son compatibles entre
si, el soft del circuito en teoría es también compatible con los módulos de Laipac,
construyendo el respectivo adaptador. Me baso en rutinas ya probadas anteriormente
que me funcionaron bien tanto con los módulos de Laipac y de Aurel, pero tengo que
indicar que en este caso solo lo he probado con los de Aurel, los módulos de Tx C-0503
y C-0507 junto con el receptor C-0504, todas las referencia del distribuidor en España
de estos módulos híbridos son de Cebek.

Sobre la trama de datos (Tx):

En la trama de datos para que no se produzcan errores en la recepción de los mismos, la


comienzo siempre con un BYTE de inicio el 0 en mi caso, y recordar que no es lo
mismo que escribir en el comando del lenguaje “0” en cerrado entre comillas. También
hay que tener encuentra que si queremos usar módulos de Laipac (los expuestos en la
foto) no hay que sobre pasar los 1200 baudios de velocidad del puerto serie.
El 0 inicial nos permite sincronizar la trama de datos con el receptor, pero este carácter
no se tiene en cuenta a la hora de recomponer la trama en el receptor.
Otra cosa importante a tener en cuenta es enviar toda la trama de una sola vez, es decir
no dividirla si es posible en varios comandos de programa.
Todas estas indicaciones estan pensadas para ser usadas con el modulo USART del PIC.
Algunas emulaciones del puerto serie por soft ya tienen encuentra esto y no es necesario
tomar tantas precauciones, pero recordar que no es seguro que funcione bien si antes no
se toman estas medidas.

________________________________________________________________
CRFRLTX y CRFRLRX Ver. 1.1 – By COS - 10/06 Dogflu66@yahoo.es
1
Control de Reles a Distancia por Radio Frecuencia (RF)_______________________

El funcionamiento del Tx:

El circuito esta compuesto de 9 teclas que van directamente conectadas a 9 entradas del
PIC y estas entradas fueron polarizadas a positivo mediante resistencia, cada entrada
tiene un condensador a masa de 1nF para proteger al micro en lo posible de
interferencia por RF que genera el propio mando u otros equipos ajenos a el. Y también
ayuda a disminuir los rebotes de las mismas teclas al ser pulsadas. Estas capacidades
son muy importantes.
En la parte de la fuente destacamos D1 que esta en serie con la entrada de la
alimentación y nos protege el circuito contra posibles inversiones de polaridad.

Q3 trabaja en modo seguidor de emisor y es un transistor darlington que esta gobernado


por Q2, hay muchas formas distintas de alimentar el modulo de Tx y esta es una mas
entre ellas.

Existe un led por tecla que indica la maniobra que se esta procesando en ese momento,
la maniobra solo podrá ser activada si se pulsa al mismo tiempo la tecla STAR junto
con la tecla de la maniobra deseada, esto genera una secuencia que es indicada con el
parpadeo del led asociado a la maniobra activada, esta secuencia esta sincronizada con
la secuencia de activación de la placa remota, el led terminara apagado justo cuando la
placa remota lleve acabo la orden recibida (temporizada a la conexión). Activara su rele
durante 100mSg, pasando de nuevo al estado de reposo.
En este caso un pequeño pulso es suficiente para activar el mecanismo de apertura de
una puerta automática de garaje.

La tecla STOP, si es pulsada, anula todas las ordenes que todavía estén en el proceso de
temporizacion.

El funcionamiento del Rx:

Esta también protegido contra posibles inversiones de polaridad mediante el diodo D1.

Se necesitan dos señales opuestas para poder activar el rele de 5v dos circuitos
conmutados, y tiene en seriados sus dos circuitos de contactos, una entrada digital
(RA4) se utiliza para comprobar que durante el test del circuito no estén cogidos los
contactos del rele por motivos desconocidos, D3 protege este pin RA4 de sobre
tensiones.

Led2 nos da una indicación visual si el rele esta energizado o sin embargo esta en
reposo. D2 absorbe los picos de alta tensión que genera la bobina del rele y T1 y T2
gobiernan el rele.

S1 es un bloque de micro interruptores que nos permiten programar el numero de placa


o dicho de otra forma nos permite asociar una placa de rele a una maniobra determinada
del mando de control.

Led1 nos indica con su cadencia de parpadeo en que estado se encuentra el circuito.

________________________________________________________________
CRFRLTX y CRFRLRX Ver. 1.1 – By COS - 10/06 Dogflu66@yahoo.es
2
Control de Reles a Distancia por Radio Frecuencia (RF)_______________________

Esquema del mando (Tx):

________________________________________________________________
CRFRLTX y CRFRLRX Ver. 1.1 – By COS - 10/06 Dogflu66@yahoo.es
3
Control de Reles a Distancia por Radio Frecuencia (RF)_______________________

Esquema del receptor (Rx):

________________________________________________________________
CRFRLTX y CRFRLRX Ver. 1.1 – By COS - 10/06 Dogflu66@yahoo.es
4
Control de Reles a Distancia por Radio Frecuencia (RF)_______________________

Módulos de Tx y Rx compatibles

________________________________________________________________
CRFRLTX y CRFRLRX Ver. 1.1 – By COS - 10/06 Dogflu66@yahoo.es
5
Control de Reles a Distancia por Radio Frecuencia (RF)_______________________

Placa del mando, CRFRTX versión 1.1

Detalle de la ubicación de las teclas por la cara de las pistas

________________________________________________________________
CRFRLTX y CRFRLRX Ver. 1.1 – By COS - 10/06 Dogflu66@yahoo.es
6
Control de Reles a Distancia por Radio Frecuencia (RF)_______________________

Placa CRFRLRX versión 1.1

________________________________________________________________
CRFRLTX y CRFRLRX Ver. 1.1 – By COS - 10/06 Dogflu66@yahoo.es
7
Control de Reles a Distancia por Radio Frecuencia (RF)_______________________

La trama de datos:

La trama de datos esta formada por 4 bytes, no tengo en cuenta el byte de arranque 0.
En este caso Hserout es el comando de alto nivel que utiliza este lenguaje para
enviar los datos a través del modulo del puerto serie del PIC.
La trama esta compuesta, en riguroso orden, de los bytes contenidos en las variables que
se utilizan para componerla.

1º grupo: da nombre al grupo de trabajo o red de placas


2º n_placa: contiene el nombre de una placa en concreto
3º estado: indica la orden a realizar por la placa remota, cuyo nombre lo indica n_placa
4º checsum: es la suma aritmética de los de mas valores (grupo+n_placa+estado), nos
ayuda a identificar posibles errores en la trama recibida.

En este caso el comando Hserout quedaría de la siguiente forma:

checsum = grupo + n_placa + estado


Hserout 0, grupo, n_placa, estado, checsum, grupo, n_placa, estado, checsum

Se puede apreciar que repito dos veces la trama en el mismo comando, todo precedido
una única vez por el 0.

Como el modulo de Tx no esta alimentación de forma continua hay que dejar un


pequeño tiempo, después de alimentarlo, para que se estabilice antes de enviarle la
trama de datos, en este circuito lo activo 50mSeg antes y desactivo 50mSeg después de
enviarle la trama.

Utilizo el 0 como byte de arranque por ningún motivo en especial, simplemente fue el
primero que utilice y me soluciono el problema de la continua perdida de datos, puede
que se pueda utilizar otro que nos genere un mejor rendimiento.

________________________________________________________________
CRFRLTX y CRFRLRX Ver. 1.1 – By COS - 10/06 Dogflu66@yahoo.es
8
Control de Reles a Distancia por Radio Frecuencia (RF)_______________________

El programa del Tx:


'***************** CONTROL DE RELES A DISTANCIA POR RF ***************************************
'NOMBRE: 16F876_CRFRLTX
'VERSION/Autor: 1.1/By COS 11/06
'MICRO: PIC16f876A,8Mhz
'DESCRIPCION: Control de reles a distancia utilizando transmision de datos por radio frecuencia
'Version: 1.0
'Version: 1.1
'se repara el codigo del led de la tecla start que no encendia
'************************************************************************************************
'--------------------------------------DEFINICION DE VARIABLES-------------------------------------
'-------------------------------------Variables del contador del TIMER1----------------------------
Dim pause As Word 'contiene el valor para simular el comando Waitms
Dim aux_pause As Word 'variable auxiiar
Dim basetimer_1ms As Byte 'base de tiempos raiz
Dim timer_1ms As Byte 'base de tiempos se incrementa cada 1mSeg
Dim timer_100ms As Word 'base de tiempos se incrementa cada 100mSeg
Dim timer1_100ms As Byte 'base de tiempos se incrementa cada 100mSeg
Dim timer2_100ms As Byte 'base de tiempos se incrementa cada 100mSeg
Dim timer3_100ms As Byte 'base de tiempos se incrementa cada 100mSeg
Dim timer4_100ms As Byte 'base de tiempos se incrementa cada 100mSeg
Dim timer5_100ms As Byte 'base de tiempos se incrementa cada 100mSeg
Dim timer6_100ms As Byte 'base de tiempos se incrementa cada 100mSeg
Dim timer7_100ms As Byte 'base de tiempos se incrementa cada 100mSeg
'--------------------------------------Variables Programa------------------------------------------
Dim grupo As Byte 'nombre del grupo de trabajo
Dim n_placa As Byte 'numero de la placa dentro de la red
Dim estado As Byte 'accion a tomar por la placa remota
Dim checsum As Byte 'control de errores de la trama
Dim s1 As Byte 'habilita las operaciones de la tecla P1, parpadeo led, temporizacion, envio trama
Dim s2 As Byte 'habilita las operaciones de la tecla P2, parpadeo led, temporizacion, envio trama
Dim s3 As Byte 'habilita las operaciones de la tecla P3, parpadeo led, temporizacion, envio trama
Dim s4 As Byte 'habilita las operaciones de la tecla P4, parpadeo led, temporizacion, envio trama
Dim s5 As Byte 'habilita las operaciones de la tecla P5, parpadeo led, temporizacion, envio trama
Dim s6 As Byte 'habilita las operaciones de la tecla P6, parpadeo led, temporizacion, envio trama
Dim s7 As Byte 'habilita las operaciones de la tecla P7, parpadeo led, temporizacion, envio trama
Dim start As Byte 'habilita las demas teclas al pulsar la tecla Start
Dim stop As Byte 'anula las secuencias que se estan procesando de cada una de las placas, tecla Stop
'-----------------------------------------------ASIGNACIONES----------------------------------------
'-------------------------------------Asigna valores a las variables--------------------------------
aux_pause = 0
pause = 0
basetimer_1ms = 0 'on
timer_1ms = 255 'off
timer_100ms = 255 'off
timer1_100ms = 255 'off
timer2_100ms = 255 'off
timer3_100ms = 255 'off
timer4_100ms = 255 'off
timer5_100ms = 255 'off
timer6_100ms = 255 'off
timer7_100ms = 255 'off
'--------------------------------------asignacion de valores generales-----------------------------
grupo = 255 'nombre del grupo de trabajo
n_placa = 0 'nombre de la placa actual, se descodifica pero se ignora
estado = 0 'comando de reposo
s1 = 0 'no hay nada para la placa nº1
s2 = 0 'no hay nada para la placa nº2
s3 = 0 'no hay nada para la placa nº3
s4 = 0 'no hay nada para la placa nº4
s5 = 0 'no hay nada para la placa nº5
s6 = 0 'no hay nada para la placa nº6
s7 = 0 'no hay nada para la placa nº7
start = 0 'no estan habilitadas las teclas de maniobra
stop = 0 'no se envia comando de cancelacion

________________________________________________________________
CRFRLTX y CRFRLRX Ver. 1.1 – By COS - 10/06 Dogflu66@yahoo.es
9
Control de Reles a Distancia por Radio Frecuencia (RF)_______________________

'--------------------------------------DEFINICION DE PUERTOS------------------------------------------------
'--------------------------------ASIGNACION DE I/O y valores de inicio de las salidas----------------------
ADCON1 = 0x07 'deshabilita las entradas analogicas
TRISA = 0xff 'puerto A configurado como entradas
TRISB = 0x00 'puerto B configurado como salidas
TRISC = 0xff 'puerto C configurado como entradas
TRISC.2 = 0 'configurado como salida, controla la activacion del modulo hibrido de Tx
TRISC.3 = 0 'configurado como salida, nc
TRISC.5 = 0 'configurado como salida, controla el led de la tecla start
TRISC.6 = 0 'configurado como salida, salida datos serie, Tx
TRISC.7 = 0 'configurado como salida, nc
PORTB = 0xff 'todo el puerto B a nivel alto, led apagados
PORTC.2 = 1 'modulo Tx desconectado
PORTC.5 = 1 'led apagado, start
'------------------------------------INICIO DEL PUERTO SERIE, TIMER E INTERRUPCONES------------------
Hseropen 1200 'Velocidad del puerto serie e inicializa los comandos de bajo nivel que controlan la USART
INTCON.PEIE = 1 'bit de habilitacion de interrupciones de perifericos(USART), comun para tx y rx
PIE1.RCIE = 0 'deshabilita la interrupcion de la USART en modo rx
T1CON.TMR1ON = 1 'Configuracion y habilitacion del TMR1
T1CON.TMR1CS = 0 'factor del preescales del timer1, 0
T1CON.T1CKPS0 = 0 'factor del preescales del timer1, 0
T1CON.T1CKPS1 = 0 'factor del preescales del timer1, 0
TMR1H = 0xf8 'carga el registro del contador para que desborde cada 1mSeg, byte alto
TMR1L = 0x30 'carga el registro del contador para que desborde cada 1mSeg, byte bajo
PIE1.TMR1IE = 1 'activa el timer1
Enable 'INTCON.GIE habilita todas las interrupciones globales
'--------------------------------------Inicio Programa--------------------------------------------------
pause = 3000 'carga la rutina pause con 3Seg
Gosub pause_ms 'espera 3Seg

________________________________________________________________
CRFRLTX y CRFRLRX Ver. 1.1 – By COS - 10/06 Dogflu66@yahoo.es
10
Control de Reles a Distancia por Radio Frecuencia (RF)_______________________

'--------------------------------------Main Programa----------------------------------------------------
main:
If RA1 = 0 And RC4 = 0 Then 'P1 y Start, comprueba las tecla
Gosub ledstart_on 'led a on de la tecla Start
s1 = 1 'activa la secuencia para la placa remota nº 1
estado = 2 'estado de activacion
n_placa = 1 'nombre de la placa relacionada
timer1_100ms = 0 'activacion de la base de tiempos del led tecla P1
Gosub tx_trama 'compones y envia la trama de datos
Endif
If RA2 = 0 And RC4 = 0 Then 'P2 y Start, comprueba las teclas
Gosub ledstart_on 'led a on de la tecla Start
s2 = 1 'activa la secuencia para la placa remota nº 2
estado = 2 'estado de activacion
n_placa = 2 'nombre de la placa relacionada
timer2_100ms = 0 'activacion de la base de tiempos del led tecla P2
Gosub tx_trama 'compones y envia la trama de datos
Endif
If RA3 = 0 And RC4 = 0 Then 'P3 y Start, comprueba las teclas
Gosub ledstart_on 'led a on de la tecla Start
s3 = 1 'activa la secuencia para la placa remota nº 3
estado = 2 'estado de activacion
n_placa = 3 'nombre de la placa relacionada
timer3_100ms = 0 'activacion de la base de tiempos del led tecla P3
Gosub tx_trama 'compones y envia la trama de datos
Endif
If RA4 = 0 And RC4 = 0 Then 'P4 y Start, comprueba las teclas
Gosub ledstart_on 'led a on de la tecla Start
s4 = 1 'activa la secuencia para la placa remota nº 4
estado = 2 'estado de activacion
n_placa = 4 'nombre de la placa relacionada
timer4_100ms = 0 'activacion de la base de tiempos del led tecla P4
Gosub tx_trama 'compones y envia la trama de datos
Endif
If RA5 = 0 And RC4 = 0 Then 'P5 y Start, comprueba las teclas
Gosub ledstart_on 'led a on de la tecla Start
s5 = 1 'activa la secuencia para la placa remota nº 5
estado = 2 'estado de activacion
n_placa = 5 'nombre de la placa relacionada
timer5_100ms = 0 'activacion de la base de tiempos del led tecla P5
Gosub tx_trama 'compones y envia la trama de datos
Endif
If RC0 = 0 And RC4 = 0 Then 'P6 y Start, comprueba las teclas
Gosub ledstart_on 'led a on de la tecla Start
s6 = 1 'activa la secuencia para la placa remota nº 6
estado = 2 'estado de activacion
n_placa = 6 'nombre de la placa relacionada
timer6_100ms = 0 'activacion de la base de tiempos del led tecla P6
Gosub tx_trama 'compones y envia la trama de datos
Endif
If RC1 = 0 And RC4 = 0 Then 'P7 y Start, comprueba las teclas
Gosub ledstart_on 'led a on de la tecla Start
s7 = 1 'activa la secuencia para la placa remota nº 7
estado = 2 'estado de activacion
n_placa = 7 'nombre de la placa relacionada
timer7_100ms = 0 'activacion de la base de tiempos del led tecla P7
Gosub tx_trama 'compones y envia la trama de datos
Endif
If s1 = 1 Or s2 = 1 Or s3 = 1 Or s4 = 1 Or s5 = 1 Or s6 = 1 Or s7 = 1 Then Gosub led_flash 'parpadeo On
pause = 50 'carga el pause con una espera de 50mSeg
Gosub pause_ms 'espera el valor de pause
Gosub ledstop_off 'apaga el led de la tecla Stop
If RC4 = 0 Then Gosub ledstart_on 'prende el led de la tecla Start
If RC4 = 1 Then Gosub ledstart_off 'apaga el led de la tecla Start
Goto main
End
'--------------------------------------FIN DEL MAIN-------------------------------------------

________________________________________________________________
CRFRLTX y CRFRLRX Ver. 1.1 – By COS - 10/06 Dogflu66@yahoo.es
11
Control de Reles a Distancia por Radio Frecuencia (RF)_______________________

'--------------------------------------Sub_Rutinas Programa-----------------------------------------------
tx_out: 'rutina que deja en reposo las secuencias que se activaron, despues de terminar su ejecucion
If s1 = 1 And timer1_100ms >= 100 Then
s1 = 0
Endif
If s2 = 1 And timer2_100ms >= 100 Then
s2 = 0
Endif
If s3 = 1 And timer3_100ms >= 100 Then
s3 = 0
Endif
If s4 = 1 And timer4_100ms >= 100 Then
s4 = 0
Endif
If s5 = 1 And timer5_100ms >= 100 Then
s5 = 0
Endif
If s6 = 1 And timer6_100ms >= 100 Then
s6 = 0
Endif
If s7 = 1 And timer7_100ms >= 100 Then
s7 = 0
Endif

Return
tx_trama: 'transmite la trama
PORTC.2 = 0 'activa el Tx
checsum = grupo + n_placa + estado 'calcula el checsum
pause = 50 'espera 50mSeg, estabiliza el modulo hibrido
Gosub pause_ms 'salta a la rutina de pausa
Hserout 0, grupo, n_placa, estado, checsum, grupo, n_placa, estado, checsum 'envia la trama doble
pause = 50 'carga el pause
Gosub pause_ms 'salta a la rutina de espera
PORTC.2 = 1 'desactiva el Tx
estado = 0 'nuevo estado, reposo
n_placa = 0 'placa no operativa, no se ejecutan las posibles ordenes con este numero
Return

________________________________________________________________
CRFRLTX y CRFRLRX Ver. 1.1 – By COS - 10/06 Dogflu66@yahoo.es
12
Control de Reles a Distancia por Radio Frecuencia (RF)_______________________

led1_on: 'activacion de led, pulsador P1


RB1 = 0
Return
led2_on: 'activacion de led, pulsador P2
RB2 = 0
Return
led3_on: 'activacion de led, pulsador P3
RB3 = 0
Return
led4_on: 'activacion de led, pulsador P4
RB4 = 0
Return
led5_on: 'activacion de led, pulsador P5
RB5 = 0
Return
led6_on: 'activacion de led, pulsador P6
RB6 = 0
Return
led7_on: 'activacion de led, pulsador P7
RB7 = 0
Return
ledstart_on: 'activacion de led, pulsador Start
RC5 = 0
Return
ledstop_on: 'prende el led de la tecla Stop
RB0 = 0
Return
led1_off: 'desactivacion de led, pulsadores P1
RB1 = 1
Return
led2_off: 'desactivacion de led, pulsadores P2
RB2 = 1
Return
led3_off: 'desactivacion de led, pulsador P3
RB3 = 1
Return
led4_off: 'desactivacion de led, pulsador P4
RB4 = 1
Return
led5_off: 'desactivacion de led, pulsador P5
RB5 = 1
Return
led6_off: 'desactivacion de led, pulsador P6
RB6 = 1
Return
led7_off: 'desactivacion de led, pulsador P7
RB7 = 1
Return
ledstart_off: 'desactivacion de led, pulsador Start
RC5 = 1
Return
ledstop_off: 'apaga el led de la tecla Stop
RB0 = 1
Return
comandos_off: 'paso a estado de reposo de todas las placas
n_placa = 16 'todas las placas decodifican este n_placa
estado = 0 'reposo
Gosub tx_trama 'envia la trama al aire
s1 = 0 'se anulan todas las operaciones pendientes de P1
s2 = 0 'se anulan todas las operaciones pendientes de P2
s3 = 0 'se anulan todas las operaciones pendientes de P3
s4 = 0 'se anulan todas las operaciones pendientes de P4
s5 = 0 'se anulan todas las operaciones pendientes de P5
s6 = 0 'se anulan todas las operaciones pendientes de P6
s7 = 0 'se anulan todas las operaciones pendientes de P7
Gosub ledall_off 'se apagan los leds
Return

________________________________________________________________
CRFRLTX y CRFRLRX Ver. 1.1 – By COS - 10/06 Dogflu66@yahoo.es
13
Control de Reles a Distancia por Radio Frecuencia (RF)_______________________

ledall_off:
RB1 = 1 'P1 LED OFF
RB2 = 1 'P2 LED OFF
RB3 = 1 'P3 LED OFF
RB4 = 1 'P4 LED OFF
RB5 = 1 'P5 LED OFF
RB6 = 1 'P6 LED OFF
RB7 = 1 'P7 LED OFF
RC5 = 1 'START LED OFF
Return
led_flash: 'controla la cadencia de on/off de los led de las teclas pulsadas
If timer_100ms <= 2 Then 'led a on 200mSeg, controla
'el tiempo de parpadeo de los leds
If timer1_100ms < 100 Then Gosub led1_on 'led a on mientras el Rx tempriza la maniobra
If timer2_100ms < 100 Then Gosub led2_on 'led a on mientras el Rx tempriza la maniobra
If timer3_100ms < 100 Then Gosub led3_on 'led a on mientras el Rx tempriza la maniobra
If timer4_100ms < 100 Then Gosub led4_on 'led a on mientras el Rx tempriza la maniobra
If timer5_100ms < 100 Then Gosub led5_on 'led a on mientras el Rx tempriza la maniobra
If timer6_100ms < 100 Then Gosub led6_on 'led a on mientras el Rx tempriza la maniobra
If timer7_100ms < 100 Then Gosub led7_on 'led a on mientras el Rx temporiza la maniobra
Endif
If timer_100ms >= 3 Then 'led a off, 200mSeg
If timer1_100ms <= 100 Then Gosub led1_off 'led a on mientras el Rx temporiza la maniobra
If timer2_100ms <= 100 Then Gosub led2_off 'led a on mientras el Rx temporiza la maniobra
If timer3_100ms <= 100 Then Gosub led3_off 'led a on mientras el Rx tempriza la maniobra
If timer4_100ms <= 100 Then Gosub led4_off 'led a on mientras el Rx tempriza la maniobra
If timer5_100ms <= 100 Then Gosub led5_off 'led a on mientras el Rx tempriza la maniobra
If timer6_100ms <= 100 Then Gosub led6_off 'led a on mientras el Rx tempriza la maniobra
If timer7_100ms <= 100 Then Gosub led7_off 'led a on mientras el Rx tempriza la maniobra
Endif
If timer_100ms >= 5 Then timer_100ms = 0 'reinicia esta base de tiempos, tiempo parpadeo leds
Return
pause_ms: 'rutina de espera, rutina tipo Waitms, pause establece el tiempo total en mSeg
aux_pause = 0 'variable auxiliar lleva la cuenta de los ms
timer_1ms = 0 'al borrar el contador se activa y comienza la cuenta de 1mSeg
While aux_pause <= pause 'tiempo en mSeg maximos a contar
aux_pause = aux_pause + 1 'variable auxiliar lleva la cuenta de los ms
If timer_1ms > 0 Then timer_1ms = 0 'al borrar el contador se activa y cuenta 1mSeg
While timer_1ms < 1 'espera un milisegundo
Wend
Wend
Return

________________________________________________________________
CRFRLTX y CRFRLRX Ver. 1.1 – By COS - 10/06 Dogflu66@yahoo.es
14
Control de Reles a Distancia por Radio Frecuencia (RF)_______________________

'--------------------------------------SIBRUTINAS ESPECIALES---------------------------------------------
On Interrupt 'Comienzan las rutinas de las interrupciones
Save System 'Guarda los valores del sistema
If PIR1.TMR1IF = 1 Then 'comprueba la interrupcion,
'solo hay de un tipo, no es necesario, se pone por costumbre
basetimer_1ms = basetimer_1ms + 1 'base de tiempos raiz
If timer_1ms < 1 Then timer_1ms = timer_1ms + 1 'base de tiempos, temporiza un 1msg
If basetimer_1ms >= 100 Then 'establece que las siguientes bases de tiempos
'se incrementaran cada 100mSeg
If timer_100ms < 5 Then timer_100ms = timer_100ms + 1 'temporiza 0.5Seg
If timer1_100ms < 100 Then timer1_100ms = timer1_100ms + 1 'temporiza 10Seg, parpadeo led
If timer2_100ms < 100 Then timer2_100ms = timer2_100ms + 1 'temporiza 10Seg, parpadeo led
If timer3_100ms < 100 Then timer3_100ms = timer3_100ms + 1 'temporiza 10Seg, parpadeo led
If timer4_100ms < 100 Then timer4_100ms = timer4_100ms + 1 'temporiza 10Seg, parpadeo led
If timer5_100ms < 100 Then timer5_100ms = timer5_100ms + 1 'temporiza 10Seg, parpadeo led
If timer6_100ms < 100 Then timer6_100ms = timer6_100ms + 1 'temporiza 10Seg, parpadeo led
If timer7_100ms < 100 Then timer7_100ms = timer7_100ms + 1 'temporiza 10Seg, parpadeo led
basetimer_1ms = 0 'reinicia la base timer raiz
Endif
If RA0 = 0 Then 'Stop
PORTC.2 = 0 'activa el tx
RB0 = 0 'activa el led de la tecla STOP
n_placa = 16 'numero de placa que descodifican todas las placas remotas
estado = 0 'reposo
checsum = grupo + n_placa + estado 'calculo del checsum
Hserout 0, grupo, n_placa, estado, checsum, grupo, n_placa, estado, checsum
'envia la trama de datos
Hserout 0, grupo, n_placa, estado, checsum, grupo, n_placa, estado, checsum
'envia la trama de datos
Hserout 0, grupo, n_placa, estado, checsum, grupo, n_placa, estado, checsum
'envia la trama de datos
Hserout 0, grupo, n_placa, estado, checsum, grupo, n_placa, estado, checsum
'envia la trama de datos
PORTC.2 = 1 'desactiva el tx
s1 = 0 'terminan todas las acciones relacionadas con la tecla P1
s2 = 0 'terminan todas las acciones relacionadas con la tecla P2
s3 = 0 'terminan todas las acciones relacionadas con la tecla P3
s4 = 0 'terminan todas las acciones relacionadas con la tecla P4
s5 = 0 'terminan todas las acciones relacionadas con la tecla P5
s6 = 0 'terminan todas las acciones relacionadas con la tecla P6
s7 = 0 'terminan todas las acciones relacionadas con la tecla P7
RB1 = 1 'P1 LED OFF
RB2 = 1 'P2 LED OFF

RB3 = 1 'P3 LED OFF


RB4 = 1 'P4 LED OFF
RB5 = 1 'P5 LED OFF
RB6 = 1 'P6 LED OFF
RB7 = 1 'P7 LED OFF
RC5 = 1 'START LED OFF
Endif
TMR1H = 0xf8 'recarga el contador del timer1 para que desborde pasado 1mSeg, byte alto
TMR1L = 0x30 'recarga el contador del timer1 para que desborde pasado 1mSeg, byte bajo
PIR1.TMR1IF = 0 'borra el flag de salto del tmr1
Endif
Resume
End

________________________________________________________________
CRFRLTX y CRFRLRX Ver. 1.1 – By COS - 10/06 Dogflu66@yahoo.es
15
Control de Reles a Distancia por Radio Frecuencia (RF)_______________________

El programa del Rx:


'***************** CONTROL DE RELES A DISTANCIA POR RF ***************************************
'NOMBRE:16F88_CRFRLRX
'MICRO: PIC16F88/8Mhz reloj interno
'Version/Autor: 1.0/By COS 11.06
'DESCRIPCION: modulo receptor de datos por Radio Frecuencia
'al conectar la placa enciendo led de estado durante 1 seg
'estado=0, 2,9Seg a off y 0.1seg a on, si el n_placa=0 o despues de una trama de stop
'estado=1, 1.3seg a off y 0.6 a on, n_placa comprendida entre 1 y 7 (OK en espera de trama)
'estado=3, '0,2 segundos a off y 0,2 seg a on durante 10Seg antes de activar el rele durante 100mSeg
'despues de recibir trama correcta led a on durante 1Seg.
'tiempo de lectura entre byte y byte del bufer serie 10mseg maximo y un milisegundo minimo
'Version 1.1, se activa una entrada digital para comprobar que los contactos del rele
'no tienen tension durante el arranque del circuito
'al energizar la placa led de estado a on si hay tension en los contactos del rele,
'y la placa queda fuera de servicio
'************************************************************************************************
'-------------------------------------PUERTOS DEFINIDOS POR EL SISTEMA----------------------------
'-------------------------------------Puertos del LCD---------------------------------------------
'--------------------------------------DEFINICION DE VARIABLES-------------------------------------
'-------------------------------------Variables sub_rutinas del puerto serie---------------------
Dim assii As Byte 'Contiene el valor de lectura del puerto serie
Dim n_usart As Byte 'Numero de datos del USART y del bufer IMAGEN de control
Dim usart As Byte 'Variable indice que apunta al ultimo dato adquirido por la USART
Dim aux_usart As Byte 'Auxiliar de la variable indice usart del USART
Dim c_serial As Byte 'Como USART pero para la lectura de control del bufer IMAGEN
Dim bufer As Byte 'Indica si hay datos por leer en el bufer USART
'-------------------------------------Variables del contador del TIMER1----------------------------
Dim pause As Word 'contiene el valor para simular el comando Waitms
Dim aux_pause As Word 'variable auxiiar
Dim basetimer_1ms As Byte 'base de tiempos raiz
Dim timer_1ms As Word 'base de tiempos se incrementa cada 1mSeg
Dim timer_100ms As Byte 'base de tiempos se incrementan cada 100mSeg
Dim timer1_100ms As Byte 'base de tiempos 1 se incrementan cada 100mSeg
Dim timer2_100ms As Byte 'base de tiempos 2 se incrementan cada 100mSeg
Dim timer3_100ms As Byte 'base de tiempos 3 se incrementan cada 100mSeg
Dim timer4_100ms As Byte 'base de tiempos 4
'--------------------------------------Variables Programa------------------------------------------
Dim arranque As Byte 'arranque, estabiliza el bit de bajada (no se contabiliza)
Dim grupo As Byte 'byte de sincronismo (grupo de trabajo)
Dim n_placa As Byte 'nombre de la placa
Dim checsum As Byte 'chesun calculado por el micro que le pertenece a la trama recibida
Dim w_posrx As Byte 'Tiempo entre lectura y lectura del bufer
Dim rd_grupo As Byte 'byte del nombre de la red a la que se le envia la trama
Dim rd_n_placa As Byte 'numero de la placa a la que se refiere la trama
Dim rd_checsum As Byte 'control de error que suministra la trama
Dim rd_estado As Byte 'modo de actuacion obtenido de la trama de datos
Dim estado As Byte 'asigna el estado de la placa, 0=deshabilitada, 1=habilitada, 2 y 3 modo de activacion del rele
Dim n As Byte 'variable auxiliar para las rutinas del programa
'------------------------------------VARIABLES tipo array programa----------------------------------
'------------------------------------VARIABLES tipo array sub_rutinas-------------------------------
'------------------------------------Variables tipo array puerto serie----------------------------------
Dim usart_imagen(81) As Byte 'Componen el bufer IMAGEN para control del bufer USART,
'apuntador que nos indica que registros tienen datos de usart_bufer
Dim usart_bufer(81) As Byte 'Componen el bufer de la USART de bajo nivel, contiene los bytes recibidos

________________________________________________________________
CRFRLTX y CRFRLRX Ver. 1.1 – By COS - 10/06 Dogflu66@yahoo.es
16
Control de Reles a Distancia por Radio Frecuencia (RF)_______________________

'-----------------------------------------------ASIGNACIONES----------------------------------------
'-------------------------------------Asigna valores a las variables de la rutina del puerto serie--
usart = 0
aux_usart = 0
c_serial = 0
bufer = 0
n_usart = 80
assii = 0
'-------------------------------------Asigna valores a las variables del TIMER1---------------------
aux_pause = 0
pause = 0
basetimer_1ms = 0
timer_1ms = 0
timer_100ms = 0
timer1_100ms = 0
timer2_100ms = 0
timer3_100ms = 0
timer4_100ms = 0
'--------------------------------------asignacion de valores generales-----------------------------
arranque = 0
grupo = 255
n_placa = 0
estado = 0
w_posrx = 10 '10mSeg rf, se espera un maximo de tiempo antes de leer el bufer si no hay datos
'--------------------------------------DEFINICION DE PUERTOS------------------------------------------------
'--------------------------------ASIGNACION DE I/O y valores de inicio de las salidas----------------------
ANSEL = 0x00 'los pin I/O digitales (no analogicos)
OSCCON = 0x7e 'set intrc To 8mhz
CMCON = 0x07 'comparador a off
TRISA = 0xff 'Puerto A como entradas digitales
TRISA.5 = 0 'como salida
TRISB = 0x00 'puerto B como salidas
PORTB.4 = 0 'entrega negativo al rele, activa a 1
PORTB.6 = 1 'entrega positivo al rele, activa a 0
PORTB.7 = 0 'ilunina el led de estado, 1 iluminado
'------------------------------------fallo placa-----------------------------------------------------
WaitMs 500 'pausa para estabilizar la entrada
If RA4 = 1 Then Goto fallo 'si hay tension en los contactos durante el arranque se bloquea el circuito
'------------------------------------INICIO DEL PUERTO SERIE, TIMER E INTERRUPCONES------------------
Hseropen 1200 'Velocidad del puerto serie e inicializa los comandos de bajo nivel que
controlan la USART
INTCON.PEIE = 1 'bit de habilitacion de interrupciones de perifericos(USART), para que
funcione la implementación P. SERIE
PIE1.RCIE = 1 'Activa la interrupcion de la USART en modo rx
T1CON.TMR1ON = 1 'Configuracion y habilitacion del TMR1
T1CON.TMR1CS = 0 'reloj principal para el timer1
T1CON.T1CKPS0 = 0 'sin preescales
T1CON.T1CKPS1 = 0 'sin preescales
TMR1H = 0xf8 'desbordamiento del timer1 cada 1ms, byte alto
TMR1L = 0x30 'desbordamiento del timer1 cada 1ms, byte bajo
PIE1.TMR1IE = 1 'activacion del timer1
Enable ' INTCON.GIE habilita todas las interrupciones globales

________________________________________________________________
CRFRLTX y CRFRLRX Ver. 1.1 – By COS - 10/06 Dogflu66@yahoo.es
17
Control de Reles a Distancia por Radio Frecuencia (RF)_______________________

'--------------------------------------Inicio Programa--------------------------------------------------
pause = 10 'carga el tiempo de espera
Gosub pause_ms 'espera el valor del pause
n_placa.0 = PORTA.0 'bits seleccion del numero de la placa,
'cero placa deshabilitada, nº 16 comun a todas las placas
n_placa.1 = PORTA.1
n_placa.2 = PORTA.2
n_placa.3 = PORTA.3
If n_placa = 0 Then estado = 0 'asigna el estado de la placa segun el numero de la placa, deshabilitada
If n_placa > 7 Then estado = 0 'deshabilitada
If n_placa > 0 And n_placa < 8 Then estado = 1 'habilitada
Gosub off_led 'asegura led apagado
Gosub off_rele 'asegura rele desconectado
Gosub clear_bufer 'Borra el BUFER IMAGEN y por lo tanto tambien al USART, OBLIGATORIO POR LO MENOS UNA VEZ
pause = 500 'pausa de 0.5 Seg
Gosub pause_ms 'espera el valor cargado en pause
'--------------------------------------Main Programa----------------------------------------------------
main:
If RCSTA.OERR = 1 Then 'testea posible bloqueo del puerto fisico en modo Rx
Gosub clear_bufer 'borra el bufer por soft del puerto serie de entrada
Endif
If n_placa > 0 And n_placa <= 16 And bufer = 1 Then 'verifica que el n_placa es correcto y comprueba el bufer
Gosub recibo_comando 'salta a la rutina de lectura del bufer serie
Endif
If n_placa = 0 Then 'la placa queda en reposo
estado = 0 'la placa queda en reposo
Gosub off_rele 'rele apagado
Endif
If estado = 0 Then 'la placa queda en reposo
Gosub off_rele 'rele apagado
Endif
If estado = 1 Then 'la placa queda en reposo
Gosub off_rele 'rele apagado
Endif
If estado = 2 Then 'se inicia la secuencia de activacion
Gosub off_rele 'rele apagado
estado = 3 'permite que se active el rele
timer_100ms = 0 'activa el timer_100ms, 10Seg antes de activar el rele
Endif
If estado = 3 And timer_100ms >= 100 Then 'activa el rele durante 100mSEg despues de terminar timer_100ms
timer_100ms = 0 'se inicializa timer_100ms
Gosub on_rele 'activa rele
estado = 0 'estado despues de la activacion o anulacion de secuencia
pause = 100 'carga la rutina del pause
Gosub pause_ms 'espera el valor del pause
Gosub off_rele 'desconecta el rele
Endif
Goto main
End
'--------------------------------------FIN DEL MAIN---------------------------------------------------

________________________________________________________________
CRFRLTX y CRFRLRX Ver. 1.1 – By COS - 10/06 Dogflu66@yahoo.es
18
Control de Reles a Distancia por Radio Frecuencia (RF)_______________________

'--------------------------------------Sub_Rutinas Programa-----------------------------------------------
on_led:
PORTB.7 = 1 'enciende el led
Return
off_led:
PORTB.7 = 0 'apaga el led
Return
on_rele: 'activa el rele
If estado = 3 Then
PORTB.6 = 0
PORTB.4 = 1
Endif
estado = 0
Return
off_rele: 'desactiva el rele
PORTB.6 = 1
PORTB.4 = 0
Return
fallo: 'bloque el programa
PORTB.6 = 1 'apaga el rele, bit 1
PORTB.4 = 0 'apaga el rele, bit 2
RB7 = 1 'prende el led de estado fijo
Goto fallo
Return
'-------------------------------Lectura de la trama de datos recibida por el bufer serie------------------
recibo_comando: 'confecciona la trama
Gosub readserial 'lee un byte almacenado en el bufer del puerto serie
If assii = grupo Then 'establece la cabecera y sincroniza la trama
rd_grupo = assii
Gosub readserial
rd_n_placa = assii
Gosub readserial
rd_estado = assii
Gosub readserial
rd_checsum = assii
checsum = rd_grupo + rd_n_placa + rd_estado 'calculo el checsum con los valores recibidos
If rd_checsum = checsum Then 'actualizo los valores de las salidas si el checsum recibido es correcto
If rd_estado >= 8 Then estado = 1 'se pasa a estado de espera
If rd_n_placa = n_placa Then estado = rd_estado 'se establece el estado recibido
If rd_n_placa = 16 Then estado = 0 'se pasa a estado cero
timer4_100ms = 0 'se activa la base de tiempos que nos modificara el parpadeo
'del led para indicar que se recibio una trama correctamente
Endif
Endif
Return

________________________________________________________________
CRFRLTX y CRFRLRX Ver. 1.1 – By COS - 10/06 Dogflu66@yahoo.es
19
Control de Reles a Distancia por Radio Frecuencia (RF)_______________________

'--------------------------------------SIBRUTINAS ESPECIALES---------------------------------------------
On Interrupt 'Comienzan las rutinas de las interrupciones
Save System 'Guarda los valores del sistema
'--------------------------------------RUTINA TIMER_1----------------------------------------------------
T1CON.TMR1ON = 0 'deshabilitacion del TMR1
PIE1.RCIE = 0 'desactiva la interrupcion de la USART en modo rx
If PIR1.TMR1IF = 1 Then 'comprueba que es esta la interrupcion activa
basetimer_1ms = basetimer_1ms + 1 'base de tiempos patron
If timer_1ms < 1 Then timer_1ms = timer_1ms + 1 'se utiliza para hacer temporizaciones en pasos de 1ms
If basetimer_1ms >= 100 Then 'establece pasos de 100mseg para las otras bases de tiempos
If timer4_100ms < 10 Then 'solo se activa cuando se recibe una trama de datos con exito
timer4_100ms = timer4_100ms + 1 'varia la longit del parpadeo del led, al recibir trama
PORTB.7 = 1 'enciende el led de control
If timer_100ms < 100 Then timer_100ms = timer_100ms + 1
'10seg, actualiza y controla base de tiempos
If timer1_100ms < 30 Then timer1_100ms = timer1_100ms + 1
'3seg, actualiza y controla base de tiempos
If timer2_100ms < 20 Then timer2_100ms = timer2_100ms + 1
'2seg, actualiza y controla base de tiempos
If timer3_100ms < 4 Then timer3_100ms = timer3_100ms + 1
'0.4seg, actualiza y controla base de tiempos
Goto fin 'al recibir una trama de datos valida se salta a fin
Endif
If timer_100ms < 100 Then timer_100ms = timer_100ms + 1 'actualiza y controla base de tiempos
If timer1_100ms < 30 Then timer1_100ms = timer1_100ms + 1 'act. y controla base de tiempos
If timer2_100ms < 20 Then timer2_100ms = timer2_100ms + 1 'act. y controla base de tiempos
If timer3_100ms < 4 Then timer3_100ms = timer3_100ms + 1 'act. y controla base de tiempos
If estado = 0 Then 'segun el estado se varia la longitud y velocidad del parpadeo del led
If timer1_100ms > 29 Then '2,9Seg a off y 0.1seg a on
PORTB.7 = 1 'prende el led indicador del estado
If timer1_100ms >= 30 Then timer1_100ms = 0 'reinicializa base de tiempos
Else
PORTB.7 = 0 'apaga el led indicador del estado
Endif
Endif
If estado = 1 Then 'segun el estado se varia la longitud y velocidad del parpadeo del led
If timer2_100ms > 13 Then '1.3seg a off y 0.6 a on
PORTB.7 = 1 'prende el led de estado
If timer2_100ms >= 20 Then timer2_100ms = 0 'reiniciliza la base tiempos
Else
PORTB.7 = 0 'apaga el led de estado
Endif
Endif
If estado = 3 Then 'segun el estado se varia la longitud y velocidad del parpadeo del led
If timer3_100ms > 2 Then '0,2 segundos a off y 0,2 seg a on
PORTB.7 = 1 'prende el led de estado
If timer3_100ms >= 4 Then timer3_100ms = 0 'reinicializa la base tiempos
Else
PORTB.7 = 0 'apaga el led de estado
Endif
Endif
fin:
basetimer_1ms = 0 'la reinicializa
Endif
TMR1H = 0xf8 'carga el timer1 para que desborde 1mseg, byte higt
TMR1L = 0x30 'carga el timer1 para que desborde 1mseg, byte low
Endif
'--------------------------------------BUFER PUERTO SERIE-----------------------------------------------
If PIR1.RCIF = 1 Then 'comprueba que es esta la interrupcion activa
If usart < n_usart Then 'comprueba que el bufer de entrada no esta lleno
If usart_imagen(usart) = 0 Then 'comprueba que la posicion esta vacia
aux_usart = usart 'retiene la posicion antigua del bufer
usart = usart + 1 'indica cual sera la posicion siguiente del bufer
usart_imagen(aux_usart) = 1 'indica que hay dato en el bufer de entrada
bufer = 1 'indica que el bufer tiene datos
Hserget usart_bufer(aux_usart) ' carga el dato en el bufer
Else
Hserget usart_bufer(n_usart) 'descarga la usart para que no se bloquee porque el bufer
'de entrada esta lleno
Endif
Else
If usart_imagen(0) = 0 Then 'comprueba que esta vacia la primera posicion del bufer
usart_imagen(0) = 1 'marca que hay dato en esa posicion del bufer
bufer = 1 'marca que el bufer tiene datos
usart = 1 'establece la proxima posicion del bufer
Hserget usart_bufer(0) 'lee la usart y guarda el dato en el bufer

________________________________________________________________
CRFRLTX y CRFRLRX Ver. 1.1 – By COS - 10/06 Dogflu66@yahoo.es
20
Control de Reles a Distancia por Radio Frecuencia (RF)_______________________

Else
Hserget usart_bufer(n_usart) 'descarga la usart porque el bufer esta lleno
Endif
Endif
Endif
PIR1.TMR1IF = 0 'borra el flag de salto del tmr1
PIR1.RCIF = 0 'borra el flag de salto de la usart
PIE1.RCIE = 1 'activa la interrupcion de la USART en modo rx
T1CON.TMR1ON = 1 'habilitacion del TMR1
Resume
pause_ms: 'rutina de espera, rutina tipo Waitms, pause establece el tiempo total en mSeg
aux_pause = 0 'variable auxiliar lleva la cuenta de los ms
timer_1ms = 0 'al borrar el contador se activa y comienza la cuenta de 1mSeg
While aux_pause <= pause 'tiempo en mSeg maximos a contar
aux_pause = aux_pause + 1 'variable auxiliar lleva la cuenta de los ms
If timer_1ms > 0 Then timer_1ms = 0 'al borrar el contador se activa y cuenta 1mSeg
While timer_1ms < 1 'espera un milisegundo
Wend
Wend
Return
'------------------------------ rutinas para el control del bufer del puerto serie-------------
pause_ms_rx: 'rutina de espera antes de leer el bufer, rutina tipo Waitms, w_posrx establece el tiempo total en mSeg
aux_pause = 0 'variable auxiliar lleva la cuenta de los ms
timer_1ms = 0 'al borrar el contador se activa y comienza la cuenta de 1mSeg
While aux_pause <= w_posrx 'tiempo en mSeg maximos a contar
If bufer > 0 Then aux_pause = w_posrx 'si entran datos en el bufer se termina el contaje
aux_pause = aux_pause + 1 'variable auxiliar lleva la cuenta de los ms
If timer_1ms > 0 Then timer_1ms = 0 'al borrar el contador se acitva y cuenta 1mSeg
While timer_1ms < 1 'espera un milisegundo
Wend
Wend
Return
readserial: 'RUTINA DE LECTURA DEL BUFER DEL PUERTO SERIE (ASSII)
Gosub pause_ms_rx 'valor de entrada en mSeg de espera definido por w_posrx
assii = 0 ' se borra el valor de assi, no se debe de utilizar cero como un valor de control
If bufer = 1 Then 'si bufer tiene datos
assii = usart_bufer(c_serial) 'se lee el valor del bufer y se asigna assi
usart_imagen(c_serial) = 0 'se marca como leida para que pueda ser llenada de nuevo
c_serial = c_serial + 1 'se incrementa el indice del bufer
If c_serial >= n_usart Then c_serial = 0 'se verifica si se llego al final del bufer
If usart_imagen(c_serial) = 0 Then bufer = 0 'si no quedan mas datos en el bufer se marca como vacio
Endif
Return
clear_bufer:
For n = 0 To 1 'desbloquea el puerto serie fisico en caso de bloqueo por exceso de entrada de datos
T1CON.TMR1ON = 0 'bloquea timer1
PIE1.RCIE = 0 'deshabilita la interrupcion del modulo serie
RCSTA.CREN = 0 'protocolo de desbloqueo puerto serie
RCSTA.CREN = 1 'protocolo de desbloqueo puerto serie
RCSTA.OERR = 0 'protocolo de desbloqueo puerto serie
Next n
Gosub clearbufer 'borra el bufer por soft de los datos recibidos por el puerto serie
PIR1.TMR1IF = 0 'borra el flag de salto del tmr1
PIR1.RCIF = 0 'borra el flag de salto de la usart
PIE1.RCIE = 1 'activa la interrupcion de la USART en modo rx
T1CON.TMR1ON = 1 'habilitacion del TMR1
Return
clearbufer: 'BORRA E INICIALIZA EL BUFER IMAGEN DEL PUERTO SERIE
For c_serial = 0 To n_usart 'pasa por cada uno de los bytes del bufer
usart_imagen(c_serial) = 0 'borra bytes del bufer apuntador,
'que nos indica si esa posición del bufer tiene datos
Next c_serial 'repite hasta el total del bufer
c_serial = 0 'borra el contador
usart = 0 'borra variable de control
bufer = 0 'borra variable de control, a 1 indica que hay datos en el bufer de entrada
assii = 0 'borra el ultimo caracter leido
Return
END

________________________________________________________________
CRFRLTX y CRFRLRX Ver. 1.1 – By COS - 10/06 Dogflu66@yahoo.es
21

Вам также может понравиться