Foros ZackYFileS

Foros ZackYFileS (http://foros.zackyfiles.com/index.php)
-   PROGRAMACIÓN Microcontroladores: PICs , AVRs. (http://foros.zackyfiles.com/forumdisplay.php?f=437)
-   -   Receptor IR (protocolo NEC) para PIC16F84 (http://foros.zackyfiles.com/showthread.php?t=524454)

ZackY 31/07/2007 16:12

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.

ru_cremas 16/01/2008 22:53

¿Que mandos usan el protocolo NEC?


Saludos!!

ZackY 21/01/2008 23:45

El de mi DVD grabador con dico duro de la Marca LG por ejemplo

ru_cremas 22/01/2008 00:04

Cita:

Iniciado por ZackY (Mensaje 3198802)
El de mi DVD grabador con dico duro de la Marca LG por ejemplo

¿Pero como sé que usa el protocolo NEC?


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!

Illgner 12/11/2011 21:41

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

rina 27/03/2013 16:11

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

rina 28/03/2013 17:41

Código:

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 
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



La franja horaria es GMT +2. Ahora son las 14:35.

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