Foros ZackYFileS

Foros ZackYFileS (http://foros.zackyfiles.com/index.php)
-   PROGRAMACIÓN Microcontroladores: PICs , AVRs. (http://foros.zackyfiles.com/forumdisplay.php?f=437)
-   -   Emisor RF (433MHz) para HCS101. Aplicación: Control de persiana motorizada (http://foros.zackyfiles.com/showthread.php?t=524178)

ZackY 28/07/2007 16:45

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.

ZackY 28/07/2007 16:52

Para la Recepción y Decodificación se puede usar un microcontrolador PIC como recomienda el fabricante:

AN740, Decoding the HCS101 for Non-Secure Applications


La franja horaria es GMT +2. Ahora son las 00:02.

Powered por vBulletin™ Version 3.8.10
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.
Traducido por vBsoporte - vBulletin en español
ZackYFileS - Foros de Debate