TIMER0

Es un registro contador ascendente de 8 bits TMR0. La fuente de reloj puede ser interna (modo timer) o externa modo contador, cabe destacar que si la fuente de reloj es externa se puede escoger el flanco de activación de este, por otro lado si su contador se rebasa puede producir una interrupción.



Si las labores del temporizador o contador las asignamos al programa principal robaría mucho tiempo al procesador en decremento de las actividades más importantes. Por este motivo se diseñan recursos específicamente orientados a estas misiones.

          El PIC16F887 posee un temporizador/contador de 8 bits, llamado TMR0 que actúan de dos maneras diferentes:

1. Como contador de sucesos, que estan representados por los impulsos que se aplican a la patita RA4/TOCKI. Al llegar al valor FF H se desborda el contador y con el siguiente impulso, pasa a 00 H, advirtiendo esta circunstancia activando un señalizador y/o provocando una interrupción.

2. Como temporizador, cuando se carga en el registro que implementa al recurso un valor inicial se incrementa con cada ciclo de instrucción (Fosc/4) hasta que se desborda, o sea , pasa de FF a 00 H, y avisa poniendo a 1 un bit señalizador y/o provocando una interrupción.

Para poder utilizar el TIMER0 es necesario saber el manejo de los registros OPTION_REG e INTCON.


Registro OPTION_REG:

Contiene varios bits de control para configurar el divisor de frecuencia o preescaler del TMR0/WDT, la interrupción externa INT, TMR0 y los pull-ups para el PORTB




Estado de sus Bit's




La combinación de los BIT's; PS2, PS1 y PS0 (0, 1 y 2) determinan el valor del divisor de frecuencia, el cual se puede ver en la siguiente tabla.





Registro INTCON:

 Contiene los bits para habilitar cada una de las fuentes de interrupción y las banderas que informan el origen de la interrupción.




Estado de sus Bit's.




Fórmula utilizada para calcular el valor de registro TMR0





Donde:

Ret; es el retardo que queremos generar

Fosc; es la frecuencia de oscilación

256 es el número máximo al que llega el timer para luego ser interrumpido

Preesc; es el preescaler el cual es un divisor de frecuencia




PROGRAMAS DE TMR0

Modo contador (counter) por interrupcion (sincrono)


A continuacion procederemos a crear un programa en el lenguaje ASSEMBLER, este programa consiste en contar pulsos dados por una señal cuadrada conectada al pin RA4, se seleccionó un preescaler de 1:256, el TMR0 contara 50 veces una señal de entrada, al hacer dicho conteo se enciende una secuencia de  Leds por  el pin RB0, RB1 y RB2 se apaga y vuelve a contar.


Fosc=4MHz
Frecuencia del pulso de conteo=1kHz
Se quiere que la TMR0 cuente 50 veces

Hacemos al TMR0 para encontrar el Preescaler  adecuado


Se debe escoger el preescaler  más cercano y mayor al valor obtenido, por lo tanto Preesc=256




código:

; PROGRAMA: TIMER0 modo contador (counter) por polling
; SE ENCENDERA UNA SECUENCIA DE LEDS CADA UNO DURANTE 1 SEGUNDO
; UNA VEZ QUE OCURRA UN DESBORDAMIENTO
; EN LA BANDERA DEL TMR0, UNA VEZ PASADO LOS 3S
; DE ENCENDIDO, EL MISMO SE APAGARA Y COMENZARA NUEVAMENTE EL CONTEO
   LIST P=16F887
    INCLUDE "P16F887.INC"
     
   __CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF &_INTRC_OSC_NOCLKOUT 
   __CONFIG    _CONFIG2, _WRT_OFF & _BOR21V 

               CONT1 EQU 20H            ;VARIABLES A UTILIZAR 

CONT2 EQU 21H
CONT3 EQU 22H

ORG 0X00
GOTO ARRIBA

ARRIBA

BANKSEL ANSEL        ;BITS DE CONFIGURACION
CLRF ANSEL
CLRF ANSELH              ;SE PONDRA COMO ENTRADA
BANKSEL TRISA          ;EL BIT 4 DEL PUERTOA
BSF TRISA,4                   ;PARA COLOCAR LA SEÑAL DE PULSO QUE CONTARA EL TIMER0
CLRF TRISB                   ;SE DECLARA AL PUERTOB COMO
CLRF TRISC                   ;SALIDA PARA ENCENDER LOS LED
BANKSEL PORTA
CLRF PORTA
CLRF PORTB                  ; Y SE MODIFICA EL OPTION_REG
CLRF PORTC                  ;PARA QUE FUNCIONES CON UNA 
MOVLW B'10100111'     ;PRE DE 1:256
MOVWF OPTION_REG
MOVLW .61                      ;ADEMAS DE Q SE LE ASIGNA UN
MOVWF TMR0               ; VALOR A TMR0 PARA QUE CUENTE
BCF INTCON,2               ;128 VECES UNA SEÑAL DE ENTRADA


INICIO BTFSS INTCON,2           ;se espera por la bandera de desbordamiento, cuando ocurre salta

GOTO CUENTA            ;a la instruccion que enciende al led en la pata rb2 durante 1s
GOTO PRENDE           ;luego al led en la pata rb1 y luego al de la pata rb0        
                                            ;si no ocurre nada se mantiene en un bucle hasta que ocurre un    
                                             ;desbordamiento en el timer0
CUENTA  MOVF TMR0,W
                  MOVWF  PORTC
                  GOTO INICIO

PRENDE BCF INTCON,2

          BSF PORTB,2            ;PONEMOS EN 1 EL BIT 2 Y ENCENDEMOS EL PRIMER LED
         CALL RETARDO     ;COMENZAMOS EL RETARDO DE 1SEG
         BCF PORTB,2           ;PONEMOS EN 0 EL BIT 2
         BSF PORTB,1           ;PONEMOS EN 1 EL BIT 1 Y ENCENDEMOS EL SIGUIENTE LED
        CALL RETARDO      ;COMENZAMOS EL RETARDO DE 1SEG
        BCF PORTB,1             ;PONEMOS EN 0 EL BIT 1
        BSF PORTB,0              ;PONEMOS EN 1 EL BIT 0 Y ENCENDEMOS ELULTIMO LED
        CALL RETARDO      ;COMENZAMOS EL RETARDO DE 1SEG
        BCF PORTB,0            ;PONEMOS EN 0 EL BIT 0
        MOVLW .224
        MOVWF TMR0
        GOTO INICIO

RETARDO               ;retardo de 1seg
MOVLW D'10'        ;W<-10
MOVWF CONT3    ;CONT3<-W
MOVLW D'100'      ;W<-100
MOVWF CONT2    ;CONT2<-W
MOVLW D'250'       ;W<-250
MOVFW CONT1    ;CONT1<-W
NOP                           ;ESTE PRIMER BUCLE DURARA 1mSEG
DECFSZ CONT1,1  ;CONT1<-CONT1-1
GOTO $-.2
DECFSZ CONT2,1  ;CONT2<-CONT2-1 ESTE BUCLE REALIZA EL RETARDO DE 100mSEG
GOTO $-.6
DECFSZ CONT3,1  ;CONT3<-CONT3-1 ESTE BUBLE REPITE ELRETARTO DE 100mSEG 10 VECES
GOTO $-.10              ;COMPLETANDO EL RETARDO DE 1SEG
RETURN

END


Montaje en proteus


acá les dejo un vídeo de como montar el programa en proteos





Modo temporizador (timer) por interrupcion

Se mantendra encendido de manera intermitente un led, el cual durara un segundo encendido y apagado. Cuando se presione un pulsador, se encendera una secuencia de leds, los cuales encenderan uno despues del otro con un periodo de tiempo de un segundo entre cada led, para luego volver a la rutina de intermitencia.

código:

 
LIST p=16F887
    INCLUDE <P16F887.inc>
    __CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
    __CONFIG    _CONFIG2, _WRT_OFF & _BOR21V
   
TIEMPO    EQU    23H

    ORG    0X00

    GOTO    INICIO
    ORG    0X04
    GOTO    INT
   

;CONFIGURACION DE LOS PINES y el TMR0


     INICIO

    ; REGISTROS DE CONFIGURACION QUE GARANTIZAN , QUE SE ACTIVE EL
                ;TMR0 POR INTERRUPCION

    BANKSEL    ANSEL;MOVERNOS AL BANCO 3
    CLRF    ANSEL;GARANTIZAMOS QUE
    CLRF    ANSELH;ESTEMOS TRABAJANDO EN DIGITAL
    BANKSEL    TRISB;MOVERNOS AL BANCO 1
    BSF    PORTB,0;PONER EN 1 EL BIT CERO DEL PUERTO B
    CLRF    TRISC;LIMPIAR PUERTO C
    MOVLW    B'01000111'; W<=01000111
    MOVWF    OPTION_REG ; OPTION_REG<=W <<REGISTRO DEL TIMER 0>>
    BANKSEL    PORTB; MOVERNOS AL BANCO 0
    CLRF    PORTB;LIMPIAR PUERTOS PARA GARANTIZAR QUE
    CLRF    PORTC;SALGA LA INFORMACION CORRECTA
    MOVLW    B'10010000'; W<=10010000
    MOVWF    INTCON        ;   INTCON<=W    <<REGISTRO PARA LA INTERRUPCION>>
   
    ;RUTINA QUE ENCIENDE Y APAGA EL LED DEL BIT 3 DEL PUERTO C
    ;DURANTE 1 SEGUNDO
    MOVLW    .50        ; W<=50
    MOVWF    TMR0        ; TMR0<=W
    MOVLW    .40        ;W<=40
    MOVWF    TIEMPO        ;TIEMPO<=W

    BSF    PORTC,3            ;ENCIENDE EL BIT 3 DEL PUERTO C


    DESC    BTFSS    INTCON,T0IF    ;SI ESTA EN UNO LA OPCION T0IF DEL REGISTRO

    GOTO    DESC        ;INTCON SALTA A BCF (NORRAR INFORMACION DE T0IF)
    BCF    INTCON,T0IF
    GOTO    SIGUE
   SIGUE    DECFSZ  TIEMPO; DECREMENTA TIEMPO Y SALTA SI ES CERO
    GOTO    DESC
    CLRF    TIEMPO        ;BORRA LA VARIABLE TIEMPO
    ;SECUENCIA DE RETARDO
   
    MOVLW    .50       
    MOVWF    TMR0       
    MOVLW    .40
    MOVWF    TIEMPO

    BCF    PORTC,3            ;SE APAGA EL BIT 3 DEL PUERTO C


   DESC2    BTFSS    INTCON,T0IF

    GOTO    DESC2
    BCF    INTCON,T0IF
    GOTO    SIGUE2
    SIGUE2    DECFSZ  TIEMPO        ;SECUENCIA DE RETARDO DEL LED DEL BIT 3 DEL PUERTO C
    GOTO    DESC2
    CLRF    TIEMPO
    GOTO    INICIO
   
;RUTINA DE INTERRUPCION SE UTILIZA  LA MISMA SECUENCIA DE RETARDO UTILIZADA
    ;EN LA PRIMERA PARTE

INT

   
        BCF    INTCON,7
        CLRF    PORTB
      
    MOVLW    .50       
    MOVWF    TMR0       
    MOVLW    .40
    MOVWF    TIEMPO

    BSF    PORTC,0        ;Enciendo BIT 0


   DESC3    BTFSS    INTCON,T0IF

    GOTO    DESC3
    BCF    INTCON,T0IF
    GOTO    SIGUE3
    SIGUE3    DECFSZ  TIEMPO
    GOTO    DESC3
    CLRF    TIEMPO
    BCF    PORTC,0        ;apago RB0 en 1s, respectivamente
   
    MOVLW    .50       
    MOVWF    TMR0        
    MOVLW    .40
    MOVWF    TIEMPO

    BSF    PORTC,1        ;Enciendo BIT 1


    DESC4    BTFSS    INTCON,T0IF

    GOTO    DESC4
    BCF    INTCON,T0IF
    GOTO    SIGUE4
    SIGUE4    DECFSZ  TIEMPO
    GOTO    DESC4
    CLRF    TIEMPO
    BCF    PORTC,1        ;Apago RB1 en 1s, respectivamente
   
    MOVLW    .50   
    MOVWF    TMR0        
    MOVLW    .40
    MOVWF    TIEMPO

    BSF    PORTC,2            ;Enciendo BIT 2


   DESC5    BTFSS    INTCON,T0IF

    GOTO    DESC5
    BCF    INTCON,T0IF
    GOTO    SIGUE5
   SIGUE5    DECFSZ  TIEMPO
    GOTO    DESC5
    CLRF    TIEMPO
    BCF    PORTC,2            ;Apago Rb2 en 1s, respectivamente
   
    MOVLW    .50        
    MOVWF    TMR0        
    MOVLW    .40
    MOVWF    TIEMPO

    BSF    PORTC,3            ;Enciendo BIT 3


    DESC6    BTFSS    INTCON,T0IF

    GOTO    DESC6
    BCF    INTCON,T0IF
    GOTO    SIGUE6
    SIGUE6    DECFSZ  TIEMPO
    GOTO    DESC6
    CLRF    TIEMPO
    BCF    PORTC,3        ;Apago Rb3 en 1s, respectivamente
   
    MOVLW    .50        
    MOVWF    TMR0        
    MOVLW    .40
    MOVWF    TIEMPO

    BSF    PORTC,4            ;Enciendo BIT 4


    DESC7    BTFSS    INTCON,T0IF

    GOTO    DESC7
    BCF    INTCON,T0IF
    GOTO    SIGUE7
   SIGUE7    DECFSZ  TIEMPO
    GOTO    DESC7
    CLRF    TIEMPO
    BCF    PORTC,4            ;Apago Rb4 en 1s, respectivamente
   
    MOVLW    .50        
    MOVWF    TMR0        
    MOVLW    .40
    MOVWF    TIEMPO

    BSF    PORTC,5            ;Enciendo BIT 5


    DESC8    BTFSS    INTCON,T0IF

    GOTO    DESC8
    BCF    INTCON,T0IF
    GOTO    SIGUE8
     SIGUE8    DECFSZ  TIEMPO
    GOTO    DESC8
    CLRF    TIEMPO
    BCF    PORTC,5            ;Apago Rb5 en 1s, respectivamente
   
    MOVLW    .50        
    MOVWF    TMR0        
    MOVLW    .40
    MOVWF    TIEMPO

    BSF    PORTC,6            ;Enciendo BIT 6


    DESC1    BTFSS    INTCON,T0IF

    GOTO    DESC1
    BCF    INTCON,T0IF
    GOTO    SIGUE1
   SIGUE1    DECFSZ  TIEMPO
    GOTO    DESC1
    CLRF    TIEMPO
    BCF    PORTC,6            ;Apago Rb6 en 1s, respectivamente
   
    MOVLW    .50 
    MOVWF    TMR0        
    MOVLW    .40
    MOVWF    TIEMPO

    BSF    PORTC,7            ;Enciendo BIT 7


    DESC0    BTFSS    INTCON,T0IF

    GOTO    DESC0
    BCF    INTCON,T0IF
    GOTO    SIGUE0
    SIGUE0    DECFSZ  TIEMPO
    GOTO    DESC0
    CLRF    TIEMPO
    BCF    PORTC,7        ;Apago Rb7 en 1s, respectivamente
    GOTO INICIO
   
    END



Montaje en proteus




  


En el siguiente link podran ver ejemplos del TMR0 como temporizador: https://mega.nz/#F!KMtWwZCB!S_POHQvFOjs_6cKI0lec5A









No hay comentarios:

Publicar un comentario