sábado, 16 de junio de 2012

SUBRUTINA

Es un conjunto de instrucciones al que se tiene acceso desde cualquier tipo del programa principal. es decir una subrutina es un subprograma que se ejecuta cada vez que el programa principal lo necesite.

call    xxxx  // llamado de la subrutina xxxx.

xxxxx
.......
........
........
return       // se sale de la subrutina y retorna al programa principal.

LIBRERÍAS CON SUBRUTINA DE RETARDO

En la mayoría de los proyectos es necesario controlar el tiempo es por  eso que los retardos son probablemente las subrutinas mas utilizadas dentro los programas.

Para calcular el tiempo checar pag. 170 del libro microcontrolador 16f84a.

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
realice la librería del mismo libro:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CBLOCK
     R_ContA
     R_ContB
     R_ContC
     ENDC
Retardo_10micros
          nop
          nop
          nop
          nop
          nop
Retardo_5micros
          nop
Retardo_4micros
          return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;RETARDOS de 20 hasta 500 microsegundos
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;,;;;
Retardo_500micros
          nop
          movlw  d'164'
          goto   RetardoMicros
Retardo_200micros
          nop
          movlw  d'64'
          goto   RetardoMicros
Retardo_100micros
          movlw  d'31'
          goto   RetardoMicros
Retardo_50micros
          nop
          movlw  d'14'
          goto   RetardoMicros
Retardo_20micros
          movlw  d'5'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RetardoMicros
          movwf  R_ContA
Rmicros_Bucle
          decfsz R_ContA,F
          goto   Rmicros_Bucle
          return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;RETARDOS de 1ms hasta 200ms
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Retardo_200ms
          movlw  d'200'
          goto   Retardos_ms
Retardo_100ms
          movlw  d'100'
          goto   Retardos_ms
Retardo_50ms
          movlw  d'50'
          goto   Retardos_ms
Retardo_20ms
          movlw  d'20'
          goto   Retardos_ms
Retardo_10ms
          movlw  d'10'
          goto   Retardos_ms
Retardo_5ms
          movlw  d'5'
          goto   Retardos_ms
Retardo_2ms
          movlw  d'2'
          goto   Retardos_ms
Retardo_1ms
          movlw  d'1'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Retardos_ms
          movwf  R_ContB
R1ms_BucleExterno
          movlw  d'249'
          movwf  R_ContA
R1ms_BucleInterno
          nop
          decfsz R_ContA,F
          goto   R1ms_BucleInterno
          decfsz R_ContB,F
          goto   R1ms_BucleExterno
          return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;RETARDOS de 0.5 hasta 20 segundos
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Retardo_20s
          movlw  d'200'
          goto   Retardo_1Decima
Retardo_10s
          movlw  d'100'
          goto   Retardo_1Decima
Retardo_5s
          movlw  d'50'
          goto   Retardo_1Decima
Retardo_2s
          movlw  d'20'
          goto   Retardo_1Decima
Retardo_1s
          movlw  d'10'
          goto   Retardo_1Decima
Retardo_500ms
          movlw  d'5'
Retardo_1Decima
          movwf  R_ContC
R1Decima_BucleExterno2
          movlw  d'100'
          movwf  R_ContB
R1Decima_BucleExterno
          movlw  d'249'
          movwf  R_ContA
R1Decima_BucleInterno
          nop
          decfsz R_ContA,F
          goto   R1Decima_BucleInterno
          decfsz R_ContB,F
          goto   R1Decima_BucleExterno
          decfsz R_ContC,F
          goto   R1Decima_BucleExterno2
          return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Lo guarde con la terminación .INC lo cual indica que es una librería.

TEMPORIZADOR 0-9 SEGUNDOS

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 __CONFIG _CP_OFF&_WDT_OFF&_PWRTE_ON&_XT_OSC
        LIST P=16F84A
        INCLUDE<P16F84A.INC>
        CBLOCK  0x0E
        ENDC
status  equ  0x03
porta   equ  0x05
portb   equ  0x06
trisa   equ  0x85
trisb   equ  0x86
        org  0
inicio
      bsf   status,5
      clrf  trisb
      movlw b'11111'
      movwf trisa
      bcf   status,5
      clrf  portb
ini
      movlw b'00111111'
      movwf portb
          
principal
      btfsc porta,0
      goto  principal
      call  Retardo_10micros
      btfsc porta,0
      goto  principal
      goto  activar
deje
      btfss porta,0
      goto  deje
      goto  principal
activar
      call  Retardo_1s           ; llamado de la subrutina del retardo 1 segundo la cual se encuentra en la librería.
      movlw    b'0000110'    ; 1  
      movwf portb
      call  Retardo_1s
      movlw    b'1011011'    ; 2  
      movwf portb
      call  Retardo_1s         
         movlw    b'1001111'    ; 3
      movwf portb
      call  Retardo_1s  
      movlw    b'1100110'    ; 4
      movwf portb
      call     Retardo_1s
      movlw    b'1101101'    ; 5  
      movwf portb
      call  Retardo_1s
      movlw    b'1111101'    ; 6  
      movwf portb
      call  Retardo_1s
      movlw    b'0000111'    ; 7
      movwf portb
      call  Retardo_1s  
      movlw    b'1111111'    ; 8  
      movwf portb
      call  Retardo_1s
      movlw    b'1101111'    ; 9
      movwf portb
      call  Retardo_1s
      goto  ini
      INCLUDE <retardos.inc>  ;  se incluye la librería de retardos en el programa principal.
      END

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 

MATERIAL: 

1- Pushbutton.
1- Resistor de 10k.
1- Display 7 segmentos ánodo común.
1- Pic 16f84a.
1- Cristal de 4Mhz.
2- Capacitores cerámicos de 22pf.
7- Resistores de 220.

SIMULACIÓN:



  Se necesita apretar el push para que empiece el conteo.


VIDEO DE LA SIMULACION:


En el ejemplo nadamas se utilizo la subrutina de un segundo pero de la misma forma se pueden mandar a llamar cualquier subrutina de la librería o se pueden ir anidando.
Se puede incluir la librería al realizar un proyecto en mplab o copiar la librería en la misma carpeta en que vas a guardar tu programa principal(.asm).

DESCARGAR LIBRERÍA Y PROGRAMA SIMULADO EN PROTEUS:









SIGUEME EN FECEBOOK

MI TWITTER

Translate