Autor Tema: Emisor de RC5 16F84A Problema  (Leído 4699 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado facu94hi

  • PIC10
  • *
  • Mensajes: 3
Emisor de RC5 16F84A Problema
« en: 13 de Diciembre de 2010, 00:52:03 »
Hola, soy relativamente nuevo en programacion en pic, mi intencion es realizar un simple emisor de un comando para un tv philips en rc5, para eso utilice el siguiente programa:

Código: C++
  1. #include<16f84a.h>
  2. #use delay( clock = 4000000 )
  3. int a;
  4. void on(void);
  5. void off(void);
  6.  
  7. main()
  8. {
  9.  
  10. set_tris_a(0x00);
  11. set_tris_b(0x00);
  12.  
  13. while(TRUE)
  14. {
  15. on();/*bit 1*/
  16. on();/*bit 2*/
  17. on();/*bit 3*/
  18. off();/*bit 4*/
  19. off();/*bit 5*/
  20. off();/*bit 6*/
  21. off();/*bit 7*/
  22. off();/*bit 7*/
  23. off();/*bit 8*/
  24. off();/*bit 9*/
  25. off();/*bit 10*/
  26. off();/*bit 11*/
  27. off();/*bit 12*/
  28. off();/*bit 13*/
  29. on();/*bit 14*/
  30.  
  31. delay_us(89);/*espera de 50 bits*/
  32.  
  33. }
  34. }
  35.  
  36. void on(void)
  37. {
  38.  
  39. delay_us(896);
  40.  
  41. for(a=0;a<32;a++)
  42. {
  43. output_high(PIN_B0);
  44. delay_us(14);
  45. output_low(PIN_B0);
  46. delay_us(14);
  47. }
  48.  
  49. }
  50.  
  51. void off(void)
  52. {
  53.  
  54. for(a=0;a<32;a++)
  55. {
  56. output_high(PIN_B0);
  57. delay_us(14);
  58. output_low(PIN_B0);
  59. delay_us(14);
  60. }
  61.  
  62. delay_us(896);
  63.  
  64. }

podrian decirme que esta mal???, aclaro que tuve que redondear los 36KHz de la frecuencia portadora, podra ser por eso que no anda???

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Emisor de RC5 16F84A Problema
« Respuesta #1 en: 13 de Diciembre de 2010, 10:51:59 »
  Yo cuento que estás mandando 15 bits y el protocolo RC5 es de 14 bits. Yo lo había hecho en asm que se puede tener un mucho mejor control de los tiempos y puedo confirmarte que funciona ya que lo probé con el TV de casa.
  La información del protocolo la saque de estos dos sitios

  http://www.sbprojects.com/knowledge/ir/rc5.htm
  http://www.ustr.net/infrared/index.shtml
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re: Emisor de RC5 16F84A Problema
« Respuesta #2 en: 13 de Diciembre de 2010, 10:57:39 »
El PIc 16F84 no tiene puerto C.
Solo dispone de puertos A y B
Todos los días se aprende algo nuevo.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Emisor de RC5 16F84A Problema
« Respuesta #3 en: 13 de Diciembre de 2010, 11:01:39 »
El PIc 16F84 no tiene puerto C.
Solo dispone de puertos A y B

  RC5 se refiere al protocolo de los remotos Philips y no al puerto del Pic, si es que a eso apuntaba tu comentario. Fijate que el programa que muestra facu usa el pin B0 como salida de portadora.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado facu94hi

  • PIC10
  • *
  • Mensajes: 3
Re: Emisor de RC5 16F84A Problema
« Respuesta #4 en: 13 de Diciembre de 2010, 13:19:15 »
Antes que nada, muchas gracias por las respuestas y por la info, bueno, modifique el programa en c le corregi el nº de bits y puse los tiempos justos y sigue sin andarme, podra ser un problema de tiempos? o del circuito?, estoy usando un emisor de IR generico con un bc548.
Ahi va el programa en css

Código: CSS
  1. #include<16f84a.h>
  2. #use delay( clock = 4000000 )
  3. int a,b;
  4. void on(void);
  5. void off(void);
  6.  
  7. main()
  8. {
  9.  
  10. set_tris_a(0x00);
  11. set_tris_b(0x00);
  12.  
  13. while(TRUE)
  14. {
  15. on(); /*bit1*/
  16. on(); /*bit2*/
  17. on(); /*bit3*/
  18. off(); /*bit4*/
  19. off(); /*bit5*/
  20. off(); /*bit6*/
  21. off(); /*bit7*/
  22. off(); /*bit8*/
  23. off(); /*bit9*/
  24. off(); /*bit10*/
  25. off(); /*bit11/
  26. off(); /*bit12*/
  27. off(); /*bit13*/
  28. off(); /*bit14*/
  29.  
  30. delay_us(89); /*espera de 50 bits*/
  31.  
  32. }
  33.  
  34. return 0;
  35.  
  36. }
  37.  
  38. void on(void)
  39. {
  40.  
  41. delay_us(889);
  42.  
  43. for(a=0;a<32;a++)
  44. {
  45. output_high(PIN_B0);
  46. delay_us(13.89);
  47. output_low(PIN_B0);
  48. delay_us(13.89);
  49. }
  50.  
  51. }
  52.  
  53. void off(void)
  54. {
  55.  
  56. for(b=0;b<32;b++)
  57. {
  58. output_high(PIN_B0);
  59. delay_us(13.89);
  60. output_low(PIN_B0);
  61. delay_us(13.89);
  62. }
  63.  
  64. delay_us(889);
  65.  
  66. }

Muchas gracias!

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Emisor de RC5 16F84A Problema
« Respuesta #5 en: 13 de Diciembre de 2010, 14:58:09 »
  Si no me equivoco a las rutinas de delay no podes pasarle como parámetro un número con decimales. Además, con cristal de 4MHz el tiempo por instrucción es de 1 us así que cualquier delay tiene que ser múltiplo de 1us (o sea 1, 2, 5, etc. siempre entero).

  Otra cosa es que si mantenés una tecla presionada en el remoto el "bit 3" tiene que ir alternando su valor. Aunque no creo que sea por ésto que no te esté funcionando.

  Como en C es muy difícil tener un control del tiempo tendrías que simularlo o bien con el MPLAB o con Proteus para saber cuanto tiempo está demorando cada bit en ser transmitido. Yo me arriesgaría a pensar que el tema viene por ahí...
También te conviene incluir la directiva fast_io para el puerto B.

  Posiblemente CCS genere este código asm para hacer "1" tu salida....

Código: ASM
  1. bcf STATUS,RP0
  2. bcf STATUS,RP1
  3. bsf PORTB,0

  Algo similar ocurriría para hacer "0" la salida
Entonces ya hay tres ciclos de instrucción más por cada cambio de salida así que eso incorpora 3 us de delay (si se usa un cristal de 4MHz)... Así que imaginate a cuanto se te puede ir el delay agregado, además falta sumar el tiempo que insume evaluar el ciclo for...  Por ello va a ser necesario que lo simules utilizando breakpoints o haciéndolo paso a paso para saber bien el tiempo que estás tardando.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: Emisor de RC5 16F84A Problema
« Respuesta #6 en: 14 de Diciembre de 2010, 18:03:44 »
supongo que estaras usando un modulador? ya que directamente con un transistor no te funcionaria.

yo use un ne555 y me fue de perlas.
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Emisor de RC5 16F84A Problema
« Respuesta #7 en: 14 de Diciembre de 2010, 18:53:42 »
supongo que estaras usando un modulador? ya que directamente con un transistor no te funcionaria.

yo use un ne555 y me fue de perlas.

  Está generando la portadora con el propio PIC.
También activa la portadora únicamente cuando tiene que haber señal, osa que con el mismo pin hace la portadora y la modulante.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: Emisor de RC5 16F84A Problema
« Respuesta #8 en: 14 de Diciembre de 2010, 20:29:46 »
ok.entiendo. ya hace tiempo descarte usar ese sistema en un proyecto que realize.pero no me acuerdo de porque.
quizas fuera porque necesitaba recursos del pic para interrupciones.

en el proyecto que realize copiaba la trama y luego la reproducia.de esta forma el circuito hera compatible con cualquier codigo.lo unico que hacia falta,
es modificar la frecuencia de la portadora para que fuera compatible con otros receptores.aunque me parecio ver que funcinaba igual con 36Khz que con 38Khz.
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Emisor de RC5 16F84A Problema
« Respuesta #9 en: 14 de Diciembre de 2010, 21:19:05 »
ok.entiendo. ya hace tiempo descarte usar ese sistema en un proyecto que realize.pero no me acuerdo de porque.
quizas fuera porque necesitaba recursos del pic para interrupciones.

en el proyecto que realize copiaba la trama y luego la reproducia.de esta forma el circuito hera compatible con cualquier codigo.lo unico que hacia falta,
es modificar la frecuencia de la portadora para que fuera compatible con otros receptores.aunque me parecio ver que funcinaba igual con 36Khz que con 38Khz.

  Sí, claro, es mucho mejor así. Pero para probar algo sencillo se puede generar portadora con el F84. Y sino se puede recurrir a un 628 y generar la portadora con el modulo PWM, otra salida se la usa como modulante (sería la trama a transmitir) y luego se podría usar una "and" entre la trama y la portadora o un transistor para que funcione como "and" y así modular la portadora.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado facu94hi

  • PIC10
  • *
  • Mensajes: 3
Re: Emisor de RC5 16F84A Problema
« Respuesta #10 en: 15 de Diciembre de 2010, 00:52:26 »
genere el programa en assembler y calcule los tiempos justos, lo probe con el osciloscopio digital de pic simulator y los tiempos daban bien, IGUALMENTE sigue si funcionarme, ahi va el codigo en asm:
Código: ASM
  1. pa      equ 0x05
  2. pb      equ 0x06
  3. est     equ 0x03
  4. tmr     equ 0x01
  5. int     equ 0x0b       
  6. op      equ 0x0c
  7.                
  8.         org 0  
  9.  
  10.         bsf est,5
  11.         clrf pa
  12.         clrf pb
  13.         movlw b'11010011';activo preescaler x16, se lo asigno a tmr0
  14.         movwf option     ;y lo pongo en modo temporizacion
  15.         bcf est,5
  16.         clrf tmr
  17.  
  18. main    call off
  19.         call on ;bit1=1
  20.  
  21.         call off
  22.         call on ;bit2=1
  23.  
  24.         call off
  25.         call on ;bit3=1
  26.  
  27.         call on
  28.         call off ;bit4=0
  29.        
  30.         call on
  31.         call off ;bit5=0
  32.        
  33.         call on
  34.         call off ;bit6=0
  35.  
  36.         call on
  37.         call off ;bit7=0
  38.        
  39.         call on
  40.         call off ;bit8=0
  41.        
  42.         call on
  43.         call off ;bit9=0
  44.  
  45.         call on
  46.         call off ;bit10=0
  47.        
  48.         call on
  49.         call off ;bit11=0
  50.        
  51.         call on
  52.         call off ;bit12=0
  53.        
  54.         call on
  55.         call off ;bit13=0
  56.        
  57.         call on
  58.         call off ;bit14=0
  59.  
  60.         call del_89;espera de 50 bits
  61.  
  62.         call off
  63.         call on ;bit1=1
  64.  
  65.         call off
  66.         call on ;bit2=1
  67.  
  68.         call on
  69.         call off ;bit3=0
  70.  
  71.         call on
  72.         call off ;bit4=0
  73.        
  74.         call on
  75.         call off ;bit5=0
  76.        
  77.         call on
  78.         call off ;bit6=0
  79.  
  80.         call on
  81.         call off ;bit7=0
  82.        
  83.         call on
  84.         call off ;bit8=0
  85.        
  86.         call on
  87.         call off ;bit9=0
  88.  
  89.         call on
  90.         call off ;bit10=0
  91.        
  92.         call on
  93.         call off ;bit11=0
  94.        
  95.         call on
  96.         call off ;bit12=0
  97.        
  98.         call on
  99.         call off ;bit13=0
  100.        
  101.         call on
  102.         call off ;bit14=0
  103.  
  104.         call del_89;espera de 50 bits
  105.  
  106.         goto main
  107.                
  108. del_14  nop
  109.         nop
  110.         nop
  111.         nop
  112.         nop
  113.         nop
  114.         nop
  115.         nop
  116.         nop
  117.         nop
  118.         return
  119.  
  120. del_11  nop
  121.         nop
  122.         nop
  123.         nop
  124.         nop
  125.         nop
  126.         nop
  127.         return
  128.  
  129. off     movlw d'201'
  130.         movwf tmr
  131. exp     btfss int,2
  132.         goto exp
  133.         bcf int,2
  134.         return ;en total, con el uso del call y el return y todo sumado, da 896us justos de delay
  135.  
  136. on      movlw d'32'
  137.         movwf op
  138. on1     bsf pb,0
  139.         call del_14
  140.         bcf pb,0
  141.         call del_11
  142.         decfsz op,1
  143.         goto on1
  144.         return ;en total 32 ciclos a
  145.                ;35.7KHz y ciclo de act.=50%
  146.        
  147. del_89  movlw d'251'
  148.         movwf tmr
  149. exp2    btfss int,2
  150.         goto exp2
  151.         bcf int,2
  152.         return
  153.  
  154.         end

lo hice a los apurones, de ahi el uso de los nop, pero anda en la pc, no en el tv, fijense si me pueden dar una mano por favor!!!

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Emisor de RC5 16F84A Problema
« Respuesta #11 en: 15 de Diciembre de 2010, 09:13:29 »
  ¿Y el PIC físico funciona?
  Subí una imágen del circuito que estás usando. Para saber si al led le llegan los pulsos podes reemplazar el led infrarrojo por uno rojo común y ver si se enciende.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: Emisor de RC5 16F84A Problema
« Respuesta #12 en: 15 de Diciembre de 2010, 11:56:01 »
o lo miras con la camra del mobil.  :mrgreen:
Montando mi primera impresora 3D (Raprep Prusa i3)


 

anything