Guest User

Untitled

a guest
Aug 17th, 2018
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.     list    p=16F877A
  2.     INCLUDE <P16F877A.INC>
  3.  
  4. TMR0_CONFIG EQU b'10000111' ;desactivado pullup, flanco asc interrupcion , reloj interno,flanco ascendente , asignado a TMR0, preescaler a 256
  5. INTCON_CONFIG EQU b'1101000'
  6. ALARMA0 EQU 0x20
  7. ALARMA1 EQU 0X27
  8. ALARMA2 EQU 0X2E
  9. ALARMA3 EQU 0X35
  10. ALARMA4 EQU 0X3C
  11. RESP_W EQU 0X7F
  12. NUM_ALARM EQU 0x6F
  13. CORRIMIENTO EQU 0X07
  14. DIRECCION EQU 0X5F
  15. CONTADOR_INTERNO EQU 0x4f
  16. ENCENDIDO EQU 0XFF
  17.  
  18.     ;CONFIGURANDO INTERRUPCIONES
  19.     MOVLW INTCON_CONFIG
  20.     MOVWF INTCON
  21.     ;seteamos las alarmas a invalidas
  22.     CLRF ALARMA0
  23.     CLRF ALARMA1
  24.     CLRF ALARMA2
  25.     CLRF ALARMA3
  26.     CLRF ALARMA4
  27.     MOVLW 0X20
  28.     MOVWF DIRECCION
  29.     ;PRUEBA
  30.     MOVLW ENCENDIDO
  31.     MOVWF ALARMA3
  32.     ;USANDO DIRECCIONAMIENTO INDIRECTO PARA ACCEDER A LAS ALARMAS
  33.     ;INICIALIZANDO EL PUNTERO
  34.     BCF STATUS, .7
  35.     CLRF FSR   
  36.     ;poniendo a 0 el contador de la alarma leida
  37.     CLRF NUM_ALARM
  38.  
  39.  
  40. ;MAIN DEL PROGRAMA 
  41. main   
  42.     MOVFW DIRECCION
  43.     MOVWF FSR
  44.     MOVF INDF, W
  45.     BTFSS STATUS, Z
  46.     goto checar_alarma  ;CALL
  47.     ;SINO SEGUIR PROBANDO
  48.     INCF NUM_ALARM
  49.    
  50.  
  51. ;SE ENCARGA DE AUMENTAR LA DIRECCION QUE SERA USADA PARA UBICAR EL PROGRAMA
  52. ; EN LA EJECUCION
  53. mult
  54.     MOVWF RESP_W
  55.     BTFSC NUM_ALARM, .2 ;SERA NUM_ALARM IGUAL A 4
  56.     goto reset_counter
  57.     MOVFW DIRECCION
  58.     ADDLW CORRIMIENTO
  59.     MOVWF DIRECCION
  60.     MOVFW RESP_W
  61.     goto main
  62.  
  63. ;EL SIGUIENTE CONJUNTO DE INSTRUCCIONES RESETEA LOS VALORES CONTADORES A 0 Y 20
  64. ;PARA MANTENER EL LOOP DURANTE EL PROGRAMA
  65. reset_counter
  66.     movlw 0x20
  67.     movwf DIRECCION
  68.     clrf NUM_ALARM
  69.     goto main
  70.  
  71.   ;SUBRUTINA LLAMADA PARA CHECAR LA ALARMA QUE HA SIDO DETECTADA COMO ACTIVADA
  72. checar_alarma:
  73.     movlw .5
  74.     movwf CONTADOR_INTERNO
  75. rutina_checa:
  76.     ;se pide el dato al reloj, el reloj responde
  77.    
  78.     ;accedemos al siguiente valor de la estructura de la alarma
  79.     INCF FSR
  80.     MOVF INDF, W
  81.     MOVWF RESP_W
  82. ;   MOVWF ;EL VALOR QUE NOS ENTREGO EL RELOJ
  83.     MOVLW 0x00
  84. ;LO ANTERIOR ES SOLO PAR PROBAR
  85.     COMF RESP_W, F
  86.     ANDWF RESP_W, F
  87.     btfss STATUS, Z
  88.     goto main
  89.     decfsz CONTADOR_INTERNO
  90.     goto rutina_checa
  91.     goto turn_on
  92.  
  93. ;encendemos la alarma recordar que usaremos el PORTA y PORTB para las alarmas
  94. turn_on:
  95.     ;respaldamos nuestra posicion indirecta
  96.     movf FSR, W
  97.     movwf RESP_W
  98.     ;nos movemos al banco 1 para configurar el option_reg del tmr0
  99.     movlw b'10000001'
  100.     movwf FSR
  101.     movlw TMR0_CONFIG
  102.     movwf INDF
  103.     ;reseteamos INDF a la posicion de la alarma que estamos encendiendo
  104.     movf RESP_W, W
  105.     movwf FSR
  106.     ;inicializamos el timer
  107.     ;movf INDF, W
  108.     movlw .254
  109.     movwf TMR0
  110. loop_wait
  111.     btfss INTCON, TMR0IF
  112.     goto loop_wait
  113.     ;ahora apagamos la alarma que estaba encendida
  114.     movlw .5    ;restamos para ponernos al principio de la alarma
  115.     subwf RESP_W, W
  116.     movwf FSR   ;usamos direccionamiento indirecto para acceder a la alarma
  117.     clrf INDF   ;limpiamos los bytes de encendido/apagado
  118.     goto main   ;regresamos al main
  119.    
  120.    
  121.    
  122.        
  123.    
  124.    
  125. ;FINAL
  126. final
  127.     NOP
  128.     END
Add Comment
Please, Sign In to add comment