Está en la página 1de 87

Aplicaciones de mC

Lenguaje C- CC5x-Temporizadores
Preparado por : Juan Ignacio Huircn
Departamento de Ingeniera Elctrica
Universidad de La Frontera
Otoo 2009

Introduccin
El C posee 3 Mdulos Timer, llamados:
TMR0
TMR1
TMR2

Cada uno de ellos posee diversas caractersticas


En la programacin intervienen varios registros
Su uso puede resultar complejo dado que requieren del manejo de
interrupciones

Aplicaciones de C

Timer 0
Es un Timer/counter de 8 bit
Selector de clock interno o externo
Interrupcin de overflow de FFh a 00h
Preescalar de 8 bit configurable por software
Seleccin del canto para clock externo

Aplicaciones de C

Como funciona un sistema genrico??


Sea el bloque

Timer

Aplicaciones de C

Como funciona un sistema genrico??


Sea el bloque
clock
Timer

Aplicaciones de C

Como funciona un sistema genrico??


Sea el bloque

Carga Inicial

clock
Timer

Aplicaciones de C

Como funciona un sistema genrico??


Sea el bloque

Carga Inicial

clock
Timer

Aplicaciones de C

Como funciona un sistema genrico??


Sea el bloque

Carga Inicial

0xFD

clock
Timer

El timer empieza a contar los cantos de


reloj a partir de la carga inicial

Aplicaciones de C

Como funciona un sistema genrico??


Sea el bloque

Carga Inicial

0xFE

clock
Timer

El timer empieza a contar los cantos de


reloj a partir de la carga inicial

Aplicaciones de C

Como funciona un sistema genrico??


Sea el bloque

Carga Inicial

0xFF

clock
Timer

El timer empieza a contar los cantos de


reloj a partir de la carga inicial

Aplicaciones de C

Como funciona un sistema genrico??


Sea el bloque

Carga Inicial

0x00

clock
Timer

El timer empieza a contar los cantos de


reloj a partir de la carga inicial

Aplicaciones de C

Como funciona un sistema genrico??


Sea el bloque

Carga Inicial

0x00

clock
Timer

El timer empieza a contar los cantos de


reloj a partir de la carga inicial
Cuando llega a 0xFF y pasa a 0x00, se
habilita el Flag de Interrupcin TMR0IF

Aplicaciones de C

Que es un preescalar?
Es un mecanismo por el cual pasa previamente el clock antes de
ingresar al Timer, donde es divido. Por lo general por una potencia de 2
Divisor por 2
clock
Pre-escalar

Timer

Aplicaciones de C

Que es un preescalar?
Es un mecanismo por el cual pasa previamente el clock antes de
ingresar al Timer, donde es divido. Por lo general por una potencia de 2
Divisor por 4
clock
Pre-escalar

Timer

Aplicaciones de C

Esquema del Timer 0 (simplificado)


osc
M
U
X

PIN RA4
/T0CK

M
U
X

T0SE

TMR0 Reg

T0CS
PSA

Watchdog
Timer

WDT Enable
bit

M
U
X

Preescalar

PSA

MUX

WDT timeout

PSA
Aplicaciones de C

Registros Involucrados
OPTION (En el manual aparece como OPTION_REG)
INTCON
Procedimiento
Se debe configurar la operacin del mdulo en el registro
OPTION
Se debe configurar el registro INTCON para habilitar las
interrupciones

Aplicaciones de C

Registro OPTION
RBPU

INTEDG

T0CK

T0SE

PSA

PS2

PS1

PS0

Registro OPTION
RBPU

INTEDG

T0CK

T0SE

PSA

PS2

PS1

Bit que selecciona la fuente de clock


1

Transicin el pin TOCK1

Clock interno

PS0

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

Incremento del clock con canto de subida en el pin T0CK1

Registro OPTION
RBPU

INTEDG

T0CK

T0SE

PSA

PS2

PS1

PS0

Preescalar asignado al WDT (Watch Dog Timer)

Preescalar asignado al Timer0

Bits de asignacin del preescalar

Registro OPTION
RBPU

INTEDG

T0CK

T0SE

PSA

PS2

PS1

Bits que seleccionan el


preescalar
000

1:2

001

1:4

010

1:8

011

1:16

100

1:32

101

1:64

110

1:128

111

1:256

PS0

Registro INTCON
GIE

PEIE

TMR0IE

INTIE

RBIE

TMR0IF

INTIF

RBIF

Registro INTCON
GIE

PEIE

TMR0IE

INTIE

Habilita todas las interrupciones

RBIE

TMR0IF

INTIF

RBIF

Registro INTCON
GIE

PEIE

TMR0IE

INTIE

RBIE

Habilita la interrupcin por el TMR0

TMR0IF

INTIF

RBIF

Registro INTCON
GIE

PEIE

TMR0IE

INTIE

RBIE

TMR0IF

Flag de interrupcin del TMR0

INTIF

RBIF

Esquema del Timer 0 (simplificado)


osc

M
U
X

PIN RA4
/T0CK

M
U
X

T0SE
M
U
X

T0CS
Watchdog
Timer

Preescalar

PSA

TMR0 Reg

PSA y T0CS son


bits de control

PSA

WDT Enable
bit

MUX

WDT time-out

PSA
RBPU

INTEDG

T0CS

T0SE

PSA

PS2

PS1

PS0

Aplicaciones de C

Esquema del Timer 0 (simplificado)


osc

M
U
X

PIN RA4
/T0CK

M
U
X

T0SE
M
U
X

0
Watchdog
Timer

Preescalar

TMR0 Reg

PSA y T0CS son


bits de control

WDT Enable
bit

MUX

WDT time-out

0
RBPU

INTEDG

T0SE

PS2

PS1

PS0

Aplicaciones de C

Esquema del Timer 0 (simplificado)


osc

M
U
X

PIN RA4
/T0CK

M
U
X

T0SE
M
U
X

0
Watchdog
Timer

Preescalar

TMR0 Reg

PSA y T0CS son


bits de control

WDT Enable
bit

MUX

WDT time-out

0
RBPU

INTEDG

T0CS

T0SE

PSA

PS2

PS1

PS0

Aplicaciones de C

Esquema del Timer 0 (simplificado)


osc

M
U
X

PIN RA4
/T0CK

M
U
X

T0SE
M
U
X

Preescalar

TMR0 Reg

RBPU

INTEDG

T0SE

PS2

PS1

PS0

Aplicaciones de C

Esquema del Timer 0 (simplificado)


osc

M
U
X

PIN RA4
/T0CK

M
U
X

T0SE
M
U
X

Preescalar

TMR0 Reg

RBPU

INTEDG

T0CS

T0SE

PSA

PS2

PS1

PS0

Aplicaciones de C

Esquema del Timer 0 (simplificado)


osc

M
U
X

PIN RA4
/T0CK

M
U
X

T0SE
M
U
X

TMR0 Reg

1:2

RBPU

INTEDG

T0CS

T0SE

PSA

Aplicaciones de C

Esquema del Timer 0 (simplificado)


osc

M
U
X

PIN RA4
/T0CK

M
U
X

T0SE
M
U
X

TMR0 Reg

1:4

RBPU

INTEDG

T0CS

T0SE

PSA

Aplicaciones de C

Esquema del Timer 0 (simplificado)


osc

M
U
X

PIN RA4
/T0CK

M
U
X

T0SE
M
U
X

TMR0 Reg

1:8

RBPU

INTEDG

T0CS

T0SE

PSA

Aplicaciones de C

Esquema del Timer 0 (simplificado)


osc

M
U
X

PIN RA4
/T0CK

M
U
X

T0SE
M
U
X

TMR0 Reg

1:16

RBPU

INTEDG

T0CS

T0SE

PSA

Aplicaciones de C

Esquema del Timer 0 (simplificado)


osc

M
U
X

PIN RA4
/T0CK

M
U
X

T0SE
M
U
X

TMR0 Reg

1:32

RBPU

INTEDG

T0CS

T0SE

PSA

Aplicaciones de C

Esquema del Timer 0 (simplificado)


osc

M
U
X

PIN RA4
/T0CK

M
U
X

T0SE
M
U
X

TMR0 Reg

1:64

RBPU

INTEDG

T0CS

T0SE

PSA

Aplicaciones de C

Esquema del Timer 0 (simplificado)


osc

M
U
X

PIN RA4
/T0CK

M
U
X

T0SE
M
U
X

TMR0 Reg

1:128

RBPU

INTEDG

T0CS

T0SE

PSA

Aplicaciones de C

Esquema del Timer 0 (simplificado)


osc

M
U
X

PIN RA4
/T0CK

M
U
X

T0SE
M
U
X

TMR0 Reg

1:256

RBPU

INTEDG

T0CS

T0SE

PSA

Aplicaciones de C

Interrupciones
Es el mecanismo ms eficiente para atender los perifricos.
Permite generar temporizacin ms precisa.
Las fuentes pueden ser distintas
Los Clock internos
Seales externas tales como INT u otros bits definidos
Perifricos internos de uC tales como la UART o el ADC o el PWM

Aplicaciones de C

Como Funcionan las interrupciones


Cuando un perifrico requiere atencin, a travs de una seal lo
solicita a la CPU.
Inmediatamente, el control del programa salta una rutina llamada
RSI o Rutina de servicio de interrupcin.
Esta funcin atiende al perifrico y luego retorna al programa
principal.

Aplicaciones de C

Funcionamiento General

Rutina de
Servicio de
Interrupcin

interrupcin
Programa
Principal

Aplicaciones de C

Funcionamiento General

Rutina de
Servicio de
Interrupcin

interrupcin
Programa
Principal

Aplicaciones de C

Funcionamiento General

Rutina de
Servicio de
Interrupcin

interrupcin
Programa
Principal

Aplicaciones de C

Funcionamiento General

Rutina de
Servicio de
Interrupcin

interrupcin
Programa
Principal

Aplicaciones de C

Funcionamiento General

Rutina de
Servicio de
Interrupcin

interrupcin
Perifrico

Programa
Principal

Aplicaciones de C

Funcionamiento General

Rutina de
Servicio de
Interrupcin

interrupcin
Perifrico

Programa
Principal

Aplicaciones de C

Funcionamiento General

Rutina de
Servicio de
Interrupcin

interrupcin
Perifrico

Programa
Principal

Aplicaciones de C

Funcionamiento General

Rutina de
Servicio de
Interrupcin

interrupcin
Perifrico

Programa
Principal

Aplicaciones de C

Funcionamiento General

Rutina de
Servicio de
Interrupcin

interrupcin
Perifrico

Programa
Principal

Aplicaciones de C

Funcionamiento General

Rutina de
Servicio de
Interrupcin

interrupcin
Perifrico

Programa
Principal

Aplicaciones de C

Funcionamiento General

Rutina de
Servicio de
Interrupcin

interrupcin
Perifrico

Programa
Principal

Aplicaciones de C

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 direccin 0x0004

Cada vez que se interrumpe se setea un FLAGS de acuerdo a la fuente de


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

Aplicaciones de C

Se implementa una RSI bajo el formato indicado a continuacin


#include "int16CXX.H"
#pragma origin 4
interrupt rsi( void)
{
int_save_registers

// W, STATUS (and PCLATH)

// En esta zona se debe preguntar por


// el flag correspondiente

int_restore_registers // W, STATUS (and PCLATH)


}

Aplicaciones de C

Se implementa una RSI bajo el formato indicado a


continuacin
#include "int16CXX.H"
#pragma origin 4
interrupt rsi( void)
{
int_save_registers
if ( T0IF)

// W, STATUS (and PCLATH)

/* TMR0 overflow interrupt */


T0IF = 0;

/* reset flag */

}
if(INTF) {
INTF=0;
}
if(ADIF)
{
ADIF=0;
}
int_restore_registers // W, STATUS (and PCLATH)
}
Aplicaciones de C

Esquema de programa
#include "int16CXX.H"
#pragma origin 4
interrupt rsi(void)
{
// codigo
}
void
{
//
//
//

main()
Config. Puertos I-O
Config. Timer
Config. Interrupciones

while(1) // ciclo for ever


{
}
}
Aplicaciones de C

Aplicacin con el TMR0


#include "int16CXX.H"
#pragma origin 4
interrupt rsi( void)
{
int_save_registers

// W, STATUS (and PCLATH)

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)
}
Aplicaciones de C

void main()
{
//
TRISB.0=0;
PORTB.0=1;
//Programacin del TMR0
OPTION.5=0;
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)
{
}
}
Aplicaciones de C

Timer 1
El Timer1 es un mdulo de Temp/cont de 16 bits que tiene 2 registros de
lectura y escritura TMR1H y TMR1L.
El registro formado por ambos TMR1H:TMR1L
0000h a FFFFh.

se incrementa desde

La Interrupcin TMR1 si es habilitada es generada por el overflow el cual


es 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
Aplicaciones de C

En modo Timer, Timer1 se incrementa cada ciclo de


instruccin.
En modo counter, el incremento es en cada canto de subida
de una entrada de clock externa
El Timer1 se habilita/deshabilita mediante el bit TMR1ON.
Tambin tiene una entrada de reset

Aplicaciones de C

Diagrama Timer1 (Simplificado)


T1SYNC

TMR1
TMR1H

TMR1L
TMR1ON

RC0

Pre-scaler

RC1
Clock ext

Fosc/4
T1OSCEN

T1CKPS1:T1CKPS0

TMR1CS

Registros Involucrados

T1CON

T1CKPS1

T1CKPS0

T1OSEN

T1SYNC

TMR1CS TMR1ON

T1CON

T1CKPS1

T1CKPS0

1:1

1:2

1:3

1:4

T1OSEN

T1SYNC

Preescalar

TMR1CS TMR1ON

T1CON

T1CKPS1

Selecciona fuente de
clock externo

T1CKPS0

T1OSCEN

T1SYNC

TMR1CS TMR1ON

T1CON

T1CKPS1

T1CKPS0

T1OSCEN

T1SYNC

TMR1CS TMR1ON

T1CON

T1CKPS1

Seleccin de la fuente de
clock

T1CKPS0

T1OSCEN

T1SYNC

TMR1CS TMR1ON

T1SYNC

TMR1
TMR1H

TMR1L
TMR1ON

RC0

Pre-scaler

RC1
Clock ext

Fosc/4
T1OSCEN

T1CKPS1:T1CKPS0

TMR1CS

T1SYNC

TMR1
TMR1H

TMR1L
TMR1ON

RC0

Pre-scaler

RC1
Clock ext

Fosc/4
T1OSCEN

T1CKPS1:T1CKPS0

TMR1CS

T1CKPS1

T1CKPS0

T1OSEN

T1SYNC

TMR1CS

TMR1ON

T1SYNC

TMR1
TMR1H

TMR1L
TMR1ON

RC0

Pre-scaler

RC1
Clock ext

Fosc/4
T1OSCEN

T1CKPS1:T1CKPS0

TMR1CS

T1CKPS1

T1CKPS0

T1OSEN

T1SYNC

TMR1CS

TMR1ON

T1SYNC

TMR1
TMR1H

TMR1L
TMR1ON

RC0

Pre-scaler

RC1
Clock ext

Fosc/4
T1OSCEN

T1CKPS1:T1CKPS0

TMR1CS

T1CKPS1

T1CKPS0

T1OSEN

T1SYNC

TMR1CS

TMR1ON

T1SYNC

TMR1
TMR1H

TMR1L
TMR1ON

RC0

Pre-scaler

RC1
Clock ext

Fosc/4
T1OSCEN

T1CKPS1:T1CKPS0

TMR1CS

T1CKPS1

T1CKPS0

T1OSEN

TMR1ON

TMR1
TMR1H

TMR1L
TMR1ON

RC0

Pre-scaler

RC1
Clock ext

Fosc/4
T1OSCEN

T1CKPS1:T1CKPS0

T1CKPS1

T1CKPS0

T1OSEN

TMR1ON

TMR1
TMR1H

TMR1L
TMR1ON

RC0

Pre-scaler

RC1
Clock ext

Fosc/4
T1OSCEN

T1CKPS1:T1CKPS0

T1CKPS1

T1CKPS0

T1OSEN

TMR1ON

TMR1
TMR1H

TMR1L
TMR1ON

RC0

Pre-scaler

RC1
Clock ext

Fosc/4
T1OSCEN

T1CKPS1:T1CKPS0

T1CKPS1

T1CKPS0

T1OSEN

TMR1ON

TMR1
TMR1H

TMR1L
TMR1ON

RC0

1:1

RC1
Clock ext

Fosc/4
T1OSCEN

0 0

T1OSEN

TMR1ON

TMR1
TMR1H

TMR1L
TMR1ON

RC0

1:1

RC1
Clock ext

Fosc/4
T1OSCEN

0 0

T1OSEN

TMR1ON

TMR1
TMR1H

TMR1L
TMR1ON

RC0

1:1

RC1
Clock ext

Fosc/4
T1OSCEN

0 0

T1OSEN

TMR1
TMR1H

TMR1L
1

RC0

1:1

RC1
Clock ext

Fosc/4
T1OSCEN

0 0

T1OSEN

TMR1
TMR1H

TMR1L
1

RC0

1:1

RC1
Clock ext

Fosc/4
T1OSCEN

0 0

TMR1
TMR1H

TMR1L
1

RC0

1:1

RC1
Clock ext

Fosc/4
T1OSCEN

0 0

TMR1
TMR1H

TMR1L
1

RC0

1:1

RC1
Clock ext

Fosc/4
T1OSCEN

0 0

TMR1
TMR1H

TMR1L
1

0x0000
RC0

1:1

RC1
Clock ext

Fosc/4
T1OSCEN

0 0

TMR1
TMR1H

TMR1L
1

0x0001
RC0

1:1

RC1
Clock ext

Fosc/4
T1OSCEN

0 0

TMR1
TMR1H

TMR1L
1

0xFFFD
RC0

1:1

RC1
Clock ext

Fosc/4
T1OSCEN

0 0

TMR1
TMR1H

TMR1L
1

0xFFFE
RC0

1:1

RC1
Clock ext

Fosc/4
T1OSCEN

0 0

TMR1
TMR1H

TMR1L
1

0xFFFF
RC0

1:1

RC1
Clock ext

Fosc/4
T1OSCEN

0 0

TMR1
TMR1H

TMR1L
1

0x0000
RC0

1:1

RC1
Clock ext

Fosc/4
T1OSCEN

0 0

TMR1IF=1

TMR1
TMR1H

TMR1L
1

0x0000
RC0

1:1

RC1
Clock ext

Fosc/4
T1OSCEN

0 0

También podría gustarte