Hola...
Estoy realizando un programa que es algo asi como una cerradura digital con un pic16f84.
El mismo recibe una secuencia de cuatro dígitos y si la secuencia es la correcta me enciende un led (que hace las veces de cerradura). Yo se que ya hay integrados que hacen estas cosas pero yo lo quiero hacer con este pic.
El programa que hice no funciona por alguna razón que desconozco. Nunca se enciende el led aunque la secuencia de números (que en este caso es 2,4,6 y 8) sea la ingresada.
Acá les muestro el código...
include "p16F84A.inc"
;Variables *****************************************
param00_delay_us equ 0x0c
_d_main equ 0x0d
_flag_main equ 0x0e
_cont_main equ 0x0f
ORG 0
goto start__code
ORG 4
_interrupt
bcf INTCON, T0IF ;clear interrupt flag
retfie
start__code
;;;;;;;;void main(void)
_main__code
clrf _d_main
clrf _flag_main
clrf _cont_main
;;;;;;;;{
;;;;;;;; char d=0x00,flag=0x00,cont=0x00;
;;;;;;;;
;;;;;;;; set_bit( STATUS, RP0 );
bsf STATUS, RP0
;;;;;;;; OPTION_REG = 7;
movlw D'7'
movwf OPTION_REG
;;;;;;;; set_tris_b( 0x00 );
clrf TRISB
;;;;;;;; clear_bit( STATUS, RP0 );
bcf STATUS, RP0
;;;;;;;; output_port_b( 0x00 );
clrf PORTB
;;;;;;;;
;;;;;;;; set_bit( STATUS, RP0 );
bsf STATUS, RP0
;;;;;;;; set_tris_a( 0x0f );
movlw D'15'
movwf TRISA
;;;;;;;; clear_bit( STATUS, RP0 );
bcf STATUS, RP0
;;;;;;;;
;;;;;;;; while(1)
label_0000
;;;;;;;; {
;;;;;;;; d=input_port_a();
movf PORTA, W
movwf _d_main
;;;;;;;; delay_us(255);
movlw D'255'
movwf param00_delay_us
call _delay_us
;;;;;;;;
;;;;;;;;if((d==0x02)||(d==0x04)||(d==0x06)||(d==0x08)||(d==0x00))
movf _d_main, W
sublw D'2'
movlw 1
btfss STATUS, Z
clrw
andlw 0xFF
btfss STATUS, Z
goto label_0004
movf _d_main, W
sublw D'4'
movlw 1
btfss STATUS, Z
clrw
andlw 0xFF
btfsc STATUS, Z
goto label_0004+1
label_0004
movlw 1
andlw 0xFF
btfss STATUS, Z
goto label_0005
movf _d_main, W
sublw D'6'
movlw 1
btfss STATUS, Z
clrw
andlw 0xFF
btfsc STATUS, Z
goto label_0005+1
label_0005
movlw 1
andlw 0xFF
btfss STATUS, Z
goto label_0006
movf _d_main, W
sublw D'8'
movlw 1
btfss STATUS, Z
clrw
andlw 0xFF
btfsc STATUS, Z
goto label_0006+1
label_0006
movlw 1
andlw 0xFF
btfss STATUS, Z
goto label_0007
movf _d_main, W
sublw D'0'
movlw 1
btfss STATUS, Z
clrw
andlw 0xFF
btfsc STATUS, Z
goto label_0007+1
label_0007
movlw 1
sublw 0
btfsc STATUS, Z
goto label_0003
;;;;;;;; {
;;;;;;;; if(d==0x02)
movlw D'2'
subwf _d_main, W
btfss STATUS, Z
goto label_0008
;;;;;;;; if(cont==0x00)
movf _cont_main, F
btfss STATUS, Z
goto label_0009
;;;;;;;; cont++;
incf _cont_main, F
;;;;;;;; else cont=0x00;
goto label_0010
label_0009
clrf _cont_main
;;;;;;;;
;;;;;;;; if(d==0x04)
label_0010
label_0008
movlw D'4'
subwf _d_main, W
btfss STATUS, Z
goto label_0011
;;;;;;;; if(cont==0x01)
movlw D'1'
subwf _cont_main, W
btfss STATUS, Z
goto label_0012
;;;;;;;; cont++;
incf _cont_main, F
;;;;;;;; else cont=0x00;
goto label_0013
label_0012
clrf _cont_main
;;;;;;;;
;;;;;;;; if(d==0x06)
label_0013
label_0011
movlw D'6'
subwf _d_main, W
btfss STATUS, Z
goto label_0014
;;;;;;;; if(cont==0x02)
movlw D'2'
subwf _cont_main, W
btfss STATUS, Z
goto label_0015
;;;;;;;; cont++;
incf _cont_main, F
;;;;;;;; else cont=0x00;
goto label_0016
label_0015
clrf _cont_main
;;;;;;;;
;;;;;;;; if(d==0x08)
label_0016
label_0014
movlw D'8'
subwf _d_main, W
btfss STATUS, Z
goto label_0017
;;;;;;;; if(cont==0x03)
movlw D'3'
subwf _cont_main, W
btfss STATUS, Z
goto label_0018
;;;;;;;; if(flag==0x00)
movf _flag_main, F
btfss STATUS, Z
goto label_0019
;;;;;;;; {output_high_port_b(0);
bsf PORTB, 0
;;;;;;;; flag=0x01;
movlw D'1'
movwf _flag_main
;;;;;;;; cont=0x00;}
clrf _cont_main
;;;;;;;; else
goto label_0021
label_0019
;;;;;;;; {output_low_port_b(0);
bcf PORTB, 0
;;;;;;;; flag=0x00;
clrf _flag_main
;;;;;;;; cont=0x00;}
clrf _cont_main
;;;;;;;; else cont=0x00;
label_0020
goto label_0021
label_0018
clrf _cont_main
;;;;;;;; }
label_0021
label_0017
;;;;;;;;else cont=0x00;
goto label_0022
label_0003
clrf _cont_main
;;;;;;;; }
label_0022
;;;;;;;;}
goto label_0000
label_0001
_main__end
_delay_us__code
_delay_us
rrf param00_delay_us, 1
rrf param00_delay_us, 1
movlw D'63'
andwf param00_delay_us, 1
movlw D'3'
subwf param00_delay_us, 1
label_0002
nop
decfsz param00_delay_us, 1
goto label_0002
nop
return
_delay_us__end
END
El mismo fue realizado con el programa C2C-plus. Ya se que es un poco largo como para leerlo pero estaria muy agradecido si alguien me puede decir cual es mi error...![Big grin :D :D](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
Estoy realizando un programa que es algo asi como una cerradura digital con un pic16f84.
El mismo recibe una secuencia de cuatro dígitos y si la secuencia es la correcta me enciende un led (que hace las veces de cerradura). Yo se que ya hay integrados que hacen estas cosas pero yo lo quiero hacer con este pic.
El programa que hice no funciona por alguna razón que desconozco. Nunca se enciende el led aunque la secuencia de números (que en este caso es 2,4,6 y 8) sea la ingresada.
Acá les muestro el código...
include "p16F84A.inc"
;Variables *****************************************
param00_delay_us equ 0x0c
_d_main equ 0x0d
_flag_main equ 0x0e
_cont_main equ 0x0f
ORG 0
goto start__code
ORG 4
_interrupt
bcf INTCON, T0IF ;clear interrupt flag
retfie
start__code
;;;;;;;;void main(void)
_main__code
clrf _d_main
clrf _flag_main
clrf _cont_main
;;;;;;;;{
;;;;;;;; char d=0x00,flag=0x00,cont=0x00;
;;;;;;;;
;;;;;;;; set_bit( STATUS, RP0 );
bsf STATUS, RP0
;;;;;;;; OPTION_REG = 7;
movlw D'7'
movwf OPTION_REG
;;;;;;;; set_tris_b( 0x00 );
clrf TRISB
;;;;;;;; clear_bit( STATUS, RP0 );
bcf STATUS, RP0
;;;;;;;; output_port_b( 0x00 );
clrf PORTB
;;;;;;;;
;;;;;;;; set_bit( STATUS, RP0 );
bsf STATUS, RP0
;;;;;;;; set_tris_a( 0x0f );
movlw D'15'
movwf TRISA
;;;;;;;; clear_bit( STATUS, RP0 );
bcf STATUS, RP0
;;;;;;;;
;;;;;;;; while(1)
label_0000
;;;;;;;; {
;;;;;;;; d=input_port_a();
movf PORTA, W
movwf _d_main
;;;;;;;; delay_us(255);
movlw D'255'
movwf param00_delay_us
call _delay_us
;;;;;;;;
;;;;;;;;if((d==0x02)||(d==0x04)||(d==0x06)||(d==0x08)||(d==0x00))
movf _d_main, W
sublw D'2'
movlw 1
btfss STATUS, Z
clrw
andlw 0xFF
btfss STATUS, Z
goto label_0004
movf _d_main, W
sublw D'4'
movlw 1
btfss STATUS, Z
clrw
andlw 0xFF
btfsc STATUS, Z
goto label_0004+1
label_0004
movlw 1
andlw 0xFF
btfss STATUS, Z
goto label_0005
movf _d_main, W
sublw D'6'
movlw 1
btfss STATUS, Z
clrw
andlw 0xFF
btfsc STATUS, Z
goto label_0005+1
label_0005
movlw 1
andlw 0xFF
btfss STATUS, Z
goto label_0006
movf _d_main, W
sublw D'8'
movlw 1
btfss STATUS, Z
clrw
andlw 0xFF
btfsc STATUS, Z
goto label_0006+1
label_0006
movlw 1
andlw 0xFF
btfss STATUS, Z
goto label_0007
movf _d_main, W
sublw D'0'
movlw 1
btfss STATUS, Z
clrw
andlw 0xFF
btfsc STATUS, Z
goto label_0007+1
label_0007
movlw 1
sublw 0
btfsc STATUS, Z
goto label_0003
;;;;;;;; {
;;;;;;;; if(d==0x02)
movlw D'2'
subwf _d_main, W
btfss STATUS, Z
goto label_0008
;;;;;;;; if(cont==0x00)
movf _cont_main, F
btfss STATUS, Z
goto label_0009
;;;;;;;; cont++;
incf _cont_main, F
;;;;;;;; else cont=0x00;
goto label_0010
label_0009
clrf _cont_main
;;;;;;;;
;;;;;;;; if(d==0x04)
label_0010
label_0008
movlw D'4'
subwf _d_main, W
btfss STATUS, Z
goto label_0011
;;;;;;;; if(cont==0x01)
movlw D'1'
subwf _cont_main, W
btfss STATUS, Z
goto label_0012
;;;;;;;; cont++;
incf _cont_main, F
;;;;;;;; else cont=0x00;
goto label_0013
label_0012
clrf _cont_main
;;;;;;;;
;;;;;;;; if(d==0x06)
label_0013
label_0011
movlw D'6'
subwf _d_main, W
btfss STATUS, Z
goto label_0014
;;;;;;;; if(cont==0x02)
movlw D'2'
subwf _cont_main, W
btfss STATUS, Z
goto label_0015
;;;;;;;; cont++;
incf _cont_main, F
;;;;;;;; else cont=0x00;
goto label_0016
label_0015
clrf _cont_main
;;;;;;;;
;;;;;;;; if(d==0x08)
label_0016
label_0014
movlw D'8'
subwf _d_main, W
btfss STATUS, Z
goto label_0017
;;;;;;;; if(cont==0x03)
movlw D'3'
subwf _cont_main, W
btfss STATUS, Z
goto label_0018
;;;;;;;; if(flag==0x00)
movf _flag_main, F
btfss STATUS, Z
goto label_0019
;;;;;;;; {output_high_port_b(0);
bsf PORTB, 0
;;;;;;;; flag=0x01;
movlw D'1'
movwf _flag_main
;;;;;;;; cont=0x00;}
clrf _cont_main
;;;;;;;; else
goto label_0021
label_0019
;;;;;;;; {output_low_port_b(0);
bcf PORTB, 0
;;;;;;;; flag=0x00;
clrf _flag_main
;;;;;;;; cont=0x00;}
clrf _cont_main
;;;;;;;; else cont=0x00;
label_0020
goto label_0021
label_0018
clrf _cont_main
;;;;;;;; }
label_0021
label_0017
;;;;;;;;else cont=0x00;
goto label_0022
label_0003
clrf _cont_main
;;;;;;;; }
label_0022
;;;;;;;;}
goto label_0000
label_0001
_main__end
_delay_us__code
_delay_us
rrf param00_delay_us, 1
rrf param00_delay_us, 1
movlw D'63'
andwf param00_delay_us, 1
movlw D'3'
subwf param00_delay_us, 1
label_0002
nop
decfsz param00_delay_us, 1
goto label_0002
nop
return
_delay_us__end
END
El mismo fue realizado con el programa C2C-plus. Ya se que es un poco largo como para leerlo pero estaria muy agradecido si alguien me puede decir cual es mi error...