Programación Específica > Microcontroladores
Rutina Para Delay De 1s Pic16f873
(1/1)
anthilan:
Hola queremos realizar una rutina de dalay de un segundo para un pic 16f873 y para ello debemos usar o bien el TMR1 o bien el TMR2 adjunto el código que hemos desarrollado y creemos q debia estar mas o menos bien pero que no nos funciona, además de hacer el delay el código incluye el tratamiento de una interrupción por RB0 y pretendemos simular una puerta de garaje. Gracias por la atención
--- Código: Text --- list p=16F873 include "P16F873.INC" ORG 0 goto INICIO ORG 4 goto INTERRUPCION ORG 5CONT EQU 0x21;creamos un contador para la puerta a la hora de abrirlaUP_DOWN EQU 0x22; registro de referencia subidaESPERA EQU 0x23;para el tiempo que esta arribaAUX EQU 0X24;10001110111111INICIO: ; CONFIGURACION DE LA ENTRADAS, SALIDAS y TMRs bsf STATUS,RP0 bcf STATUS,RP1; banco 1 movlw b'10000110' movwf ADCON1;Todas las entradas digitales movlw b'11000000' movwf TRISA; PUERTA A SALIDAS (RA0-RA4, 5 LEDs) y RA5 Entrada sin usar movlw 0xFF movwf TRISB; PUERTA B ENTRADA (RB0, pulsador, RB1-RB4, interruptores, RB5 optoacoplador) movwf TRISC; PUERTA C Entradas sin usar movlw .5 movwf CONT;inicializamos el valor del contador el valor de referencia máximo movlw b'11000111' movwf OPTION_REG; INICIO DEL PROGRAMA movlw b'00010000';configuramos las interrupciones movwf INTCON clrf PIE1 clrf PIR1 clrf PIE2 clrf PIR2 bcf STATUS,RP0; banco 0 movlw b'11000000' movwf ADCON0;Modulo A/D desactivado movlw b'00110000' movwf T1CON movlw b'01111111' bsf T2CON,0 movwf T2CON movlw .30; configuramos una espera de la puerta 30s arriba movwf ESPERA clrf PORTA;bsf PORTA,5;tras cargar la puerta entramos en modo sleep a la espera de la interrupción del pulsador RB0 q indica el inicio del proceso de apertura bsf INTCON,GIEDORMIR: SLEEP goto DORMIR; BUCLE COMPROBACION DE LA CLAVE CORRECTA BUCLE_CLAVE: bcf INTCON,GIE movf PORTC,0; Lleva lo que hay en los interruptores a W para comprobar si se ha introducido la clave correctamente andlw b'00001111' sublw b'00001100'; Comprueba la clave correcta 1100.(Introducir la clave correcta xxxx) btfss STATUS,Z; bit 2 del registro STATUS goto BUCLE_CLAVE goto SUBIENDO; pasamos al encendido del motor y apertura de la puerta SUBIENDO: bsf PORTA,1 bcf PORTA,0;este es el codigo de apertura "10" call DEC ARRIBA: bsf PORTA,0;codigo arriba "11" bsf PORTA,4; encendemos la luz del garage bsf PORTA,3;encendemos la luz verde del semáforo bsf PORTA,5 call TIEMPO BAJANDO: bcf PORTA,1;codigo bajando "01" bcf PORTA,3 call DEC ABAJO: clrf PORTA; bsf PORTA,5 bcf INTCON,0 bcf INTCON,1 bcf INTCON,2 bsf INTCON,GIE retfie;cuando ya ha bajado la ponemos en modo sleep ;estara un tiempo subiendo hasta el tope, eso lo simularemos mediante el decremento de un auxiliar que simboliza la cadena de la puerta, hasta que llega a 0 TIEMPO: call DELAY1S decfsz ESPERA,1 goto TIEMPO return DEC: call PARPADEO_ON decf CONT,1;decrementamos uno por uno el contador llamando despues al método de parpadeo del semáforo(led) con T=1s call PARPADEO_ON btfss STATUS,Z;chequeamos que el resultado del decremento sea 0 goto DEC; volvemos a decrementar si no es cero movf UP_DOWN,0 return ; BUCLE PARPADEO DE LEDs 1seg ENCENDIDO 1seg APAGADO PARPADEO_ON: bsf PORTA,2; El led amarillo del semaforo encendido (LED ON) call DELAY1S bcf PORTA,2; El led amarillo del semaforo apagado (LED OFF) call DELAY1S return DELAY1S: movlw .100 movwf AUX DELAY10ms: movlw .40 bsf STATUS,RP0;banco 1 movwf PR2 bcf PIR1,TMR2IF clrf TMR2 DELAY_AUX: btfss PIR1,TMR2IF goto DELAY_AUX decfsz AUX goto DELAY10ms return INTERRUPCION: btfsc INTCON,INTF goto BUCLE_CLAVE retfie END
Navegación
Ir a la versión completa