You are on page 1of 26

#include "16f877a.

h" #device ADC=8 #fuses XT,NOWDT,NOPROTECT,NOLVP,NODEBUG #use delay(clock=4000000) #define Pulse PIN_C0 //aqu manda pulso disparo al triac int flag=0; //#include #int_ext void ext_isr() { flag=1; } void main() { BYTE i, j, address, value; int16 q, q1; int16 retardo=0,data=200; float p; q1=0; output_low(Pulse); setup_adc_ports(AN0); setup_adc(ADC_CLOCK_INTERNAL);

set_adc_channel(0); ext_int_edge(0,L_TO_H); enable_interrupts(INT_EXT); enable_interrupts(GLOBAL); do { if(flag) { data=read_adc(); retardo=(int16)(255-data)*32; delay_us(retardo); output_high(Pulse); delay_us(40); output_low(Pulse); flag=0; } }while (TRUE); }

ahy unos componentes que cambie como el TSOP y el triac

Philips RC5.
El protocolo RC5 es un tipo de Manchester paquete de datos codificado. Manchester datos es nica en que una de datos est representado por una transicin en el centro de la broca. Un 1 es recibida por el receptor de infrarrojos (despus de la inversin por el sensor de infrarrojos) como una transicin de alto a bajo, y un 0 como una transicin de bajo-a-alto. El paquete de IR RC5 consta de 14 bits: dos bits de inicio (S1, S0), un bit de control (C), cinco bits de direccin (A4 a A0) y un cdigo de comando bit seis (C5 a C0). El paquete de 14 bits entero se recibe MSB primero, comenzando con dos bits de inicio. La figura se muestra a continuacin es un paquete de datos visto por el receptor IR.

Los bits de inicio siempre se transmiten como 1. El bit de control activa o desactiva cada vez que se recibe una nueva clave. Los cinco bits de direccin representan 32 direcciones posibles diferentes del equipo para el que est destinado el paquete. Los seis bits de comando 64 representan comandos que pueden ser transmitidos. El periodo de bit de RC5 es 1.78 ms de largo, con la mitad de ese perodo de alto y la otra mitad bajo. La duracin para el paquete de 14 bits completo es de aproximadamente 25 ms.

RC5 lee el cdigo de ejemplo.


/ * * Nombre del proyecto: RC5 decodificacin * Copyright: Nicholas Sirirak * Descripcin: * Configuracin de la prueba: MCU: PIC18F2620 Dev.Board: Oscilador: HS, 16,0000 MHz Ext. Mdulos: SW: mikroC PRO V1.65

* NOTAS: * # # # # # # # / Define Define Define Define Define Define Define LED1 LED2 LED3 LED4 LED5 LED6 LED7 LATB.F1 LATB.F2 LATB.F3 LATB.F4 LATB.F5 LATB.F6 LATB.F7

sin firmar capturar_datos, BIT_COUNT; carbn logic_interval, logic_change; carbn old_invert = 0 ; carbn invert_bit = 0 ; enumeracin { Idle, Start_bit, Capture_bit }; caracteres Current_state = Idle; carbn got_data = 0 ; carbn Command_code, Address_code;

void interrupt(){ if(INTCON.INT0IF){ //******************************************************************* *********** / / RB0 cambiado, palanca de flanco de interrupcin y aumentar logic_change para detectar / Propsito seal de fallo / / / Si se trata de un primer borde detectado, inicializar los datos y activar el temporizador 2 / / ************************************************ ****************************** INTCON2.INTEDG0 = ~ INTCON2.INTEDG0; / / borde de palanca logic_change + +, si (== current_state Idle) { logic_interval = 0 ; logic_change = 0 ; delay_us ( 200 ); TMR2 = 0 ; PIR1.TMR2IF = 0 ; / / claro indicador de interrupcin T2CON.TMR2ON = 1 ; / / temporizador 2 est en Current_state = Start_bit; }

INTCON.INT0IF = 0 , . / / indicador de interrupcin clara } / RB0 rutina / ********* End interrupcin ********************** ******************* si (PIR1.TMR2IF) { logic_interval + +; switch (Current_state){ //******************************************************************* *********** / / Buscar (segundos) bit de inicio, lgica en RB0 debe cambiar en 890us o considera / / Como una seal de fallo. / / ************************************************ ****************************** caso Start_bit: si ((logic_interval == 1 ) && (logic_change == 1 )) { logic_interval = 0 ; logic_change = 0 ; BIT_COUNT = 0 ; capturar_datos = 0 ; current_state = Capture_bit; / / pasar a la captura estatal } ms { Current_state = inactivo;

T2CON.TMR2ON = est apagado la cada

0 ; 0 ;

/ / temporizador 2 / / interrupcin de

INTCON2.INTEDG0 =

/ / Captura de estado. Muestreo RB0 lgica cada 1780 nosotros (logic_interval = 2). / / Los datos son vlidos si la lgica en RB0 fue el cambio. / / Los datos son almacenados en Command_code y Address_code / / ************************************************ ****************************** si (logic_interval == 2 ) { si (logic_change <= 2 ) { logic_interval = 0 ; logic_change = 0 , si (BIT_COUNT < 12 ) { BIT_COUNT + +; capturar_datos << = 1 ; si (PORTB.F0 == 1 ) { capturar_datos | = 1 ; } } ms { Command_code = capturar_datos y 0x3F ; capturar_datos >> = 6 ; Address_code = capturar_datos y 0x1F ;

temporizador interrupcin

temporizador interrupcin

en el flanco }

capturar_datos >> = 5 ; si (old_invert = capturar_datos) { invert_bit = 1 ; old_invert = capturar_datos; } dems invert_bit = 0 ; got_data = 1 ; Current_state = inactivo; T2CON.TMR2ON = 0 ; / / 2 est apagado INTCON2.INTEDG0 = 0 , . / / en el flanco descendente } } ms { Current_state = inactivo; T2CON.TMR2ON = 0 ; / / 2 est apagado INTCON2.INTEDG0 = 0 , . / / en el flanco descendente } } descanso , por defecto : Current_state = inactivo; INTCON2.INTEDG0 = 0 ; / / interrupcin descendente.

PIR1.TMR2IF = clear } }

0 ;

indicador de interrupcin / /

/ / ************************************************ ****************************** / / PRINCIPAL PRINCIPAL PRINCIPAL PRINCIPAL / / ************************************************ ****************************** void main () { TRISC = 0 ; / / PORTC se emite TRISB = 0 ; / / PORTB se emite LATB = 0 ; / / ************************** ************************************************** ** / / RB0 interrupcin establecido / / ************************************************ ****************************** INTCON.INT0IE = 1 ; / / activar RB0 interrupcin. INTCON2.INTEDG0 = 0 ; / / interrupcin en el flanco descendente. TRISB.F0 = 1 , . / / RB0 = entrada ADCON1 = 0x0F ; / / todas las E / S digitales

/ / ************************************************ ****************************** / / Timer2 interrupcin establecido, interrumpa cada 890us / / ************************************************ ****************************** T2CON = 0b00100001; / / postscal 1:5, temporizador, prescaler 01:04 PR2 = 177 ; / / precarga Timer2 valor de comparacin TMR2 = 0 , el valor / / reset Timer2 PIR1.TMR2IF = 0 , . / / indicador de interrupcin clara PIE1 . TMR2IE = 1 , . / / activar Timer2 interrupcin IPR1.TMR2IP = 1 ; / / temporizador 2 de interrupcin de alta prioridad / / ************************************************ ****************************** / / Interrupcin Global permitir / / ************************************************ ****************************** INTCON.PEIE = 1 ; / / habilitar interrupcin INTCON.GIE = 1 ; / / habilitar interrupciones globales

mientras que ( 1 ) { si (got_data) { got_data = 0 , si ((Address_code == 0 ) && (invert_bit interruptor (Command_code) { caso 0 : LED1 = ~ LED1, descanso caso 1 : LED2 = ~ LED2, descanso caso 2 : LED3 = ~ LED3, descanso caso 3 : LED4 = ~ LED4, descanso caso 4 : LED5 = ~ LED5; descanso caso 5 : LED6 = ~ LED6; descanso caso 6 : LED7 = ~ LED7, descanso } } } } }

== , , , , ; ; ;

1 )) {

Sony

SONY Protocolo SIRC.


Mando a distancia de infrarrojos se ha arond durante mucho tiempo. Cada fabricante utiliza un conjunto diferente de los protocolos. Por ejemplo, RC80 es utilizado por Panasonic, RC5 se utiliza por Philips, y SIRC se utiliza por SONY, que es uno de los ms simples a decodificar. Con el fin de eliminar fuentes de luz ambiente de interferir con el flujo de datos transmiti se utiliza luz modulada. Esta modulacin es el centro en torno a diferentes frecuencias dependiendo del fabricante y vara de 32 KHz a 56kHz. En el caso de Sony, el centro de la modulacin es 40KHz que significa que necesitamos un receptor de infrarrojos que puede recibir la modulacin de la luz infrarroja y convertirla en una seal TTL para un PIC. Hay un nmero de IR-receptores disponibles, cada uno que tiene una frecuencia central especfica que son ms sensibles tambin. En este ejemplo, yo uso RPM7140 que tiene frecuencia central 40KHz. La figura que se muestra a continuacin es el diagrama de bloques interno del RPM7140.

Salida (Rout) es normalmente alto como se puede ver en el diagrama de bloques, que tiene un resistor pull-up que mantienen lgico alto cuando no hay seal presente. Cuando se detecta la seal de infrarrojos, el caudal es bajo. Protocolo de SONY, SIRC (Serial Control de Infra-Red) es un protocolo de comunicacin de control remoto luz infrarroja que utiliza una forma de modulacin de ancho de pulso (PWM) para construir interface.The protocolo ms comn es la interfaz serial de 12 bits,

pero de 15 bits y la versin 20_bit estn tambin disponibles. La figura que se muestra a continuacin es una serie de pulsos se acumulan paquete de 12 bits.

La cabecera es 2.4ms de largo, 1 lgico es 1.8ms (1.2ms 0.6ms de alto + bajo), la lgica 0 es 1.2ms (0.6ms 0.6ms de alto + bajo). El paquete consta de cabecera, el cdigo de comando (7 bits) que se presenta en el botn real pulsa en el control remoto, y el cdigo de dispositivo (5 bits), que presenta un TV, VCR, reproductor de CD, etc Aquellos seal se invierte en fuga de la RPM7140. Cuando se envan los datos, tiempo de retardo 45ms antes del siguiente paquete se enva y se repite durante el tiempo que

se presiona la tecla. Tabla que se muestra a continuacin encontrar la lista de cdigo de tecla Comando para la televisin (cdigo de dispositivo = 1).
Cdigo comando (Hex) 0 1 2 3 4 5 6 7 8 9 0x10 0x11 0x12 0x13 0x14 0x15 0x0B 0x25 0x74 Funcin Clave 1 Clave 2 Clave 3 Clave 4 Clave 5 Clave 6 Tecla 7 Tecla 8 Clave 9 Tecla 0 Canal + Canal Volumen + Volumen Silencio Potencia Entrar Entrada ARRIBA

0x75 0x33 0x34

ABAJO DERECHO IZQUIERDA

El Esquema.
En este ejemplo, todo lo que necesito es para alternar activar y desactivar una coordenada LED de la tecla del mando a distancia. El esquema que se muestra a continuacin.

El Cdigo.
/ * * Nombre del proyecto: SONY SIRC decodificacin * Copyright: Nicholas Sirirak * Descripcin: * Configuracin de la prueba: MCU: PIC18F2620 Dev.Board: Oscilador: HS, 16,0000 MHz Ext. Mdulos: SW: mikroC PRO V1.65 * NOTAS: * # # # # # # # / Define Define Define Define Define Define Define LED1 LED2 LED3 LED4 LED5 LED6 LED7 LATB.F1 LATB.F2 LATB.F3 LATB.F4 LATB.F5 LATB.F6 LATB.F7

sin firmar contador = 0 ; sin firmar capturar_datos, BIT_COUNT; enumeracin { Idle, Start_bit, Capture_bit };

caracteres Current_state = Idle; carbn got_data = 0 ; carbn Command_code, Device_code; void interrupcin () { si (INTCON.INT0IF) { interruptor (Current_state) { caso Idle: INTCON2.INTEDG0 = 1 , . / / interrupcin en el flanco ascendente contador = 0 ; Current_state = Start_bit; descanso ; / / encuentra el flanco ascendente, para comprobar la longitud 2.4ms caso Start_bit: seal / / correcto, pase al siguiente estado si (contador == 4 ) { contador = 0 ; BIT_COUNT = 0 ; capturar_datos = 0 ; Current_state = Capture_bit; } ms { / seal / error, vuelva al estado Libre Current_state = inactivo; } descanso ; caso Capture_bit: / / cheque ms la longitud 0 o 1 si (contador == 2 ) {

; recibidos

capturar_datos >> = / / aadir 0 para los datos BIT_COUNT + +; } ms { si (contador ==

3 )

{ capturar_datos >> = 1 ; capturar_datos | = / / aadir 1 a los datos } vuelva al estado de reposo INTCON2.INTEDG0 = 0 , . / / interrupcin en el flanco descendente Current_state = inactivo; } } / / Compleat 12 bits si (BIT_COUNT> = 12 ) { got_data = 1 ; capturar_datos >> = 4 ; INTCON2.INTEDG0 = 0 , . / / interrupcin en el flanco descendente Current_state = inactivo; } contador = 0 ; descanso ; BIT_COUNT + +; ms { / lugar / error, 0x8000 ; recibidos

predeterminado : Current_state = inactivo; } INTCON.INT0IF = 0 ; / / indicador de interrupcin clara. } si (PIR1.TMR2IF) { contador + +; si (contador> 5 ) { Current_state = inactivo; contador = 0 ; INTCON2.INTEDG0 = 0 ; / / interrupcin en el flanco descendente. } PIR1.TMR2IF = 0 ; indicador de interrupcin / / clear } } / / *********************************************** * ****************************** / / PRINCIPAL PRINCIPAL PRINCIPAL PRINCIPAL / / *********************************************** * ****************************** void main () { TRISC = 0 ; / / PORTC se emite TRISB = 0 ; / / PORTB se emite / / *********************************************** * ****************************** / / RB0 interrupcin establecido

/ / *********************************************** * ****************************** INTCON.INT0IE = 1 ; / / activar RB0 interrupcin. INTCON2.INTEDG0 = 0 ; / / interrupcin en el flanco descendente. TRISB.F0 = 1 , . / / RB0 = entrada ADCON1 = 0x0F ; / / todas las E / S digitales / / *********************************************** * ****************************** / / Timer2 interrupcin establecido, interrumpa cada 600us / / *********************************************** * ****************************** T2CON = 2 ; / / temporizador, prescaler 1:16 PR2 = 149 , . / / precarga Timer2 valor de comparacin TMR2 = 0 , el valor / / reset Timer2 PIR1.TMR2IF = 0 ; . indicador de interrupcin / / clear PIE1.TMR2IE = 1 ; / / enable Timer2 interrupcin. IPR1.TMR2IP = 1 ; / / temporizador 2 de interrupcin de alta prioridad / / *********************************************** * ****************************** / / Interrupcin Global permitir

/ / *********************************************** * ****************************** INTCON.PEIE = 1 ; / / habilitar interrupcin INTCON.GIE = 1 ; / / habilitar interrupciones globales T2CON.TMR2ON = 1 ; / / temporizador 2 es el tiempo ( 1 ) { si (got_data) { Command_code = capturar_datos y 0x7F ; Device_code = capturar_datos >> 7 ; got_data = 0 , si (Device_code == 1 ) { interruptor (Command_code) { caso 0 : LED1 = ~ LED1, descanso , caso 1 : LED2 = ~ LED2, descanso , caso 2 : LED3 = ~ LED3, descanso , caso 3 : LED4 = ~ LED4, descanso , caso 4 : LED5 = ~ LED5; descanso ; caso 5 : LED6 = ~ LED6; descanso ; caso 6 : LED7 = ~ LED7, descanso ; } PIE1.TMR2IE = 0 , . / / desactivar Timer2 interrupcin Delay_ms ( 100 );

TMR2 = 0 , el valor / / reset Timer2 PIE1.TMR2IE = 1 , . / / activar Timer2 interrupcin } } } }

You might also like