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: Modelo: Voltaje: Corriente: B.P.F. Center Frequency: Distancia:
EverLight IRM-8601S 0 - 6V 3 mA 38 Khz 8m
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: Power DVD Cicle Square Windows UP Stop Back Play/Pause Next DN First Upper Last Left Ok Right Return Down i Vol Mute Vol+
Hex Code: 800F040C 800F8424 800F8480 800F0481 800F840D 800F0412 800F0419 800F8415 800F046E 800F8414 800F8413 800F041B 800F841E 800F041A 800F8420 800F0422 800F8421 800F0423 800F841F 800F040F 800F8411 800F040E 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: Power 1 Power 2 Power 3 Power 4
Hex Code: 800F040C 800F840C 800F040C 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 main.c /* * * * * * * * * * * * * * * * * * * * * * */
04/01/13
http://www.proprojects.wordpress.com
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; OSCTUNEbits.SPLLEN = 1; RC6M6Init(); lcd_initialize(); while(true){ lcd_goto(1,1);
// Poscaler selected to 8 MHz // PLLx4 Enable System FQ = 32 MHz
Por: Omar Gurrola
04/01/13 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:
http://www.proprojects.wordpress.com
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