TODOPIC

Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: dogflu66 en 01 de Noviembre de 2006, 18:25:27

Título: Control de Reles a Distancia por RF
Publicado por: dogflu66 en 01 de Noviembre de 2006, 18:25:27
Hola panas por aqui ire dejando un nuevo articulo, en este caso para trabajar con los modulos de RF de Laipac y Aurel

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.
Los módulos mostrados en la imagen son de Laipac y Aurel compatibles entre si, el 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 comunicar que estos dos circuitos solo los 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 hay que comenzar la siempre con un BYTE de inicio el 0, 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 funcionen bien si antes no se toman estas medidas.

El esquema del circuito de 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.
Título: Re: Control de Reles a Distancia por RF
Publicado por: dogflu66 en 01 de Noviembre de 2006, 18:27:18
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.

La tecla STOP, si es pulsada, anula todas las ordenes que todavía estén en el proceso de temporizacion. En este caso un pequeño pulso es suficiente para activar el mecanismo de apertura de una puerta automática de garaje.

El circuito de 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 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 parpadeos en que estado se encuentra el circuito.
Título: Re: Control de Reles a Distancia por RF
Publicado por: Nocturno en 01 de Noviembre de 2006, 18:39:42
Magnífico artículo, Carlos, pero se te han olvidado las fotos / esquemas...
Título: Re: Control de Reles a Distancia por RF
Publicado por: dogflu66 en 01 de Noviembre de 2006, 18:43:20
jajajajajajajaja, estoy en ello..  :mrgreen:
Título: Re: Control de Reles a Distancia por RF
Publicado por: dogflu66 en 01 de Noviembre de 2006, 19:15:55
Esquema del mando Tx:

http://img169.imageshack.us/img169/6264/crfrltx11hi1.jpg

Asi queda:

(http://img239.imageshack.us/img239/2457/crfrtxsmo0.jpg)

(http://img239.imageshack.us/img239/1472/crfrtxiys6.jpg)
Título: Re: Control de Reles a Distancia por RF
Publicado por: dogflu66 en 01 de Noviembre de 2006, 19:21:03
Esquema del Rx:

http://img520.imageshack.us/img520/4706/crfrlrx11sj9.jpg

Asi queda:

(http://img239.imageshack.us/img239/318/crfrrxszr6.jpg)

(http://img239.imageshack.us/img239/8723/crfrrxild3.jpg)
Título: Re: Control de Reles a Distancia por RF
Publicado por: Nocturno en 01 de Noviembre de 2006, 19:23:25
Ahora sí, jeje, esquema, fotos y todo lujo de detalles. Gracias.

Por cierto, ¿cómo estañas las placas?
Título: Re: Control de Reles a Distancia por RF
Publicado por: dogflu66 en 01 de Noviembre de 2006, 19:26:55
Lo hago con bomba, mientras funde estaño absorbe el sobrante.

Pero eso solo lo hice porque no tenia barniz para circuito impreso en ese momento...  :D
Título: Re: Control de Reles a Distancia por RF
Publicado por: dogflu66 en 01 de Noviembre de 2006, 19:28:53
Los protagonistas (modulos de RF):

(http://img176.imageshack.us/img176/3769/picrfmodulosforoka3.jpg)
Título: Re: Control de Reles a Distancia por RF
Publicado por: doppel en 01 de Noviembre de 2006, 19:32:28
Hola Carlos!!
Magnifico proyecto, Felicitaciones y gracias por compartirlo
 :-/
Título: Re: Control de Reles a Distancia por RF
Publicado por: dogflu66 en 01 de Noviembre de 2006, 19:42:58
Gracias Hernan.

Tengo que añadir que los modulos de Aurel de tx, son compatibles entre si.
El modulo C-0503 también funciona a 12Vdc


PD. Corregido porque puede dar a error
el modulo C-0503 tiene dos entradas de datos una para cuando trabaja alimentado a 5Vdc y otra distinta para trabajar a 12Vdc
Título: Re: Control de Reles a Distancia por RF
Publicado por: dogflu66 en 01 de Noviembre de 2006, 19:44:37
Proximamente mas sobre la trama de datos y los programas de ambas placas.
Título: Re: Control de Reles a Distancia por RF
Publicado por: LordLafebre en 01 de Noviembre de 2006, 20:01:34
Hola:

Master, andas que no paras... a ver si pronto terminas todos los proyectos pendientes, se ve muy bien las plaquitas y de seguro funcionan mejor.  :-/
Título: Re: Control de Reles a Distancia por RF
Publicado por: dogflu66 en 01 de Noviembre de 2006, 20:15:10
Si maistro estoy en ello como puedes ver, voy publicando segun termino los articulitos...
es que si haces el proyectito y no se hace una pequeña memoria queda como si no se hubiese hecho nada.
como ya te comente estoy quedandome con uno de cada para dejarlos en la estanteria entre los libros...  :D :mrgreen:
Título: Re: Control de Reles a Distancia por RF
Publicado por: PAOLA09 en 01 de Noviembre de 2006, 20:25:04
Pero no te quedas quieto, siempre sorprendiendonos con algo nuevo  :)
Título: Re: Control de Reles a Distancia por RF
Publicado por: tithanae en 02 de Noviembre de 2006, 10:59:37
Estimado dogflu66  te cuento que mientras realizavas tu articulo me llegaron los modulos de aurel el identicos a los tuyos y me caeria de perrilla una colaboracion tuya ya que los sabes utilizar,   serias tan amable de informarme que tipo de trama utilizar para realizar la comunicacion y si no es mucha molestia el programa de tx y rx para que me ayude un poquito.............de antemano muchas gracias
Título: Re: Control de Reles a Distancia por RF
Publicado por: dogflu66 en 02 de Noviembre de 2006, 11:16:25
Proximamente mas sobre la trama de datos y los programas de ambas placas.

Estoy adecentando esa parte del articulo, apenas lo tenga listo lo publico.
Título: Re: Control de Reles a Distancia por RF
Publicado por: dogflu66 en 03 de Noviembre de 2006, 03:56:00
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 esta contenido en 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:

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

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

Como el modulo 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 perdida de datos continua, puede que se pueda utilizar otro que nos genere un mejor rendimiento.
Título: Re: Control de Reles a Distancia por RF
Publicado por: tithanae en 03 de Noviembre de 2006, 05:55:40
dogfju66 gracias por la info cuando yo la tenga andando te cuento
Título: Re: Control de Reles a Distancia por RF
Publicado por: aitopes en 03 de Noviembre de 2006, 09:10:37
Muy buen trabajo Dogflu66....y sobre todo, excelente documentación. Gracias!
Título: Re: Control de Reles a Distancia por RF
Publicado por: dogflu66 en 03 de Noviembre de 2006, 13:15:29
Gracias Panas

proximamente el software
Título: Re: Control de Reles a Distancia por RF
Publicado por: Azicuetano en 03 de Noviembre de 2006, 14:02:36
Gracias Dogflu,

Un proyecto muy interesante con el que estoy seguro que muchísima gente va a disfrutar como enanos (yo incluido  :mrgreen: :mrgreen: :mrgreen:).

Un saludo desde Alicante.
Título: Re: Control de Reles a Distancia por RF
Publicado por: dogflu66 en 05 de Noviembre de 2006, 21:22:34
Aqui dejo el programita del Tx:

Código: Visual Basic
  1. [code]'***************** CONTROL DE RELES A DISTANCIA POR RF ***************************************
  2. 'NOMBRE: 16F876_CRFRLTX
  3. 'VERSION/Autor: 1.1/By COS 11/06
  4. 'MICRO: PIC16f876A,8Mhz
  5. 'DESCRIPCION: Control de reles a distancia utilizando transmision de datos por radio frecuencia
  6. 'Version: 1.0
  7. 'Version: 1.1
  8. 'se repara el codigo del led de la tecla start que no encendia
  9. '************************************************************************************************
  10. '--------------------------------------DEFINICION DE VARIABLES-------------------------------------
  11. '-------------------------------------Variables del contador del TIMER1----------------------------
  12. Dim pause As Word                       'contiene el valor para simular el comando Waitms
  13. Dim aux_pause As Word           'variable auxiiar
  14. Dim basetimer_1ms As Byte       'base de tiempos raiz
  15. Dim timer_1ms As Byte           'base de tiempos se incrementa cada 1mSeg
  16. Dim timer_100ms As Word         'base de tiempos se incrementa cada 100mSeg
  17. Dim timer1_100ms As Byte        'base de tiempos se incrementa cada 100mSeg
  18. Dim timer2_100ms As Byte        'base de tiempos se incrementa cada 100mSeg
  19. Dim timer3_100ms As Byte        'base de tiempos se incrementa cada 100mSeg
  20. Dim timer4_100ms As Byte        'base de tiempos se incrementa cada 100mSeg
  21. Dim timer5_100ms As Byte        'base de tiempos se incrementa cada 100mSeg
  22. Dim timer6_100ms As Byte        'base de tiempos se incrementa cada 100mSeg
  23. Dim timer7_100ms As Byte        'base de tiempos se incrementa cada 100mSeg
  24. '--------------------------------------Variables Programa------------------------------------------
  25. Dim grupo As Byte  'nombre del grupo de trabajo
  26. Dim n_placa As Byte  'numero de la placa dentro de la red
  27. Dim estado As Byte  'accion a tomar por la placa remota
  28. Dim checsum As Byte  'control de errores de la trama
  29. Dim s1 As Byte  'habilita las operaciones de la tecla P1, parpadeo led, temporizacion, envio trama
  30. Dim s2 As Byte  'habilita las operaciones de la tecla P2, parpadeo led, temporizacion, envio trama
  31. Dim s3 As Byte  'habilita las operaciones de la tecla P3, parpadeo led, temporizacion, envio trama
  32. Dim s4 As Byte  'habilita las operaciones de la tecla P4, parpadeo led, temporizacion, envio trama
  33. Dim s5 As Byte  'habilita las operaciones de la tecla P5, parpadeo led, temporizacion, envio trama
  34. Dim s6 As Byte  'habilita las operaciones de la tecla P6, parpadeo led, temporizacion, envio trama
  35. Dim s7 As Byte  'habilita las operaciones de la tecla P7, parpadeo led, temporizacion, envio trama
  36. Dim start As Byte  'habilita las demas teclas al pulsar la tecla Start
  37. Dim stop As Byte  'anula las secuencias que se estan procesando de cada una de las placas, tecla Stop
  38. '-----------------------------------------------ASIGNACIONES----------------------------------------
  39. '-------------------------------------Asigna valores a las variables--------------------------------
  40. aux_pause = 0
  41. pause = 0
  42. basetimer_1ms = 0  'on
  43. timer_1ms = 255  'off
  44. timer_100ms = 255  'off
  45. timer1_100ms = 255  'off
  46. timer2_100ms = 255  'off
  47. timer3_100ms = 255  'off
  48. timer4_100ms = 255  'off
  49. timer5_100ms = 255  'off
  50. timer6_100ms = 255  'off
  51. timer7_100ms = 255  'off
  52. '--------------------------------------asignacion de valores generales-----------------------------
  53. grupo = 255  'nombre del grupo de trabajo
  54. n_placa = 0  'nombre de la placa actual, se descodifica pero se ignora
  55. estado = 0  'comando de reposo
  56. s1 = 0  'no hay nada para para la placa nº1
  57. s2 = 0  'no hay nada para para la placa nº2
  58. s3 = 0  'no hay nada para para la placa nº3
  59. s4 = 0  'no hay nada para para la placa nº4
  60. s5 = 0  'no hay nada para para la placa nº5
  61. s6 = 0  'no hay nada para para la placa nº6
  62. s7 = 0  'no hay nada para para la placa nº7
  63. start = 0  'no estan habilitadas las teclas de maniobra
  64. stop = 0  'no se envia comando de cancelacion
  65. '--------------------------------------DEFINICION DE PUERTOS------------------------------------------------
  66. '--------------------------------ASIGNACION DE I/O y valores de inicion de las salidas----------------------
  67. ADCON1 = 0x07   'deshabilita las entradas analogicas
  68. TRISA = 0xff  'puerto A configurado como entradas
  69. TRISB = 0x00  'puerto B configurado como salidas
  70. TRISC = 0xff  'puerto C configurado como entradas
  71. TRISC.2 = 0  'configurado como salida, controla la activacion del modulo hibrido de Tx
  72. TRISC.3 = 0  'configurado como salida, nc
  73. TRISC.5 = 0  'cofigurado como salida, controla el led de la tecla start
  74. TRISC.6 = 0  'configurado como salida, salida datos serie, Tx
  75. TRISC.7 = 0  'configurado como salida, nc
  76. PORTB = 0xff  'todo el puerto B a nivel alto, led apagados
  77. PORTC.2 = 1  'modulo Tx desconectado
  78. PORTC.5 = 1  'led apagado, start
  79. '------------------------------------INICIO DEL PUERTO SERIE, TIMER E INTERRUPCONES------------------
  80. Hseropen 1200           'Velocidad del puerto serie e inicializa los comandos de bajo nivel que controlan la USART
  81. INTCON.PEIE = 1         'bit de habilitacion de interrupciones de perifericos(USART), comun para tx y rx
  82. PIE1.RCIE = 0           'deshabilita la interrupcion de la USART en modo rx
  83. T1CON.TMR1ON = 1        'Configuracion y habilitacion del TMR1
  84. T1CON.TMR1CS = 0        'factor del preescales del timer1, 0
  85. T1CON.T1CKPS0 = 0  'factor del preescales del timer1, 0
  86. T1CON.T1CKPS1 = 0  'factor del preescales del timer1, 0
  87. TMR1H = 0xf8  'carga el registro del contador para que desborde cada 1mSeg, byte alto
  88. TMR1L = 0x30  'carga el registro del contador para que desborde cada 1mSeg, byte bajo
  89. PIE1.TMR1IE = 1         'activa el timer1
  90. Enable                          'INTCON.GIE habilita todas las interrupciones globales                 
  91. '--------------------------------------Inicio Programa--------------------------------------------------
  92. pause = 3000  'carga la rutina pause con 3Seg
  93. Gosub pause_ms  'espera 3Seg
  94. '--------------------------------------Main Programa----------------------------------------------------
  95. main:
  96.         If RA1 = 0 And RC4 = 0 Then     'P1 y Start, comprueba las tecla
  97.                 Gosub ledstart_on  'led a on de la tecla Start
  98.                 s1 = 1  'activa la secuencia para la placa remota nº 1
  99.                 estado = 2  'estado de activacion
  100.                 n_placa = 1  'nombre de la placa relacionada
  101.                 timer1_100ms = 0  'activacion de la base de tiempos del led tecla P1
  102.                 Gosub tx_trama  'compones y envia la trama de datos    
  103.         Endif
  104.         If RA2 = 0 And RC4 = 0 Then     'P2 y Start, comprueba las teclas
  105.                 Gosub ledstart_on  'led a on de la tecla Start
  106.                 s2 = 1  'activa la secuencia para la placa remota nº 2
  107.                 estado = 2  'estado de activacion
  108.                 n_placa = 2  'nombre de la placa relacionada
  109.                 timer2_100ms = 0  'activacion de la base de tiempos del led tecla P2
  110.                 Gosub tx_trama  'compones y envia la trama de datos
  111.         Endif
  112.         If RA3 = 0 And RC4 = 0 Then     'P3 y Start, comprueba las teclas
  113.                 Gosub ledstart_on  'led a on de la tecla Start
  114.                 s3 = 1  'activa la secuencia para la placa remota nº 3
  115.                 estado = 2  'estado de activacion
  116.                 n_placa = 3  'nombre de la placa relacionada
  117.                 timer3_100ms = 0  'activacion de la base de tiempos del led tecla P3
  118.                 Gosub tx_trama  'compones y envia la trama de datos
  119.         Endif
  120.         If RA4 = 0 And RC4 = 0 Then     'P4 y Start, comprueba las teclas
  121.                 Gosub ledstart_on  'led a on de la tecla Start
  122.                 s4 = 1  'activa la secuencia para la placa remota nº 4
  123.                 estado = 2  'estado de activacion
  124.                 n_placa = 4  'nombre de la placa relacionada
  125.                 timer4_100ms = 0  'activacion de la base de tiempos del led tecla P4
  126.                 Gosub tx_trama  'compones y envia la trama de datos
  127.         Endif
  128.         If RA5 = 0 And RC4 = 0 Then     'P5 y Start, comprueba las teclas
  129.                 Gosub ledstart_on  'led a on de la tecla Start
  130.                 s5 = 1  'activa la secuencia para la placa remota nº 5
  131.                 estado = 2  'estado de activacion
  132.                 n_placa = 5  'nombre de la placa relacionada
  133.                 timer5_100ms = 0  'activacion de la base de tiempos del led tecla P5
  134.                 Gosub tx_trama  'compones y envia la trama de datos
  135.         Endif
  136.         If RC0 = 0 And RC4 = 0 Then     'P6 y Start, comprueba las teclas
  137.                 Gosub ledstart_on  'led a on de la tecla Start
  138.                 s6 = 1  'activa la secuencia para la placa remota nº 6
  139.                 estado = 2  'estado de activacion
  140.                 n_placa = 6  'nombre de la placa relacionada
  141.                 timer6_100ms = 0  'activacion de la base de tiempos del led tecla P6
  142.                 Gosub tx_trama  'compones y envia la trama de datos
  143.         Endif
  144.         If RC1 = 0 And RC4 = 0 Then     'P7 y Start, comprueba las teclas
  145.                 Gosub ledstart_on  'led a on de la tecla Start
  146.                 s7 = 1  'activa la secuencia para la placa remota nº 7
  147.                 estado = 2  'estado de activacion
  148.                 n_placa = 7  'nombre de la placa relacionada
  149.                 timer7_100ms = 0  'activacion de la base de tiempos del led tecla P7
  150.                 Gosub tx_trama  'compones y envia la trama de datos
  151.         Endif
  152.         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
  153.         pause = 50  'carga el pause con una espera de 50mSeg
  154.         Gosub pause_ms  'espera el valor de pause
  155.         Gosub ledstop_off  'apaga el led de la tecla Stop
  156.         If RC4 = 0 Then Gosub ledstart_on  'prende el led de la tecla Start
  157.         If RC4 = 1 Then Gosub ledstart_off  'apaga el led de la tecla Start
  158. Goto main
  159. End
  160. '--------------------------------------FIN DEL MAIN-------------------------------------------
  161. '--------------------------------------Sub_Rutinas Programa-----------------------------------------------
  162. tx_out:                 'rutina que deja en reposo las secuencias que se activaron, despues de terminar su ejecucion
  163.         If s1 = 1 And timer1_100ms >= 100 Then
  164.                 s1 = 0
  165.         Endif  
  166.         If s2 = 1 And timer2_100ms >= 100 Then
  167.                 s2 = 0
  168.         Endif
  169.         If s3 = 1 And timer3_100ms >= 100 Then
  170.                 s3 = 0
  171.         Endif
  172.         If s4 = 1 And timer4_100ms >= 100 Then
  173.                 s4 = 0
  174.         Endif
  175.         If s5 = 1 And timer5_100ms >= 100 Then
  176.                 s5 = 0
  177.         Endif
  178.         If s6 = 1 And timer6_100ms >= 100 Then
  179.                 s6 = 0
  180.         Endif
  181.         If s7 = 1 And timer7_100ms >= 100 Then
  182.                 s7 = 0
  183.         Endif
  184. Return
  185. tx_trama:       'transmite la trama
  186.         PORTC.2 = 0     'activa el Tx
  187.         checsum = grupo + n_placa + estado  'calcual el checsum
  188.         pause = 50  'espera 50mSeg, estabiliza el modulo hibrido
  189.         Gosub pause_ms  'salta a la rutina de pausa    
  190.         Hserout 0, grupo, n_placa, estado, checsum, grupo, n_placa, estado, checsum  'envia la trama doble
  191.         pause = 50  'carga el pause
  192.         Gosub pause_ms  'salta a la rutina de espera
  193.         PORTC.2 = 1     'desactiva el Tx
  194.         estado = 0  'nuevo estado, reposo
  195.         n_placa = 0  'placa no operativa, no se ejecutan las posibles ordenes con este numero
  196. Return
  197. led1_on:        'activacion de led, pulsador P1
  198.         RB1 = 0
  199. Return
  200. led2_on:  'activacion de led, pulsador P2
  201.         RB2 = 0
  202. Return
  203. led3_on:  'activacion de led, pulsador P3
  204.         RB3 = 0
  205. Return
  206. led4_on:  'activacion de led, pulsador P4
  207.         RB4 = 0
  208. Return
  209. led5_on:  'activacion de led, pulsador P5
  210.         RB5 = 0
  211. Return
  212. led6_on:  'activacion de led, pulsador P6
  213.         RB6 = 0
  214. Return
  215. led7_on:  'activacion de led, pulsador P7
  216.         RB7 = 0
  217. Return
  218. ledstart_on:  'activacion de led, pulsador Start
  219.         RC5 = 0
  220. Return
  221. ledstop_on:  'prende el led de la tecla Stop
  222.         RB0 = 0
  223. Return
  224. led1_off:       'desactivacion de led, pulsadores P1
  225.         RB1 = 1
  226. Return
  227. led2_off:  'desactivacion de led, pulsadores P2
  228.         RB2 = 1
  229. Return
  230. led3_off:  'desactivacion de led, pulsador P3
  231.         RB3 = 1
  232. Return
  233. led4_off:  'desactivacion de led, pulsador P4
  234.         RB4 = 1
  235. Return
  236. led5_off:  'desactivacion de led, pulsador P5
  237.         RB5 = 1
  238. Return
  239. led6_off:  'desactivacion de led, pulsador P6
  240.         RB6 = 1
  241. Return
  242. led7_off:  'desactivacion de led, pulsador P7
  243.         RB7 = 1
  244. Return
  245. ledstart_off:  'desactivacion de led, pulsador Start
  246.         RC5 = 1
  247. Return
  248. ledstop_off:  'apaga el led de la tecla Stop
  249.         RB0 = 1
  250. Return
  251. comandos_off:  'paso a estado de reposo de todas las placas
  252.         n_placa = 16  'todas las placas decodifican este n_placa
  253.         estado = 0  'reposo
  254.         Gosub tx_trama  'envia la trama al aire
  255.         s1 = 0  'se anulan todas las operaciones pendientes de P1
  256.         s2 = 0  'se anulan todas las operaciones pendientes de P2
  257.         s3 = 0  'se anulan todas las operaciones pendientes de P3
  258.         s4 = 0  'se anulan todas las operaciones pendientes de P4
  259.         s5 = 0  'se anulan todas las operaciones pendientes de P5
  260.         s6 = 0  'se anulan todas las operaciones pendientes de P6
  261.         s7 = 0  'se anulan todas las operaciones pendientes de P7
  262.         Gosub ledall_off  'se apagan los leds
  263. Return
  264. ledall_off:
  265.         RB1 = 1 'P1 LED OFF
  266.         RB2 = 1 'P2 LED OFF
  267.         RB3 = 1 'P3 LED OFF
  268.         RB4 = 1 'P4 LED OFF
  269.         RB5 = 1 'P5 LED OFF
  270.         RB6 = 1 'P6 LED OFF
  271.         RB7 = 1 'P7 LED OFF
  272.         RC5 = 1 'START LED OFF
  273. Return
  274. led_flash:      'controla la cadencia de on/off de los led de las teclas pulsadas
  275.         If timer_100ms <= 2 Then        'led a on 200mSeg, controla
  276.                                                                 'el tiempo de parpadeo de los leds
  277.                 If timer1_100ms < 100 Then Gosub led1_on  'led a on mientras el Rx tempriza la maniobra
  278.                 If timer2_100ms < 100 Then Gosub led2_on  'led a on mientras el Rx tempriza la maniobra
  279.                 If timer3_100ms < 100 Then Gosub led3_on  'led a on mientras el Rx tempriza la maniobra
  280.                 If timer4_100ms < 100 Then Gosub led4_on  'led a on mientras el Rx tempriza la maniobra
  281.                 If timer5_100ms < 100 Then Gosub led5_on  'led a on mientras el Rx tempriza la maniobra
  282.                 If timer6_100ms < 100 Then Gosub led6_on  'led a on mientras el Rx tempriza la maniobra
  283.                 If timer7_100ms < 100 Then Gosub led7_on  'led a on mientras el Rx tempriza la maniobra
  284.         Endif
  285.         If timer_100ms >= 3 Then        'led a off, 200mSeg
  286.                 If timer1_100ms <= 100 Then Gosub led1_off  'led a on mientras el Rx tempriza la maniobra
  287.                 If timer2_100ms <= 100 Then Gosub led2_off  'led a on mientras el Rx tempriza la maniobra
  288.                 If timer3_100ms <= 100 Then Gosub led3_off  'led a on mientras el Rx tempriza la maniobra
  289.                 If timer4_100ms <= 100 Then Gosub led4_off  'led a on mientras el Rx tempriza la maniobra
  290.                 If timer5_100ms <= 100 Then Gosub led5_off  'led a on mientras el Rx tempriza la maniobra
  291.                 If timer6_100ms <= 100 Then Gosub led6_off  'led a on mientras el Rx tempriza la maniobra
  292.                 If timer7_100ms <= 100 Then Gosub led7_off  'led a on mientras el Rx tempriza la maniobra
  293.         Endif
  294.         If timer_100ms >= 5 Then timer_100ms = 0        'reinicia esta base de tiempos, tiempo parpadeo leds
  295. Return
  296. pause_ms:  'rutina de espera, rutina tipo Waitms, pause establese el tiempo total en mSeg
  297.         aux_pause = 0  'variable auxiliar lleva la cuenta de los ms
  298.         timer_1ms = 0   'al borrar el contador se activa y comienza la cuenta de 1mSeg
  299.         While aux_pause <= pause  'tiempo en mSeg maximos a contar
  300.                 aux_pause = aux_pause + 1       'variable auxiliar lleva la cuenta de los ms
  301.                 If timer_1ms > 0 Then timer_1ms = 0     'al borrar el contador se activa y cuenta 1mSeg
  302.                 While timer_1ms < 1     'espera un miliesegundo
  303.                 Wend
  304.         Wend
  305. Return
  306. '--------------------------------------SIBRUTINAS ESPECIALES---------------------------------------------
  307. On Interrupt            'Comienzan las rutinas de las interrupciones
  308.         Save System             'Guarda los valores del sistema
  309.         If PIR1.TMR1IF = 1 Then         'comprueba la interrupcion,
  310.                                                                 'solo hay de un tipo, no es necesario, se pone por costumbre
  311.                 basetimer_1ms = basetimer_1ms + 1  'base de tiempos raiz
  312.                 If timer_1ms < 1 Then timer_1ms = timer_1ms + 1  'base de tiempos, temporiza un 1msg
  313.                 If basetimer_1ms >= 100 Then    'establece que las siguientes bases de tiempos
  314.                                                                                 'se incrementaran cada 100mSeg
  315.                         If timer_100ms < 5 Then timer_100ms = timer_100ms + 1  'temporiza 0.5Seg
  316.                         If timer1_100ms < 100 Then timer1_100ms = timer1_100ms + 1  'temporiza 10Seg, parpadeo led
  317.                         If timer2_100ms < 100 Then timer2_100ms = timer2_100ms + 1  'temporiza 10Seg, parpadeo led
  318.                         If timer3_100ms < 100 Then timer3_100ms = timer3_100ms + 1  'temporiza 10Seg, parpadeo led
  319.                         If timer4_100ms < 100 Then timer4_100ms = timer4_100ms + 1  'temporiza 10Seg, parpadeo led
  320.                         If timer5_100ms < 100 Then timer5_100ms = timer5_100ms + 1  'temporiza 10Seg, parpadeo led
  321.                         If timer6_100ms < 100 Then timer6_100ms = timer6_100ms + 1  'temporiza 10Seg, parpadeo led
  322.                         If timer7_100ms < 100 Then timer7_100ms = timer7_100ms + 1  'temporiza 10Seg, parpadeo led
  323.                         basetimer_1ms = 0  'reinicia la base timer raiz
  324.                 Endif
  325.                         If RA0 = 0 Then 'Stop
  326.                                 PORTC.2 = 0     'activa el tx
  327.                                 RB0 = 0  'activa el led de la tecla STOP
  328.                                 n_placa = 16  'numero de placa que descodifican todas las placas remotas
  329.                                 estado = 0  'reposo
  330.                                 checsum = grupo + n_placa + estado  'calculo del checsum
  331.                                 Hserout 0, grupo, n_placa, estado, checsum, grupo, n_placa, estado, checsum  'envia la trama de datos
  332.                                 Hserout 0, grupo, n_placa, estado, checsum, grupo, n_placa, estado, checsum  'envia la trama de datos
  333.                                 Hserout 0, grupo, n_placa, estado, checsum, grupo, n_placa, estado, checsum  'envia la trama de datos
  334.                                 Hserout 0, grupo, n_placa, estado, checsum, grupo, n_placa, estado, checsum  'envia la trama de datos
  335.                                 PORTC.2 = 1     'desactiva el tx
  336.                                 s1 = 0  'terminan todas las acciones relacionadas con la tecla P1
  337.                                 s2 = 0  'terminan todas las acciones relacionadas con la tecla P2
  338.                                 s3 = 0  'terminan todas las acciones relacionadas con la tecla P3
  339.                                 s4 = 0  'terminan todas las acciones relacionadas con la tecla P4
  340.                                 s5 = 0  'terminan todas las acciones relacionadas con la tecla P5
  341.                                 s6 = 0  'terminan todas las acciones relacionadas con la tecla P6
  342.                                 s7 = 0  'terminan todas las acciones relacionadas con la tecla P7
  343.                                 RB1 = 1 'P1 LED OFF
  344.                                 RB2 = 1 'P2 LED OFF
  345.                                 RB3 = 1 'P3 LED OFF
  346.                                 RB4 = 1 'P4 LED OFF
  347.                                 RB5 = 1 'P5 LED OFF
  348.                                 RB6 = 1 'P6 LED OFF
  349.                                 RB7 = 1 'P7 LED OFF
  350.                                 RC5 = 1 'START LED OFF
  351.                         Endif
  352.                 TMR1H = 0xf8  'recarga el contador del timer1 para que desborde pasado 1mSeg, byte alto
  353.                 TMR1L = 0x30  'recarga el contador del timer1 para que desborde pasado 1mSeg, byte bajo
  354.                 PIR1.TMR1IF = 0 'borra el flag de salto del tmr1
  355.         Endif
  356. Resume
  357. End
[/code]
Título: Re: Control de Reles a Distancia por RF
Publicado por: dogflu66 en 08 de Noviembre de 2006, 19:42:10
El programa del RX:

Código: Visual Basic
  1. '***************** CONTROL DE RELES A DISTANCIA POR RF ***************************************
  2. 'NOMBRE:16F88_CRFRLRX
  3. 'MICRO: PIC16F88/8Mhz reloj interno
  4. 'Version/Autor: 1.1/By COS 11.06
  5. 'DESCRIPCION: modulo receptor de datos por Radio Frecuencia
  6. 'Version 1.0
  7. 'al conectar la placa enciendo led de estado durante 1 seg
  8. 'estado=0, 2,9Seg a off y 0.1seg a on, si el n_placa=0 o despues de una trama de stop
  9. 'estado=1, 1.3seg a off y 0.6 a on, n_placa comprendida entre 1 y 7 (OK en espera de trama)
  10. 'estado=3, '0,2 segundos a off y 0,2 seg a on durante 10Seg antes de activar el rele durante 100mSeg
  11. 'despues de recibir trama correcta led a on durante 1Seg.
  12. 'tiempo de lectura entre byte y byte del bufer serie 10mseg maximo y un milisegundo minimo
  13. 'Version 1.1
  14. se activa una entrada digital para comprobar que los contactos del rele
  15. 'no tienen tension durante el arranque del circuito
  16. 'al energizar la placa led de estado a on si hay tension en los contactos del rele,
  17. 'y la placa queda fuera de servicio
  18. '************************************************************************************************
  19. '-------------------------------------PUERTOS DEFINIDOS POR EL SISTEMA----------------------------
  20. '-------------------------------------Puertos del LCD---------------------------------------------
  21. '--------------------------------------DEFINICION DE VARIABLES-------------------------------------
  22. '-------------------------------------Variables sub_rutinas del puerto serie---------------------
  23. Dim assii As Byte               'Contiene el valor de lectura del puerto serie
  24. Dim n_usart As Byte             'Numero de datos del USART y del bufer IMAGEN de control
  25. Dim usart As Byte               'Variable indice que apunta al ultimo dato adquirido por la USART
  26. Dim aux_usart As Byte   'Auxiliar de la variable indice usart del USART
  27. Dim c_serial As Byte            'Como USART pero para la lectura de control del bufer IMAGEN
  28. Dim bufer As Byte               'Indica si hay datos por leer en el bufer USART
  29. '-------------------------------------Variables del contador del TIMER1----------------------------
  30. Dim pause As Word               'contiene el valor para simular el comando Waitms
  31. Dim aux_pause As Word   'variable auxiiar
  32. Dim basetimer_1ms As Byte       'base de tiempos raiz
  33. Dim timer_1ms As Word   'base de tiempos se incrementa cada 1mSeg
  34. Dim timer_100ms As Byte 'base de tiempos se incrementan cada 100mSeg
  35. Dim timer1_100ms As Byte        'base de tiempos 1 se incrementan cada 100mSeg
  36. Dim timer2_100ms As Byte        'base de tiempos 2 se incrementan cada 100mSeg
  37. Dim timer3_100ms As Byte        'base de tiempos 3 se incrementan cada 100mSeg 
  38. Dim timer4_100ms As Byte        'base de tiempos 4
  39. '--------------------------------------Variables Programa------------------------------------------
  40. Dim arranque As Byte    'arranque, estabiliza el bit de bajada (no se contabiliza)
  41. Dim grupo As Byte               'byte de sincronismo (grupo de trabajo)
  42. Dim n_placa As Byte             'nombre de la placa
  43. Dim checsum As Byte     'chesun calculado por el micro que le pertenece a la trama recibida
  44. Dim w_posrx As Byte     'Tiempo entre lectura y lectura del bufer
  45. Dim rd_grupo As Byte    'byte del nombre de la red a la que se le envia la trama
  46. Dim rd_n_placa As Byte  'numero de la placa a la que se refiere la trama
  47. Dim rd_checsum As Byte  'control de error que suministra la trama
  48. Dim rd_estado As Byte   'modo de actuacion obtenido de la trama de datos
  49. Dim estado As Byte              'asigna el estado de la placa, 0=deshabilitada, 1=habilitada, 2 y 3 modo de activacion del rele
  50. Dim n As Byte           'variable auxiliar para las rutinas del programa
  51. '------------------------------------VARIABLES tipo array programa----------------------------------
  52. '------------------------------------VARIABLES tipo array sub_rutinas-------------------------------
  53. '------------------------------------Variables tipo array puerto serie----------------------------------
  54. Dim usart_imagen(81) As Byte    'Componen el bufer IMAGEN para control del bufer USART,
  55.                         'apuntador que nos indica que registros tienen datos de usart_bufer
  56. Dim usart_bufer(81) As Byte     'Componen el bufer de la USART de bajo nivel, contiene los bytes recibidos
  57.  
  58.  
  59. '-----------------------------------------------ASIGNACIONES----------------------------------------
  60. '-------------------------------------Asigna valores a las variables de la rutina del puerto serie--
  61. usart = 0
  62. aux_usart = 0
  63. c_serial = 0
  64. bufer = 0
  65. n_usart = 80
  66. assii = 0
  67. '-------------------------------------Asigna valores a las variables del TIMER1---------------------
  68. aux_pause = 0
  69. pause = 0
  70. basetimer_1ms = 0
  71. timer_1ms = 0
  72. timer_100ms = 0
  73. timer1_100ms = 0
  74. timer2_100ms = 0
  75. timer3_100ms = 0
  76. timer4_100ms = 0
  77. '--------------------------------------asignacion de valores generales-----------------------------
  78. arranque = 0
  79. grupo = 255
  80. n_placa = 0
  81. estado = 0
  82. w_posrx = 10            '10mSeg rf, se espera un maximo de tiempo antes de leer el bufer si no hay datos
  83. '--------------------------------------DEFINICION DE PUERTOS------------------------------------------------
  84. '--------------------------------ASIGNACION DE I/O y valores de inicio de las salidas----------------------
  85. ANSEL = 0x00    'los pin I/O digitales (no analogicos)
  86. OSCCON = 0x7e   'set intrc To 8mhz
  87. CMCON = 0x07    'comparador a off
  88. TRISA = 0xff    'Puerto A como entradas digitales
  89. TRISA.5 = 0             'como salida
  90. TRISB = 0x00    'puerto B como salidas
  91. PORTB.4 = 0             'entrega negativo al rele, activa a 1
  92. PORTB.6 = 1             'entrega positivo al rele, activa a 0
  93. PORTB.7 = 0             'ilunina el led de estado, 1 iluminado
  94. '------------------------------------fallo placa-----------------------------------------------------
  95. WaitMs 500  'pausa para estabilizar la entrada
  96. If RA4 = 1 Then Goto fallo  'si hay tension en los contactos durante el arranque se bloquea el circuito
  97. '------------------------------------INICIO DEL PUERTO SERIE, TIMER E INTERRUPCONES------------------
  98. Hseropen 1200                           'Velocidad del puerto serie e inicializa los comandos de bajo nivel que controlan la USART
  99. INTCON.PEIE = 1                         'bit de habilitacion de interrupciones de perifericos(USART), para que funcione la implementación P. SERIE
  100. PIE1.RCIE = 1                           'Activa la interrupcion de la USART en modo rx
  101. T1CON.TMR1ON = 1                        'Configuracion y habilitacion del TMR1
  102. T1CON.TMR1CS = 0                        'reloj principal para el timer1
  103. T1CON.T1CKPS0 = 0                       'sin preescales
  104. T1CON.T1CKPS1 = 0                       'sin preescales
  105. TMR1H = 0xf8                            'desbordamiento del timer1 cada 1ms, byte alto
  106. TMR1L = 0x30                            'desbordamiento del timer1 cada 1ms, byte bajo
  107. PIE1.TMR1IE = 1                         'activacion del timer1
  108. Enable  ' INTCON.GIE habilita todas las interrupciones globales                
  109. '--------------------------------------Inicio Programa--------------------------------------------------
  110. pause = 10  'carga el tiempo de espera
  111. Gosub pause_ms  'espera el valor del pause
  112. n_placa.0 = PORTA.0     'bits seleccion del numero de la placa,
  113.                                         'cero placa deshabilitada, nº 16 comun a todas las placas
  114. n_placa.1 = PORTA.1
  115. n_placa.2 = PORTA.2
  116. n_placa.3 = PORTA.3
  117. If n_placa = 0 Then estado = 0  'asigna el estado de la placa segun el numero de la placa, deshabilitada
  118. If n_placa > 7 Then estado = 0  'deshabilitada
  119. If n_placa > 0 And n_placa < 8 Then estado = 1  'habilitada
  120. Gosub off_led           'asegura led apagado
  121. Gosub off_rele          'asegura rele desconectado
  122. Gosub clear_bufer       'Borra el BUFER IMAGEN y por lo tanto tambien al USART, OBLIGATORIO POR LO MENOS UNA VEZ
  123. pause = 500                     'pausa de 0.5 Seg
  124. Gosub pause_ms          'espera el valor cargado en pause
  125.  
  126.  
  127. '--------------------------------------Main Programa----------------------------------------------------
  128. main:
  129.         If RCSTA.OERR = 1 Then  'testea posible bloqueo del puerto fisico en modo Rx
  130.                 Gosub clear_bufer       'borra el bufer por soft del puerto serie de entrada
  131.         Endif
  132.         If n_placa > 0 And n_placa <= 16 And bufer = 1 Then  'verifica que el n_placa es correcto y comprueba el bufer
  133.                 Gosub recibo_comando  'salta a la rutina de lectura del bufer serie
  134.         Endif
  135.         If n_placa = 0 Then  'la placa queda en reposo 
  136.                 estado = 0  'la placa queda en reposo
  137.                 Gosub off_rele  'rele apagado
  138.         Endif
  139.         If estado = 0 Then  'la placa queda en reposo
  140.                 Gosub off_rele  'rele apagado
  141.         Endif
  142.         If estado = 1 Then  'la placa queda en reposo
  143.                 Gosub off_rele  'rele apagado
  144.         Endif
  145.         If estado = 2 Then  'se inicia la secuencia de activacion
  146.                 Gosub off_rele  'rele apagado
  147.                 estado = 3  'permite que se active el rele
  148.                 timer_100ms = 0  'activa el timer_100ms, 10Seg antes de activar el rele
  149.         Endif
  150.         If estado = 3 And timer_100ms >= 100 Then  'activa el rele durante 100mSEg despues de terminar timer_100ms
  151.                 timer_100ms = 0  'se inicializa timer_100ms
  152.                 Gosub on_rele  'activa rele
  153.                 estado = 0  'estado despues de la activacion o anulacion de secuencia
  154.                 pause = 100  'carga la rutina del pause
  155.                 Gosub pause_ms  'espera el valor del pause
  156.                 Gosub off_rele  'desconecta el rele
  157.         Endif                          
  158. Goto main
  159. End
  160. '--------------------------------------FIN DEL MAIN---------------------------------------------------
  161. '--------------------------------------Sub_Rutinas Programa-----------------------------------------------
  162. on_led:
  163.         PORTB.7 = 1     'enciende el led
  164. Return
  165. off_led:
  166.         PORTB.7 = 0     'apaga el led
  167. Return
  168. on_rele:                'activa el rele
  169.         If estado = 3 Then
  170.                 PORTB.6 = 0
  171.                 PORTB.4 = 1
  172.         Endif
  173.         estado = 0
  174. Return
  175. off_rele:       'desactiva el rele
  176.         PORTB.6 = 1
  177.         PORTB.4 = 0
  178. Return
  179. fallo:  'bloque el programa
  180.         PORTB.6 = 1  'apaga el rele, bit 1
  181.         PORTB.4 = 0  'apaga el rele, bit 2
  182.         RB7 = 1  'prende el led de estado fijo
  183.         Goto fallo
  184. Return
  185.  
  186.  
  187. '-------------------------------Lectura de la trama de datos recibida por el bufer serie------------------
  188. recibo_comando:         'confecciona la trama
  189.         Gosub readserial  'lee un byte almacenado en el bufer del puerto serie
  190.         If assii = grupo Then  'establece la cabecera y sincroniza la trama
  191.                 rd_grupo = assii
  192.                 Gosub readserial       
  193.                 rd_n_placa = assii
  194.                 Gosub readserial
  195.                 rd_estado = assii
  196.                 Gosub readserial
  197.                 rd_checsum = assii
  198.                 checsum = rd_grupo + rd_n_placa + rd_estado  'calculo el checsum con los valores recibidos
  199.                 If rd_checsum = checsum Then  'actualizo los valores de las salidas si el checsum recibido es correcto
  200.                         If rd_estado >= 8 Then estado = 1  'se pasa a estado de espera
  201.                         If rd_n_placa = n_placa Then estado = rd_estado  'se establece el estado recibido
  202.                         If rd_n_placa = 16 Then estado = 0  'se pasa a estado cero
  203.                         timer4_100ms = 0        'se activa la base de tiempos que nos modificara el parpadeo
  204.                                         'del led para indicar que se recibio una trama correctamente
  205.                 Endif
  206.         Endif
  207. Return
  208.  
  209.  
  210. '--------------------------------------SIBRUTINAS ESPECIALES---------------------------------------------
  211. On Interrupt            'Comienzan las rutinas de las interrupciones
  212.         Save System                     'Guarda los valores del sistema
  213. '--------------------------------------RUTINA TIMER_1----------------------------------------------------
  214.         T1CON.TMR1ON = 0        'deshabilitacion del TMR1
  215.         PIE1.RCIE = 0           'desactiva la interrupcion de la USART en modo rx
  216.         If PIR1.TMR1IF = 1 Then 'comprueba que es esta la interrupcion activa
  217.                 basetimer_1ms = basetimer_1ms + 1  'base de tiempos patron
  218.                 If timer_1ms < 1 Then timer_1ms = timer_1ms + 1  'se utiliza para hacer temporizaciones en pasos de 1ms
  219.                 If basetimer_1ms >= 100 Then  'establece pasos de 100mseg para las otras bases de tiempos
  220.                         If timer4_100ms < 10 Then  'solo se activa cuando se recibe una trama de datos con exito
  221.                                 timer4_100ms = timer4_100ms + 1  'varia la longitud del parpadeo del led, al recibir trama
  222.                                 PORTB.7 = 1  'enciende el led de control
  223.                                 If timer_100ms < 100 Then timer_100ms = timer_100ms + 1
  224.   '10seg, actualiza y controla base de tiempos
  225.                                 If timer1_100ms < 30 Then timer1_100ms = timer1_100ms + 1
  226.   '3seg, actualiza y controla base de tiempos
  227.                                 If timer2_100ms < 20 Then timer2_100ms = timer2_100ms + 1
  228.  '2seg, actualiza y controla base de tiempos
  229.                                 If timer3_100ms < 4 Then timer3_100ms = timer3_100ms + 1
  230.   '0.4seg, actualiza y controla base de tiempos
  231.                                 Goto fin  'al recibir una trama de datos valida se salta a fin
  232.                         Endif
  233.                         If timer_100ms < 100 Then timer_100ms = timer_100ms + 1  'actualiza y controla base de tiempos
  234.                         If timer1_100ms < 30 Then timer1_100ms = timer1_100ms + 1  'act. y controla base de tiempos
  235.                         If timer2_100ms < 20 Then timer2_100ms = timer2_100ms + 1  'act. y controla base de tiempos
  236.                         If timer3_100ms < 4 Then timer3_100ms = timer3_100ms + 1  'act. y controla base de tiempos
  237.                         If estado = 0 Then  'segun el estado se varia la longitud y velocidad del parpadeo del led
  238.                                 If timer1_100ms > 29 Then  '2,9Seg a off y 0.1seg a on
  239.                                         PORTB.7 = 1  'prende el led indicador del estado
  240.                                         If timer1_100ms >= 30 Then timer1_100ms = 0  'reinicializa base de tiempos
  241.                                 Else
  242.                                         PORTB.7 = 0  'apaga el led indicador del estado
  243.                                 Endif
  244.                         Endif
  245.                         If estado = 1 Then  'segun el estado se varia la longitud y velocidad del parpadeo del led
  246.                                 If timer2_100ms > 13 Then  '1.3seg a off y 0.6 a on
  247.                                         PORTB.7 = 1  'prende el led de estado
  248.                                         If timer2_100ms >= 20 Then timer2_100ms = 0  'reiniciliza la base de tiempos
  249.                                 Else
  250.                                         PORTB.7 = 0  'apaga el led de estado
  251.                                 Endif
  252.                         Endif
  253.                         If estado = 3 Then  'segun el estado se varia la longitud y velocidad del parpadeo del led
  254.                                 If timer3_100ms > 2 Then  '0,2 segundos a off y 0,2 seg a on
  255.                                         PORTB.7 = 1  'prende el led de estado
  256.                                         If timer3_100ms >= 4 Then timer3_100ms = 0  'reinicializa la base de tiempos
  257.                                 Else
  258.                                         PORTB.7 = 0  'apaga el led de estado
  259.                                 Endif
  260.                         Endif
  261.                         fin:
  262.                         basetimer_1ms = 0  'la reinicializa
  263.                 Endif
  264.         TMR1H = 0xf8  'carga el timer1 para que desborde 1mseg, byte higt
  265.         TMR1L = 0x30  'carga el timer1 para que desborde 1mseg, byte low
  266.         Endif
  267. '--------------------------------------BUFFER PUERTO SERIE-----------------------------------------------
  268.         If PIR1.RCIF = 1 Then   'comprueba que es esta la interrupcion activa
  269.                 If usart < n_usart Then 'comprueba que el bufer de entrada no esta lleno
  270.                         If usart_imagen(usart) = 0 Then  'comprueba que la posicion esta vacia
  271.                                 aux_usart = usart  'retiene la posicion antigua del bufer
  272.                                 usart = usart + 1  'indica cual sera la posicion siguiente del bufer
  273.                                 usart_imagen(aux_usart) = 1  'indica que hay dato en el bufer de entrada
  274.                                 bufer = 1       'indica que el bufer tiene datos
  275.                                 Hserget usart_bufer(aux_usart)  ' carga el dato en el bufer
  276.                         Else
  277.                                 Hserget usart_bufer(n_usart)  'descarga la usart para que no se bloquee porque el bufer de entrada esta lleno
  278.                         Endif
  279.                 Else
  280.                         If usart_imagen(0) = 0 Then  'comprueba que esta vacia la primera posicion del bufer
  281.                                 usart_imagen(0) = 1  'marca que hay dato en esa posicion del bufer
  282.                                 bufer = 1  'marca que el bufer tiene datos
  283.                                 usart = 1  'establece la proxima posicion del bufer
  284.                                 Hserget usart_bufer(0)  'lee la usart y guarda el dato en el bufer
  285.                         Else
  286.                                 Hserget usart_bufer(n_usart)  'descarga la usart porque el bufer esta lleno
  287.                         Endif
  288.                 Endif
  289.         Endif
  290.         PIR1.TMR1IF = 0 'borra el flag de salto del tmr1
  291.         PIR1.RCIF = 0   'borra el flag de salto de la usart
  292.         PIE1.RCIE = 1   'activa la interrupcion de la USART en modo rx
  293.         T1CON.TMR1ON = 1  'habilitacion del TMR1
  294. Resume
  295. pause_ms:  'rutina de espera, rutina tipo Waitms, pause establece el tiempo total en mSeg
  296.         aux_pause = 0  'variable auxiliar lleva la cuenta de los ms
  297.         timer_1ms = 0   'al borrar el contador se activa y comienza la cuenta de 1mSeg
  298.         While aux_pause <= pause  'tiempo en mSeg maximos a contar
  299.                 aux_pause = aux_pause + 1       'variable auxiliar lleva la cuenta de los ms
  300.                 If timer_1ms > 0 Then timer_1ms = 0     'al borrar el contador se activa y cuenta 1mSeg
  301.                 While timer_1ms < 1     'espera un milisegundo
  302.                 Wend
  303.         Wend
  304. Return
  305. '------------------------------ rutinas para el control del bufer del puerto serie-------------
  306. pause_ms_rx:  'rutina de espera antes de leer el bufer, rutina tipo Waitms, w_posrx establece el tiempo total en mSeg
  307.         aux_pause = 0  'variable auxiliar lleva la cuenta de los ms
  308.         timer_1ms = 0   'al borrar el contador se activa y comienza la cuenta de 1mSeg
  309.         While aux_pause <= w_posrx  'tiempo en mSeg maximos a contar
  310.                 If bufer > 0 Then aux_pause = w_posrx  'si entran datos en el bufer se termina el contaje
  311.                 aux_pause = aux_pause + 1       'variable auxiliar lleva la cuenta de los ms
  312.                 If timer_1ms > 0 Then timer_1ms = 0     'al borrar el contador se acitva y cuenta 1mSeg
  313.                 While timer_1ms < 1     'espera un milisegundo
  314.                 Wend
  315.         Wend
  316. Return
  317. readserial:     'RUTINA DE LECTURA DEL BUFER DEL PUERTO SERIE (ASSII)
  318.         Gosub pause_ms_rx       'valor de entrada en mSeg de espera definido por w_posrx
  319.         assii = 0  ' se borra el valor de assi, no se debe de utilizar cero como un valor de control
  320.         If bufer = 1 Then       'si bufer tiene datos
  321.                 assii = usart_bufer(c_serial)   'se lee el valor del bufer y se asigna assi
  322.                 usart_imagen(c_serial) = 0      'se marca como leida para que pueda ser llenada de nuevo
  323.                 c_serial = c_serial + 1 'se incrementa el indice del bufer
  324.                 If c_serial >= n_usart Then c_serial = 0        'se verifica si se llego al final del bufer
  325.                 If usart_imagen(c_serial) = 0 Then bufer = 0 'si no quedan mas datos en el bufer se marca como vacio
  326.         Endif
  327. Return
  328. clear_bufer:
  329.         For n = 0 To'desbloquea el puerto serie fisico en caso de bloqueo por exceso de entrada de datos
  330.                 T1CON.TMR1ON = 0  'bloquea timer1
  331.                 PIE1.RCIE = 0  'deshabilita la interrupcion del modulo serie
  332.                 RCSTA.CREN = 0  'protocolo de desbloqueo puerto serie
  333.                 RCSTA.CREN = 1  'protocolo de desbloqueo puerto serie
  334.                 RCSTA.OERR = 0  'protocolo de desbloqueo puerto serie
  335.         Next n
  336.                 Gosub clearbufer  'borra el bufer por soft de los datos recibidos por el puerto serie
  337.                 PIR1.TMR1IF = 0 'borra el flag de salto del tmr1
  338.                 PIR1.RCIF = 0   'borra el flag de salto de la usart
  339.                 PIE1.RCIE = 1   'activa la interrupcion de la USART en modo rx
  340.                 T1CON.TMR1ON = 1  'habilitacion del TMR1
  341. Return
  342. clearbufer:     'BORRA E INICIALIZA EL BUFER IMAGEN DEL PUERTO SERIE
  343.         For c_serial = 0 To n_usart  'pasa por cada uno de los bytes del bufer
  344.                 usart_imagen(c_serial) = 0  'borra bytes del bufer apuntador,
  345.                                                                         'que nos indica si esa posición del bufer tiene datos
  346.         Next c_serial  'repite hasta el total del bufer
  347.         c_serial = 0  'borra el contador
  348.         usart = 0  'borra variable de control
  349.         bufer = 0  'borra variable de control, a 1 indica que hay datos en el bufer de entrada
  350.         assii = 0  'borra el ultimo caracter leido
  351. Return
  352. END

PD. The End
Título: Re: Control de Reles a Distancia por RF
Publicado por: dogflu66 en 12 de Noviembre de 2006, 20:08:59
El articulo completo lo podeis descargar de aqui:

http://www.mytempdir.com/1047934
Título: Re: Control de Reles a Distancia por RF
Publicado por: DieccoF en 17 de Noviembre de 2006, 23:19:16
Yo queria felicitarte, a mi me gusta mucho este tema de transmitir bit en forma inalambrica, no tengo mucho tiempo en ahcer cosas pero cuando puedo encaro siempre algo, lo que estoy llevando de apoquito es ver como me armo algun tranmisor de FM en la banda de 27 o 72 Mhz para transmitir datos con un pic a travez de frecuencias DTMF, es lo que tengo pensado hacer, bueno adios y felicitaciones por su trabajo !!

PD: el dia que me salga esto lo guardare en una caja y seguire con los modulos que tu propones !!!

Habran paso, pero primero lo primero, despues el siguiente paso !!!

                                     Diecco
Título: Re: Control de Reles a Distancia por RF
Publicado por: dogflu66 en 18 de Noviembre de 2006, 11:52:27
Gracias Diecco.

Tengo algunos otros proyectos terminados para trabajar por RF, pero todos inyectan o decodifican los datos en forma de onda cuadrada.

Tambien tengo un proyectito pendiente que adapte esos datos a cualquier equipo comercial ya sea de CB, 2M y UHF, por las clavijas de MIC/EAR del aparato, pero por el momento solo se queda en pendientes... :(
Título: Re: Control de Reles a Distancia por RF
Publicado por: DieccoF en 18 de Noviembre de 2006, 12:03:20
bueno te dejo mi correo si kieres agregarme, me gustaria charlar con tigo mas adelante cuando empiece agarrar de vuelta el soldador !!! jejeje

Te cuento ke estoy terminando mi diseño de datos inalambricos por IR, se compone de un control de remoto de 8 botoncitos manejados por un pic, y el recptor tambien compuesto por por un pic, un receptor universal de IR y una pantalla LCD para visualizar los datos recibidos.... no le he sacado foto aun, me falta un pedazo de tiempo para pulir un poco los prorgamas , tengo un error en el ultimo bit de la trama, ya vere ke pasa, no tengo camara y tampoco tiempo es ke estoy muy jugado estudiando para la facultad para los parciales que vienen, te comento que cada dia este tema me gusta mas, pues estudio ing en telecomunicaciones en argentina, de ahi viene la cosa, y trato de hacer algo practico con todo esto fuera de la facultad, como si fuera un hobby :P

                       Saludos Man        diecco@hotmail.com
Título: Re: Control de Reles a Distancia por RF
Publicado por: dogflu66 en 18 de Noviembre de 2006, 12:21:07
Bien a darle duro a los estudios.

Mi correo y mi msn es el mismo "dogflu66@yahoo.es" lo tienes a tu disposición... :-)




PD. Por el momento no he tenido necesidad de ocultarlos, espero que asi siga... :(
Título: Re: Control de Reles a Distancia por RF
Publicado por: lord_10 en 19 de Noviembre de 2006, 01:53:29
Muy buen trabajo maistro con el RF 8) excelente la descripción del articulo  :-)


Pdta:  Empezare a molestar "T" para que ocultes tu msn  :D :D  :lol: :lol:
Título: Re: Control de Reles a Distancia por RF
Publicado por: dogflu66 en 19 de Noviembre de 2006, 12:39:13
Pero maistro si yo soy un (http://img49.imageshack.us/img49/6044/angelho0.gif)
Título: Re: Control de Reles a Distancia por RF
Publicado por: dogflu66 en 27 de Noviembre de 2006, 17:49:37
Podeis descargar el articulo de aqui:

http://www.freewebs.com/glafebre/controlderelesrf.htm
Título: Re: Control de Reles a Distancia por RF
Publicado por: LordLafebre en 27 de Noviembre de 2006, 18:22:56
Hola:

Gracias master por permitirme colgar tus proyectos en mi humilde web  :mrgreen:
Título: Re: Control de Reles a Distancia por RF
Publicado por: Leon Pic en 14 de Febrero de 2007, 04:20:27
Hola. Alguien sabe en donde se puede comprar estos módulos de TX y RX en Argentina, Buenos Aires o por el conurbano?. Desde ya muchas gracias. :-/ :-/ :-/
Título: Re: Control de Reles a Distancia por RF
Publicado por: Lupin en 14 de Febrero de 2007, 23:12:43
Hola. Alguien sabe en donde se puede comprar estos módulos de TX y RX en Argentina, Buenos Aires o por el conurbano?. Desde ya muchas gracias. :-/ :-/ :-/

Los encontras en cika: www.cika.com.ar
Por ejemplo el transmisor que en el hilo figura como Laipac Tx es el producto 152064339wt-6 (numero de cika) y cuesta 3,15 dolares.
El receptor Laipac RX es el producto 152063038R (numero de cika) y cuesta 12.6 dolares.

Saludos
Título: Re: Control de Reles a Distancia por RF
Publicado por: Leon Pic en 28 de Febrero de 2007, 22:37:08
Muchas gracias. Jamas lo hubiera encontrado. Suerte.
Título: Re: Control de Reles a Distancia por RF
Publicado por: Resistencio en 13 de Marzo de 2007, 01:39:18
Hola, compre en CIKA, 2 modulos RX/TX ASK (dicen para 140 metros), son de la firma WHENSHING (.com.tw)...Alguien tiene alguna plaquita armada para estos modulos...pense que iba a encontrar detalles en la web, pero no hay nada...los enlacé en el PROTO y andan...pero queria saber si hay que apantallarlos o tomar algunas precauciones para aumentar su rendimiento ( o al menos que no empeore)...tengo que hacer el software para los micros (con mi propio protocolo, parecido al serie, conceptualmente)...El codigo del amigo "dogflu66", es nuevo para mi, estimo que sera "basic" para el MPLAB o algo parecido...si pueden aclararmelo...Empece con los PICs hace unos meses, porque necesitaba reemplazar un sistema de control en un tomografo, que tenia discreta (con unos track/hold inconseguibles y unos encoders que me salian u$s 750, usados y desde EEUU)...despues de leer mucho, pude hacerlo, y desde entonces no logro pensar en proyectos nuevos sin tenerlos en cuenta...Bueno, si alguien sabe lo de los modulitos (son RSW-530 y TWS-CS para 315 MHZ - ASK), les agradeceria alguna pista...SALU2 a todos !!! GRACIAS por leer...
Título: Re: Control de Reles a Distancia por RF
Publicado por: dogflu66 en 13 de Marzo de 2007, 21:14:42
No se que modulos son, y tampoco encuentro info sobre ellos.
Título: Re: Control de Reles a Distancia por RF
Publicado por: dogflu66 en 13 de Marzo de 2007, 21:26:23
ya los encontre..  :mrgreen:
http://www.wenshing.com.tw/English/prouducts_info5.asp?bookbm=366
ahora toca ir a dormir y luego al curro... parecen interesantes como para mirarlos con mas detalle... :D
Título: Re: Control de Reles a Distancia por RF
Publicado por: Lupin en 13 de Marzo de 2007, 21:54:04
Podeis descargar el articulo de aqui:
http://www.freewebs.com/glafebre/controlderelesrf.htm

Excelente trabajo, muy detallado. (ya esta en mi pc)

Cita de: LordLafebre
Gracias master por permitirme colgar tus proyectos en mi humilde web

Aproveche para recorrer tu pagina y bajarme unas cuantas cosas, es muy buena.

Saludos
Título: Re: Control de Reles a Distancia por RF
Publicado por: dogflu66 en 05 de Diciembre de 2007, 06:01:51
http://es.youtube.com/watch?v=ukASM3UUGJE
Título: Re: Control de Reles a Distancia por RF
Publicado por: Nocturno en 05 de Diciembre de 2007, 07:00:17
Jeje, qué poca distancia  :D

Bromas aparte, estupendo proyecto, Carlos.
Título: Re: Control de Reles a Distancia por RF
Publicado por: stk500 en 05 de Diciembre de 2007, 08:20:14
 :-/ :-/ Ole Carlo!!! :-/ :-/
ya ha probado a larga Distancia? :-/ :-/

Título: Re: Control de Reles a Distancia por RF
Publicado por: Leon Pic en 05 de Diciembre de 2007, 08:33:49
Muy lindo dogflu66. Consulta hay algo que no entendí en el video: ¿Es bidireccional o unidireccional la comunicación?
Título: Re: Control de Reles a Distancia por RF
Publicado por: dogflu66 en 05 de Diciembre de 2007, 11:30:59
Je, je, ya no me acordaba de este hilo, puse el video por que me lo pidieron por privado.

Hasta 700mtrs en ciudad tal como estan, pero como dice en el hilo/articulo esto es variable.

Y solo utiliza comunicacion en un unico sentido, pero los tengo probados usando
comunicacion bidireccional y van muy bien... :-)
Título: Re: Control de Reles a Distancia por RF
Publicado por: Leon Pic en 05 de Diciembre de 2007, 12:00:35
Hasta 700mtrs en ciudad tal como estan, pero como dice en el hilo/articulo esto es variable.

Y solo utiliza comunicacion en un unico sentido, pero los tengo probados usando
comunicacion bidireccional y van muy bien... :-)

¿700mts? que linda distancia. Dime, como se llaman los módulos, porque me interesan muchísimo

Y una consulta más, ¿Dónde puedo encontrar más información para comunicación bidireccional? o sea, ¿cómo hago para sincronizar dos microcontroladores, o el módulo transeiver me hace ese trabajo?
Título: Re: Control de Reles a Distancia por RF
Publicado por: dogflu66 en 05 de Diciembre de 2007, 21:11:20
De aqui te puedes descargar Info de los modulos:

http://www.freewebs.com/glafebre/controlderelesrf.htm

Y son modulos muy baratos, por lo que se tiene que
hacer el control a base de programa.
Título: Re: Control de Reles a Distancia por RF
Publicado por: Leon Pic en 05 de Diciembre de 2007, 21:51:26
Está muy bueno el árticulo. Me viene como anillo al dedo. Muchas gracias.
Título: Re: Control de Reles a Distancia por RF
Publicado por: meledu en 01 de Junio de 2010, 12:59:25
una pregunta porque desactivas el modulo timer dentro de las interrupciones al igual que desactivas la interrupcion por usart si segun tengo entendido ON INTERRUMP  desactiva las mismas y RESUME  las vuelve a activar.
Título: Re: Control de Reles a Distancia por RF
Publicado por: dogflu66 en 02 de Junio de 2010, 10:42:10
Si, el código es redundante, puede ser que antes esa rutina no estuviera en esta parte del programa y, al cambiarla de sitio quedaran esas líneas inútiles ahí.

El programa lleva varios añitos por la red, y eres el primero que me hace esa observación. :D

Pero como ya has dicho esas líneas no afectan al funcionamiento del programa ya que es código redundante.

Gracias por la observación.

De aqui te puedes descargar Info de los modulos:

De aquí se puede descargar el artículo completo:

http://www.freewebs.com/glafebre/controlderelesrf.htm

Y aquí se pueden ver los modulos funcionando:

Título: Re: Control de Reles a Distancia por RF
Publicado por: meledu en 02 de Junio de 2010, 17:34:52
Buen dia ,tenia una duda ,para mejorar la trasmision de datos via rf me recomendaron usar codificacion manchester,la verdad que no havia oido hablar de esto y me gustaria que me apoyaran un poco he buscado en la red y ya tengo alguna info pero por siacaso nomas no habra algun tema abierto en el foro en donde pueda inrecambiar experiencias???
Título: Re: Control de Reles a Distancia por RF
Publicado por: dogflu66 en 02 de Junio de 2010, 17:47:42
Te recomiendo que pruebes el que se trata en el artículo. Utiliza sincronización de la trama y la trama tiene cabecera y terminación (checksum).                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
Título: Re: Control de Reles a Distancia por RF
Publicado por: meledu en 02 de Junio de 2010, 18:28:08
si lo he estado leyendo y por eso me di cuenta de la redundancia del programa ,pero hay unas cosas que no me quedan claro como lo que te mencione la vez pasada de porqe conviene usar mas hserget en ves de haserin , en las pruvas que he hecho al recibir la trama haserin me recibe todos los byte que envio (la trama completa)pero al usar haserget solo me recibe la primera.
no he hecho mi programa tan complejo no un bufer por soft ni nada solo cree una variable de 4 bytes y cargaba cada byte de la trama recibido y recibia muy bien todos inclusive probe enviando un cheksum y todo muy bien pero eso usando haserin ,al usar haserget solo me recibia el primer byte ,porque sera???
otra cosa cual seria la mejor forma de implementar un checsum ? yo lo hice de tal manera que hacia una suma de los primeros tres bytes pero sucedia que cuando habia silencio al ser todo en nivel bajo reconocia 0+0+0 que era 0 y como coincidia reconocia como dato cuando no era nada lo que queria enviar,
Título: Re: Control de Reles a Distancia por RF
Publicado por: dogflu66 en 02 de Junio de 2010, 19:09:56
Por eso es más fácil para un principiante utilizar Hserin, pero cuando complicas el programa ya comienza a darte problemas, Hserget solo lee 1byte cada vez, y pertenece a la programación avanzada ya que se pretende que el micro este realizando otras tareas como leer teclas, activar salidas, enviar datos por el LCD o hacer cálculos matemáticos. Hserget se puede utilizar básicamente de dos maneras: Comprobando el bit o flag que nos informa que hay datos en el búfer y por lo tanto enviamos a haserget tantas veces como haga falta hasta extraer todos los datos, no necesitamos saber la longitud de la trama. Normalmente cuando más rendimiento se obtiene con Hserget es utilizando la segunda forma: Las interrupciones, cuando están activas las interrupciones de la Usart no tenemos que comprobar nada, simplemente se ejecuta la rutina de entrada de datos de forma autónoma. La otra parte que crea muchos quebraderos de cabeza al que se inicia con el modulo Usart, es que hay que tener en cuenta que como es un búfer de entrada de datos, si los datos se solapan en el búfer este queda bloqueado, y activa un flag de error de desborde que implica que se perdieron datos y, quedando el modulo usart bloqueado solo en modo Rx, por esto hay que comprobar el flag de error de la usart para saberlo, y proceder al desbloqueo según el método del datasheet del micro.

Y el problema que mencionas con la trama se soluciona si envías códigos ASCII. En ASCII no es lo mismo 0 que "0" (http://www.ascii.cl/es/). El sistema anterior usa un protocolo de los llamados simples, y te puedo asegurar que no se le cuela ninguna trama defectuosa. Aquí te dejo un video con el mismo protocolo pero para otra aplicación:


En el video anterior a una de las placas se le suministran los datos por el teclado del pc y esta los reenvia por rf a la otra pantalla.
Aquí esta el hilo donde puedes seguir todo eso:

http://www.todopic.com.ar/foros/index.php?topic=14917.0
Título: Re: Control de Reles a Distancia por RF
Publicado por: dogflu66 en 02 de Junio de 2010, 19:22:04
Otro tema:
Si tienes ruido constante con este sistema no te afecta, para ver esto supondremos que trabajamos a 9600 baudios constantes ya sea ruido o datos, da igual, así que haremos lo siguiente:
9600/10= nos da 960bytes por segundo y esto nos da 0.96 bytes por cada mSeg., por lo tanto a un que tengamos ruido o datos continuos nos quedan 960uSeg. para hacer lo que queramos entre byte y byte que entra al búfer de la usart. Recuerda que el módulo usart funciona de forma autonoma y cada 0.96mSeg. nos daria un dato.

De todo esto deducimos que a más velocidad del oscilador del micro más tiempo para hacer otras cosas. Por lo tanto si cuando tienes avalancha de datos o ruido no puedes atender otros eventos o tareas tendrás que cambiar la estructura de tu programa.
Título: Re: Control de Reles a Distancia por RF
Publicado por: meledu en 03 de Junio de 2010, 12:45:00
Gracias amigo dogflu me haz dejado claro vairias cosas.
justo tenia esa duda de como hacer para tener mas tiempo para ejecutar otras tareas y se me ocurrio aumentar la velocidad de transmision y el clock, sabia que iva a ser mejor pero no tenia claro porque,y la verdad si que soy muy novato .
por desgracia los modulos que uso son economicos y no puedo trasmitir a mas de 2400 ,bueno se me ocurre comprar unos mejores ,pero creo que primero voy a hacer un programa bie estructurado y que funcione bien por cables y luego ya pruevo por rf.
Muchas gracias amigo y espero no molestar si recurro nuevamente a usted si se me presenta otra duda.
Título: Re: Control de Reles a Distancia por RF
Publicado por: elpeibel en 08 de Junio de 2010, 08:10:07
bueno antes de nada dar la enhorabuena a dogflu66.

mi pregunta es referente a relé:

corregidme si me equivoco, porque probablemente lo haga. El relé se activa o desactiva con dos señales distintas del micro que cierran y cortan la alimentacion de la bobina atraves de los transistores.  Cuando el relé está activado la alimentación queda activa y el rele consume corriente (si supieras cuanto consume el relé y el circuito total me gustaría saberlo), mi pregunta es: ¿existe algún relé o alguna configuración que sólo consuma en los cambios de estado?

estoy haciendo un circuito para controlar reles por ip

gracias por el trabajazo de documentación...
Título: Re: Control de Reles a Distancia por RF
Publicado por: dogflu66 en 09 de Junio de 2010, 05:26:02
Los reles típicos de electrónica que uso consumen entre 30 y 60mA (valor tipico 40mA). Lo mejor para saber este dato es medir la corriente del mismo. Y a lo segundo creo recordar que hay reles con biestable mecánico, pero nunca los he visto.
Título: Re: Control de Reles a Distancia por RF
Publicado por: stk500 en 09 de Junio de 2010, 10:35:49
los llamado Solide Relay, algunos tiene un consumo de 10mA, osea que se pueden atacar sin transistores.
por ejemplo este  (http://parts.digikey.com/1/parts/757291-relay-ssr-10ma-240v-1-2a-8-dip-pr3bmf51nskf.html) PR3BMF51NSKF