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: &#59; 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&#59; 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&#59;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&#59; 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  &#59; 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

[0] Índice de Mensajes

Ir a la versión completa