# [Aporte] Control remoto infrarrojo de 4 canales con pic



## Dario (Abr 26, 2014)

Hola gente, aqui les dejo un un proyecto que seguramente les va ainteresar, se trata de un control remoto infrarrojo de 4 canales con pic 12f629 de mi propia mano  (copy right) jajaja... 
bueno, les dejo el pdf con el proyecto y un video con un intento de explicacion. un gran saludo a todos


----------



## miborbolla (Abr 26, 2014)

Aunque esta el .hex en tu aporte me gustaria tener en mano la explicación del programa, ya sea en ensamblador o lo que hayas utilizado y particularmente el del transmisor.

Enriqueciendo un poco tu estupendo aporte dejo un programa en Basic (IDE de proton) que utilizo muy regularmente para aplicaciones como la que presentas y que sirve prácticamente en cualquier microcontrolador de microchip (modificando las lineas correspondientes), con el mismo receptor infrarojo que utilizas aunque yo no requiero invertir la señal que entrega el receptor infrarojo. 

Por otro lado, este programa que comparto decodifica cualquier transmisor infrarojo de TV SONY y por tanto se pueden obtener tantos comandos como el propio control tenga.



> '****************************************************************
> '*  Name    : DECSONYIR.BAS                                      *
> '*  Author  : Miguel Angel Borbolla Bonomi                      *
> '*  Notice  : Copyright (c) 2012 CIBERTLAN                      *
> ...



Te dejo un cordial saludo y dejo ya diagrama en donde funciona este programa.


----------



## Dario (Abr 26, 2014)

Bueno, aqui les dejo los programas que escribi en pic basic pro por si quieren modificarlos a su guso jeje... al transistor inversor que esta a la salida del tsop1738, lo puse solo para aumentarle algo mas al receptor, de manera que la placa no se viera tan desprovista de componentes. eso se puede eliminar cambiando un poco el prorama tanto del receptor, como del transmisor. lindo codigo el del decodificador de controles sony, ya estoy pensando en una version pbpro  pero me gustaria saber si hay alguna libreria que se encargue de eso para el microcode... saludosss 

transmisor:


```
'****************************************************************
'*  Name    : trans629serout.BAS                                *
'*  Author  : Cesar Quinteros                                   *
'*  Notice  : Copyright (c) 2013 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 26/10/2013                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
                         'configuracion de fuses (fusibles)
@ DEVICE pic12F629, intrc_osc_noclkout, wdt_off, pwrt_off, mclr_off, bod_off, protect_off
 
                          'includes
include "modedefs.bas"
DEFINE OSCCAL_1K 1
DEFINE OSC 4              'óscilador interno a 4mhz

CMCON=7  'COMPARADOR OFF
                          'configuracion de puertos
TRISIO=%00110011
GPIO=%00110011
                          'declaracion de variables
bot1 var GPIO.0
bot2 var GPIO.1
bot3 var GPIO.4
bot4 var GPIO.5
pulso var GPIO.2
                          'loop de inicio
inicio:
if bot1=0 then pres1
if bot2=0 then pres2
if bot3=0 then pres3
if bot4=0 then pres4
goto inicio
                         'acciones
pres1:
serout pulso,N2400,["A"]
pause 10
goto inicio

pres2:
serout pulso,N2400,["B"]
pause 10
goto inicio

pres3:
serout pulso,N2400,["C"]
pause 10
goto inicio

pres4:
serout pulso,N2400,["D"]
pause 10
goto inicio

end
```

Receptores:

carrito a control remoto:


```
'****************************************************************
'*  Name    : autito (carrito) a control remoto.BAS                                *
'*  Author  : Cesar Quinteros]                                  *
'*  Notice  : Copyright (c) 2013 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 26/10/2013                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
                           'configuracion de fuses (fusibles)
@ DEVICE pic12F629, intrc_osc_noclkout, wdt_off, pwrt_off, mclr_off, bod_off, protect_off 

                      'includes
include "modedefs.bas"
DEFINE OSCCAL_1K 1
DEFINE OSC 4  'oscilador interno a 4mhz
CMCON=7  'COMPARADOR OFF

                 'configuracion de puertos
TRISIO=%00001000
GPIO=%00001000

                 'declaracion de variables
LED1 var GPIO.0         
LED2 VAR GPIO.1
LED3 VAR GPIO.4
LED4 VAR GPIO.5
pulso var GPIO.3
ancho var byte
                  'loop de inicio
inicio:
serin pulso,N2400,50,res,ancho
if ancho="A" then adel
if ancho="B" then atras 
if ancho="C" then izq
if ancho="D" then der
goto inicio

adel:
HIGH LED1
low led2
low led3
high led4
goto inicio

atras:
low LED1
high led2
high led3
low led4
goto inicio

izq:
low LED1
high led2
low led3
high led4
goto inicio

der:
high LED1
low led2
high led3
low led4
goto inicio

                 'pone todos los puertos de salida a cero
res:
LOW LED1:LOW LED2:LOW LED3:LOW LED4
goto inicio

end
```

on off:

```
'****************************************************************
'*  Name    : on off.BAS                                *
'*  Author  : Cesar Quinteros]                                  *
'*  Notice  : Copyright (c) 2013 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 26/10/2013                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
                           'configuracion de fuses (fusibles)
@ DEVICE pic12F629, intrc_osc_noclkout, wdt_off, pwrt_off, mclr_off, bod_off, protect_off 

                      'includes
include "modedefs.bas"
DEFINE OSCCAL_1K 1
DEFINE OSC 4  'oscilador interno a 4mhz
CMCON=7  'COMPARADOR OFF

                 'configuracion de puertos
TRISIO=%00001000
GPIO=%00001000

                 'declaracion de variables
LED1 var GPIO.0         
LED2 VAR GPIO.1
LED3 VAR GPIO.4
LED4 VAR GPIO.5
pulso var GPIO.3
ancho var byte
 
                  'loop de inicio

clear                  
                  
apagauno:
low led1
pause 300
gosub lectura
if ancho="A" then uno
gosub leepuertos
goto apagauno

uno:
high led1
pause 300
gosub lectura
if ancho="A" then apagauno
gosub leepuertos
goto uno

dos:
high led2
pause 300
gosub lectura
if ancho="B" then apagados
gosub leepuertos
goto dos

apagados:
low led2
pause 300
gosub lectura
if ancho="B" then dos
gosub leepuertos
goto apagados

tres:
high led3
pause 300
gosub lectura
if ancho="C" then apagatres
gosub leepuertos
goto tres

apagatres:
low led3
pause 300
gosub lectura
if ancho="C" then tres
gosub leepuertos
goto apagatres

cuatro:
high led4
pause 300
gosub lectura
if ancho="D" then apagacuatro
gosub leepuertos
goto cuatro

apagacuatro:
low led4
pause 300
gosub lectura
if ancho="D" then cuatro
gosub leepuertos
goto apagacuatro

lectura:
serin pulso,N2400,ancho
return

leepuertos:
if ancho="A" then uno
if ancho="B" then dos 
if ancho="C" then tres
if ancho="D" then cuatro
return

end
```

push boton:

```
'****************************************************************
'*  Name    : receptor push.BAS                                *
'*  Author  : Cesar Quinteros]                                  *
'*  Notice  : Copyright (c) 2013 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 26/10/2013                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
                           'configuracion de fuses (fusibles)
@ DEVICE pic12F629, intrc_osc_noclkout, wdt_off, pwrt_off, mclr_off, bod_off, protect_off 

                      'includes
include "modedefs.bas"
DEFINE OSCCAL_1K 1
DEFINE OSC 4  'oscilador interno a 4mhz
CMCON=7  'COMPARADOR OFF

                 'configuracion de puertos
TRISIO=%00001000
GPIO=%00001000

                 'declaracion de variables
LED1 var GPIO.0         
LED2 VAR GPIO.1
LED3 VAR GPIO.4
LED4 VAR GPIO.5
pulso var GPIO.3
ancho var byte
                  'loop de inicio
inicio:
serin pulso,N2400,50,res,ancho
if ancho="A" then adel
if ancho="B" then atras 
if ancho="C" then izq
if ancho="D" then der
goto inicio

adel:
HIGH LED1
low led2
low led3
low led4
goto inicio

atras:
low LED1
high led2
low led3
low led4
goto inicio

izq:
low LED1
low led2
high led3
low led4
goto inicio

der:
low LED1
low led2
low led3
high led4
goto inicio

                 'pone todos los puertos de salida a cero
res:
LOW LED1:LOW LED2:LOW LED3:LOW LED4
goto inicio

end
```


----------



## miborbolla (Abr 28, 2014)

Hasta donde sé, no existe una librería para PBpro para decodificar el protocolo Sirc de Sony, sin embargo cuando utilizaba ese compilador acoplaba el siguiente código (que no es mio y no recuerdo de donde lo obtuve para hacer la referencia) para obtener el comando, ojala te de una idea de como utilizarlo, yo ya no tengo el PBpro como para confirmartelo, pero te aseguro que funcionaba decentemente.

utilizaba un PIC12F629 o un PIC12F675 y el receptor infrarojo lo conectaba al pin GPIO.4



> @ DEVICE INTRC_OSC, MCLR_off, PROTECT_OFF, WDT_OFF
> CMCON = 7 ‘ Comparators OFF
> ANSEL = 0 ‘ A/D OFF — Port pins all digital
> TRISIO = %010000 ‘ Todas las salidas de I/O solo GPIO3 como salida
> ...



Saludos


----------



## fj7495sa (Abr 30, 2014)

Hola, seria posible hacerlo de 12-16 canales con un pic 16f628 o similar no necesito mucha distacia entre 8-10 centimetro, es para un camion y el remorque, yo enciendo las luces con la emisora, pero me falta poder encender las luces del remorque cuando lo engancho sin tener usar un conector y si es posible en (ASM) que es lo que estoy usando pues soy novato. GRACIAS 

P.D. si es con otro pic me da igual lo conseguiria


----------



## miborbolla (May 1, 2014)

fj7495sa dijo:


> Hola, seria posible hacerlo de 12-16 canales con un pic 16f628 o similar no necesito mucha distacia entre 8-10 centimetro, es para un camion y el remorque, yo enciendo las luces con la emisora, pero me falta poder encender las luces del remorque cuando lo engancho sin tener usar un conector y si es posible en (ASM) que es lo que estoy usando pues soy novato. GRACIAS
> 
> P.D. si es con otro pic me da igual lo conseguiria



Por supuesto que puede ser de tantos canales como se quiera, si utilizas el ejemplo que comparto con un control remoto de sony, puedes usar tantos como el propio control remoto tenga, ahora si eres novato, como comentas, lograrlo en asembler no es tan fácil; por estas razones es que utilizo el lenguaje de programación BASIC que da muchas prestaciones y ya tienes tanto el proyecto de D@ario como el de tu servidor en mano.

Obvio necesitas del compilador correspondiente para lograrlo, pero bueno son cosas imprescindibles par lograrlo.

Por ultimo, el alcance de los infrarojos puede alcanzar los 8 9 metros sin mucho problema, yo lo utilizo muchísimo por que un control remoto de Sony, es verdaderamente muy barato.

Saludos y ojala te sirva el aporte.


----------



## fj7495sa (May 1, 2014)

Hola, gracias "MIBORBOLA" : entonces seria mejor que lo hiciera en Basic, si es asi que programa tendria que usar para escribir el codigo,compilarlo y grabarlo (tengo el MPLAB IDE v8.00, el grabador PICKIT 2 v2.1, el PROTEUS v8 PROFESSIONAL, el PCB WIZARD v? y alguno mas sin instalar.

SOLO necesito de 8 a 10 centimetros de alcance que es la distancia aproximada entre camion y remolque (DE JUGUETE) no quisiera interferir en algun aparato de TV


----------



## miborbolla (May 1, 2014)

fj7495sa dijo:


> (tengo el MPLAB IDE v8.00, el grabador PICKIT 2 v2.1, el PROTEUS v8 PROFESSIONAL, el PCB WIZARD v? y alguno mas sin instalar.
> 
> SOLO necesito de 8 a 10 centimetros de alcance que es la distancia aproximada entre camion y remolque (DE JUGUETE) no quisiera interferir en algun aparato de TV




Tendrías que conseguirte o instalarte el compilador de basic http://melabs.com/ que no se si tengas, a mi parecer el ejemplo que nos aporta D@rio se acerca mucho mas a lo que requieres y requiere de este compilador en particular.

Saludos


----------



## cosmico74 (May 10, 2014)

Tengo un par de preguntas para miborbolla o para quien me pueda ayudar a aclararlas.
1.-En estas instrucciones:

If SONY_COMMAND=0 Then High LED1
If SONY_COMMAND=1 Then High LED2
If SONY_COMMAND=2 Then High LED3
If SONY_COMMAND=3 Then High LED4
If SONY_COMMAND=4 Then High LED5
If SONY_COMMAND=5 Then High LED6
If SONY_COMMAND=6 Then High LED7

De donde sacas el 0,1,2,3,4,5,6.,etc en base a que o que me representan,mi duda es por que hace tiempo arme un circuito con arduino y un receptor TSOPXXXX y bueno abri la Consola Serial y probe un control remoto con protocolo NEC y hacia lo siguiente aprieto un boton digamos ENTER y me aparecia 0XF807FF00,STOP=0XBA45FF00...y asi sucesivamente y ya con esos valores tomar decisiones,como por ejemplo mover un carrito Adelante,Reversa,giros.,etc.
En resumen los valores me los arrojaba en formato Hexadecimal de este tipo 0XF807FF00
y bueno esa es mi duda esos valores (1,2,3,4,5,6) de tus IF SONY_COMMAND, son los que manda el control remoto o son la teclas que presionas,haber si me puedes aclarar esas dudas por que no me quedo claro...Gracias

2.-Si quiero utilizar un PIC16f628A que mas necesito cambiar?,voy a utilizar un cristal de 20 Mhz,puedo ocupar cualquier pin como entrada del receptor TSOPXXXX?

3.- Me podras ayudar como probar este programa que amablemente compartes en el SERIAL COMUNICATOR de Proton IDE osea que Hardware necesito logicamente un control tv Sony,el circuito receptor sin el USB que se ve en tu diagrama.quiero probar varios controles remotos.En si como le hago para que me muestre los valores(datos) en la pantalla de la consola serial de proton ide...Gracias por sus opiniones


----------



## miborbolla (May 11, 2014)

Hola Cosmico74:

Los valores los obtuve presentando en un display LCD, el contenido de la variable "SONY_COMMAND", este display lo conecte al pic y obtuve la tabla que te anexo en el archivo adjunto y el programa que utilize es el siguiente:



> '****************************************************************
> '*  Name    : lcd1.BAS                                          *
> '*  Author  : Miguel Angel Borbolla Bonomi                      *
> '*  Notice  : Copyright (c) 2012 CIBERTLAN                      *
> ...



Con respecto a tu segunda pregunta, si puedes usar cualquier pin, si te fijas en este codigo, utilizo un PIC diferente, con un PIN diferente...

En un una oportunidad te comparto un código que envié por el puerto serial del pic el valor de "SONY_COMMAND" espero no tardarme en hacerlo.

Espero te aclare tus dudas, entre tanto recibe un cordial saludo.


----------



## fj7495sa (May 11, 2014)

hola, *miborbolla*.Ya tengo el compilador PBP, pero ahora tengo una pregunta si utilizo el codigo Sony podre usar varios botones a la vez?, yo lo que necesito es lo siguiente a travez de la emisora con un interructor enciendo la luz de pocision y queda encendido es Toggle (fijo), pulso otro y tambien hace lo mismo pero el primero sigue encendido y asin con todos un total de 16 pulsadores que enciendo o apago por separado cuando yo quiero, en el receptor quiero poner antes de la salida a los reles una toma para que active el pulsador (o entrada del emisor)del infrarrojo y enviar la señal al remolque,. Mi proyecto es para un camion con remorque de juguete sin tener que utilizar cables entre C. y R.

Hos agradesco de antemano toda la ayuda que reciba: Saludos a todos desde Barcelona


----------



## miborbolla (May 11, 2014)

Hola fj7495sa, en mi ultimo comentario dirigido a ti, comente que a mi parecer, la forma que utiliza D@rio para comunicación es mas adecuado para lo que buscas y que No es el sistema Sirc de SONY, el que utiliza D@rio es una comunicación serial estándar a 2400 BPS y por tanto tienes la ventaja de poder hacer prácticamente lo que quieras con este protocolo, mientras que con un control remoto como el de sony, aunque tienes muchos botones en realidad solo puedes aprovechar uno a la vez y no muchos al mismo tiempo como pretendes.

Yo pienso que si realizas el montaje que nos propone D@rio y ya que lo tengas en marcha (con sus 4 canales) ya después podrás explorar y vislumbrar con mucho mas claridad llevar a buen fin tu proyecto y expandirlo a los canales y/o botones que deseas.

Yo utilizo o aprovecho el sistema SIRC de SONY, en primero por que un control remoto SONY es muy barato y fácil de conseguir y en segundo tengo a mi disposición muchos comandos o botones ocupando un solo PIN de mi microcontrolador, pero te aclaro nuevamente que no puedo utilizar 2 o mas botones a la vez, definitivamente eso no se puede hacer en un control remoto de TV, VCR, DVD etc, etc.

Por estas razones en mis comentarios he estado dirigiéndote a utilizar la forma de comunicación que aprovecha en su proyecto nuestro compañero D@rio y que en un principio de su aporte le solicite a D@rio que nos compartiera el código ya que de esta manera nos ayudaría mucho a todos y que yo agradezco esta gentileza de su parte.

Te dejo un cordial saludo y espero estar ayudándote lo suficiente.


----------



## chepao (May 12, 2014)

Me gusta tu aporte, me gusta jejeje ya se en que lo voy a utilizar, excelente, tenes 10 amigo...!!!





miborbolla dijo:


> Por otro lado, este programa que comparto decodifica cualquier transmisor infrarojo de TV SONY y por tanto se pueden obtener tantos comandos como el propio control tenga.
> Te dejo un cordial saludo y dejo ya diagrama en donde funciona este programa.




Explica un poquito amigo, yo soy un poco rudo para esto y voy aprendiendo a patadas y trompadas, te lo agraeceria..!!


----------



## Dario (May 12, 2014)

chepao dijo:


> Me gusta tu aporte, me gusta jejeje ya se en que lo voy a utilizar, excelente, tenes 10 amigo...!!!



 gracias amigo, estoy trabajando en el proximo video... 
apuesto a que lo vas a usar en un robot a control remoto   saludosss


----------



## chepao (May 12, 2014)

D@rio dijo:


> gracias amigo, estoy trabajando en el proximo video...
> apuesto a que lo vas a usar en un robot a control remoto   saludosss





jajaja claro que si amigo, muy bueno tu circuito y tu codigo..!





miborbolla dijo:


> utilizaba un PIC12F629 o un PIC12F675 y el receptor infrarojo lo conectaba al pin GPIO.4
> Saludos




Pudiera usarse el 16F628A ?


----------



## cosmico74 (May 12, 2014)

Que tal miborbolla! estaba ensamblando este codigo en protoboard y LCD


'************************************************* ***************
'* Name : lcd1.BAS *
'* Author : Miguel Angel Borbolla Bonomi *
'* Notice : Copyright (c) 2012 CIBERTLAN *
'* : All Rights Reserved *
'* Date : 31/05/2012 *
'* Version : 1.0 *
'* Notes : *
'* : *
'************************************************* ***************
Device = 18F4550

Xtal = 48


Declare LCD_ENPin PORTB.0
Declare LCD_RSPin PORTB.1
Declare LCD_DTPin PORTB.4
Symbol lcdw PORTB.2 ' la linea se utiliza para poner en 0 la linea RW del LCD
LCD_Interface=4
LCD_Lines=2
LCD_Type=0
Declare LCD_DataUs 255 ' comado que da un tiempo de espera al enviar datos al display

Declare Sonyin_Pin = PORTB.3
Dim SONYIN_WORD As Word

Dim SONY_COMMAND As SONYIN_WORD.LowByte

Dim SONY_SYSTEM As SONYIN_WORD.HighByte

Dim Imprime As String *40

Imprime="Decodificador IR"

All_Digital = On
Low lcdw ' la linea se utiliza para poner en 0 la linea RW del LCD
Print $FE, 1
DelayMS 500
Print At 1,1, Imprime

While 1 = 1
Repeat
SONYIN_WORD = SonyIn '
Until SONY_COMMAND<> 255
DelayMS 500
Print At 2,1," "
Print At 2,1,"Valor recibido=",Dec SONY_COMMAND
Print At 3,1," "


Wend


Para decodificar el control sony tv pero me marca error en la zona de results (abajo) en proton IDE creo que entender que solamente ese pic soporta esa instruccion este es el mensaje que me manda...*string variables only supported with 18F or enhanced core devices!*haber si me pueden dar una ayuda o como le puedo hacer...*Estoy utilizando un PIC16F628A,cristal 16Mhz*...Haber si puedo subir una imagen.


----------



## miborbolla (May 12, 2014)

El error es por que se utiliza la instrucción;

 "Dim Imprime As String *40" es la linea que te tira el error y en efecto es propia de los microcontroladores mas grandes pero si evitas esta instrucción y dejas el código así:



> '****************************************************************
> '*  Name    : lcd1.BAS                                          *
> '*  Author  : Miguel Angel Borbolla Bonomi                      *
> '*  Notice  : Copyright (c) 2012 CIBERTLAN                      *
> ...



Ya te compilara sin ningún problema y podrás usar el código con tu PIC 16f628, ya lo comprobé.

Saludos


----------



## Gerson strauss (May 13, 2014)

cosmico74 dijo:


> Tengo un par de preguntas para miborbolla o para quien me pueda ayudar a aclararlas.
> 1.-En estas instrucciones:
> 
> If SONY_COMMAND=0 Then High LED1
> ...



En este video se ve como se obtienen los valores desde el C/R Sony.


----------



## fj7495sa (May 14, 2014)

Hola a todos, aqui pongo un "proyecto" simulado de lo que voy a hacer, no hacer caso de las conecciones lo he hecho para que tengais una idea y me digais si es posible conectar 2 12f629 de esta forma y asin tener 8 salidas. Si esto es casi correcto ya pondria el proyecto real para su posible rectificacion antes de realizarlo en placa.

P.D. en realidad lo haria, emisor 16f684, receptor 16f628

Gracias y saludos


----------



## cosmico74 (May 14, 2014)

Que tal miborbolla! Ya probe el *codigo con varios controles remoto TV SONY,lcd,*en el protoboard y estos fueron mis resultados: al _*oprimir las teclas 0,1,2,3,4,5,6,7,8,9*_ me aparecen los valores en *LCD= 9,0,1,2,3,4,5,6,7,8* respectivamente hasta aqui todo correcto,conforme a tu tablavalorSony.*Pero al apretar Mute,Power,Reset,Jump,Enter,Menu,Power,...etc.*,no me aparecen los valores de la tabla me aparecen 1,5,3,4 osea valores en unidades nada que ver con estos valores:

POWER      21
MUTTING	               20
SLEEP		       54
MTS/SAP		       23
DISPLAY		       58
TV/VIDEO		       37
JUMP			       59
ENTER	               11
VOL +		       18
VOL -			       19
CH +			       16
CH -			       17
RESET	               22
MENU			       96
FLECHA ARRIBA	     116
FLECHA ABAJO	     117
FLECHA DERECHA       51
FLECHA IZQUIERDA    52
cENTRO DE CURSOR  101


A que se debera esto?,ya probe con diferentes controles remoto TV SONY.unos con mas funciones que otros...
Utilizo PIC16F628A XTAL=16Mhz

Y suponiendo que ya casi queda este codigo al 100% uffff claro con tu ayuda faltaria nada mas arreglar este detalle...ya puedo utilizar ahora si el codigo de tu mensaje #2 


'************************************************* ***************
'* Name : DECSONYIR.BAS *
'* Author : Miguel Angel Borbolla Bonomi *
'* Notice : Copyright (c) 2012 CIBERTLAN *
'* : All Rights Reserved *
'* Date : 06/03/2012 *
'* Version : 1.0 *
'* Notes : *
'* : *
'************************************************* ***************

Device = 18F2550

Xtal = 48

Declare Sonyin_Pin = PORTB.0 ' se asigna el pin RB0 (pin 21) para recibir datos del receptor Infrarojo
Dim SONYIN_WORD As Word ' Se crea una variable de "palabra completa" para recibir el tren de datos
' Se hace un ALIAS de el BYTE BAJO que contiene los comandos de la variable SONYIN_WORD
Dim SONY_COMMAND As SONYIN_WORD.LowByte
' Se hace un ALIAS de el Byte ALTO que contiene el tipo de systema de la variable SONYIN_WORD
Dim SONY_SYSTEM As SONYIN_WORD.HighByte

' Se crean alias del puerto B (Pin 22 al 28) con el nombre LEDX respectivamente

Symbol LED1 PORTB.1
Symbol LED2 PORTB.2
Symbol LED3 PORTB.3
Symbol LED4 PORTB.4
Symbol LED5 PORTB.5
Symbol LED6 PORTB.6
Symbol LED7 PORTB.7



All_Digital = On ' se asignas todas las entradas como digitales

While 1 = 1 ' Se crea un Loop Infinito
Repeat
SONYIN_WORD = SonyIn ' Se recibe el tren de datos del receptor infrarojo
Until SONY_COMMAND<> 255 ' Se queda repitiendose la recepcion hasta que el byte bajo (comandos) sea diferente a 255

'Se procesa la informacion del comando recibido y se prende el led correspondiente

If SONY_COMMAND=0 Then High LED1
If SONY_COMMAND=1 Then High LED2
If SONY_COMMAND=2 Then High LED3
If SONY_COMMAND=3 Then High LED4
If SONY_COMMAND=4 Then High LED5
If SONY_COMMAND=5 Then High LED6
If SONY_COMMAND=6 Then High LED7

DelayMS 1000 ' espera 1 segundo
PORTB=0 ' Se borra el contenido del puerto B y se repite el Loop para recibir otro dato.
Wend

*Osea con los valores arrojados por el SONY_COMMAND=XXX tomar decisiones como encender leds u otras acciones cierto?.
*


----------



## miborbolla (May 15, 2014)

cosmico74 dijo:


> Que tal miborbolla! Ya probe el *codigo con varios controles remoto TV SONY,lcd,*en el protoboard y estos fueron mis resultados: al _*oprimir las teclas 0,1,2,3,4,5,6,7,8,9*_ me aparecen los valores en *LCD= 9,0,1,2,3,4,5,6,7,8* respectivamente hasta aqui todo correcto,conforme a tu tablavalorSony.*Pero al apretar Mute,Power,Reset,Jump,Enter,Menu,Power,...etc.*,no me aparecen los valores de la tabla me aparecen 1,5,3,4 osea valores en unidades nada que ver con estos valores:
> 
> [/I][/I][/B]



Francamente no se que sucede, es obvio que ya estas decodificando el infrarojo, pues me comentas que del 0 al 9 todo OK, yo este código lo he probado infinidad de veces y siempre he obtenido los mismos resultados independientemente del control o el microcontrolador.

Asegúrate que en el display LCD tengas espacio suficiente para desplegar el resultado, y toma en cuenta que en mi codigo tengo un display de 4 lineas, asi que verifica la linea que imprime en el display:

*Print At 2,1,"Valor recibido=",Dec SONY_COMMAND.*

Por lo demás no se como ayudarte mas.

Saludos


----------



## cosmico74 (May 15, 2014)

Que tal miborbolla!!! Pues con la novedad que ya eche andar este proyecto los numeros que no me aparecen completos es por que use un LCD 16X2 y  como tu mencionas que utilizaste un LCD X4 lineas yo creo que es por eso que no se despliega completamente,luego conseguire un lcd x4.para ver bien los valores de las otras funciones que traen los otros controles remotos de mi autoestereo por ejemplo.
Bueno pues independientemente del LCD que no es el adecuado forzozamente tiene que entrar la señal del TSOP1238 por el PIN RB.0 y suministrar informacion al pic para procesar las instrucciones con base en esto y al codigo del mensaje #2 del post le coloque los valores del comando 2,3,4,jump,enter,reset,menu y a fuerzas me tiene que activar los leds y efectivamente ejecuta las instrucciones.
Resumiendo: los valores que aparecen despues de presionar los comandos pueden estar en cualquier formato,binario,hexadecimal,decimal,etc.que mas que nada depende del programador en que formato quiere que se le devuelva la informacion en tu caso los devuelve en decimales por eso era la duda con respecto a tu post que pegaste en el mensaje#2.
Bueno gracias por la ayuda miborbolla ya logre hacer los 2 ejercisios decodificar con lcd y ejecutar acciones con el codigo.

*Por aqui un video:*









*Tocando este tema de los infrarrojos ayer encontre un post tuyo que se me hizo interesante*,voy a darle una leida y luego si no te molesta voy a consultarte para algunas dudas o en si para ver que es lo que hace exactamente este codigo/circuito,es este post del que te hablo:


*Sensor de presencia con infrarojos
Hola Compañeros de foro:

Estoy practicando con transmisores/receptores infrarojos y en particular con un sensor de presencia, con la finalidad de tener otra opción a los sensores de calor PIR.

¿Por que? como sabemos los sensores PIR aun cuando son muy efectivos como sensor de movimiento, no se desempeñan muy bien cuando en su campo de acción un objeto se queda fijo y simplemente ya no sensan nada a menos que se mueva de nuevo el objeto.

Viendo por el foro los diferentes circuitos, en la que la mayoría, están basados en el 555 y el 567 que son analógicos y por tanto dependen de temperatura y tolerancia de los componentes o que mas bien están pensados como sensores de proximidad de poco alcance, me decidi a usar un microcontrolador para este propósito.

dejo aquí el código, diagrama y archivo en proteus (dentro del archivo .rar)...aunque debo advertir que el archivo en proteus no simula para nada la sección del infrarojo, ya que no encontré ningún receptor para poderlo simular
*

*Por cierto deberias de postear algo sobre modulos RF 434 Mhz encoder,decoder,usando un pic mas que nada para aumentar o expandir a 6 u 8 canales de salida por ejemplo yo los he armado pero con el clasico que ya traen por default,osea 4 canales,me gustaria armar uno pero con pic programado en proton o pic basicpro tambien por ahi he leido que se puede colocar un HTdecoder en paralelo con el otro HTdecoder a la salida pero no he encontrado mucha informacion que digamos bueno de cualquier forma cualquiera de las dos formas seria bueno...Gracias.
*


----------



## juanrojas2093 (Nov 25, 2014)

interesante amigo y gracias por el aporte yo también estoy leyendo sobre  este tema con el control SONY  el archivo q nos muestras es una tabla y con esos valores ya podria pogramar mi pic y hacer tal función por ejemplo controlar un carrito con las funciones adelante , atras , derecha , izqueirda ? desearía una ayuda a esa duda Saludos 




miborbolla dijo:


> Hola Cosmico74:
> 
> Los valores los obtuve presentando en un display LCD, el contenido de la variable "SONY_COMMAND", este display lo conecte al pic y obtuve la tabla que te anexo en el archivo adjunto y el programa que utilize es el siguiente:
> 
> ...


----------



## pacocable (May 18, 2015)

Estoy haciendo este mismo circuito para mandos de sony pero no tengo lcd tengo 74hc595 y 74ls164 que los he utilizado para una bobinadora.¿Me podrian ayudar para en vez de usar lcd use leds de  segmentos, serian 3?
Muchas gracias


----------



## pepibho (Jul 24, 2015)

un saludo para dario y el aporte que as echo. estas teniendo un buen enfoque para estructurar los programas.

no esta mal usar el comando seriel para la trasmision de datos por infrarrojo. pero ya podrias mandar datos a mayor escala (mayor. lo que se puede conun infrarrojo.. no mucho)

tenias que crear la rutina para leer el codigo de mandos nec o rc5, lo que me deja pillado..

un dia seme dio por ver el codigo de un mando de panasoni vamos lo clasico del receptor de infrerrojo conectado al micro del pc para poder grabar su espectro.. y la verdad que me parecio muy vardo el tema no creo que todos los mandos sony tengan la misma codificacion.
este en particular era un rejistro de 12bif que daba el addess y las veces que se repetia era el numero del boton (me parecio una burrada)

ese mando soni que usais podiais pasar un mp3 en el que vayas pulsando distintos botones. por ejemplo 1 pulso algo largo, un espacio sin pulsar, 2 pulso algo largo asi asta el 5 por ejemplo

esque llevo preguntandome donde esta el programa que lee reconoce acess y lee el boton pulsado.

aun asi creo que tengo suvito por electronicafacil un probrama solo el hex la verdad que me uviera gustado ver el codigo sin compilar seguro era no muy depurado (era de ace años)
con un 16f84 para encender 8 dispositivos porlomenos, pulsas la tecla enciede pulsas denuevo apaga.
el programa constaba de una parte donde programabas el mando valido para nec o rc5. entonces pulsaba una tecla donde entraba en modo programacion alguna del puerto a.x algo pulsaba una tecla del mando y si reconocia bien el cogigo (codigo compatible) almacenaba los 16bit de acess y el ultimo byte de los 32bit lo guardo como la tencla pulsada, (bueno realmente sumaba el tercero y cuerto byte si el resultado era 255 era correcto y almacenaba la tecla) asi una tras otra si solo queria 4 teclas tansolo era pulsar el resto de veces la ultima tecla despues miraba si dos cogigos eran iguales seguidos  y inutlizaba el resto (bueno eso es una cosa que agusto)
cosa cuando te reconocia el codigo adess y verifica la suma de los dos ultimos bytes 255 correctas parpadea 2 veces si ya esta almacenando los botones y no reconoce el acess o la suma de los dos ultimos bytes del boton parpadea rapidamente 8 beces o algo asi (eso segun te apetezca programarlo)

pongamos que era un accionador de reles por infrerrojos programable para mandos a distancia por infrerrojos con codificacion nec rc5 y panasonic

panasonic solo se diferencia porque la informacion serial que manda el mando es mas rapida y manda 48bit = 5bytes donde los primeras 24bit son el acess y los ultimos 16bit o 2 bytes son el boton pulsado para verificar que es correcto un byte es inverso al otro asi cuando los sumas dan 255 o los superpones (en una operacion logica que solo come 2 procesos de comando una suma son 5)

un saludo ala comunidad y aunque tardio el aporte y muy mal esplicado (yo como siempre) espero que os sirva de ayuda. tengo que acer otro codigo como ese  si lo ago igual lo suvo, que porcierto tambien trabajo mucho con el micro studio picbasic


----------



## callecuatro1976 (Ago 25, 2015)

No te esta en c


----------



## FALKON707 (Oct 30, 2015)

Saludos a todos.!!

mi gente a quien le compila sin errores el codigo del Control remoto infrarrojo de 4 canales con pic Pic12f629 ?

me manda siempre un error al compilar los codigos de receptor y emisor, informado q se excedio la capacidad de memoria

                         'configuracion de fuses (fusibles)
@ DEVICE pic12F629, intrc_osc_noclkout, wdt_off, pwrt_off, mclr_off, bod_off, protect_off

                          'includes
include "modedefs.bas"
DEFINE OSCCAL_1K 1
DEFINE OSC 4              'óscilador interno a 4mhz

CMCON=7  'COMPARADOR OFF
                          'configuracion de puertos
TRISIO=%00110011
GPIO=%00110011
                          'declaracion de variables
bot1 var GPIO.0
bot2 var GPIO.1
bot3 var GPIO.4
bot4 var GPIO.5
pulso var GPIO.2
                          'loop de inicio
inicio:
if bot1=0 then pres1
if bot2=0 then pres2
if bot3=0 then pres3
if bot4=0 then pres4
goto inicio
                         'acciones
pres1:
serout pulso,N2400,["A"]
pause 10
goto inicio

pres2:
serout pulso,N2400,["B"]
pause 10
goto inicio

pres3:
serout pulso,N2400,["C"]
pause 10
goto inicio

pres4:
serout pulso,N2400,["D"]
pause 10
goto inicio

end

GRACIAS.. Por la ayuda a quien hayga tenido el mismo problema me ayude..!!


----------



## D@rkbytes (Oct 30, 2015)

Ese código debe compilar sin problemas.
¿Qué versión de PICBasic Pro y Windows estás usando?


----------



## torres.electronico (Oct 31, 2015)

me parece que mal interpreto el mensaje... te sale este mensaje despues de compilar? *"crosing page boundary"*


----------



## D@rkbytes (Oct 31, 2015)

No creo que sea eso mi estimado torres, porque el código es para un PIC12F629 y  en dado caso ese código es muy pequeño para que pueda ocurrir un cambio de página.
Aparte, *"**Crossing page boundary" *es una advertencia y no un error.*
*


----------



## FALKON707 (Oct 31, 2015)

Saludos.. siempre eh compuilado en WIN7 32bBist..  uso microcode 3.0.0.6 y compilador pbp 2.60a.. pero no me da esos errores con otros pic.. por ejemplo con los mismos compilo para el 16f628a y son muuuchas líneas de código q lleva y no manda nunca manda ese error.. también vi ejemplos de códigos cuyo "HEX" pesa mas de 2Kb pero el pbp me dice que eccedi la memoria con ese codigo

ps el error solo es al compila (F9).

mensaje del error: *Address limit of 3FFh exceeded*


----------



## torres.electronico (Nov 2, 2015)

Interesante error, nunca habia visto ese mensaje...
Igualmente, desde que compilo con mpasm, nunca mas vi problemas


----------



## reyvilla (Nov 2, 2015)

buenas compañeros, yo he tenido algo experiencia con ese mensaje de 3FFH con el 16F877/A y los 12F, y sucede que al pasar la capacidad de memoria del micro nos envié ese mensaje y no compila, lo único que se me ocurre por ahora es que se haya seleccionado en el microcodeestudio otro microcontrolador de menos capacidad pero igual de ser así el mismo compilador indica un error al no coincidir pero puede ser el caso pero es bien extraño de que así sea, realice pruebas y no tuve problemas al compilar el codigo.
Por otra parte lo lleve a su máxima capacidad copiando una linea de serout con varios caracteres ascii unas 10 veces mas o menos para desjarles el mensaje de error.

Cualquier cosa seria ver que versión de microcode y como esta configurado etc. para determinar que esta sucediendo. Mi version es 3.0.0.5 y del PBP es la 2.47


----------



## D@rkbytes (Nov 2, 2015)

Si, ese error ocurre cuando ya se alcanzó el máximo de ROM.
Pero también se puede dar por lo que yo le llamo "El error invisible"
Sucede cuando se copia y se pega algún código hacia un archivo de texto.
Y cuando ese archivo se llega a ejecutar y compilar, se produce ese error.

En esos casos lo que he notado, es que algunos espacios en blanco confunden al compilador.
Pueden ser falsas tabulaciones mal interpretadas por el compilador.

La solución cuando el código es muy extenso, es limpiarlo manualmente.
En este caso como el código es muy corto, se puede volver a escribir el código directamente en el editor MicroCode Studio y compilar.

Eso me ha resuelto ese problema.


----------



## FALKON707 (Nov 2, 2015)

Ok mis amogos gracias por la segerencias..

 hechare manos a la obra con la reeescritura.. *EXITOS para Todos..!!*



Ok mis amogos gracias por la segerencias..

 hechare manos a la obra con la reeescritura.. *EXITOS para Todos..!!*


----------



## FALKON707 (Nov 2, 2015)

SALUDOS.. 

ya encontré la falla mi gente..!!

fue que cabié la sentencia: *DEFINE OSCCAL_1K 1* ..por.. *DEFINE OSCCAL_2K 1* 

asi que los que tengan el mismo mensaje q yo...  deben buscar en los fuses mala sintaxis.. suerte mis chamacos..!!


----------



## Dario (Nov 3, 2015)

Hola gente, tanto tiempo   les comento que yo nunca he podido compilar ese codigo utilizando microcode en win7, sin embargo, no tengo ningun problema al compilarlo con microcode corriendo en win xp. por ahi no recuerdo donde, leí que pic basic pro ya esta obsoleto y no existen versiones que funcionen bien en win7. lamentablemente de mi parte, he descargado varias versiones de microcode incluyendo la ultima y no puedo hacerlo funcionar, asi que parami por lo menos, es verdad ...  y por eso estoy tratando de aprender el odioso ccs...


----------



## torres.electronico (Nov 4, 2015)

Dario dijo:


> Hola gente, tanto tiempo   les comento que yo nunca he podido compilar ese codigo utilizando microcode en win7, sin embargo, no tengo ningun problema al compilarlo con microcode corriendo en win xp. por ahi no recuerdo donde, leí que pic basic pro ya esta obsoleto y no existen versiones que funcionen bien en win7. lamentablemente de mi parte, he descargado varias versiones de microcode incluyendo la ultima y no puedo hacerlo funcionar, asi que parami por lo menos, es verdad ...  y por eso estoy tratando de aprender el odioso ccs...




Yo en lo notebook con win7, conpilo perfecto...yo creo que te referis a los win de 64bits...


----------



## FALKON707 (Nov 4, 2015)

Saludos...

Totalmente de acuerdo con *torres.electronico*.. EN Win7 32 Anda todo bn.. EN 64 no Compila, y hay Pc donde si compila, pero manda errores de sisntaxis donde no los hay..

Ps.. versiones alternativas recomiendo mucho el* Proton IDE 1.0.4.6* actualizado para Win7 32Bits y se parece mucho al *PBP*.. solo q éste tiene todo encuanto a nuevos dispositivos y todo lo que uno imagine hacer con los pic's..  

Suerte a todos..!!


----------



## torres.electronico (Nov 4, 2015)

... lo probe, y lo unico que me gusta, son las librerias de control de glcd... me comentsron que viene integrada librerias para fp, pero como lo desinstale,me quede con la duda...
Yo creo que a cualquier basic, solo le faltaria este ultimo punto para hacerlo mas interesante 
Perdon por el offtopic


----------



## CarloShura (Nov 5, 2015)

Primero que nada te felicito por el aporte, está muy completo.

Disculpa mi ignorancia, ¿exactamente que hace el 555?, ¿los trenes de pulso no podrían ser generados directamente por el PIC?

Otra duda que siempre he tenido, ¿de que manera se logra que la luz solar no afecte este tipo de circuitos? En el entendido que la luz solar contiene luz infrarroja.

Saludos colega.


----------



## Dario (Nov 9, 2015)

CarloShura dijo:


> Primero que nada te felicito por el aporte, está muy completo.
> 
> Disculpa mi ignorancia, ¿exactamente que hace el 555?, ¿los trenes de pulso no podrían ser generados directamente por el PIC?



El 555 funciona como modulador generando una portadora de entre 38 y 40 khz para que el receptor pueda captar la señal. probablemente los pulsos podrian ser generados por el pic, pero nunca lo intente ya que me parecio mas comodo  un 555 que romperme lacabeza :cabezon: en averiguar como hacerlo con el pic.  




CarloShura dijo:


> Otra duda que siempre he tenido, ¿de que manera se logra que la luz solar no afecte este tipo de circuitos? En el entendido que la luz solar contiene luz infrarroja.
> Saludos colega.



 no lo se... supuestamente el receptor esta ajustado para recibir solo las señales comprendidas entre 38 y 40 khz... 

a los amigos torres y falcon les digo que entonces hay un problema con las dos pc en las que tengo instalado el win7 32 bit... voy a probar recargando sistema en una de las dos


----------



## TRILO-BYTE (Nov 9, 2015)

pero para evitar el 555  es tan facil como hacer un tren de pulsos cuadrados a 38khz

es decir se debe configuracion de timer a 76khz y hacer un togle en un pin asi se obtiene la señal de 38khz

ahora los datos y el tren de pulsos generados por la interrupcion hace que el NE555 se valla al demonio


----------



## D@rkbytes (Nov 9, 2015)

El problema de lo que mencionas, es que si existen retardos en el programa, se detendrá el Timer 0.
Lo ideal sería usar el módulo CCP en modo PWM, pero el PIC12F629 no tiene.


----------



## Dario (Nov 10, 2015)

TRILO-BYTE dijo:


> pero para evitar el 555  es tan facil como hacer un tren de pulsos cuadrados a 38khz
> 
> es decir se debe configuracion de timer a 76khz y hacer un togle en un pin asi se obtiene la señal de 38khz
> 
> ahora los datos y el tren de pulsos generados por la interrupcion hace que el NE555 se valla al demonio



Pobre NE555, que culpa tiene de ser tan util jejeje... el pic que use ya esta obsoleto, sin embargo el NE555 sigue tan actual como si nunca hubiesen pasado los casi 40 años que tiene  a tanto rompedero de cabeza, me quedo con el 555 jajaja...  viva el 555!!!


----------



## FALKON707 (Nov 18, 2015)

a todas éstas no eh armado ese proyecto del control *IR *de *4 *Canales, dado que la idea de usar un *MICROCONTROLADOR* es la de *Suprimir La Nececidad De Circuitos Integrados Adicionales*.. como vemos en los controles remotos de los equpos de *TV*, *SONIDO* y demás que usan mandos a distancia...

La preguntas es..

funciona el circuito receptor si no se usa el *NE555* ?


----------



## Gerson strauss (Nov 18, 2015)

FALKON707 dijo:


> a todas éstas no eh armado ese proyecto del control *IR *de *4 *Canales, dado que la idea de usar un *MICROCONTROLADOR* es la de *Suprimir La Nececidad De Circuitos Integrados Adicionales*.. como vemos en los controles remotos de los equpos de *TV*, *SONIDO* y demás que usan mandos a distancia...
> 
> La preguntas es..
> 
> funciona el circuito receptor si no se usa el *NE555* ?



Funciona si se utiliza un led receptor infrarrojo y un amplificador operacional en la placa receptora, pero si utilizas el modulo infrarrojo necesitas si o si la señal portadora de 38khz, que es lo que precisamente hace el 555.


----------



## Dario (Nov 18, 2015)

Gerson strauss dijo:


> Funciona si se utiliza un led receptor infrarrojo y un amplificador operacional en la placa receptora, pero si utilizas el modulo infrarrojo necesitas si o si la señal portadora de 38khz, que es lo que precisamente hace el 555.



El amigo Gerson strauss no podia estar mas acertado amigo falcon...  si quieres eliminar el 555, nada te lo impide, de hecho, he dejado disponible el codigo fuente en pbp para que el que quiera pueda modificarlo a su gusto  ... lo que tienes que hacer es que el micro genere una portadora de 38 a 40khz y a la vez modular con ella los datos en serie... saludosss


----------



## luis30 (Nov 19, 2015)

FALKON707 dijo:


> a todas éstas no eh armado ese proyecto del control *IR *de *4 *Canales, dado que la idea de usar un *MICROCONTROLADOR* es la de *Suprimir La Nececidad De Circuitos Integrados Adicionales*.. como vemos en los controles remotos de los equpos de *TV*, *SONIDO* y demás que usan mandos a distancia...
> 
> La preguntas es..
> 
> funciona el circuito receptor si no se usa el *NE555* ?



mira este link:https://www.forosdeelectronica.com/f24/aporte-comunicacion-pic-pic-116724/


----------



## chepao (Dic 19, 2015)

hey amigo Dario que alcance tiene tu control?


----------



## Dario (Dic 26, 2015)

Hla amigo, el alcancees de unos 8 a 10 metros. saludosss


----------



## chepao (Dic 29, 2015)

me parece el alcance.

ahora nomas unas preguntas, que unas dudas.

porque en circuito que muestras en el video solo aparecen 2 filtros, y en el digrama yo veo 4 entre ellos un polarizado.

y la otra pregunta es, que si se puede como una mezcla del programa para dejar dos botones al estilo push-button y otros dos asi como para bajar y subir volumen.

espero comentarios, saludos amigo Cesar..!


----------



## Dario (Dic 29, 2015)

Pues si leiste el post desde el principio, habras visto que hay varias versiones de programa, entre ellas, la funcion push button creo que la nombre asi. saludos


----------



## chepao (Ene 2, 2016)

hola hermano, disculpa mi ignorancia, quisiera saber a que se debe esta diferencia;

trsnsmisor on-off
serin pulso,N2400,ancho
return

transmisor push button
serin pulso,N2400,50,res,ancho

a proposito me gustaria, cuando pudieras checaras mi pcb a ver si esta bien. saludos..!


----------



## Dario (Ene 2, 2016)

Hola amigo.

trsnsmisor on-off                       "lee el puerto de entrada pulso y guarda el valor leido en la variable ancho.
serin pulso,N2400,ancho
return
-----------------------------------------------------------------------------------------------------
transmisor push button          "lee el puerto de entrada pulso y guarda el valor leido en la variable ancho,
serin pulso,N2400,50,res,ancho  "si no recibe señal durante 50 mili segundos salta a la etiqueta res.

ese pcb se ve bien, aunque no lo he revisado. saludosss


----------



## asherar (Ene 29, 2016)

Dario dijo:


> Pobre NE555, que culpa tiene de ser tan util jejeje... el pic que use ya esta obsoleto, sin embargo el NE555 sigue tan actual como si nunca hubiesen pasado los casi 40 años que tiene  a tanto rompedero de cabeza, me quedo con el 555 jajaja...  viva el 555!!!



Bueno, perdón, pero los micros evolucionan y también se reemplazan. 
Si es por simplicidad tendrías que "retroceder" a compuertas lógicas en lugar del pic. 

Y yo que te iba a preguntar por qué usas el transistor inversor cuando ya, internamente, la salida del TSOP1738 tiene uno. Jeje.


----------



## Dario (Ene 30, 2016)

asherar dijo:


> Bueno, perdón, pero los micros evolucionan y también se reemplazan.
> Si es por simplicidad tendrías que "retroceder" a compuertas lógicas en lugar del pic.
> 
> Y yo que te iba a preguntar por qué usas el transistor inversor cuando ya, internamente, la salida del TSOP1738 tiene uno. Jeje.



Jajaja... en cierta manera, esta ahí para que la placa no se vea tan vacia jeje... pero te cuento que me dio un poco de pereza modificar un par de letras en el codigo fuente y ese es otro motivo por el cual ese transistor esta ahí...  es el primer diseño  los videotutoriales son para aprender, si al pibe que lo ve no le gusta el 555 ni el transistor, ahi esta el codigo fuente para ser modificado. yo hubiese pagado por un diseño funcional como ese, en mi etapa de novato, ya que controlar cosas a distancia fue y es mi pasion, pero cuando recien comencea intentarlo, solo encontraba diseños inutiles o fragmentos de info que luego fui uniendo para poder aprender jejeje... saludosss


----------



## asherar (Ene 30, 2016)

No te estoy criticando, solo es MI aporte. 
Para "aprender electrónica" le ponemos todos los componentes que quieras (con tal que funcione). 
Pero para "optimizar" el diseño yo le sacaría los componentes que no son indispensables, 
cosa que también es aprender. 
La probabilidad de fallos aumenta con la cantidad de componentes. 
La optimización simplifica futuros retoques o reparaciones y también ahorra $$$. 
El detector ya tiene adentro su adaptador de señal, está bien,  ese lo dejamos. 
Pero el regulador de la fuente se lo podría reemplazar por un 7805 y sus dos 
capacitores (100nf y 100uF). 
Esto simplifica notablemente el diseño de la placa, y deja más lugar para el circuito de la aplicación.


----------



## pepibho (May 26, 2016)

*P*ero saveis cual es la solucion... 

*U*sar menos bibliotecas echas *[Término poco apropiado]*. 
*C*rear una subrrutina ada*P*tada a*-*lo que necesitais.

*Y* si es usar tmr0 pero como la usas para la portadora del infrarrojo por otro lado  en una rutina podrias usarla para generar los largos de los pulsos serial, usar la cabeza no solo para aporrear paredes.

*T*engo que crear un codigo que perdi ace tiempo (solo que espero que esta me salga mucho mas *[Término poco apropiado]*, ya lo posteare, anterior mente lo tenia posteado en electrnicafacil.
*F*unciona pero no es perfecto.
*P*ongamos que es un receptor ir de 8 salidas programable.
*P*rogramables simplemente por que al pulsar una tecla entro en la subrrutina creada por un servidor para leer y almacenar el ad*R*ess y tecla en la eppro*M*. *E*s *´V*alido para nec RC5 y panasonic.

*S*i quereis que lo su*B*a lo que quiero son criticas  u mejoras del produc*T*o. (pongamos que no llega ocupar mucho mas de 600 intrucciones) *H*asta mil todavia se podia replantear algun chorradina pecul*I*ar.

*Y* daria ante*-*todo, quiero tu criterio. que por*-*cierto dario, si que funciona perfectamente el micro stucio picbasic hasta win10 y con las mejoras de la bibliotecas para USB solo que el compilador PBP y el edito*R* microestudio son dos cosas aparte y tenes que conseguir las dor o el micro que no tenga registrado.


*R*ealmente voy a postear las subrrutinas que tengo echas para la lectura, comparacion y almacenado de infrarrojos.



```
'
'  lectura infrarrojos
'
infrarrojos:
port_piloto=0
boton=0
contador=0
while port_ir=0 ' leemos el largo del pulso alto de inicio codigo
    contador=contador+1
wend
if contador<400 then salto_ruido ' si es menor seguro sea ruido IR
contador=0
while port_ir=1 ' leemos el largo del pulso bajo de inicio codigo
    contador=contador+1
    if contador>260 then salto_ruido ' si es mayor seguro no sera correcto
wend
pulso=0
repeat
    infra=0
    while port_ir=0 ' cuenta el largo el pulso alto
        infra=infra+1
        if infra>130 then salto_barrido ' si desborda salimos a comprovarlo
        if port_pulsar=0 then salto_ruido ' salimos de la rutina
    wend
    infra=0
    while port_ir=1 ' cuenta el largo el pulso bajo
        infra=infra+1
        if infra>254 then salto_barrido ' si desborda salimos a comprovarlo
        if port_pulsar=0 then salto_ruido ' salimos de la rutina
        toggle port_piloto
    wend
    casilla=pulso>>3 ' divido entre 4 para encasillar en byte's
    codigo[casilla]=codigo[casilla]<<1 ' desplazo byte para ingresar nuevo bit 
    if infra>110 then codigo[casilla]=codigo[casilla]+1 ' si es un 1 lo suma
    pulso=pulso+1 ' cuenta el largo de bit serial
until pulso=48 ' limite maximo serial 48bit
salto_barrido:
if codigo[0]=codigos[0] then ' comprovamos byte de acceso bajo
    if codigo[1]=codigos[1] then ' comprovamos el byte de acceso alto
        boton=codigo[casilla] ' almaceno el ultimo byte en boton
        retraso=0
    endif ' se puede mejorar la veracidad de los  2 
endif     ' ultimos byte's. NEC, RC5, Panasonic48bit
salto_ruido:
port_piloto=1
return
```

*E*esto co*R*responderia ala lectura, hay que ajustar los valores un poco a relacion de osculador o de las paradas de interru*P*c*I*ones, si no se puede *H*acer asi hay que *H*acerla por el puerto serial como interrucion psi.


```
'
' comprueva la tecla pulsada
'
tecla:  
port_piloto=0
temp2=uncuarto+lluz ' aumenta 1/4 del minimo
temp1=hluz-uncuarto ' reduce el masimo 1/4 menos del maximo
select case boton ' comprovamos la accion de la tecla pulsada
    case codigos[4] ' funcion encender apagar
        if luz<temp1 then ' si la luz es menos de la mitad
' ajustar ara ascento descenso rapido
            luz=temp1 ' pone a 7/8 de la intensidad
        else
            luz=temp2 ' pone a 1/8 de la intensidad 
        endif
        tiempos=1
        retraso=8
        gosub temporizadores ' reten, (evita luz disco)
        codigo[0]=0
        tiempo=0
    case codigos[5]' retraso de apagado de luz (dormir)
        retraso=3
        parada=3
        indica=1
        gosub indicaciones ' da dos destellos y baja la luz a 1/4
        codigo[0]=0
        tiempo=9700 ' aumenta el temporizador reduce el apagado en 20min+-
    case codigos[3] '  bajamos el nivel de luz
        if luz>lluz then luz=luz-1
        tiempo=0
    case codigos[2] ' suvimos el nivel de luz
        if luz<hluz then luz=luz+1
        tiempo=0
end select
boton=0
port_piloto=1
return
```

*E*sta donde comparo la tecla, pongamos que el p*R*ograma propio es de un regulador PWM para *h*iluminacion les en particular mi *H*a*B*itación con dos modulos de 10w led smd de 1100 lumenes.



```
'
' guardar infrarrojos
'
almacena_infra:
parada=5
indica=3 ' indica ciones del modo programacion
gosub indicaciones
temp3=0
repetir_codigo:
casilla=0
while port_ir=1 ' repite asta detectar señal infrarroja
    if port_pulsar=0 then 
        gosub cargarcodigoIR
        goto saltoalmacena
    endif
wend    
gosub infrarrojos
if casilla<2 then repetir_codigo:
if temp3=0 then
    codigos[0]=codigo[0]
    codigos[1]=codigo[1]
    temp3=1
endif
if codigos[0]=codigo[0] and codigos[1]=codigo[1] then
    temp3=temp3+1
    codigos[temp3]=codigo[casilla]
    parada=18
    indica=1
    gosub indicaciones
else
    parada=3
    indica=7
    gosub indicaciones
endif
codigo[0]=0
codigo[1]=0
if temp3<5 then repetir_codigo
'
for temp1=2 to 7
    write temp1,codigos[temp1-2]
next temp1
'
saltoalmacena:
parada=8
indica=3
gosub indicaciones
return' sale del modo programacion
```


*E*sta seria la parte para almacenar las teclas, cuando entro en modo programacion.
*F*altaria las rutinas de parada (por no usar pause) la rutina de de temporizadores controlada por tmr1 sin interruccion, el encider etc.

*E*espero *D*ario que te guste un poco y comprendas lo que e echo.  (pon que este tipo programacion es mas para chabales jovenes. pero que veo cada chapuza que me pregunto su el mismo que la escri*B*e al verla el año siguiente no le dara asquito, por poner diminutivo. sin e*MB*argo tu *D*ario estas teniendo un buen enfoque a*-*la hora de estructurar  el programa para poder leerse despues.

*Y*a posteare el pr*O*grama cundo lo cree de nuevo, que estuve por empezar ahora, la verdad que mucho es solo copia pega de mis subrutinas, asi que acabaria pronto  eso es lo que quiero decir con una buena forma de estructurar los programas *D*ario.

*U*un cordial saludo

*P*or*-*cierto, tampoco es una maravilla mi manera de programar, pero se puede entender lo que se hace en todo momento, y eso son solo 3 cachos.


----------



## pepibho (May 28, 2016)

Dario dijo:


> Hola gente, tanto tiempo   les comento que yo nunca he podido compilar ese codigo utilizando microcode en win7, sin embargo, no tengo ningun problema al compilarlo con microcode corriendo en win xp. por ahi no recuerdo donde, leí que pic basic pro ya esta obsoleto y no existen versiones que funcionen bien en win7. lamentablemente de mi parte, he descargado varias versiones de microcode incluyendo la ultima y no puedo hacerlo funcionar, asi que parami por lo menos, es verdad ...  y por eso estoy tratando de aprender el odioso ccs...




dario descargaste mplab, piensa que el compilador loque ace es adactar el programa a .ams en la configuracion del pc basic tiene que poner en las obciones de compile and program asignar la carpeta pbp (las bibliotecas del basis y programa de compilacion) pero para pasarlo a .ams y compilarlo a .hex tienes que asignar el compilador mpasmwin.exe del mplad que descargas en la pagina de microchip. 
el microcode studio 2 no funciona en win7 ni win10, pero la version 3 o superiores ya si van perfectos en win7 o 10.

instala todos los programas en c: o donde tengas instalado windows aveces si estan en otras unidades se raya tambien el compilador (te da un error de problema al encontrar la ruta de archivo, incluso tiene untamaño maximo de caracteres de ruta asi que no agas muchas profundidad en carpetas.

realmente cualquier compilador es valido de sobre entendiendo como inter`reta los comandos o bibliotecas. pero como me acostumbre al pbp pues... o pbp o en mplab. cosa que el mplab es algo pesado de programar aunque es la manera mas correcta.

y por cierto, no pasa nada con el 555 cuando lo pensaste lo pensaste asi que se le va hacer, lo que esta claro que al ponerlo  aunque ocupe mas y subir el coste tambien te quita tequito problemas y complicaciones que crear la portadora a +-36khz, y que sele va acer tanpoco esta mal. aun asi intentaria hacer mas filirgranas, alguna proteccion, temporizador o algo.

para encima el codigo e directamente de 8bit, enves de darle un acceso de 8 o 16bit y meter el byte del boton mas el invertido del mismo, para poder verificar que la lectura del codigo es correcta y no actue por rudo de algun otro infrarrojo que cuedra unos de sus 32 o 40bit con el unico byte que pusiste.

explico: un mando normal  y corriente NEC conta de 4 bytes, 2 que indican el acesso de dispositivo y ls otros dos la tecla, si el primer byte de tecla es 2 el segundo bit es 253. si ago una  and de ambos bytes el resultado tendria que ser cero, (pongamos que yo no suelo poner esa comparacion con que cuedre los 16bit de aceso me quedo con el primer bit de la tebla) pero bueno es poner una decision mas solo.

en el caso que tu aces es muy factible que otro mando con codificacion nec, rc5, pasanocin y alguna otra marca que mande la informacon via seria asincrono te podria activar sin quere el receptor cmo s fuera una orden del mando que as creado.
tanolo tienes que aumentar la trama de datos serial que mandas.


un saludo



bueno, espongo mi codigo a ver que les parece, esta preparado para un 16f84a a 4Mhz, pero que vamos seguro se adacta a cualquier otro (si no tiene fallos) vamos lo e compilado no lo he provado ni testeado. factiblemente tenga algun fallo que se pueda solucionar sobre la marcha o hacer mas modificaciones.

posiblemente si prepare uno para un 12f629 y el serial 74xx595 (me gusto este podelo por la posibilidad de pasar el byte entero y no esten secuenciando las salidas aparte de sus 100mhz de veocidad maxima que nunca superaremos con un microcontrolador sencillo)



```
' define osc (8)
'
' defnicion de variables y bit alias
'
estado Var byte  ' bit de marcas de memoria
tiempos var estado.bit0
errorp var estado.bit1
pulsado var estado.bit2
m2 var estado.bit3
' variables variadas
tiempo var word
temp1 var byte
temp2 var byte
temp3 var byte
indica var byte
reten var byte
' variables de infrarrojo
contador var word ' aprovechos su alias como punto para retrasos y infrarrojos
infra var contador.byte0 ' esto permite reducir muchos la bariable 16bit
pulso var byte
boton var byte
casilla var byte
codigos var byte [12]
codigo var byte [7]
'
' alias de pin's
'
port_piloto1 var porta.0 ' bit piloto o led 1
port_piloto2 var porta.1 ' bit piloto o led 2
port_pulsar1 var porta.2 ' bit pulsador 1
port_pulsar2 var porta.3 ' bit pulsador 2
port_ir var porta.4 ' bit usado para el receptor infrarrojo
'
' registro configuracion inicial
' 
status=%00000000
option_reg=%00001110 ' configuracion de interruciones primarias
intcon=%00000000 ' configuracion de estatado de interrucciones primarias
' 
trisa=%11100 ' deficicion de puertos inicial
porta=%00000
trisb=%00000000
portb=%10000000
'
tiempo=0
casilla=0
estado=0
boton=0
gosub leer_codigos_ir ' carga valores de IR
'ON INTERRUPT GOTO interrucciones
'
' bucle de programa
'
programa:
if port_pulsar1=0 then gosub almacena_infra ' pulsador
if port_ir=0 then gosub infrarrojos ' lectura infrarrojos
if boton>0 then gosub tecla ' acciones
goto programa
'
'  lectura infrarrojos
'
infrarrojos:
port_piloto1=1
boton=0  
contador=0
while port_ir=0 ' leemos el largo del pulso alto de inicio codigo
    contador=contador+1
wend
if contador<340 then salto_ruido ' si es menor seguro sea ruido IR
contador=0
while port_ir=1 ' leemos el largo del pulso bajo de inicio codigo
    contador=contador+1
    if contador>220 then salto_ruido ' si es mayor seguro no sera correcto
wend
pulso=0
repeat
    infra=0
    while port_ir=0 ' cuenta el largo el pulso alto
        infra=infra+1
        if infra>170 then salto_barrido ' si desborda salimos a comprovarlo
        if port_pulsar2=0 then salto_ruido ' salimos de la rutina
    wend
    infra=0
    while port_ir=1 ' cuenta el largo el pulso bajo
        infra=infra+1 
        if infra>254 then salto_barrido ' si desborda salimos a comprovarlo
        if port_pulsar2=0 then salto_ruido ' salimos de la rutina
    wend
    casilla=pulso>>3 ' divido entre 4 para encasillar en byte's
    codigo[casilla]=codigo[casilla]<<1 ' desplazo byte para ingresar nuevo bit 
    if infra>74 then codigo[casilla]=codigo[casilla]+1 ' si es un 1 lo suma
    pulso=pulso+1 ' cuenta el largo de bit serial
until pulso=48 ' limite maximo serial 48bit
salto_barrido:
if codigo[0]=codigos[0] then ' comprovamos byte de acceso bajo
    if codigo[1]=codigos[1] then ' comprovamos el byte de acceso alto
        boton=codigo[casilla] ' almaceno el ultimo byte en boton
    endif ' se puede mejorar la veracidad de los  2 
endif     ' ultimos byte's. NEC, RC5, Panasonic48bit
codigo[0]=0 ' borramos el acceso para evitar repeticiones
codigo[1]=0
salto_ruido:
port_piloto1=0
return
'
' comprueva la tecla pulsada
'
tecla:  
port_piloto1=1
select case boton ' comprovamos la accion de la tecla pulsada
    case codigos[7] ' 
        portb=portb ^ %11000000 ' se invierte los bit 6 y 7
    case codigos[6] ' 
        portb=portb ^ %00100000 ' invierte el bit 5
    case codigos[5] ' 
        toggle portb.4 ' lo mismo que lo anterior mas rapido de escrivir
    case codigos[4]' 
        toggle portb.3
    case codigos[3] '  
        toggle portb.2
    case codigos[2] ' 
        toggle portb.1
end select
boton=0
infra=120 ' equivale a un pause
gosub retardo_tmr0 ' equivale a un pause
port_piloto1=0
return
'
' guardar infrarrojos
'
almacena_infra:
port_piloto2=0
infra=70 ' aprovecho el alias infra
indica=3 ' indicaciones del modo programacion
gosub indicaciones
temp3=0 ' se utiliza para contar los bytes (las teclas a almacenar)
repetir_codigo:
casilla=0
while port_ir=1 ' repite asta detectar señal infrarroja
    if port_pulsar1=0 then ' pulsar para salir
        gosub leer_codigos_ir ' vuelve a cargar los balores iniciales ir 
        goto saltoalmacena ' saltamos para salir sin guardar
    endif
wend    
gosub infrarrojos ' rutina de lectura infrarrojos
if casilla<2 then repetir_codigo: ' si la lectura es mayor de 3 bytes
if temp3=0 then ' si es el primer codigo guarda los 2 bytes de acceso
    codigos[0]=codigo[0]
    codigos[1]=codigo[1]
    temp3=1 ' incremento uno para el siguiente proceso
endif
if codigos[0]=codigo[0] and codigos[1]=codigo[1] then
    temp3=temp3+1 ' si el acceso es balido, añade el byte del boton
    codigos[temp3]=codigo[casilla] ' 
    infra=140 ' indicaciones de parada
    indica=1
    gosub indicaciones
else
    infra=40 ' si el acceso no es igual destellos rapidos y repite
    indica=7
    gosub indicaciones
endif
codigo[0]=0 ' borro los bytes de acceso
codigo[1]=0
if temp3<7 then repetir_codigo ' cantidad de teclas para almacenar
'
for temp1=0 to 7 ' almacena codicos en la eepron
    write temp1,codigos[temp1]
next temp1
'
saltoalmacena: ' salto para salir de almacenar sin almacenar
infra=190
indica=0
gosub indicaciones
port_piloto2=1
return 
'
' destellos de indicaciones
'
indicaciones:
for temp1=0 to indica ' repite los destellos para incicaciones
    port_piloto1=1
    gosub retardo_tmr0 ' rutina retardo aprovechando bit bandera tmr0
    port_piloto1=0
    gosub retardo_tmr0
next temp1
return
'
' parada por tmr0
'
retardo_tmr0:
contador=contador<<3 ' multipricador para el retraso aprovechando el alias
tiempo=0 ' 
repeat ' creo paradas simulando un pause (prefiero usar tmr1 para esto)
    if intcon.5=1 then ' retraso contador tmr0
        tiempo=tiempo+1 
        intcon.5=0  ' la manejo sin activar interruciones 
    endif
until tiempo=contador ' sale de la parada
return
'
' leer codigo addes y teclas de la eepron
'
leer_codigos_ir:
for temp1=0 to 7 ' leer los codigos IR de la eepron
    read temp1,codigos[temp1]
next temp1
return
'
' 
' control de interrucciones
'
'
'DISABLE
'interrucciones:
'    
'
'resume
'enable
```

la manera que tengo para leer IR no es muy correcta pero si sencilla eficiente y corta, hay que agustar sus valores a relacion de interruccines o oscilador, pero a estoy acostumbrado.
pon que si os fijais como funciona igual seos ocurre como funcionaria IR usando el puerto PSI, realmente lo cree apartir de uno que vi mucho mas chulo y complejo usando este puerto. y bueno como que los 12F al igual que el 16f84 no disponen de PSI asi que se inventa por softwa.

espero ver modificaciones del mismo aqui, no en otra parte y alardeando.

un placer  y un saludo.


----------

