Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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); }
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.
* 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;
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
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
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
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 );