Hola, les comento que realice un proyecto que consiste en un pedal que por medio del pic 16F84A de un pulso de salida de 5 volts, con duracion ajustable de 1/10 a 1 Segundo (es decir que se puede ajustar cada decima de segundo) con la particularidad de que aunque se siga presionando el pedal o se suelte rapidamente, siempre mantenga el tiempo de salida predefinido.
Aqui adjunto el diagrama.
http://img836.imageshack.us/img836/1092/diagramatodopic.jpgEl problema que tengo, es que cuando alimento el circuito o dejo de alimentarlo, sale un pulso (erroneamente) asi nada mas. Sospecho que puede ser algo que me falta en el codigo o tal vez algo de "ruido" que se provoca en el circuito al quitar o poner la alimentacion, aqui les dejo el codigo por si tienen alguna sugerencia, les agradecere mucho cualquier ayuda, gracias.
Codigo en ASM.
LIST P=16F84A
INCLUDE <P16F84A.inc>
__CONFIG _WDT_OFF&_PWRTE_ON&_HS_OSC&_CP_OFF
RADIX HEX
CBLOCK 0X20 ;PARA DECLARAR MUCHAS VARIABLES DE UN JALON
PDel0
PDel1
CUENTA
OPERACION
ADRESS_L
DATO_L
TIEMPO
SECUENCIA
ENDC
ORG 0X00
GOTO CONFIGURACION
ORG 0X04
GOTO INTERRUPCION
;*************************************************************************
CONFIGURACION
BSF STATUS,RP0
BCF STATUS,RP1
MOVLW B'00000000'
MOVWF OPTION_REG
MOVLW 0X90
MOVWF INTCON
MOVLW 0X01
MOVWF TRISB
MOVLW B'11110111'
MOVWF TRISA
BCF STATUS,RP0
CLRF PORTB
CLRF PORTA
BCF INTCON,INTF
GOTO PRINCIPAL
;****************************************ZONA DELAYER**********************
;100MS
DEMORA movlw .110 ; 1 set numero de repeticion (B)
movwf PDel0 ; 1 |
PLoop1 movlw .181 ; 1 set numero de repeticion (A)
movwf PDel1 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
clrwdt ; 1 ciclo delay
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 goto PDelL3 ; 2 ciclos delay
PDelL3 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
;**************************************************************************
MOSTRAR
MOVF TIEMPO,W
MOVWF SECUENCIA
;
DECF SECUENCIA
BTFSC STATUS,Z
MOVLW B'11110010'
;
DECF SECUENCIA
BTFSC STATUS,Z
MOVLW B'01001000'
;
DECF SECUENCIA
BTFSC STATUS,Z
MOVLW B'01100000'
;
DECF SECUENCIA
BTFSC STATUS,Z
MOVLW B'00110010'
;
DECF SECUENCIA
BTFSC STATUS,Z
MOVLW B'00100100'
;
DECF SECUENCIA
BTFSC STATUS,Z
MOVLW B'00000100'
;
DECF SECUENCIA
BTFSC STATUS,Z
MOVLW B'11110000'
;
DECF SECUENCIA
BTFSC STATUS,Z
MOVLW B'00000000'
;
DECF SECUENCIA
BTFSC STATUS,Z
MOVLW B'00100000'
;
DECF SECUENCIA
BTFSC STATUS,Z
MOVLW B'10000010'
MOVWF PORTB
RETURN
;***********************************************************
ESCRIBIR_EEPROM
MOVF ADRESS_L,W
MOVWF FSR
MOVF DATO_L,W ;aquí va el dato a escribir en EEPROM
BSF STATUS,RP0 ;cambiar a Banco 4
BCF STATUS,RP1
BSF EECON1,WREN ;habilitar grabación de EEPROM
BCF STATUS,RP0
MOVWF EEDATA ;poner dato en en EEDATA
MOVF FSR,W ;dirección de EEPROM
MOVWF EEADR ;ponerla en EEADR
BSF STATUS,RP0
MOVLW h'55'
MOVWF EECON2 ;comando
MOVLW h'aa'
MOVWF EECON2 ;comando
BSF EECON1,WR ;agregar el dato en la EEPROM
BTFSC EECON1,WR ;esperar a que termine (10 ms)
GOTO $-1
BCF STATUS,RP0 ;cambiar a Banco 0
BCF STATUS,RP1
RETURN
;***********LEER LA MEMORIA EEPROM DEL PIC DE LA DIRECCION "ADRESS_L" Y LO GUARDA EN "W" Y DATA_L**********
LEER_EEPROM
MOVF ADRESS_L,W ;dirección de EEPROM
; BSF STATUS,RP1 ;cambiar a Banco 2
MOVWF EEADR ;ponerla en EEADR
BSF STATUS,RP0 ;cambia banco 3
BSF EECON1,RD ;operación de lectura
BCF STATUS,RP0 ;cambia banco 2
MOVF EEDATA,W ;leer dato desde EEPROM y lo pasa a W
BCF STATUS,RP1 ;cambiar a Banco 0
MOVWF DATO_L ;guardar el dato
RETURN
;************************************************************
INTERRUPCION
BCF INTCON,INTF
BCF INTCON,GIE
BSF PORTA,3
CALL DEMORA
DECFSZ CUENTA
;BTFSC PORTB,0
;GOTO REGRESAR
GOTO INTERRUPCION
REGRESAR
BCF PORTA,3
BTFSS PORTB,0
GOTO REGRESAR
BCF INTCON,INTF
RETFIE
;***********************************************************
INCREMENTAR
INCF TIEMPO
CALL DEMORA
MOVF TIEMPO,W
MOVWF OPERACION
MOVLW 0X0B
SUBWF OPERACION
BTFSC STATUS,Z
DECF TIEMPO
BTFSS PORTA,0
GOTO $-1
MOVLW 0X01
MOVWF ADRESS_L
MOVF TIEMPO,W
MOVWF DATO_L
CALL ESCRIBIR_EEPROM
GOTO BUCLE
DECREMENTAR
MOVLW 0X01
MOVWF ADRESS_L
CALL DEMORA
DECFSZ TIEMPO
GOTO SKIP
INCF TIEMPO
SKIP
BTFSS PORTA,1
GOTO $-1
MOVLW 0X01
MOVWF ADRESS_L
MOVF TIEMPO,W
MOVWF DATO_L
CALL ESCRIBIR_EEPROM
GOTO BUCLE
NUEVO
CLRF DATO_L
CALL ESCRIBIR_EEPROM
INCF ADRESS_L
MOVLW 0X01
; MOVWF TIEMPO
MOVWF DATO_L
CALL ESCRIBIR_EEPROM
RETURN
RECORDAR
MOVLW 0X01
MOVWF ADRESS_L
CALL LEER_EEPROM
MOVF DATO_L,W
MOVWF TIEMPO
RETURN
PRINCIPAL
CLRF ADRESS_L
CALL LEER_EEPROM
MOVWF DATO_L
BTFSC DATO_L,0
CALL NUEVO
CALL RECORDAR
CLRF PORTB
BUCLE
BTFSS PORTA,0
GOTO INCREMENTAR
BTFSS PORTA,1
GOTO DECREMENTAR
CALL MOSTRAR
MOVF TIEMPO,W
MOVWF CUENTA
BSF INTCON,GIE
GOTO BUCLE
END
P.D. Este foro esta excelente, quiero aprender programacion y esto es el cielo!!!!