Ver Mensaje Individual
Antiguo 31/07/2007, 16:12   #1
ZackY
Administrador
 
Avatar de ZackY
 
Fecha de ingreso: 31/mar/2001
Mensajes: 7.477
ZackY Va a salirse de la galaxia como siga asiZackY Va a salirse de la galaxia como siga asiZackY Va a salirse de la galaxia como siga asiZackY Va a salirse de la galaxia como siga asiZackY Va a salirse de la galaxia como siga asiZackY Va a salirse de la galaxia como siga asiZackY Va a salirse de la galaxia como siga asiZackY Va a salirse de la galaxia como siga asiZackY Va a salirse de la galaxia como siga asiZackY Va a salirse de la galaxia como siga asiZackY Va a salirse de la galaxia como siga asi
Post 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.
ZackY está desconectado
Respuesta rápida a este mensaje
Responder Citando Subir
Publicidad: Conoce las ofertas de ANUNCIATE