[code]'***************** 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 para la placa nº1
s2 = 0 'no hay nada para para la placa nº2
s3 = 0 'no hay nada para para la placa nº3
s4 = 0 'no hay nada para para la placa nº4
s5 = 0 'no hay nada para para la placa nº5
s6 = 0 'no hay nada para para la placa nº6
s7 = 0 'no hay nada para para la placa nº7
start = 0 'no estan habilitadas las teclas de maniobra
stop = 0 'no se envia comando de cancelacion
'--------------------------------------DEFINICION DE PUERTOS------------------------------------------------
'--------------------------------ASIGNACION DE I/O y valores de inicion 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 'cofigurado 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
'--------------------------------------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-------------------------------------------
'--------------------------------------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 'calcual 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
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
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 tempriza 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 tempriza la maniobra
If timer2_100ms <= 100 Then Gosub led2_off 'led a on mientras el Rx tempriza 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 establese 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 miliesegundo
Wend
Wend
Return
'--------------------------------------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