Emisor RF (433MHz) para HCS101. Aplicación: Control de persiana motorizada
Este proyecto lo he programado desde cero según el protocolo usado por los chip HCS101 de microchip. Estos chips son usados ampliamente en codificadores RF para apertura de puertas de garaje, control de persianas motorizadas, dimmers, etc.
Podéis ver el protocolo de la comunicación usada por este chip en su datasheet.
Código:
Program Envio_Comandos_RF
' Envios de comandos RF con modulo TM50-1 a persiana motorizada
' Protocolo HCSx01 (usado por Chip HCS101 de Microchip)
' *******************************************************************************
' (c) Autor: ZackY - zackyzgz@yahoo.es
'
' HARDWARE:
' MCU: PIC 16F84A
' Cristal: 4 Mhz
' 1- Emisor RF TM50-1 conectado a PORTB.3
' 2- Pulsadores conectados a PORTB.0
' *******************************************************************************
const Te = 400 ' Tiempo de pulso (usg)
const Funcion_Subir = %10010001 ' Comando subir persiana IZQ
const Funcion_Bajar = %01000001 ' Comando bajar persiana IZQ
const Funcion_Stop = %01100001 ' Comando stop persiana IZQ
dim S3_cc_func as word ' Serial Nº3 + 00 + Function
dim S3_cc_subir as word ' Serial Nº3 + Function SUBIR
dim S3_cc_bajar as word ' Serial Nº3 + Function BAJAR
dim Counter as word ' Contador de pulsaciones
dim S1a as word ' Serial Nº1 primera parte
dim S1b as word ' Serial Nº1 segunda parte
Dim i as byte ' Usado para bucles
Dim Pulsado as byte ' Para evitar rebites de pulsador
' Sub-rutina para generar Preamble (23Te) y Cabecera (10Te)
' 12 pulsos de 400 usg y 4 msg hasta comienzo de datos
Sub procedure Env_Cabecera_RF()
For i = 1 to 12
Delay_us(Te) ' Envio Preamble: Tp = 23Te
Setbit(PORTB,3)
Delay_us(Te)
Clearbit(PORTB,3) ' Se envia un ultimo Te a cero
next i
Delay_us(10*Te) ' Tiempo de Cabecera Th=10Te
End sub
' Sub-rutina para envio de bit RF
Sub procedure Env_bit_RF (dim bitenv as byte)
If bitenv = 1 then
Setbit(PORTB,3) 'Envia 1
Delay_us(Te)
Clearbit(PORTB,3)
Delay_us(2*Te)
else
Setbit(PORTB,3) 'Envia 0
Delay_us(2*Te)
Clearbit(PORTB,3)
Delay_us(Te)
End if
End sub
' Sub-rutina para envio de word RF
Sub procedure Env_word_RF (dim wordenv as word)
For i = 0 to 15
Env_bit_RF(wordenv.0)
wordenv = wordenv >> 1
Next i
End sub
Main:
TRISB = %00000011 ' PORTB.0 y .1 como Entradas y .3 como Salida
PORTB.3 = 0 ' Salida a 0
Pulsado = 0 ' Pulsador sin activar
S3_cc_subir = %1111000101110111 ' Serial Nº3 + Funcion Subir
S3_cc_stop = %0110000101110111 ' Serial Nº3 + Funcion Subir
S3_cc_bajar = %0100000101110111 ' Serial Nº3 + Funcion Bajar
Counter = %0000001110000101 ' Contador de pulsaciones (901)
S1a = %0100110100111010 ' Serial Nº1 primera parte
S1b = %1101011001100010 ' Serial Nº1 segunda parte
Inicio:
While true
If PORTB.0 = 0 then ' SUBIR Persiana IZQ
If Pulsado = 0 then ' ¿Nueva pulsación?
Counter = Counter + 1
Pulsado = 1
End if
Env_Cabecera_RF 'Envia Cabecera - Tp+Th = 33Te
'Envia Stream de DATOS
Env_word_RF(S3_cc_subir)
Env_word_RF(Counter)
Env_word_RF(S1a)
Env_word_RF(S1b)
Env_bit_RF(0) ' VLow
Env_bit_RF(1) ' Envia Fin de stream = 1
Delay_us(39*Te) ' Envia Tg = 39Te
End if
If PORTB.1 = 0 then ' BAJAR Persiana IZQ
If Pulsado = 0 then ' ¿Nueva pulsación?
Counter = Counter + 1
Pulsado = 1
End if
Env_Cabecera_RF 'Envia Cabecera - Tp+Th = 33Te
'Envia Stream de DATOS
Env_word_RF(S3_cc_bajar)
Env_word_RF(Counter)
Env_word_RF(S1a)
Env_word_RF(S1b)
Env_bit_RF(0) ' VLow
Env_bit_RF(1) ' Envia Fin de stream = 1
Delay_us(39*Te) ' Envia Tg = 39Te
End if
If PORTB.0 = 1 then
Pulsado = 0
End if
Wend
End.
La variable " Contador" es usada para llevar la cuenta del número de pulsaciones (nº de usos) del dispositivo emisor. El receptor no acepta contadores inferiores al último recibido. Osea, si se le envía un comando con la variable contador por debajo de la almacenada en el receptor (en una emisión de comandos anteriores), el receptor no ejecutará el comando. Se puede mantener la variable Contador a un valor fijo. De esta forma si funciona el receptor (al menos en el sistema de control de persinas donde yo lo he usado).
Para cualquier duda sobre este código, podéis postearla en este hilo.
|