Receptor IR (protocolo NEC) para PIC16F84
Programa para la captura de emisiones Infrarrojos (IR) de mandos a distancia que empleen el protocolo NEC:
[code]program ReceptorIR NEC ' ******************************************************************************* 'Programa Receptor de codigos IR ' Protoloco IR de NEC ' ' (c) ZackY 2007 - http://foros.zackyfiles.com/forumdisplay.php?f=437 ' '-HARDWARE: ' MCU: PIC 16F84A ' Cristal: 4 Mhz ' ' Receptor IR USD160 conectado a PORTB.2 (Entrada) ' Este receptor IR proporciona una señal invertida ' PORTB.3 (Salida SEÑAL) PORTA.1 (Salida LED) ' ******************************************************************************* const Flanco1max as word = 316 ' 013Ch const Flanco1min as word = 152 ' 0098h const Flanco2max as word = 156 ' 009Ch const Flanco2min as word = 148 ' 0094h const AnchuraPulso1 as byte = 100 ' limite máximo para Error Dim AnchuraPulso as Byte Dim ComandoTotal as Word Dim Comando as Byte Dim Comando_inv as Byte Dim AddressTotal as Word Dim Address as Byte Dim Address_inv as Byte Dim i as Byte 'Rutina de lectura de CABECERA Sub procedure Cabecera_IR Dim BD1 as word Dim BD2 as word ini_cabecera: Comando=0 Address=0 BD1 = 0 BD2 = 0 WHILE PORTB.2 = 1 ' Espera a comienzo de Cabecera (0=comienzo) nop WEND ' RECIBO LA CABECERA y COMPRUEBO WHILE (PORTB.2 = 0) And (BD1 < Flanco1max) ' 1er Flanco OFF INC(BD1) WEND ' Si no es 1er Flanco OK, iniciamos proceso IF (BD1 > Flanco1max) or (BD1 < Flanco1min) THEN Delay_ms(80) GOTO ini_cabecera End if ' Primer Flanco de cabecera correcto ' Comprobamos el segundo Flanco WHILE (PORTB.2 = 1) And (BD2 < Flanco2max) ' 2º Flanco ON INC(BD2) WEND ' Si no es 2º Flanco OK, salimos IF (BD2 > Flanco2max) or (BD2 < Flanco2min) THEN Delay_ms(80) GOTO ini_cabecera End if ' Hasta aqui CABECERA RECIBIDA CORRECTAMENTE End sub 'Rutina de un Bit IR Sub function Bit_IR as Byte AnchuraPulso = 0 WHILE PORTB.2 = 0 nop WEND WHILE PORTB.2 = 1 And (AnchuraPulso < AnchuraPulso1) Inc(AnchuraPulso) WEND inc(i) IF (AnchuraPulso>83) and (AnchuraPulso<87) THEN ' ¿entre 53h y 57h? result = 1 End if IF (AnchuraPulso>28) and (AnchuraPulso<31) THEN ' ¿entre 1Ch y 1Fh? result = 0 End if End sub 'Rutina de lectura de TECLA IR protocolo NEC (Entrada PORTB.2) Sub procedure Lee_Tecla_IR Cabecera_IR ' Lee la cabecera ' RECEPCION DE STREAM de ADDRESS + COMANDO ' Me dispongo a almacenar stream ADDRESS i=0 ' Bit 0 AddressTotal.15=Bit_IR 'Bits de Address AddressTotal.14=Bit_IR AddressTotal.13=Bit_IR AddressTotal.12=Bit_IR AddressTotal.11=Bit_IR AddressTotal.10=Bit_IR AddressTotal.9=Bit_IR AddressTotal.8=Bit_IR AddressTotal.7=Bit_IR 'Bits de Address_inv AddressTotal.6=Bit_IR AddressTotal.5=Bit_IR AddressTotal.4=Bit_IR AddressTotal.3=Bit_IR AddressTotal.2=Bit_IR AddressTotal.1=Bit_IR AddressTotal.0=Bit_IR ' Me dispongo a almacenar stream COMANDO i=0 ' Bit 0 ComandoTotal.15=Bit_IR 'Bits de Comando ComandoTotal.14=Bit_IR ComandoTotal.13=Bit_IR ComandoTotal.12=Bit_IR ComandoTotal.11=Bit_IR ComandoTotal.10=Bit_IR ComandoTotal.9=Bit_IR ComandoTotal.8=Bit_IR ComandoTotal.7=Bit_IR 'Bits de Comando_inv ComandoTotal.6=Bit_IR ComandoTotal.5=Bit_IR ComandoTotal.4=Bit_IR ComandoTotal.3=Bit_IR ComandoTotal.2=Bit_IR ComandoTotal.1=Bit_IR ComandoTotal.0=Bit_IR ' Guardo datos leidos (Address y Comando) Address = Lo(AddressTotal) Address_inv = Hi(AddressTotal) Comando = Lo(ComandoTotal) Comando_inv = Hi(ComandoTotal) End Sub Main: TRISB = %00000100 ' PORTB.2 como Entrada PORTB.3 como Salida TRISA = 0 ' PORTA.0 como Salida PORTB.3 = 0 ' Salida a 0 PORTA.1 = 0 ' LED OFF Inicio: While true Lee_Tecla_IR() Wend End.[/code] Para dudas o comentarios sobre este programa, podéis usar este mismo hilo. |
¿Que mandos usan el protocolo NEC?
Saludos!! |
El de mi DVD grabador con dico duro de la Marca LG por ejemplo
|
Cita:
ES decir, tengo un mando, y como sé que usa dicho protocolo... Me interesaria adquirir un mando universal con dicho protocolo... Que modelo escogeria?? saludos! |
necesito compilar a .hex
con que programa has realizado el código? me puedes decir el esquema electrico y el porograma para compilarlo. muchas gracias
|
pues la gran mayoria de mandos utilizan codificacion NEC o Rc5, si no es asi suele ser muy similar. tambien hay cidificaciones muy diferentes aunque lo mas comun es eso.
la verdad que concretamente no se que lenguaje a utilizado hay algunos comandos que no entiendo. (y el programilla es algo cutre dentro de la versatilidd de distintos codigos) ace todvia no mucho mejore una subrrutina que uso para la lectura de estos mandos. en mi caso suelo usar el pic basic lo siento de antemano por no saver arir una pequeña vetana para introducir parte del programa.. contador var word infra var byte b0 var infra.6 ' asignamos los bit altos a usar b1 var infra.7 pulso var byte ' nos sirve para contar los pulsos del mando boton var byte ' para introducir la tecla del mando casilla var byte ' esta nos sirve con pulso para encasillar los bit en un byte codigo var byte [8] ' donde introducimos el codigo 'se definen las interrucciones (todas desactivadas) status=%00000000 option_reg=%10000000 intcon=%00000000 programa: if portb.1=0 then gosub infrarrojos 'cuando etecta una señal seva a leerla ' b.1 porque es la patilla ala que conecto el receptor de infrarrojo (puede ser otra) if codigo[0]=x and codigo[1]=x then gosub comprovar_boton ' X es por un decir, comprovamos quiue los 16bit del addess sean los que queremos goto programa ' me imagino que esta es la subrrutina que mas os puede interesar ' pongamos que esto en particular es para un cristal de 8mhz pero va tambien de sobra a 4mhz o menos infrarrojos: pulso=0 contador=0 while portb.1=0 ' comprovamos si el primer pulso es vastante largo contador=contador+1 wend if contador<320 then fin_por_ruido ' contador=0 while portb.1=1 ' lo mismo pero que no se pase de largo contador=contador+1 if contador=420 then fin_por_ruido wend ' high porta.0 ' nos indica que esta leyendo el codigo repeat 'una vez valido empezamos a leer los bit, maximo 64bit infra=0 while portb.1=0 infra=infra+1 ' si el flanco se pasa de largo se pira if infra=200 then fin_del_barrido wend casilla=pulso>>3 ' dividimos entre 8 para la casilla del bite codigo[casilla]=codigo[casilla]<<1 ' desplaamos in bit ala izquierda para incrementar el nuevo infra=0 while portb.1=1 infra=infra+1 ' leemos el bit con la informaion si se pas de rango salimos if infra=255 then fin_del_barrido if porta.4=0 then fin_del_barrido ' esta para acer vulto a 8mhz wend codigo[casilla]=codigo[casilla]+(b0|b1) 'introducimos el bit en el bite pulso=pulso+1 until pulso=64 fin_del_barrido: ' por ahorrar programa casilla=casilla-1 ' restamos una bite por el ultimo bit final fin_por_ruido: low porta.0 return es un programa muy util y eficiente.. quizas alla que ajustar algunos valores a relacion del oscilador pero es mas que lo mismo. y bueno que esta es mucho mas mejorada de la ultima que tenia creada y eficiente. la verda que no es por vacilar. pero me quedo de miedo ocupanddo poco codigo. aun asi se podria acer por la interruccion serial. pero bueno segun esta os poeis acer una idea espues para programarlo como interruccion del serial. un saludo al foro y un placer ver tanto trabajo.. aunque todo lo importante sea como siempre de gente fuera de españa vamos estadounidenses, ingleses, etc. aun asi un cordial saludo alos españoles que tambien les gusta estudiar todos estos temarios y no me refiero a la porqueria programa sino al resto de decodificcion etc |
Código:
infrarrojos: |
La franja horaria es GMT +2. Ahora son las 03:42. |
Powered por vBulletin™ Version 3.8.10
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.
Traducido por vBsoporte - vBulletin en español
ZackYFileS - Foros de Debate