Autor Tema: Emular UM3750 con Pic 16f84  (Leído 7259 veces)

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

Desconectado randall

  • PIC10
  • *
  • Mensajes: 10
Emular UM3750 con Pic 16f84
« en: 18 de Mayo de 2009, 09:16:46 »
Hola compañeros, acabo de encontrar estos foros y me parecen fantasticos los temas que aqui se tratan.El tema que me ocupa es la emulación de un mando a distancia basado en el encoder UM3750.
Estoy haciendo unas pruebas con el pic 16f84  para transmitir codigo compatible con el decoder UM3750.Tengo el datasheet del UM3750 y el formato de transmision de codigo con los tiempos ajustados para un oscilador RC de 100Khz, el problema es que no consigo ajustar los tiempos para usar como oscilador un cristal  a 4Mhz y que la transmision sea aceptada por el receptor con UM3750.
Estoy interesado en emular con 16f84 codigo UM3750 (binario 12 bits),  motorola 145026 (trinario 9 bits) y rolling code.Hasta ahora solo he podido emular el rolling HCS101, con el motorola todavia no me he puesto y con el UM3750 me he quedado atascado.
Si alguno de vosotros dispone de algo de codigo aprovechable para lo que quiero tanto para el codigo binario como para el trinario y me lo puede pasar le estaria muy agradecido asi como  si alguno de vosotros tiene conocimientos del tema y quiere que desarrollemos esto en comun pues mejor que mejor.Espero que alguno de ustedes tenga alguna solucion para poder seguir para adelante.

Un saludo a todos y gracias anticipadas.

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Emular UM3750 con Pic 16f84
« Respuesta #1 en: 18 de Mayo de 2009, 10:35:26 »
Estaría bueno que pongas el código, así detectamos cual es el problema de no poder ajustar los tiempos...
No contesto mensajes privados, las consultas en el foro

Desconectado randall

  • PIC10
  • *
  • Mensajes: 10
Re: Emular UM3750 con Pic 16f84
« Respuesta #2 en: 18 de Mayo de 2009, 15:18:03 »
Hola Suki, muchas gracias por tu interes y por la rapidisima respuesta.
He vuelto a modificar los tiempos del codigo y he colocado en las constantes S  y Ti los que aparecen en el datasheet  para osc  de 100Khz.YO tengo un emisor preparado con un pic 16f84 y un oscilador de cristal a 4 Mhz. Pero el receptor original no me lo lee.En cambio transmito con un mando original y el receptor manda la orden al rele.Por lo que deduzco que el receptor esta en buenas condiciones el fallo es el codigo transmitido, bien por protocolo o bien por los tiempos.

Aqui os dejo el codigo que tengo escrito.Esta en basic  para compilar con el mikrobasic.

  Program Envio_Comandos_RF
' Envios de comandos RF con modulo TM50-1 a puerta automatica
' Protocolo UM3750
' **********************************************************************
'  (c) Autor: Randall   
'
' HARDWARE:
'    MCU: PIC 16F84A
'    Cristal: 4 Mhz
'    1- Emisor RF TM50-1 conectado a PORTB.3
'    1- Pulsador conectado a PORTB.2
' **********************************************************************
 const Te = 400
 const Ti=  320         ' Tiempo de pulso (usg)
 const S= 11200      ' Tiempo de space a cero (usg)
 Dim i          as byte   ' Usado para bucles
 Dim Pulsado    as byte   ' Para evitar rebotes de pulsador

       ' Sub-rutina para generar space 11,52ms (11,2  +  0,32)
       Sub procedure Env_space_RF()
            Delay_us(S)
            Setbit(PORTB,3)
            Delay_us(Ti)            ' Envio espace a cero
            Clearbit(PORTB,3)
       End sub
       Sub procedure Env_codigo_RF()
            For i = 1 to 12
               Delay_us(Ti*2)
               Setbit(PORTB,3)     'Envia 12  unos seguidos
               Delay_us(Ti)
               Clearbit(PORTB,3)
            next i
       End sub
Main:
  TRISB = %00000111    ' PORTB.0 1 y 2 como Entradas y .3 como Salida
  PORTB.3 = 0         ' Salida a 0
  Pulsado = 0         ' Pulsador sin activar

Inicio:
  While true

       If PORTB.2 = 0 then
         If Pulsado = 0 then       ' ¿Nueva pulsación?
            Pulsado = 1
         End if

         Env_space_RF       'Envia espace
         Env_codigo_RF

       End if
      If PORTB.2 = 1 then
         Pulsado = 0
      End if

  Wend
End.

Espero que entre todos podamos buscarle una solucion, no creo que sea demasiado complicado pero me esta ganando de momento.

Un saludo y gracias de nuevo.

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Emular UM3750 con Pic 16f84
« Respuesta #3 en: 18 de Mayo de 2009, 15:43:55 »
Puede ser las instrucciones Delay_us(Ti*2) y For i = 1 to 12. Dado que llevan un cierto uso de instrucciones que no se tiene en cuenta y pierde sincronismo. Es lo único que veo que pueda estar afectando en las temporizaciones, porque el protocolo esta correcto. Yo no manejo Basic, pero para solucionar eso yo vería el código asm generado, para ver cuanto se demora en estas intrucciones y retocar los valores de los delays.
No contesto mensajes privados, las consultas en el foro

Desconectado randall

  • PIC10
  • *
  • Mensajes: 10
Re: Emular UM3750 con Pic 16f84
« Respuesta #4 en: 18 de Mayo de 2009, 17:40:15 »
Hola Suky, a ver,he modificado  un poco el codigo para quitar el FOR, he colocado un codigo aleatorio uno a uno sin utilizar el ciclo.Te pongo el codigo resultante:

 Program Envio_Comandos_RF
' Envios de comandos RF con modulo TM50-1 a puerta automatica
' Protocolo UM3750
' **********************************************************************
'  (c) Autor: Randall
'
' HARDWARE:
'    MCU: PIC 16F84A
'    Cristal: 4 Mhz
'    1- Emisor RF TM50-1 conectado a PORTB.3
'    1- Pulsador conectado a PORTB.2
' **********************************************************************
 const Te = 400
 const Ti=  320         ' Tiempo de pulso (usg)
 const S= 11200      ' Tiempo de space a cero (usg)
 Dim i          as byte   ' Usado para bucles
 Dim Pulsado    as byte   ' Para evitar rebotes de pulsador

       ' Sub-rutina para generar space 11,52ms (11,2  +  0,32)
       Sub procedure Env_space_RF()
            Delay_us(S)
            Setbit(PORTB,3)
            Delay_us(Ti)            ' Envio espace a cero
            Clearbit(PORTB,3)
       End sub
       Sub procedure Bajo()
               Delay_us(Ti*2)
               Setbit(PORTB,3)     'Envia  un bit bajo (cero)
               Delay_us(Ti)
               Clearbit(PORTB,3)
       End sub
       Sub procedure Alto()
                 Delay_us(Ti)
               Setbit(PORTB,3)     'Envia 1  bit alto (uno)
               Delay_us(Ti*2)
               Clearbit(PORTB,3)
        End sub


Main:
  TRISB = %00000111    ' PORTB.0 1 y 2 como Entradas y .3 como Salida
  PORTB.3 = 0         ' Salida a 0
  Pulsado = 0         ' Pulsador sin activar

Inicio:
  While true

       If PORTB.2 = 0 then
         If Pulsado = 0 then       ' ¿Nueva pulsación?
            Pulsado = 1
         End if
          Env_space_RF
          Bajo
          Alto
          Bajo
          Bajo
          Bajo
          Alto
          Bajo
          Alto
          Bajo
          Alto
          Alto
          Bajo
         


End if
      If PORTB.2 = 1 then
         Pulsado = 0
      End if

  Wend
End.



Bueno  pues ahora con este codigo funciona perfectamente, cambio los pines del receptor para hacerlos coincidir con los de la transmision y se activa el rele de salida del receptor.Perfecto

Pero ahora viene lo bueno de todo.Vuelvo a compilar el codigo anterior para tratar de averiguar porque ahora si y antes no, compilo grabo el pic   , cambio los pines del receptor todos a cero   y RESULTA QUE FUNCIONA TAMBIEN y no tengo ni idea del porqué.No se que he hecho ahora diferente a lo que hacia antes, yo creo que he hecho lo mismo pero claro  algo haria mal antes.En fin....

Bueno ahora me voy a poner con el protocolo trinario, tipo MC145026.Si alguno dispone de algo de codigo ya hecho pues mejor que mejor.Estaria muy agradecido.

Muchas gracias Suky por tu interes y ayuda.

Saudos
Muchas grac

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Emular UM3750 con Pic 16f84
« Respuesta #5 en: 18 de Mayo de 2009, 17:56:20 »
Seguro que estas grabado el *.hex del anterior? capaz se mezclaron  :mrgreen: Buenísimo entonces que funcione! Y si tenes problemas con el trinario a preguntar, si podemos, ayudaremos  :-)
No contesto mensajes privados, las consultas en el foro

Desconectado randall

  • PIC10
  • *
  • Mensajes: 10
Re: Emular UM3750 con Pic 16f84
« Respuesta #6 en: 19 de Mayo de 2009, 18:04:27 »
Hola Suky, he estado buscando los datasheets del 145026  y entiendo lo que son los tres estados y entiendo mas o menos el protocolo de envio  pero lo que no aparece nada es referente a los tiempos de dutración.Si pudieras echarme una mano te lo agradeceria.
Y una cosas mas   he mirado tambien los datasheet del holtek HT12  ,¿este encoder  es compatible con el UM3750, no es asi?? creo quie el protocolo de envio es exactamente igual que el del UM3750.

Un saludo y gracias por tu ayuda de nuevo.

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Emular UM3750 con Pic 16f84
« Respuesta #7 en: 20 de Mayo de 2009, 00:49:09 »
Hola Suky, he estado buscando los datasheets del 145026  y entiendo lo que son los tres estados y entiendo mas o menos el protocolo de envio  pero lo que no aparece nada es referente a los tiempos de dutración.Si pudieras echarme una mano te lo agradeceria.

La Frecuencia depende de los valores de 2 capacitores y una resistencia:

Sacado de este datasheet

Y una cosas mas  he mirado tambien los datasheet del holtek HT12  ,¿este encoder  es compatible con el UM3750, no es asi?? creo quie el protocolo de envio es exactamente igual que el del UM3750.
Realmente no se! lo que vi que el HT12 trabaja a 150 kHz, y el UM3750 trabaja a 100kHz no es cierto?
No contesto mensajes privados, las consultas en el foro

Desconectado randall

  • PIC10
  • *
  • Mensajes: 10
Re: Emular UM3750 con Pic 16f84
« Respuesta #8 en: 20 de Mayo de 2009, 19:29:20 »
Hola Suky, sigo haciendo pruebas con el nuevo protocolo MM145026.
Dispongo de una maquina que me lee lo que emiten los mandos a distancia.Codigo, frecuencia, tiempos emitiendo con un mando sobre ella.Y hecho esto , la maquina me indica si es trinario, binario etc y la posicion de los dips.Alguna cosa debo hacer mal en el ptrotocolo del MM145026 porque cuando grabo el pic y emito sobre la maquina , esta me reconoce que es trinario pero el codigo que aparece sobre la pantalla no se corresponde con el grabado en el 16f84.Por lo menos   he consegido que me reconozca que es trinario, algo es algo.Ahora debo de averiguar porque falla el codigo.He cogido un mando original y he emitido sobre la maquina para ver los tiempos y luego he ido ajustando los del pic  hasta aproximarlos a los del original.Aqi te dejo el codigo que tengo a ver si ves donde puede fallar el protocolo para intentar una transmision reconocida por la maquina.Ni que decir tiene que el sofware de la maquina esta preparado de tal manera que el el momento que detecte una transmision correspondiente a un MM145026  nos la muestra en pantalla  con la posicion de los microinterruptores, ahora bien, esta transmision debe estar totalmente acorde al protocolo exigido por el MM145026  y ahi creo que es donde falla mi codigo.A ver si ves tu el error.

Program Envio_Comandos_RF
' Envios de comandos RF con modulo TM50-1 a puerta automatica
' Protocolo MM145026
' **********************************************************************
'  (c) Autor: Randall
'
' HARDWARE:
'    MCU: PIC 16F84A
'    Cristal: 4 Mhz
'    1- Emisor RF TM50-1 conectado a PORTB.3
'    1- Pulsador conectado a PORTB.2
' **********************************************************************
 const Te = 400
 const Ti=  400      ' Tiempo de pulso (usg)
 const S= 14000      ' Tiempo de space a cero (usg)
 const E = 19200
 Dim i          as byte   ' Usado para bucles
 Dim Pulsado    as byte   ' Para evitar rebotes de pulsador

       ' Sub-rutina para generar space 11,52ms (11,2  +  0,32)
       Sub procedure Env_inicio_RF()
            Delay_us(S)
            clearbit(PORTB,3)
       End sub

       Sub procedure Env_inter_RF()
            Delay_us(E)
            clearbit(PORTB,3)
       End sub

       Sub procedure Bajo()
               Delay_us(Ti)
               Clearbit(PORTB,3)     'Envia  un bit bajo (cero)
               Delay_us(Ti)
               setbit(PORTB,3)     'Envia  un bit bajo (cero)
               Delay_us(Ti*7)
               clearbit(PORTB,3)
               Delay_us(Ti)
               setbit(PORTB,3)
               Delay_us(Ti*6)
               clearbit(PORTB,3)
       End sub
       Sub procedure Alto()
                 Delay_us(Ti)
               clearbit(PORTB,3)     'Envia 1  bit alto (uno)
               Delay_us(Ti*7)
               setbit(PORTB,3)
               Delay_us(Ti)
               clearbit(PORTB,3)
               Delay_us(Ti*7)
               setbit(PORTB,3)
       End sub
       Sub procedure Abierto()
               Delay_us(Ti)
               clearbit(PORTB,3)     'Envia 1  bit alto (uno)
               Delay_us(Ti*7)
               setbit(PORTB,3)
               Delay_us(Ti)
               clearbit(PORTB,3)
               Delay_us(Ti)
               setbit(PORTB,3)
               Delay_us(Ti*6)
               clearbit(PORTB,3)
       End sub

Main:
  TRISB = %00000111    ' PORTB.0 1 y 2 como Entradas y .3 como Salida
  PORTB.3 = 0         ' Salida a 0
  Pulsado = 0         ' Pulsador sin activar

Inicio:
  While true

       If PORTB.2 = 0 then
         If Pulsado = 0 then       ' ¿Nueva pulsación?
            Pulsado = 1
         End if
          Env_inicio_RF
          Bajo
          Alto
          Bajo
          Abierto
          Bajo
          Alto
          Bajo
          Alto
          Abierto
          Env_inter_RF
          Bajo
          Alto
          Bajo
          Abierto
          Bajo
          Alto
          Bajo
          Alto
          Abierto



End if
      If PORTB.2 = 1 then
         Pulsado = 0
      End if

  Wend
End.


Un saludo Suky y de nuevo muchisimas gracias por tu interes y paciencia conmigo.

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Emular UM3750 con Pic 16f84
« Respuesta #9 en: 20 de Mayo de 2009, 19:55:31 »
Estuve mirando el envío de ceros. Creo que esta mal el código, por ejemplo bajo seria así:

Código: [Seleccionar]
Sub procedure Bajo()
               Clearbit(PORTB,3)     'Envia  un bit bajo (cero)
               Delay_us(Ti)
               setbit(PORTB,3)                   
               Delay_us(Ti)
               Clearbit(PORTB,3)     
               Delay_us(Ti*7)
               setbit(PORTB,3)   
               Delay_us(Ti)
               clearbit(PORTB,3)
               Delay_us(Ti*6)
               End sub

Los otros no los mire, revisalos...
No contesto mensajes privados, las consultas en el foro

Desconectado randall

  • PIC10
  • *
  • Mensajes: 10
Re: Emular UM3750 con Pic 16f84
« Respuesta #10 en: 21 de Mayo de 2009, 09:09:30 »
Gracias Suky, lo voy a probar, lo puse asi porque en un website   vi un codigo que colocaban los delay por delante del envio del bit  y parece ser que funcionaba.Esta tarde probare a colocarlo de la manera que tu indicas y comento resultados.
Un saludo y gracias

Desconectado randall

  • PIC10
  • *
  • Mensajes: 10
Re: Emular UM3750 con Pic 16f84
« Respuesta #11 en: 05 de Septiembre de 2009, 06:49:28 »
Hola Suki, he probado el codigo y va bastante bien.Ahora lo que me interesaria hacer seria que el programa permutara parte del codigo por si mismo.
Es decir, ahora el codigo que se transmite ( compatible con MM145026) es siempre el mismo, el que se coloca en el software del pic ( Bajo, alto, bajo, etc...) y asi con  las 9 posiciones. Me gustaria que el programa,( cuando se pulsara el boton) transmitiera un codigo fijo de los siete primeros codigos  y permutara automaticamente las 9 posibles posiciones de los 2 ultimos codigos.
Osea, meter en el codigo los 7 primerosdigitos fijos y que luego el programa transmitiera el codigo formado por esos 7 primeros codigos mas todas las posibles combinaciones de los 2 ultimos.  (bajo bajo , bajo abierto, bajo alto, abierto bajo , abierto abierto, abierto alto, alto bajo, alto abierto, alto alto) transmitiendo cada codigo diferente unos 500 milisegundos cada uno antes de pasar al siguiente de la combinacion.

he probado unas cosas pero no funcionan muy bien.A ver si me puedes echar una mano.

Saludos y gracias.

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Emular UM3750 con Pic 16f84
« Respuesta #12 en: 05 de Septiembre de 2009, 11:12:26 »
Hola randall! Hoy me mareaste con tantos códigos  :D Haber si entendí, quieres enviar un código donde los primeros 7 bytes sean fijos más 2 bytes que sean todas las posibles combinaciones? Todo esto cada 500ms?

Si es así primero que nada crea una función que solo se dedique a enviar un byte cualquiera que se le ingrese como parámetro, como yo no manejo basic no se como se hará eso  :? Luego Otra función que generé las variaciones para los últimos 2 bytes, entonces de esta manera en el programa principal llamas a estas funciones y puedes hacer las combinaciones que quieras  :-)



Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado randall

  • PIC10
  • *
  • Mensajes: 10
Re: Emular UM3750 con Pic 16f84
« Respuesta #13 en: 05 de Septiembre de 2009, 11:32:27 »
Jajajaaj ya siento haberte despertado de estas maneras, otra vez intentare expresarme un poquito mejor, :lol:jejeje.
Lo que quiero hacr es precisamente lo que comentas, el problema es que no tengo ni idea de como se hace, ya he probado alguna cosa con bucles pero no funciona.Y tampoco se como hacer eso de las funciones que tu me indicas, mi nivel en programacion es mas bien bajo.Pero intentare buscar un poco por las ayudas a ver si se me ocurre como hacerlo.

No obstante si algun compañero sabe como crear ese codigo le estaria muy agradecido.

Muchas gracias Suki por tu amabilidad, seguiremos en contacto.
Saludos

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Emular UM3750 con Pic 16f84
« Respuesta #14 en: 05 de Septiembre de 2009, 11:44:32 »
Revisa el subforo de Basic, allí hay mucha información  :tongue: Y sino crea la consulta de como crear funciones, manejarlas y todas esas dudas.




Saludos!
No contesto mensajes privados, las consultas en el foro