TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: churrinfunflais 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...
-
¿Qué codificación utiliza el transmisor?
-
¿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
-
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?
-
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
-
No, esa es la portadora. Mira aquí:
http://www.sbprojects.com/knowledge/ir/index.php
-
Aqui dejo una imagen de lo que eh podido sacar conectando el receptor IR al PicKIT 2 usando el analizador serial.
-
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.
-
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.
-
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
-
Encontre estr codigo en el foro de CCS, segun que funciona perfecto pero no logro hacerlo funcionar en mi circuito.
/******************************************************************/
/* */
/* 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.
#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>
...
...
...