• Domingo 29 de Septiembre de 2024, 05:32

Autor Tema:  Rutina Para Delay De 1s Pic16f873  (Leído 1582 veces)

anthilan

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Rutina Para Delay De 1s Pic16f873
« en: Lunes 23 de Mayo de 2005, 20:56 »
0
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
  1.  
  2.   list p=16F873
  3.   include "P16F873.INC"
  4.   ORG 0
  5.   goto INICIO
  6.  
  7.   ORG 4
  8.   goto INTERRUPCION
  9.   ORG 5
  10. CONT EQU 0x21;creamos un contador para la puerta a la hora de abrirla
  11. UP_DOWN EQU 0x22; registro de referencia subida
  12. ESPERA EQU 0x23;para el tiempo que esta arriba
  13. AUX EQU 0X24
  14. ;10001110111111
  15. INICIO:
  16. &#59; CONFIGURACION DE LA ENTRADAS, SALIDAS y TMRs
  17.   bsf STATUS,RP0
  18.   bcf STATUS,RP1; banco 1
  19.   movlw b'10000110'
  20.   movwf ADCON1;Todas las entradas digitales
  21.   movlw b'11000000'
  22.   movwf TRISA; PUERTA A SALIDAS (RA0-RA4, 5 LEDs) y RA5 Entrada sin usar
  23.   movlw 0xFF
  24.   movwf TRISB; PUERTA B ENTRADA (RB0, pulsador, RB1-RB4, interruptores, RB5 optoacoplador)
  25.   movwf TRISC; PUERTA C Entradas sin usar
  26.   movlw .5
  27.   movwf CONT;inicializamos el valor del contador el valor de referencia máximo
  28.   movlw b'11000111'
  29.   movwf OPTION_REG
  30. &#59; INICIO DEL PROGRAMA
  31.   movlw b'00010000';configuramos las interrupciones
  32.   movwf INTCON
  33.   clrf PIE1
  34.   clrf PIR1
  35.   clrf PIE2
  36.   clrf PIR2
  37.   bcf STATUS,RP0; banco 0
  38.   movlw b'11000000'
  39.   movwf ADCON0;Modulo A/D desactivado
  40.   movlw b'00110000'
  41.   movwf T1CON
  42.   movlw b'01111111'
  43.   bsf  T2CON,0
  44.   movwf T2CON
  45.   movlw .30; configuramos una espera de la puerta 30s arriba
  46.   movwf ESPERA
  47.   clrf PORTA
  48. &#59;bsf PORTA,5
  49. ;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
  50.   bsf INTCON,GIE
  51. DORMIR:
  52.   SLEEP
  53.   goto  DORMIR
  54. &#59; BUCLE COMPROBACION DE LA CLAVE CORRECTA  
  55. BUCLE_CLAVE:
  56.   bcf INTCON,GIE
  57.    movf PORTC,0; Lleva lo que hay en los interruptores a W para comprobar si se ha introducido la clave correctamente
  58.   andlw b'00001111'
  59.   sublw b'00001100'; Comprueba la clave correcta 1100.(Introducir la clave correcta xxxx)
  60.   btfss STATUS,Z; bit 2 del registro STATUS
  61.   goto BUCLE_CLAVE
  62.   goto SUBIENDO; pasamos al encendido del motor y apertura de la puerta
  63.  
  64. SUBIENDO:
  65.   bsf PORTA,1
  66.   bcf PORTA,0;este es el codigo de apertura "10"
  67.   call DEC
  68.  
  69. ARRIBA:
  70.   bsf PORTA,0;codigo arriba "11"
  71.   bsf PORTA,4; encendemos la luz del garage
  72.   bsf PORTA,3;encendemos la luz verde del semáforo
  73.   bsf PORTA,5
  74.   call TIEMPO
  75.  
  76. BAJANDO:
  77.   bcf PORTA,1;codigo bajando "01"
  78.   bcf PORTA,3
  79.   call DEC
  80.  
  81. ABAJO:
  82.   clrf PORTA
  83. ;  bsf PORTA,5
  84.   bcf INTCON,0
  85.   bcf INTCON,1
  86.   bcf INTCON,2
  87.   bsf INTCON,GIE
  88.   retfie;cuando ya ha bajado la ponemos en modo sleep
  89.  
  90. ;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
  91.  
  92. TIEMPO:
  93.   call DELAY1S
  94.   decfsz ESPERA,1
  95.   goto TIEMPO
  96.   return
  97.  
  98. DEC:
  99.   call PARPADEO_ON
  100.   decf CONT,1;decrementamos uno por uno el contador llamando despues al método de parpadeo del semáforo(led) con T=1s
  101.   call PARPADEO_ON
  102.   btfss STATUS,Z;chequeamos que el resultado del decremento sea 0
  103.   goto DEC; volvemos a decrementar si no es cero
  104.   movf UP_DOWN,0
  105.   return
  106.  
  107. &#59; BUCLE PARPADEO DE LEDs 1seg ENCENDIDO 1seg APAGADO
  108.  
  109. PARPADEO_ON:
  110.   bsf PORTA,2; El led amarillo del semaforo encendido (LED ON)
  111.   call DELAY1S
  112.   bcf PORTA,2; El led amarillo del semaforo apagado (LED OFF)
  113.   call DELAY1S
  114.   return
  115.  
  116.  
  117. DELAY1S:
  118.   movlw .100
  119.   movwf AUX  
  120.  
  121. DELAY10ms:
  122.   movlw .40
  123.   bsf STATUS,RP0;banco 1
  124.   movwf PR2
  125.   bcf PIR1,TMR2IF
  126.   clrf TMR2
  127.  
  128. DELAY_AUX:
  129.   btfss PIR1,TMR2IF
  130.   goto DELAY_AUX
  131.   decfsz AUX
  132.   goto DELAY10ms
  133.   return
  134.  
  135. INTERRUPCION:
  136.  
  137.   btfsc INTCON,INTF
  138.   goto BUCLE_CLAVE
  139.   retfie
  140.  
  141. END    
  142.  
  143.