Autor Tema: Control de Reles a Distancia por RF  (Leído 35445 veces)

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

Desconectado tithanae

  • PIC16
  • ***
  • Mensajes: 109
Re: Control de Reles a Distancia por RF
« Respuesta #15 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

Desconectado dogflu66

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Control de Reles a Distancia por RF
« Respuesta #16 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.
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Control de Reles a Distancia por RF
« Respuesta #17 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.
Saludos desde Granada, España.

Desconectado tithanae

  • PIC16
  • ***
  • Mensajes: 109
Re: Control de Reles a Distancia por RF
« Respuesta #18 en: 03 de Noviembre de 2006, 05:55:40 »
dogfju66 gracias por la info cuando yo la tenga andando te cuento

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: Control de Reles a Distancia por RF
« Respuesta #19 en: 03 de Noviembre de 2006, 09:10:37 »
Muy buen trabajo Dogflu66....y sobre todo, excelente documentación. Gracias!
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado dogflu66

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Control de Reles a Distancia por RF
« Respuesta #20 en: 03 de Noviembre de 2006, 13:15:29 »
Gracias Panas

proximamente el software
Saludos desde Granada, España.

Desconectado Azicuetano

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1020
    • Aplicaciones Electrónicas en Alicante.
Re: Control de Reles a Distancia por RF
« Respuesta #21 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.

Desconectado dogflu66

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Control de Reles a Distancia por RF
« Respuesta #22 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]
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Control de Reles a Distancia por RF
« Respuesta #23 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
« Última modificación: 08 de Noviembre de 2006, 19:45:50 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Control de Reles a Distancia por RF
« Respuesta #24 en: 12 de Noviembre de 2006, 20:08:59 »
El articulo completo lo podeis descargar de aqui:

http://www.mytempdir.com/1047934
Saludos desde Granada, España.

Desconectado DieccoF

  • PIC10
  • *
  • Mensajes: 16
Re: Control de Reles a Distancia por RF
« Respuesta #25 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

Desconectado dogflu66

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Control de Reles a Distancia por RF
« Respuesta #26 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... :(
Saludos desde Granada, España.

Desconectado DieccoF

  • PIC10
  • *
  • Mensajes: 16
Re: Control de Reles a Distancia por RF
« Respuesta #27 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

Desconectado dogflu66

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Control de Reles a Distancia por RF
« Respuesta #28 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... :(
Saludos desde Granada, España.

Desconectado lord_10

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 612
    • My Blog
Re: Control de Reles a Distancia por RF
« Respuesta #29 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:
..::  3D5F ™ ::..  AHC

"Tan sólo hace falta una pequeña idea, para hacer un gran sueño realidad."