Encender/apagar luz con control remoto

aaahh estamos hablando de los pines de I/O "entrada o salida" del pic, no de puertos, hay una gran diferencia entre puerto y pin I/O. A eso me refiero. Ya que tu sigues mencionando 33 puertos, desde el principio estamos hablando de 33 pines I/O creo que es lo correcto y no 33 puertos.
 
aaahh estamos hablando de los pines de I/O "entrada o salida" del pic, no de puertos, hay una gran diferencia entre puerto y pin I/O. A eso me refiero. Ya que tu sigues mencionando 33 puertos, desde el principio estamos hablando de 33 pines I/O creo que es lo correcto y no 33 puertos.

:LOL: tienes razón, lamento mi expresión errónea XD, es que aun no soy "Ingeniero" para no equivocarme, saludos!!!!
 
Aca te dejo un circuito super sencillo para que lo puedas hacer. Consta con componentes que lo podes conseguir en cualquier lado.Tiene un alcanze de 6 y 8 metros. Lo probe y funciona a la perfección. Cualquier duda que tengas avisame.
Saludos
interruptor.jpg

eh echo el circuito y no funciona, lo probe con el protoboard y nada. Una de las cosas que hice fue comprar un relay de 12v pero 10A entonces al circuito lo bajo con un 7805, desde hay tengo 5v todo el circuito y 12 en el relay, ahora cuando lo conecto a la fuente, el relay funciona pero con el control remoto nada, aclaro que compre un receptor de tv de 38k.
 
Kelphes, debes tener algo mal conectado, revisaste si llega la señal y si se activa el transistor, etc...No solo se trata de armar el circuito y esperar que funcione y ya, estudia el circuito y ve si realmente no esta funcionando y que es lo que no funciona.

aparte:

Hay pic de muchos puertos están los 24f como el PIC24FJ128GA010, que cada puerto es de 16bits, con solo 2 puertos tendrías 32 pines I/O, y tienes en total 84 I/O, y están los pic32xxxxxx, que también rondan en ese rango aparte de tener de todo por dentro, usb, eternet, etc...en fin puedes conseguir muchos el problema esta en el costo, la programación, etc.
 
Voy a comprar los componentes ahora mismo.

Cuando el circuito no te funciona, el mando puede funcionarte a 36 KHz y usas el sensor de 38 KHz. Procura que coincida los dos a la misma frecuenca, ese es el motivo.

Si quieres ver cositas aquí con el RS232....
http://migsantiago.com/index.php?option=com_content&view=article&id=7&Itemid=8

Una revisión mini del esquema.

interruptor.jpg


En el relé lleva un rectificador 1N4007, aunque es válido, en realidad lleva el 1N4148 que es mucho más rápido que el 1N4007.

El Led verde en realidad va en paralelo con su resisrencia al relé para saber si realemente funciona. Puede encenderse el LEd verde tal como está sin que el relé haga algo.

Unas preguntas y hola de nuevo.

He intentado comprar el CD4017 y me dieron el HEF4017BP que dice que es el normalito.

1) ¿Realmente es el mismo IC como me han dicho en el local?

Otra cosa que me toca las narices es que no tiene nada del TSOP1738 ni el SHF5110-38.

2) ¿Sirve cualquier receptor para este circuito de controlar el relé?

Eso es todo por ahora.
 
Última edición:
Kelphes, debes tener algo mal conectado, revisaste si llega la señal y si se activa el transistor, etc...No solo se trata de armar el circuito y esperar que funcione y ya, estudia el circuito y ve si realmente no esta funcionando y que es lo que no funciona.

aparte:

Hay pic de muchos puertos están los 24f como el PIC24FJ128GA010, que cada puerto es de 16bits, con solo 2 puertos tendrías 32 pines I/O, y tienes en total 84 I/O, y están los pic32xxxxxx, que también rondan en ese rango aparte de tener de todo por dentro, usb, eternet, etc...en fin puedes conseguir muchos el problema esta en el costo, la programación, etc.

Intento en conseguir una PIC con 33 puertos barata y que su programación no sea compleja XD, en mi país la 16f877A esta a 10 dolares, algo adecuado para mi bolsillo, el programador lo poseo, y conozco como se comporta esa PIC en la realidad, por eso mencione ese µC jiijji, saludos!!!!
 
respecto de ese circuito receptor, me parece a mi o el sensor es simplemente un IR ???
o acaso ya tiene incluido el filtro que discrimina la frecuencia en su interior??

sino sera sensible a casi cualquier fuente de luz.
o no ??
 
y la luz comun esta compuesta tambien por IR asi que seguimos en la misma
por eso tambien es la frecuencia de TX
`por eso el rx deberia tener un filtro
 
Última edición:
y la luz comun esta compuesta tambien por IR asi que seguimso en la misma
por eso tambien es la fre3cuencia de TX
`por eso el rx deberia tener un filtro

Lo mismo desia yo hasta que me di cuenta en la practica que era falso eso, si la luz ambiental afectara en el funcionamiento del foto-transistor, el control de un TV al controlar una TV no funcionaria debido a que bloquearía la frecuencia, por eso el foto-transistor tiene una clase de "lente" oscuro, que bloquea cualquier fuente de luz que no sea IR pura, actualmente aquí poseo unos lentes de un mouse IR y al mirar atravez de ella directamente a la luz, no se puede apreciar (se bloquea) pero al apuntar a una luz IR se observa claramente (con la debida cámara claro), bueno, una observación de algo practico que hice una vez XD, saludos!!!!
 
yo hace tiempo realice uno y me funciono hasta 15 metros mas o menos apuntando directo con el control remoto lo monte en un protoboard, el circuito era mas complejo ya que era para otra finalidad, pero utilice solamente la parte que recibe y activa la salida en función a eso le adapte un opto triac MOC, y un triac y lo realice solo para probarlo pero después desistí ya que el circuito era muy grande y lo pienso hacer con un pic12f675 o 16f629 que la circuiteria es menor y ocupa menos espacio aparte de poder decodificar el los comandos del control remoto para mas opciones, en fin les dejo una imagen del circuito probado por mi que les doy fe de que si funciona ya que lo monte y probé y como dije me funciono hasta 15 metros, de echo estando a 2 o 3 metros y colocándome de espalda y apuntando en contra igual recibía la señal y lo activaba, ese fue otro motivo por el cual no me convenció mucho ya que cualquier control que estuviera cerca así no se apuntara directo al receptor lo activaba. Espero y les sirva como base el circuito ...saludosss

PD: el transistor Q1 hace de SOP2837 ya que no esta en el proteus.
 

Adjuntos

  • we654wef4.jpg
    we654wef4.jpg
    72.5 KB · Visitas: 115
Última edición:
che disculpa pero que feo se ve ese circuito, tarde en darme cuenta que el simbolo de masa que normalmente uno lo manda a negativo parece que representa en este caso positivo o +vcc y el primer ff , que tiene D y CK y R ya a un potencial , sin posibilidad de nada.... solo setearlo ....y el sensor ?? ...........
pero que feo que esta simbolicamente .
 
Última edición:
:LOL: si realmente ese era el símbolo de GND que tenia esa versión de proteus, y nada mas veo D Y CLK del primer ff, el R del primer ff esta a vcc, y ya que dices que esta feo voy a tratar de arreglarlo para que se aprecie mejor, mas no era mi intencion que se viera bonito si no era para hacer el pcb...dame un rato y lo pongo bonito...:cool:
 
Ya esta el circuito espero ahora si sea mas agradable a la vista, cualquier cosa extraña que vean en el circuito me avisan y les respondo sin ningún problema.

Pequeña explicación del circuito:

El circuito lo diseñe en base a una serie de circuitos que tenia ya probados y otros.
La primera parte es la realice en función a la hoja de datos del SOP28XX la cual indica
como conectar el componente de manera tal que sea la mas optima para la recepción.

La resistencia de 100ohm a VCC es para alimentar el SOP.
El condensador es (recommended to suppress power supply disturbance) información dada por la misma hoja del componente.

Y la resistencia de 10K o mayor a 10K? igualmente la hoja de datos.
Osea toda esa primera parte es gracias a la información dada por la hoja de datos del SOP28xx.

Ahora la parte de los FF tipo D, este es otro circuito que fue una prueba de uno ya realizado el cual no recuerdo de donde exactamente lo saque.

Funcionamiento:

La idea de todo el circuito es lograr realizar un cambio a la salida y mantenerlo.

Quiere decir que si en la salida es 0 lógico, si se recibe un pulso a la entrada esto genera un cambio en la salida a 1 lógico y lo mantiene a pesar de dejar de recibir el pulso.

Ahora si analizamos bien eso se puede lograr con un solo FF.
Pero que pasa, que el cambio no se mantendría ya que al dejar de recibir el pulso este cambiaría de estado.

Por eso se utilizaron 2 FF.

Por otro lado esta que por lo general en un diseño de circuitos digitales siempre se evalúa la primera condición o primer estado de los circuitos, esto es en el encendido.

Si energizamos el circuito en que estado va iniciare? Para eso se condiciona el circuito para que empiece siempre en un estado ya sea 1 ó 0 lógico.

Como se logra? De varias maneras, pero principalmente con un reset o set, osea que al energizar el circuito inmediatamente se resetee o setee y así lograr un estado inicial.

Por otro lado esta el clock de los FF con lo cual no funcionaria el circuito ya que no cambiaría de estado.

Esto se logra gracias a que los FF tiene la condición de obviar las entradas cuando se utiliza el set y el reset con lo cual también se puede lograr cambiar el estado de las salidas del FF sin necesidad de un clock.

Ahora no siempre el circuito obvia las entradas, (este caso D y Clock son las entradas), solamente cuanto se activa set y reset, entonces que pasa el resto del tiempo cuando no se activan, para eso se colocaron a GND tanto el clock como D asi de esta forma siempre mantenemos un estado inicial después de cada pulso recibido.

Ahora el segundo FF tiene 3 funciones principales:

Recibir la señal

Mantener el estado a la salida.

Y al igual que el anterior debe de tener un estado inicial en este caso lo que nos interesa es este a 0V la salida y por lo tanto lo condicionamos para que su estado inicial sea 0V con un reset al inicio con C3 y luego lo mantenemos a 0V con R4 para que trabaje de modo normal.


El segundo FF recibe la señal cuando la salida del primer FF cambia de estado 1 a 0 y el condensador C2 se descarga.

Cambia de estado de 0 a 1 y lo mantiene.

Ahora la mayoría de los controles no envían un solo pulso envían un tren de pulso y a 38,37,36,Khz.
Como hacemos para no tener un sistema intermitente, de eso se encarga R5 y C4, da un tiempo suficiente como para que a pesar de recibir un tren de pulso este se active una sola vez cada n cantidad de pulsos permitiendo así solo un cambio cada vez que se presione el control remoto.

Ventajas:
Diseño practico.
De alto alcance. Mis pruebas alcanzaron mas o menos unos 15 metros.
Económico.
Estable. En ningún momento le afecto ninguna luz, ni el sol, ni lamparas.


Desventajas:
A pesar de ser estable con lo de las luces y el sol, es tan sensible que se activa con cualquier control, así se apunte el control para el lado opuesto de donde este el receptor eso si se esta al rededor de 2 o 3 metros igual toma la señal y se activa.

De momento es la única desventaja que se me ocurre ya que si hablo de pic y cantidad de componentes es otra cosa.

El resto del circuito puro diseño en base a pruebas y circuitos que ya tenia armado, en si son bastantes comunes, a partir de la salida del segundo FF pueden adaptar lo que deseen ya que no compromete el funcionamiento de lo demás.

Anexo la imagen del circuito y la simulación de las señales para que tengan una idea de lo descrito. En la imagen de las señales la entrada del tren del pulso la hice a 3khz ya que no me pude hacerlo a 36khz en el proteus.

Espero buenas criticas y me disculpo por el esquema que coloque arriba ya que no lo había detallado...saludosss
 

Adjuntos

  • WEF6D54S6DF4.jpg
    WEF6D54S6DF4.jpg
    76.6 KB · Visitas: 46
  • SDFS56D4F56.jpg
    SDFS56D4F56.jpg
    182.8 KB · Visitas: 64
Muy bueno el diseño.

¿No crees que será mejor usar un PIC?

Tiene EEPROM interno por si se va la luz del circuito, al iniciarse vuelve a estar los 8 relés como estaban y no empieza desde cero aunque tenga posibilidad de configurarlo. En tu caso es un relé y no importa.

El PIC puede grabar cada botón del mando con sus trenes de pulso.

http://www.jmnlab.com/receptorir/receptorir.html
http://users.frii.com/dlc/robotics/projects/botproj.htm


Código:
;    Designed to run at 20MHz
       list p=16F877a
       #include p16F877a.inc
   
   
       __CONFIG _CP_OFF & _WDT_OFF & _HS_OSC & _LVP_OFF & _BODEN_OFF
   
   ;******************************* DEFINICIONES***************************************************
   
   #DEFINE LED1 PORTA,3 ;Rojo
   #DEFINE LED2 PORTA,5 ;Azul
   #DEFINE LED3 PORTC,5 ;Verde
   #DEFINE PULSADOR2 PORTA,1
   #DEFINE DATO0 PORTD,0
   #DEFINE DATO1 PORTD,1
   #DEFINE DATO2 PORTD,2
   #DEFINE DATO3 PORTD,3
   #DEFINE DATO4 PORTD,4
   #DEFINE DATO5 PORTD,5
   #DEFINE DATO6 PORTD,6
   #DEFINE DATO7 PORTD,7
   #DEFINE ENABLE PORTE,2
   #DEFINE RS PORTE,0
   #DEFINE W_R PORTE,1
   #DEFINE LCD_DATOS PORTD 
   #DEFINE LCD_CTRL PORTE
   #DEFINE IR PORTB,0
   #DEFINE PIN_PRUEBA PORTA,0
   #DEFINE PIN_PRUEBA2 PORTA,2
   #DEFINE PIN_PRUEBA3 PORTC,0
   
   ;****************************** REGISTROS RAM ***************************************************
   
       cblock 0x20
   Delay0                    ; Assign an address to label Delay1
   Delay1
   Delay2
   Delay3
   DELAY4
   DELAY5    
   W_TEMP
   STATUS_TEMP
   CUENTA
   UNIDADES
   DECENAS
   CENTENAS
   DATO1IR
   DATO2IR
   TICTAC
   INT_CONTROL    
   INT_CONTROL_OLD    
   CONTADOR1        
   
       endc
   
   ;**************************** POSICIONES *********************************************************
   
       ORG 0                ; Posición de memoria donde se coloca la instrucción.
       GOTO Start            ; Salto a Start, se ejecutará la instrucción debajo de Start.
       
       ORG 4
       GOTO ISR
   
       ORG 5                ; Salta el vector de interrupción
   
   ;***************************** CONFIGURAR REGISTROS ************************************************
   
   Start                    ; Inicio del programa
       
   ;        ****************** BANCO 0 **************************************************************
       BCF STATUS, RP0     
       BCF STATUS, RP1     ; Seleciona el Bank0
   
       CLRF PORTA             ; Initialize poerts by clearing output                    
       CLRF PORTB            ; data latches
       CLRF PORTC
       CLRF PORTD
       CLRF PORTE
   
       MOVLW B'10010000'
       MOVWF INTCON        ;GIE e INTE, bit 1 flag de INTE
   
   
   ;        ******************** BANCO 1 **************************************************************
   
       BSF    STATUS,RP0        ; select Register Page 1
   
       BCF OPTION_REG,INTEDG    ;Flanco de bajada 
   
       MOVLW B'00000000'    ;Interruptores son entradas
       MOVWF TRISA        
       MOVLW B'00000001'
       MOVWF TRISB
       CLRF TRISC
       CLRF TRISD
       CLRF TRISE
   
       MOVLW 0X06            ;Configurar los pin de A
       MOVWF ADCON1        ;como entradas digitales.
   
       BCF STATUS, RP0        ;Bank0
   
   
   ;************************ INICIO PROGRAMA ****************************************************************
               
       BSF LED2            ;Parpadeo de Reset
       CALL Delay_2
       BCF LED2
   
       CALL INICIALIZA_LCD
       MOVLW B'00000001'    ;Clear Display
       CALL LCD_COMANDO
       MOVLW B'00000110'    ;Entry mode set
       CALL LCD_COMANDO
       MOVLW B'00001110'    ;Activa lcd y cursor
       CALL LCD_COMANDO
   
       BCF PIN_PRUEBA2
       BCF PIN_PRUEBA
   
   
   ;************************** PROGRAMA PRINCIPAL ********************************************************    
   
   MAIN_LOOP
       BSF LED1
       CALL Delay_2
       BCF LED1
       CALL Delay_2
   
       GOTO MAIN_LOOP
   
   ;*************************** INTERRUPCIONES*************************************************************
   
   ISR
   
       MOVWF W_TEMP            ;Salva W y Status
       SWAPF STATUS,0
       MOVWF STATUS_TEMP
       BSF LED2
       BCF LED1
       BCF LED3
       CLRF TICTAC
       CLRF DATO1IR
       CLRF DATO2IR
       CLRF CONTADOR1
       CLRF INT_CONTROL        ;bit 7 entrada IR, bit 3 y 4 cambio de byte y salida, bit 0:2 contador
       CLRF INT_CONTROL_OLD
       BCF PIN_PRUEBA
       BCF PIN_PRUEBA2
       BCF PIN_PRUEBA3
   
   
   ISR_LOOP
   
   
   ;            ********* Se mira el pin de entrada, si no cambia se va a SUBIR_TIC ************************
   
   
       BTFSS IR                ;Si es cero se ejecuta la siguiente,PORTB,0 ;0.2
       GOTO PONER_A_CERO                                                    ;---->0.6
       BSF INT_CONTROL,7                                                    ;0.6
       GOTO COMP_ENTRADA                                                    ;---->1
   PONER_A_CERO                                                            ;<----0.6
       NOP                                                                    ;0.8
       BCF INT_CONTROL,7                                                    ;1
   COMP_ENTRADA                                                            ;<----1
       MOVFW INT_CONTROL_OLD                                                ;1.2
       XORWF INT_CONTROL,W        ;Si son iguales Z=1                            ;1.4
       BTFSS STATUS,Z            ;Si es 0 se ejecuta la siguiente            ;1.6                                    
       GOTO COMPARAR_TIC                                                    ;--->2
   
   ;************************** Incrementar el TIC **********************************************************
   
       NOP                                                                                 ;2
       NOP                                                                                 ;2.2
       NOP                                                                                 ;2.4
       NOP                                                                                 ;2.6
   
   SUBIR_TIC                                                                                ;<--2.6
       NOP                                                                                    ;2.8
       MOVLW D'140'            ;1 Tics = 0.1 mS                                            ;3
       SUBWF TICTAC,W                                                                        ;3.2
       BTFSC STATUS,C            ;Si TICTAC-W mayor que 0, ejecuta la siguiente                ;3.6
       GOTO  ERROR_IR                                                                        ;
       INCF TICTAC,F                                                                        ;3.8
   
                                                                                   ;
       MOVLW D'158'                                                                        ;4
       MOVWF DELAY5                                                                        ;4.2
   Delay_5loop                                                                                ;3*0.2*158=94.8 
       DECFSZ DELAY5,f                                                                        ;
       GOTO Delay_5loop                                                                    ;
       MOVFW INT_CONTROL                                                                    ;99.2                                                            
       MOVWF INT_CONTROL_OLD                                                                ;99.4
       NOP                                                                                    ;99.6
       GOTO ISR_LOOP                                                                        ;100                                                                            
       
   
   
   ;          ********* El pin de entrada a cambiado, en función de los tics damos 1 o 0 *****************
   ;          ********* TIC menos 0.8 mS error, mayor de 0.8 mS escribir cero, mayor 1.7 mS escribir uno *
   ;           **********   Si es el flanco de subida no comparamos ***************************************
   
   COMPARAR_TIC                                                                            
       BTFSC IR                                                                                                
       GOTO SUBIR_TIC                                                                        
       
                                                                           
       MOVLW D'26'                ;1 Tics = 0.1 mS                                        
       SUBWF TICTAC,W                                                                        
       BTFSC STATUS,C            ;Si TICTAC-W mayor que 0, ejecuta la siguiente            
       GOTO COMPARAR_SALIDA          
                                                       
       MOVLW D'17'                ;1 Tics = 0.1 mS                                    
       SUBWF TICTAC,W                                                                
       BTFSC STATUS,C            ;Si TICTAC-W mayor que 0, ejecuta la siguiente    
       GOTO ALMACENAR_UNO                                                        
                                                                               
       MOVLW D'8'                ;1 Tics = 0.1 mS                                
       SUBWF TICTAC,W                                                            
       BTFSC STATUS,C            ;Si TICTAC-W mayor que 0, ejecuta la siguiente    
       GOTO ALMACENAR_CERO                                                            
                                                                               
   
       
   ERROR_IR                                                                                                                                                                                                                                
       BCF LED2                                                                            
       GOTO POP                                                    
   
   COMPARAR_SALIDA
       MOVFW INT_CONTROL                                                                                                                            
       MOVWF INT_CONTROL_OLD                                                                
       CLRF TICTAC                                                                                                                                                
       GOTO ISR_LOOP
                                                                           
       
                                                                           
                                                                                                                                                                                                                                                                                                                                                       
   ALMACENAR_CERO                                                                            
       BTFSC INT_CONTROL,3    ;Si el bit 3 es uno se ejecuta la siguiente, vale 8 o mas.    
       GOTO ALMACENAR_DATO2                                                                
       BCF STATUS,C
       RLF DATO1IR,F                                                                                                                                                
       GOTO ALMACENAR_SALIDA                                                                
   ALMACENAR_DATO2    
       BCF STATUS,C                                                                    
       RLF DATO2IR,F                                                                                                                                        
       GOTO ALMACENAR_SALIDA                                                                
                                                                                           
   ALMACENAR_UNO                                                                            
       BTFSC INT_CONTROL,3    ;Si el bit 3 es uno se ejecuta la siguiente, vale 8 o mas.    
       GOTO ALMACENAR_DATO2_1    
       BCF STATUS,C                                                            
       RLF DATO1IR,F                                                                        
       INCF DATO1IR,F                                                                                                                                        
       GOTO ALMACENAR_SALIDA                                                                
   ALMACENAR_DATO2_1    
       BCF STATUS,C                                                                    
       RLF DATO2IR,F                                                                        
       INCF DATO2IR,F                                                                                                                                        
       GOTO ALMACENAR_SALIDA                                                                
                                                                                           
   
   ALMACENAR_SALIDA                                                                        
       INCF INT_CONTROL,F    
       BTFSC INT_CONTROL,4    ;Si el bit 4 es uno se ejecuta la siguiente, vale 16 o mas.    
       GOTO DATOS_A_LCD                                                                                                                                    
       GOTO COMPARAR_SALIDA                                                                
       
   
   DATOS_A_LCD
       
   
       MOVLW B'10000000'    
       CALL LCD_COMANDO
   
       MOVFW DATO1IR
       CALL BINARIO_LCD
       MOVFW CENTENAS
       CALL LCD_ESCRIBIR
       MOVFW DECENAS
       CALL LCD_ESCRIBIR
       MOVFW UNIDADES
       CALL LCD_ESCRIBIR
       
       MOVLW B'11000000'
       CALL LCD_COMANDO
   
       MOVFW DATO2IR
       CALL BINARIO_LCD
       MOVFW CENTENAS
       CALL LCD_ESCRIBIR
       MOVFW DECENAS
       CALL LCD_ESCRIBIR
       MOVFW UNIDADES
       CALL LCD_ESCRIBIR
   
   
   POP
       SWAPF STATUS_TEMP,0
       MOVWF STATUS
       MOVFW W_TEMP
       BCF INTCON,INTF
       BCF LED2
       RETFIE
   
   ;********************************** LCD ****************************************************************
   
   INICIALIZA_LCD
       CALL Delay
       CLRF LCD_CTRL
       MOVLW B'00111000'    ;8 bits, 2 líneas y 5x8 puntos
       MOVWF LCD_DATOS
       CALL LCD_E
       CALL Delay
       RETURN
   
   LCD_E
       BSF ENABLE
       NOP
       NOP
       NOP
       NOP
       NOP
       NOP
       NOP
       NOP
       NOP
       BCF ENABLE
       RETURN
   
   LCD_COMANDO    
       CLRF LCD_CTRL
       MOVWF LCD_DATOS
       CALL LCD_E
       CALL Delay    
       RETURN
   
   LCD_ESCRIBIR
       CLRF LCD_CTRL
       BSF RS
       MOVWF LCD_DATOS
       CALL LCD_E
       CALL Delay
       RETURN
   
   ;********************************** BINARIO A LCD *****************************************************
   
   BINARIO_LCD            ;Para registros de 8 bits, convierte a centenas, decenas y unidades.
   
       MOVWF CUENTA
       CLRF UNIDADES
       CLRF DECENAS
       CLRF CENTENAS
   
   CENT_LOOP
       MOVLW D'100'
       SUBWF CUENTA,W
       BTFSS STATUS,C
       GOTO DEC_LOOP
       INCF CENTENAS,F
       MOVWF CUENTA
       GOTO CENT_LOOP
   DEC_LOOP
       MOVLW D'10'
       SUBWF CUENTA,W
       BTFSS STATUS,C
       GOTO UNIDAD
       INCF DECENAS,F
       MOVWF CUENTA
       GOTO DEC_LOOP
   UNIDAD
       MOVF CUENTA,W
       MOVWF UNIDADES
   
       MOVLW B'00110000'
       ADDWF CENTENAS,1
       ADDWF DECENAS,1
       ADDWF UNIDADES,1
   
       RETURN
   
   ;********************************** DELAYS *************************************************************
   
   Delay                    ;20 mS    
       MOVLW D'65'
       MOVWF Delay1
   Delay_loop
       decfsz    Delay0,f    ; Waste time.  
       goto    Delay_loop    ; The Inner loop takes 3 instructions per loop * 256 loopss = 768 instructions
       decfsz    Delay1,f    ; The outer loop takes and additional 3 instructions per lap * 256 loops
       goto    Delay_loop    ; (768+3) * 256 = 197376 instructions / 1M instructions per second = 0.197 sec.
                           ; call it a two-tenths of a second.
       RETURN
   
   Delay_2                    ;0.86 s
       MOVLW D'22'
       MOVWF Delay2
   Delay_2loop
       decfsz    Delay0,f    ; Waste time.  
       goto    Delay_2loop    ; The Inner loop takes 3 instructions per loop * 256 loopss = 768 instructions
       decfsz    Delay1,f    ; The outer loop takes and additional 3 instructions per lap * 256 loops
       goto    Delay_2loop    ; (768+3) * 256 = 197376 instructions / 1M instructions per second = 0.197 sec.
                           ; call it a two-tenths of a second.
       decfsz     Delay2,f
       goto     Delay_2loop
       return
   
   Delay_3                ;50.2 uS
       MOVLW D'82'
       MOVWF Delay3
   Delay_3loop
       DECFSZ Delay3,f
       GOTO Delay_3loop
       RETURN
   
       end
 
Atrás
Arriba