Autor Tema: Duplicar señal IR  (Leído 3850 veces)

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

Desconectado churrinfunflais

  • PIC12
  • **
  • Mensajes: 68
Duplicar señal IR
« en: 06 de Octubre de 2011, 14:06:28 »
Hola amigos!!!

Tengo un pequeño proyectito no muy complicado en el cual nesecito leer una señal IR desplegarla en un lcd y para despues poder transmitirla denuevo.

Estoy usando un PIC 18f4550 con compilador CCS 4.120, como receptor IR un PNA4602 y como transmisor un led infrarrojo.

Como puedo guardar el dato de entrada???

cualquier ayuda con el codigo seria fantastica , gracias...

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Duplicar señal IR
« Respuesta #1 en: 06 de Octubre de 2011, 14:34:21 »
¿Qué codificación utiliza el transmisor?

Desconectado churrinfunflais

  • PIC12
  • **
  • Mensajes: 68
Re: Duplicar señal IR
« Respuesta #2 en: 06 de Octubre de 2011, 14:45:02 »
¿Qué codificación utiliza el transmisor?

El control remoto ql cual deseo duplicar, no conosco nada sobre el , pero logra exitar mi receptor, lo unico que nesesito es poder duplicar y manipular esa señal de entrada, supongo que debe ser una señal digital por boton algo asi como:

BTN ON = 101110010100

o algo asi, solo nesesito la secuensia binaria,,,,


gracias

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Duplicar señal IR
« Respuesta #3 en: 06 de Octubre de 2011, 14:57:58 »
Sin saber qué codificación lleva será más complicado. ¿Tienes un osciloscopio al menos para saber cuál es la base de tiempos que usa el transmisor?

Desconectado churrinfunflais

  • PIC12
  • **
  • Mensajes: 68
Re: Duplicar señal IR
« Respuesta #4 en: 06 de Octubre de 2011, 15:34:15 »
Sin saber qué codificación lleva será más complicado. ¿Tienes un osciloscopio al menos para saber cuál es la base de tiempos que usa el transmisor?

al parecer anda a 38KHz


Desconectado churrinfunflais

  • PIC12
  • **
  • Mensajes: 68
Re: Duplicar señal IR
« Respuesta #6 en: 06 de Octubre de 2011, 18:34:23 »
Aqui dejo una imagen de lo que eh podido sacar conectando el receptor IR al PicKIT 2 usando el analizador serial.
« Última modificación: 06 de Octubre de 2011, 19:32:56 por churrinfunflais »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Duplicar señal IR
« Respuesta #7 en: 07 de Octubre de 2011, 01:54:17 »
No se ve muy bien pero si cada división de esa captura es de 2.5ms, yo apostaría a que la base de tiempos del emisor es de 2ms.

Parece que el número de pulsos recibidos es de 34. No sé si has pulsado la tecla una sóla vez o la has dejado pulsada, pero es importante saber la duración de una pulsación simple.
Otro dato importante es que el pulso más ancho parece de unos 40ms. Por tanto, podemos decir que si transcurren 40ms sin recibir nada, la trama habrá terminado.

Una vez determinados estos dos parámetros, para capturar la trama yo haría lo siguiente:
1.- Conecta el receptor IR a un pin con interrupción externa del PIC
2.- Activa dicha interrupción
3.- Activa un timer configurado de tal manera que te permita una resolución capaz de ver 2ms. Activa una interrupción por desbordamiento del Timer que salte no antes de 40ms.
4.- Inicializa una variable para contar pulsos recibidos con el valor 0
5.- Inicializa un array de 34 posiciones a 0

En la interrupción externa:
1.- Guarda el valor del timer en una variable.
2.- Reinicia el timer
3.- Compara esa variable con 2ms; si es menor guarda un 0 en el array; si es mayor guarda un 1.
4.- Incrementa el contador de pulsos recibidos

En la interrupción del timer:
1.- Si el contador de pulsos recibidos es igual a 0, no hagas nada y sal de la interrupción
2.- En caso contrario, tienes una trama capturada en el Array. Procésala como quieras
3.- Reinicia el contador de pulsos recibidos a 0.

Hay muchas hipótesis en la redacción de este algoritmo, y habrá que comprobarlas en la práctica hasta conseguir que funcione, pero hasta que lo pruebes no sabremos más.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Duplicar señal IR
« Respuesta #8 en: 07 de Octubre de 2011, 10:15:36 »
  Yo creo que se podría implementar algo simple.... Si sólo se quiere duplicar la señal (sin interpretarla), se podría tener por un lado una portadora de 38KHz y luego mediante una compuerta AND se le aplica la señal que nos muestra Churrinfunflais. Y así obtendríamos la portadora modulada con la señal del remoto.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado churrinfunflais

  • PIC12
  • **
  • Mensajes: 68
Re: Duplicar señal IR
« Respuesta #9 en: 07 de Octubre de 2011, 13:44:37 »
Supongo que utilizando el puerto CCP1 puedo lograr esto.
alguien tiene un codigo de muestra??

cual seria la conexion correcta para poder conectar el PNA4602  al puerto serial y analizar la señal con el "IR SCOPE"  o tal vez con la Hyperterminal a traves del COM1
« Última modificación: 07 de Octubre de 2011, 16:27:18 por churrinfunflais »

Desconectado churrinfunflais

  • PIC12
  • **
  • Mensajes: 68
Re: Duplicar señal IR
« Respuesta #10 en: 11 de Octubre de 2011, 14:49:02 »
Encontre estr codigo en el foro de CCS, segun que funciona perfecto pero no logro hacerlo funcionar en mi circuito.

Código: [Seleccionar]
/******************************************************************/
/*                                                                */
/*      Infrared Receiver for SONY 12-bit protocol (SIRC)         */
/*                                                                */
/*  Compiler:     CCS PCH 3.242                                   */
/*  Processor:    PIC18F452 @ 32MHz                               */
/*  IR Sensor:    TSOP1738                                        */
/*  Circuit:      Standard from TSOP1738 Datasheet, OUT to RB0    */                                        
/*                Requires LCD on port D, LED+resistor on RC2     */
/*                LED blinks when a command is recognised.        */
/*  Author:       Aurelian Nichita     nicksubzero@yahoo.com      */
/*  Based on:     http://www.xs4all.nl/~sbp/knowledge/ir/sirc.htm */
/*                                                                */
/******************************************************************/

#define CLKSPEED 32000000
#include <18F452.h>
#fuses H4,NOPROTECT,NOOSCSEN,BROWNOUT,BORV45,NOWDT,WDT128,PUT,NOSTVREN,NODEBUG,NOLVP,WRT,NOCPB,WRTB,WRTC,NOCPD,NOWRTD,NOEBTR,NOEBTRB
#use delay(clock=CLKSPEED)
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)
#ignore_warnings none

#zero_ram

/* TIMER0 configuration */
#define TIMER0_CONFIG   RTCC_INTERNAL | RTCC_DIV_1

/* Interrupt rate:                     */
/* 4/32000000*65536*1 = 8.192 ms       */
/*                                     */
/*     Start: 3.0 ms (ignored)         */
/*     "1":   1.8 ms (14400)           */
/*     "0":   1.2 ms  (9600)           */

#define ONE_MIN  13400
#define ONE_MAX  15400
#define ZERO_MIN 8600
#define ZERO_MAX 10600

#include "lcd.c"


/* irframes[0] (start) will be garbage, ignore it...  */
int16 irframes[13];
int8 ircount = 0;
int1 irdone = FALSE;


#int_ext
void ext_isr() {
  if (irdone) return;
  irframes[ircount++] = get_timer0();
  if (ircount >= 13)
    irdone = TRUE;
  set_timer0(0);
  enable_interrupts(INT_TIMER0);
}


#int_timer0
void timer0_isr() {
  disable_interrupts(INT_TIMER0);
}


#separate
int1 decode_ir(int8 &addr, int8 &cmd) {
  int8 i;
  int8 mask;
  int8 bits[13];

  addr = 0;
  cmd = 0;

  for (i=1; i<=12; i++) {
    if ((ONE_MIN <= irframes[i]) && (irframes[i] <= ONE_MAX))
      bits[i] = 0x01;
    else
      if ((ZERO_MIN <= irframes[i]) && (irframes[i] <= ZERO_MAX))
        bits[i] = 0x00;
      else        // Error
        return FALSE;
  }

  mask = 0x01;
  for (i=1; i<=7; i++) {
    if (bits[i])
      cmd = cmd | mask;
    mask <<= 1;
  }

  mask = 0x01;
  for (i=8; i<=12; i++) {
    if (bits[i])
      addr = addr | mask;
    mask <<= 1;
  }

  return TRUE;
}


void start_ir() {
  memset(irframes, 0x00, sizeof(irframes));
  ircount = 0;
  irdone = FALSE;
}


void main() {
  int8 addr, cmd;
  int1 ok;
 
  delay_ms(100);
  setup_adc_ports(NO_ANALOGS);
  setup_adc(ADC_OFF);
  set_tris_a(0b11111111);
  set_tris_b(0b11111111);
  set_tris_c(0b11111011);  // PIN_C2 used for the LED
  set_tris_d(0b00000000);  // LCD
  set_tris_e(0b11111111);
  setup_spi(FALSE);
  setup_wdt(WDT_OFF);

  lcd_init();
  output_bit(PIN_C2, 0);
  delay_ms(100);

  lcd_putc("\fWaiting...");

  setup_timer_0(TIMER0_CONFIG);
  setup_timer_1(T1_DISABLED);
  setup_timer_2(T2_DISABLED, 255, 1);
  setup_timer_3(T3_DISABLED | T3_DIV_BY_1);
  ext_int_edge(0, L_TO_H);
  enable_interrupts(INT_EXT);
  enable_interrupts(GLOBAL);

  start_ir();
#ignore_warnings 203
  while(TRUE) {
#ignore_warnings NONE
    if (irdone) {
      ok = decode_ir(addr, cmd);
      printf(lcd_putc, "\fCmd  %3u\nAddr %3u", cmd, addr);
      if (!ok)
        lcd_putc("  ERROR");
      else
        output_bit(PIN_C2, 1);
      delay_ms(50);
      output_bit(PIN_C2, 0);
      start_ir();
    }
  }
}

creo que el problema radica en los fucibles ,, aqui dejo la configuracion que estoy intentando: con un 18f4550 y un oscilador interno a 4MHz, LCD en el puerto B en lugar de en el puerto D como el autor lo indica, todo lo demas es igual, el receptor IR en el puerto B0.

Código: [Seleccionar]
#include <18f4550.h>

#fuses INTHS,NOPROTECT,BROWNOUT,BORV45,NOWDT,WDT128,PUT,NOSTVREN,NODEBUG,NOLVP,WRT,NOCPB,WRTB,WRTC,NOCPD,NOWRTD,NOEBTR,NOEBTRB
#use delay(clock = 4M)
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)
#ignore_warnings none

#zero_ram

/* TIMER0 configuration */
#define TIMER0_CONFIG   RTCC_INTERNAL | RTCC_DIV_1

/* Interrupt rate:                     */

#define ONE_MIN  1450
#define ONE_MAX  2200
#define ZERO_MIN 600
#define ZERO_MAX 1440

#include <LCD.C>

...
...
...