87
Aplicaciones de mC Lenguaje C- CC5x-Temporizadores Preparado por : Juan Ignacio Huircán Departamento de Ingeniería Eléctrica Universidad de La Frontera Otoño 2009

Aplicaciones de mC Lenguaje C- CC5x-Temporizadoresquidel.inele.ufro.cl/~jhuircan/CCOMPILER/Aplicaciones de uC-Temp2-2009v10.pdf · Timer 0 • Es un Timer/counter de 8 bit • Selector

Embed Size (px)

Citation preview

Aplicaciones de mC Lenguaje C- CC5x-Temporizadores

Preparado por : Juan Ignacio HuircánDepartamento de Ingeniería Eléctrica

Universidad de La Frontera

Otoño 2009

Introducción

• El µC posee 3 Módulos Timer, llamados:

– TMR0– TMR1 – TMR2

Aplicaciones de µC

• Cada uno de ellos posee diversas características

• En la programación intervienen varios registros

• Su uso puede resultar complejo dado que requieren del manejo deinterrupciones

Timer 0

• Es un Timer/counter de 8 bit

• Selector de clock interno o externo

• Interrupción de overflow de FFh a 00h

Aplicaciones de µC

• Preescalar de 8 bit configurable por software

• Selección del canto para clock externo

Como funciona un sistema genérico??

Timer

Sea el bloque

Aplicaciones de µC

Como funciona un sistema genérico??

Timer

Sea el bloque

clock

Aplicaciones de µC

Como funciona un sistema genérico??

Timer

Sea el bloque

clock

Carga Inicial

Aplicaciones de µC

Como funciona un sistema genérico??

Timer

Sea el bloque

clock

Carga Inicial

Aplicaciones de µC

Como funciona un sistema genérico??

Timer

Sea el bloque

clock

Carga Inicial 0xFD

Aplicaciones de µC

El timer empieza a contar los cantos dereloj a partir de la carga inicial

Como funciona un sistema genérico??

Timer

Sea el bloque

clock

Carga Inicial 0xFE

Aplicaciones de µC

El timer empieza a contar los cantos dereloj a partir de la carga inicial

Como funciona un sistema genérico??

Timer

Sea el bloque

clock

Carga Inicial 0xFF

Aplicaciones de µC

El timer empieza a contar los cantos dereloj a partir de la carga inicial

Como funciona un sistema genérico??

Timer

Sea el bloque

clock

Carga Inicial 0x00

Aplicaciones de µC

El timer empieza a contar los cantos dereloj a partir de la carga inicial

Como funciona un sistema genérico??

Timer

Sea el bloque

clock

Carga Inicial 0x00

Aplicaciones de µC

El timer empieza a contar los cantos dereloj a partir de la carga inicial

Cuando llega a 0xFF y pasa a 0x00, se habilita el Flag de Interrupción TMR0IF

Que es un preescalar?

clock

Divisor por 2

Es un mecanismo por el cual pasa previamente el clock antes deingresar al Timer, donde es divido. Por lo general por una potencia de 2

Aplicaciones de µC

Timer

clock

Pre-escalar

Que es un preescalar?

Es un mecanismo por el cual pasa previamente el clock antes deingresar al Timer, donde es divido. Por lo general por una potencia de 2

clock

Divisor por 4

Aplicaciones de µC

Timer

clock

Pre-escalar

Esquema del Timer 0 (simplificado)

MUX

MUX

osc

T0CS

PSA

T0SE

PIN RA4/T0CK TMR0 Reg

Aplicaciones de µC

MUX

MUX

Pre-escalar

PSA

PSA

PSA

WDT Enable bit

WDT time-out

Watchdog Timer

Registros Involucrados

• OPTION (En el manual aparece como OPTION_REG)• INTCON

• Procedimiento– Se debe configurar la operación del módulo en el registro

Aplicaciones de µC

– Se debe configurar la operación del módulo en el registro OPTION

– Se debe configurar el registro INTCON para habilitar las interrupciones

Registro OPTION

RBPU INTEDG T0CK T0SE PSA PS2 PS1 PS0

Registro OPTION

RBPU INTEDG T0CK T0SE PSA PS2 PS1 PS0

Bit que selecciona la fuente de clock

1 Transición el pin TOCK1

0 Clock interno

Registro OPTION

RBPU INTEDG T0CK T0SE PSA PS2 PS1 PS0

Bit que selecciona el canto del clock

1 Incremento del clock con canto de bajada en el pin T0CK1

0 Incremento del clock con canto de subida en el pin T0CK1

Registro OPTION

RBPU INTEDG T0CK T0SE PSA PS2 PS1 PS0

Bits de asignación del preescalar

1 Preescalar asignado al WDT (Watch Dog Timer)

0 Preescalar asignado al Timer0

Registro OPTION

RBPU INTEDG T0CK T0SE PSA PS2 PS1 PS0

Bits que seleccionan el preescalar

000 1:2000 1:2

001 1:4

010 1:8

011 1:16

100 1:32

101 1:64

110 1:128

111 1:256

Registro INTCON

GIE PEIE TMR0IE INTIE RBIE TMR0IF INTIF RBIF

Registro INTCON

GIE PEIE TMR0IE INTIE RBIE TMR0IF INTIF RBIF

Habilita todas las interrupcionesHabilita todas las interrupciones

Registro INTCON

GIE PEIE TMR0IE INTIE RBIE TMR0IF INTIF RBIF

Habilita la interrupción por el TMR0

Registro INTCON

GIE PEIE TMR0IE INTIE RBIE TMR0IF INTIF RBIF

Flag de interrupción del TMR0

Esquema del Timer 0 (simplificado)

MUX

MUX

MUX

Pre-escalar

osc

T0CS

PSA

T0SE

PIN RA4/T0CK

TMR0 Reg

Watchdog Timer PSA y T0CS son

bits de control

Aplicaciones de µC

MUX

PSA

PSA

WDT Enable bit

WDT time-out

bits de control

RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0

Esquema del Timer 0 (simplificado)

MUX

MUX

MUX

Pre-escalar

osc

0

0

T0SE

PIN RA4/T0CK

TMR0 Reg

Watchdog Timer PSA y T0CS son

bits de control

Aplicaciones de µC

MUX

0

0

WDT Enable bit

WDT time-out

bits de control

RBPU INTEDG 0 T0SE 0 PS2 PS1 PS0

Esquema del Timer 0 (simplificado)

MUX

MUX

MUX

Pre-escalar

osc

0

0

T0SE

PIN RA4/T0CK

TMR0 Reg

Watchdog Timer PSA y T0CS son

bits de control

Aplicaciones de µC

MUX

0

0

WDT Enable bit

WDT time-out

bits de control

RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0

Esquema del Timer 0 (simplificado)

MUX

MUX

MUX

Pre-escalar

osc

0

0

T0SE

PIN RA4/T0CK

TMR0 Reg

Aplicaciones de µC

0

RBPU INTEDG 0 T0SE 0 PS2 PS1 PS0

Esquema del Timer 0 (simplificado)

MUX

MUX

MUX

Pre-escalar

osc

0

0

T0SE

PIN RA4/T0CK

TMR0 Reg

Aplicaciones de µC

0

RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0

Esquema del Timer 0 (simplificado)

MUX

MUX

MUX

1:2

osc

0

0

T0SE

PIN RA4/T0CK

TMR0 Reg

Aplicaciones de µC

0

RBPU INTEDG T0CS T0SE PSA 0 0 0

Esquema del Timer 0 (simplificado)

MUX

MUX

MUX

1:4

osc

0

0

T0SE

PIN RA4/T0CK

TMR0 Reg

Aplicaciones de µC

0

RBPU INTEDG T0CS T0SE PSA 0 0 1

Esquema del Timer 0 (simplificado)

MUX

MUX

MUX

1:8

osc

0

0

T0SE

PIN RA4/T0CK

TMR0 Reg

Aplicaciones de µC

0

RBPU INTEDG T0CS T0SE PSA 0 1 0

Esquema del Timer 0 (simplificado)

MUX

MUX

MUX

1:16

osc

0

0

T0SE

PIN RA4/T0CK

TMR0 Reg

Aplicaciones de µC

0

RBPU INTEDG T0CS T0SE PSA 0 1 1

Esquema del Timer 0 (simplificado)

MUX

MUX

MUX

1:32

osc

0

0

T0SE

PIN RA4/T0CK

TMR0 Reg

Aplicaciones de µC

0

RBPU INTEDG T0CS T0SE PSA 1 0 0

Esquema del Timer 0 (simplificado)

MUX

MUX

MUX

1:64

osc

0

0

T0SE

PIN RA4/T0CK

TMR0 Reg

Aplicaciones de µC

0

RBPU INTEDG T0CS T0SE PSA 1 0 1

Esquema del Timer 0 (simplificado)

MUX

MUX

MUX

1:128

osc

0

0

T0SE

PIN RA4/T0CK

TMR0 Reg

Aplicaciones de µC

0

RBPU INTEDG T0CS T0SE PSA 1 1 0

Esquema del Timer 0 (simplificado)

MUX

MUX

MUX

1:256

osc

0

0

T0SE

PIN RA4/T0CK

TMR0 Reg

Aplicaciones de µC

0

RBPU INTEDG T0CS T0SE PSA 1 1 1

Interrupciones

• Es el mecanismo más eficiente para atender los periféricos.

• Permite generar temporización más precisa.

• Las fuentes pueden ser distintas

Aplicaciones de µC

– Los Clock internos

– Señales externas tales como INT u otros bits definidos

– Periféricos internos de uC tales como la UART o el ADC o el PWM

Como Funcionan las interrupciones

• Cuando un periférico requiere atención, a través de una señal losolicita a la CPU.

• Inmediatamente, el control del programa salta una rutina llamadaRSI o Rutina de servicio de interrupción.

Aplicaciones de µC

• Esta función atiende al periférico y luego retorna al programaprincipal.

Funcionamiento General

Rutina de Servicio de Interrupción

Aplicaciones de µC

Programa Principal

interrupción

Funcionamiento General

Rutina de Servicio de Interrupción

Aplicaciones de µC

Programa Principal

interrupción

Funcionamiento General

Rutina de Servicio de Interrupción

Aplicaciones de µC

Programa Principal

interrupción

Funcionamiento General

Rutina de Servicio de Interrupción

Aplicaciones de µC

Programa Principal

interrupción

Funcionamiento General

Rutina de Servicio de Interrupción

Aplicaciones de µC

Programa Principal

interrupción

Periférico

Funcionamiento General

Rutina de Servicio de Interrupción

Aplicaciones de µC

Programa Principal

interrupción

Periférico

Funcionamiento General

Rutina de Servicio de Interrupción

Aplicaciones de µC

Programa Principal

interrupción

Periférico

Funcionamiento General

Rutina de Servicio de Interrupción

Aplicaciones de µC

Programa Principal

interrupción

Periférico

Funcionamiento General

Rutina de Servicio de Interrupción

Aplicaciones de µC

Programa Principal

interrupción

Periférico

Funcionamiento General

Rutina de Servicio de Interrupción

Aplicaciones de µC

Programa Principal

interrupción

Periférico

Funcionamiento General

Rutina de Servicio de Interrupción

Aplicaciones de µC

Programa Principal

interrupción

Periférico

En el uC PIC con CC5X

• Se configura el trabajo con interrupciones en los registros OPTION e INTCON

• Se incluye un archivo de cabecera int16cxx.h proporcionado por el que desarrolló el compilador

• La RSI queda en la dirección 0x0004

Aplicaciones de µC

• Cada vez que se interrumpe se setea un FLAGS de acuerdo a la fuente de interrupción

– INTF : Indica la interrupción por INT– T0IF : Indica la interrupción por Overflow de TMR0– RBIF : Int. Por PORTB– ADIF: Int. Del ADC– RCIF : Int. De Rx UART– TXIF : Int. De tx UART

Se implementa una RSI bajo el formato indicado a continuación

#include "int16CXX.H"#pragma origin 4

interrupt rsi( void){

int_save_registers // W, STATUS (and PCLATH)

Aplicaciones de µC

// En esta zona se debe preguntar por// el flag correspondiente

int_restore_registers // W, STATUS (and PCLATH)}

Se implementa una RSI bajo el formato indicado a continuación

#include "int16CXX.H"#pragma origin 4

interrupt rsi( void){

int_save_registers // W, STATUS (and PCLATH)

if ( T0IF) { /* TMR0 overflow interrupt */

Aplicaciones de µC

T0IF = 0; /* reset flag */}

if(INTF) {

INTF=0; }

if(ADIF){

ADIF=0;}

int_restore_registers // W, STATUS (and PCLATH)}

Esquema de programa

#include "int16CXX.H"

#pragma origin 4

interrupt rsi(void)

{

// codigo

}

Aplicaciones de µC

void main()

{

// Config. Puertos I-O

// Config. Timer

// Config. Interrupciones

while(1) // ciclo for ever

{

}

}

Aplicación con el TMR0

#include "int16CXX.H"

#pragma origin 4

interrupt rsi( void){

int_save_registers // W, STATUS (and PCLATH)

Aplicaciones de µC

if ( T0IF) {/* TMR0 overflow interrupt */TMR0 = 128;

if(PORTB.0==0) PORTB.0=1;else PORTB.0=0;

T0IF = 0; /* reset flag */}

int_restore_registers // W, STATUS (and PCLATH)}

void main(){//TRISB.0=0;PORTB.0=1;

//Programación del TMR0OPTION.5=0; OPTION.3=0; // PSA=0;

Aplicaciones de µC

OPTION.3=0; // PSA=0;OPTION.2=0; // PS2=0;OPTION.1=0; // PS1=0;OPTION.0=0; // PS0=0;TMR0=128; // Carga inicial del Timer

INTCON.5=1; //TMR0IE=1;GIE=1; // INTCON.7=1;

while(1){}

}

Timer 1

• El Timer1 es un módulo de Temp/cont de 16 bits que tiene 2 registros de lectura y escritura TMR1H y TMR1L.

• El registro formado por ambos TMR1H:TMR1L se incrementa desde0000h a FFFFh.

• La Interrupción TMR1 si es habilitada es generada por el overflow el cual

Aplicaciones de µC

• La Interrupción TMR1 si es habilitada es generada por el overflow el cuales capturado por el flag TMR1IF.

• Esta puede ser habilitada o deshabilitada por el TMR1IE.

• El modulo trabaja como:– Timer– Counter

– El modo queda determinado por el bit que selecciona el clock

• En modo Timer, Timer1 se incrementa cada ciclo de instrucción.

• En modo counter, el incremento es en cada canto de subida de una entrada de clock externa

Aplicaciones de µC

de una entrada de clock externa

• El Timer1 se habilita/deshabilita mediante el bit TMR1ON.

• También tiene una entrada de reset

Diagrama Timer1 (Simplificado)

TMR1H TMR1L

TMR1ON

T1SYNC

TMR1

RC0

Fosc/4Clock ext

Pre-scaler

T1CKPS1:T1CKPS0TMR1CS

RC0

RC1

T1OSCEN

Registros Involucrados

T1CKPS1 T1CKPS0 T1OSEN T1SYNC TMR1CS TMR1ON

T1CON

T1CKPS1 T1CKPS0 T1OSEN T1SYNC TMR1CS TMR1ON

T1CON

1:1 0 0

1:2 0 1

1:3 1 0

1:4 1 1

Preescalar

T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON

T1CON

Selecciona fuente de clock externo

T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON

T1CON

T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON

T1CON

Selección de la fuente de clock

TMR1H TMR1L

TMR1ON

T1SYNC

TMR1

RC0

Fosc/4Clock ext

Pre-scaler

T1CKPS1:T1CKPS0TMR1CS

RC0

RC1

T1OSCEN

TMR1H TMR1L

TMR1ON

T1SYNC

TMR1

RC0

Fosc/4Clock ext

Pre-scaler

T1CKPS1:T1CKPS0TMR1CS

RC0

RC1

T1OSCEN

T1CKPS1 T1CKPS0 T1OSEN T1SYNC TMR1CS TMR1ON

TMR1H TMR1L

TMR1ON

T1SYNC

TMR1

RC0

Fosc/4Clock ext

Pre-scaler

T1CKPS1:T1CKPS0TMR1CS

RC0

RC1

T1OSCEN

T1CKPS1 T1CKPS0 T1OSEN T1SYNC TMR1CS TMR1ON

TMR1H TMR1L

TMR1ON

T1SYNC

TMR1

RC0

Fosc/4Clock ext

Pre-scaler

T1CKPS1:T1CKPS0TMR1CS

RC0

RC1

T1OSCEN

T1CKPS1 T1CKPS0 T1OSEN T1SYNC TMR1CS TMR1ON

TMR1H TMR1L

TMR1ON

T1SYNC

TMR1

RC0

Fosc/4Clock ext

Pre-scaler

T1CKPS1:T1CKPS0TMR1CS

RC0

RC1

T1OSCEN

T1CKPS1 T1CKPS0 T1OSEN 0 0 TMR1ON

TMR1H TMR1L

TMR1ON

0

TMR1

RC0

Fosc/4Clock ext

Pre-scaler

T1CKPS1:T1CKPS00

RC0

RC1

T1OSCEN

T1CKPS1 T1CKPS0 T1OSEN 0 0 TMR1ON

TMR1H TMR1L

TMR1ON

0

TMR1

RC0

Fosc/4Clock ext

Pre-scaler

T1CKPS1:T1CKPS00

RC0

RC1

T1OSCEN

T1CKPS1 T1CKPS0 T1OSEN 0 0 TMR1ON

TMR1H TMR1L

TMR1ON

0

TMR1

RC0

Fosc/4Clock ext

Pre-scaler

T1CKPS1:T1CKPS00

RC0

RC1

T1OSCEN

T1CKPS1 T1CKPS0 T1OSEN 0 0 TMR1ON

TMR1H TMR1L

TMR1ON

0

TMR1

RC0

Fosc/4Clock ext

1:1

0 00

RC0

RC1

T1OSCEN

0 0 T1OSEN 0 0 TMR1ON

TMR1H TMR1L

TMR1ON

0

TMR1

RC0

Fosc/4Clock ext

1:1

0 00

RC0

RC1

T1OSCEN

0 0 T1OSEN 0 0 TMR1ON

TMR1H TMR1L

TMR1ON

0

TMR1

RC0

Fosc/4Clock ext

1:1

0 00

RC0

RC1

T1OSCEN

0 0 T1OSEN 0 0 1

TMR1H TMR1L

1

0

TMR1

RC0

Fosc/4Clock ext

1:1

0 00

RC0

RC1

T1OSCEN

0 0 T1OSEN 0 0 1

TMR1H TMR1L

1

0

TMR1

RC0

Fosc/4Clock ext

1:1

0 00

RC0

RC1

T1OSCEN

TMR1H TMR1L

1

0

TMR1

RC0

Fosc/4Clock ext

1:1

0 00

RC0

RC1

T1OSCEN

TMR1H TMR1L

1

0

TMR1

RC0

Fosc/4Clock ext

1:1

0 00

RC0

RC1

T1OSCEN

TMR1H TMR1L

1

0

TMR1

RC0

0x0000

Fosc/4Clock ext

1:1

0 00

RC0

RC1

T1OSCEN

TMR1H TMR1L

1

0

TMR1

RC0

0x0001

Fosc/4Clock ext

1:1

0 00

RC0

RC1

T1OSCEN

TMR1H TMR1L

1

0

TMR1

RC0

0xFFFD

Fosc/4Clock ext

1:1

0 00

RC0

RC1

T1OSCEN

TMR1H TMR1L

1

0

TMR1

RC0

0xFFFE

Fosc/4Clock ext

1:1

0 00

RC0

RC1

T1OSCEN

TMR1H TMR1L

1

0

TMR1

RC0

0xFFFF

Fosc/4Clock ext

1:1

0 00

RC0

RC1

T1OSCEN

TMR1H TMR1L

1

0

TMR1

RC0

0x0000

Fosc/4Clock ext

1:1

0 00

RC0

RC1

T1OSCEN

TMR1H TMR1L

1

0

TMR1

RC0

0x0000

TMR1IF=1

Fosc/4Clock ext

1:1

0 00

RC0

RC1

T1OSCEN