pic18f14k50: decodificando protocolo rc6

6
Por: Omar Gurrola 04/01/13 http://www.proprojects.wordpress.com PIC18F14K50: Decodificando Protocolo RC6 En esta sección decodificaremos un protocolo infrarrojo RC6 (Secuela del RC5) de un control infrarrojo HP que venían con algunas laptops. El objetivo de decodificar este control es poder controlar algún dispositivo a distancia. Fabricante: HP Modelo: HSTNN-PRO7 Protocolo de Tx: RC6 Tipo de Batería: CR2016 (CZ, 3V, 90mAh) El receptor que utilizare es un IRM-8601S de EverLight, el cual nos dará la señal cuadrada a decodificar: Fabricante: EverLight Modelo: IRM-8601S Voltaje: 0 - 6V Corriente: 3 mA B.P.F. Center Frequency: 38 Khz Distancia: 8 m

Upload: dragoon-micromar

Post on 31-Mar-2016

216 views

Category:

Documents


0 download

DESCRIPTION

Como decodificar el protocolo RC6

TRANSCRIPT

Por: Omar Gurrola 04/01/13 http://www.proprojects.wordpress.com

PIC18F14K50: Decodificando Protocolo RC6

En esta sección decodificaremos un protocolo infrarrojo RC6 (Secuela del RC5) de un control infrarrojo HP que venían con algunas laptops. El objetivo de decodificar este control es poder controlar algún dispositivo a distancia.

Fabricante: HP

Modelo: HSTNN-PRO7

Protocolo de Tx: RC6

Tipo de Batería: CR2016

(CZ, 3V, 90mAh)

El receptor que utilizare es un IRM-8601S de EverLight, el cual nos dará la señal cuadrada a decodificar:

Fabricante: EverLight

Modelo: IRM-8601S

Voltaje: 0 - 6V

Corriente: 3 mA

B.P.F. Center Frequency: 38 Khz

Distancia: 8 m

Por: Omar Gurrola 04/01/13 http://www.proprojects.wordpress.com

El modulo receptor infrarrojo ya lo había diseñado hace un tiempo, puedes ver cómo hacer uno en este post. Si no tienes conocimiento básico sobre el protocolo RC5 o RC6 visita este post ya que solo se realizara el análisis y decodificación de la señal. Para poder decodificar cualquier señal necesitamos verla con un analizador lógico o un osciloscopio, utilizare un analizador lógico muy básico que realice hace mucho tiempo para este trabajo.

1. Lo primer es capturar la señal al presionar un botón, en este caso es el botón de ”Power”.

Lo primero que se puede observar es que cuando no se transmite la señal se mantiene en “1” (reposo).

Se puede observar que la señal en su totalidad es enviada dos veces, ya que se repite el patrón.

La información es transmitida con codificación Manchester tal como lo establece el protocolo RC6, pero la señal esta invertida (a lo mejor por el receptor) por lo que un “1” es cambio de 0->1 y un “0” es cambio de 1->0.

El ancho de pulso o 1t = 444 µs.

El tiempo libre antes de transmitir nuevamente tiene una duración de 9t = 3993 µs.

2. Según RC6 en la cabecera hay tres bits que son [m2, m1, m0] que definen el modo, con esto podemos buscar información y entender mejor el resto de la señal.

Según la cabecera este RC6 es Modo 6 y según esta página nuestro control es modo 6A, que son para dispositivos OEM (dispositivos que no son de philips) en modo comandos. Este modo también se conoce como “General Application Mode 6A” por lo tanto el ancho de los campos control e información pueden cambiar en base a la aplicación y el fabricante.

Para este control son 32 bits los que aparecen después de la cabecera los cuales corresponden a los campos de control e información, la pregunta es cuantos bits corresponden a uno.

Por: Omar Gurrola 04/01/13 http://www.proprojects.wordpress.com

3. Para averiguarlo vamos a diseñar un programa decodificar de Manchester muy similar al del capítulo RF para leer los 32 bits de cada botón y poder determinar cuáles bits corresponden al campo de control o dirección y cuantos al de información.

Key Name: Hex Code:

Power 800F040C DVD 800F8424 Cicle 800F8480 Square 800F0481 Windows 800F840D UP 800F0412 Stop 800F0419 Back 800F8415 Play/Pause 800F046E Next 800F8414 DN 800F8413 First 800F041B Upper 800F841E Last 800F041A Left 800F8420 Ok 800F0422 Right 800F8421 Return 800F0423 Down 800F841F i 800F040F Vol - 800F8411 Mute 800F040E Vol+ 800F8410

Los primeros bits más significativos que no cambiaron corresponden al campo de control o dirección, en este caso son los primeros 16 bits [B31-B16].

Los siguientes 16 bits [B15-B0] parece que corresponden al campo de información.

4. Por ultimo determinemos si existe un bit de cambio (toggle) en el campo de información, capturando más de una vez el mismo botón, si el código cambia y regresa cada vez que se presiona existe bit de cambio.

Key Name: Hex Code:

Power 1 800F040C Power 2 800F840C Power 3 800F040C Power 4 800F840C

Se puede observar que el único bit que cambia es b15 el cual corresponde al bit de cambio. Con toda la información obtenida podemos finalmente definir el paquete que transmite este control y procedemos a terminar el decodificador:

Por: Omar Gurrola 04/01/13 http://www.proprojects.wordpress.com main.c

/* * Copyright (c) 2011-2013, http://www.proprojects.wordpress.com * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1.- Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2.- Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /********************************************************************************** * Author: Omar Gurrola * Site: http://www.proprojects.wordpress.com * Processor: PIC18 * Compiler: C18 v3.45 * File Name: main.c * Description: Main program * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Rev. Date Comment * 1.0 04/01/13 Initial version *********************************************************************************/ /** INCLUDES *******************************************************/ #include <p18f14k50.h> #include "pic18f14k50_cbits.h" #include "pic18f14k50_io.h" #include "stdvars.h" #include "wait.h" #include "HD44780-STP.h" #include "rc6_m6.h" #include <stdio.h> /** PROTOTYPES *****************************************************/ /** VARIABLES ******************************************************/ /** DECLARATIONS ***************************************************/ #pragma code // Forces the code below this line to be put into the code section (Memory Adress >= 0x'REMDIR'02A) /** Interrupt Service Routines (ISR)********************************/ #pragma interrupt HighPriorityISR void HighPriorityISR (void){ //Check which interrupt flag caused the interrupt. //Service the interrupt //Clear the interrupt flag //Etc. } //This return will be a "retfie fast", since this is in a #pragma interrupt section #pragma interruptlow LowPriorityISR void LowPriorityISR (void){ //Check which interrupt flag caused the interrupt. //Service the interrupt //Clear the interrupt flag //Etc. } //This return will be a "retfie", since this is in a #pragma interruptlow section void main(void){ u16 Address,Command; s8 String[21]; RC6M6_STATUS RXStatus; OSCCONbits.IRCF = 0b110; // Poscaler selected to 8 MHz OSCTUNEbits.SPLLEN = 1; // PLLx4 Enable System FQ = 32 MHz RC6M6Init(); lcd_initialize(); while(true){ lcd_goto(1,1);

Por: Omar Gurrola 04/01/13 http://www.proprojects.wordpress.com lcd_write_pgm(" Pro Projects "); lcd_goto(2,1); lcd_write_pgm("HP IR RC6-M6A Decode"); RXStatus = RC6M6Receive(&Address,&Command); Waitmsx(50); lcd_clear(); if(RXStatus == OK){ sprintf(String,"Address: %#.4hX",Address); lcd_goto(3,1); lcd_write(&String[0]); sprintf(String,"Command: %#.4hX",Command); lcd_goto(4,1); lcd_write(&String[0]); } else{ lcd_goto(3,1); lcd_write_pgm("ERROR CODE:"); switch(RXStatus){ case NO_START_ERROR: sprintf(String,"NO_START_ERROR"); break; case START_BIT_ERROR: sprintf(String,"START_BIT_ERROR"); break; case NO_M6_ERROR: sprintf(String,"NO_M6_ERROR"); break; case TRAIN_BIT_ERROR: sprintf(String,"TRAIN_BIT_ERROR"); break; default: sprintf(String,"UNKNOWN_ERROR"); break; } lcd_goto(4,1); lcd_write(&String[0]); } } // end while } // end main()

Circuito armado:

Por: Omar Gurrola 04/01/13 http://www.proprojects.wordpress.com

Referencias

Microchip, “PIC18F/LF1XK50 Data Sheet”, 2010,

http://ww1.microchip.com/downloads/en/DeviceDoc/41350E.pdf

Everlight, “Datasheet”, 1998

http://electronica.li2.uchile.cl/new/documentacion/pdfs/IRM8601.pdf

San Bergmans, “Philips RC6 Protocol”, 2001

http://slydiman.narod.ru/scr/kb/rc6.htm