Sie sind auf Seite 1von 9

UNIVERSIDAD PRIVADA DEL VALLE

FACULTAD DE INFORMATICA Y ELECTRONICA


INGENIERIA BIOMEDICA
CAMPUS TIQUIPAYA

Calificación

Laboratorio Nº 4

TEMPORIZADORES
MICROPROCESADORES I

Estudiante: Iván Anze Buhezo

Docente: Ing. Raúl Gómez

17 de Noviembre del 2017


TEMPORIZADORES

OBJETIVOS

 Programará los temporizadores del microcontrolador en ensamblador y en C.

 Generará eventos de tiempo utilizando los temporizadores.

MARCO TEORICO

En este caso se verá el uso del timer1 AVR como contador, temporizador y en modo
comparador, el uso del timer1 AVR en modo PWM se verá en otro apartado, en lo
que sigue se comentará para el caso del ATmega88 por lo que es muy importante
que se tenga a mano la hoja de datos del atmega88, para el caso de utilizar algún
otro microcontrolador AVR el procedimiento será muy similar a lo aquí comentado,
la programación se realizará con atmel studio.

El timer1 AVR es un temporizador contador de 16 bits, el registro donde se guardan


los valores del timer1 AVR es el registro temporizador contador representado
por TCNT1, cuando es utilizado como temporizador, sus valores aumentaran de uno
en uno entre 0 y 65535 con cada ciclo de reloj, por ejemplo si el oscilador con el
que está funcionando el microcontrolador AVR es de 1MHz, entonces el registro
TCNT1 aumentará una unidad en 1 us, si el registro TCNT1 se incrementa en 100
unidades habrán transcurrido 100us; cuando es utilizado como contador el
temporizador timer1 AVR ya no aumenta su valor de uno en uno en cada ciclo de
reloj, sino que lo hará mediante el flanco de subida o el flanco de bajada de alguna
señal que llegue a un pin especial del AVR conectado al timer1 AVR, este pin
es identificado como T1 que en el ATmega88 es el pin11 o PD5, esto puede variar
de acuerdo al microcontrolador avr utilizado, pero siempre se llamará T1.

MATERIALES Y EQUIPOS

 Fuente de poder
 Multímetro
 Caja de cables
 Breadboard
 ATMEGA 328P
 Capacitores 22 nF y 100 nF
 Cristal Oscilador 16 MHz
 Resistencia 330 ohm y 10 K
 Convertidor USB-serial
 Cable USB hembra

TECNICA O PROCEDIMIENTO

Parte 1

Realizar un temporizador de 1 hz y otro de 100 Hz

MEDICIÓN, CALCULOS Y GRAFICOS

Con 1 Hz

#include <avr/io.h>
#include <avr/interrupt.h> //LIBRERIA NECESARIA PARA TRABAJAR CON
INTERRRUPCIONES

volatile int contador;

ISR(TIMER0_OVF_vect) //RUTINA DE SERVICIO DE INTERUUPCION INT0


{
PORTC ^=(1<<PORTC4);//Complementado la señal de salida
TCNT0=177; //maxval=(256-1)-78=177 ->78 pulsos para desbordamiento
100Hz con 16MHz
}

ISR(TIMER1_OVF_vect) //RUTINA DE SERVICIO DE INTERUUPCION INT0


{
contador=contador+1;
PORTC=contador; //Desbordamiento detectado
TCNT1H=0x0ff;
TCNT1L=0x0ce; //maxval=(65536-1)-3=65532=0xfffc ->3 pulsos para
desbordamiento
}

int main(void)
{
int contador;
DDRC=0x0ff; //Puerto C todo salidas
DDRD=0b11011111; //Todo salidas excepto PD5/T1
PORTC=1;

TCCR0B |=(1<<CS00);
TCCR0B &=~(1<<CS01);
TCCR0B |=(1<<CS02); //configurando pre-escalador como contador de eventos
internos
//con pre-escalamiento igual a (CLKio/1024)

TIMSK0 |=(1<<TOIE0);//Halitando interrupciòn por desbordamiento en TIMER0

TCNT0=177; //maxval=(256-1)-78=177 ->78 pulsos para desbordamiento


100Hz con 16MHz

TCCR1B &=~(1<<CS10);
TCCR1B |=(1<<CS11);
TCCR1B |=(1<<CS12); //configurando pre-escalador por flanco de bajada en
T1/PD5

TCCR1A = 0b00000000; //COM1x1=0;COM1x0=0->OP NORMAL


//WGM11=0;WGM10=0
TCCR1B &=~(1<<WGM13);
TCCR1B &=~(1<<WGM12);//WGM13=0;WGM12=0-> MODO 0 (NORMAL)

TIMSK1 |=(1<<TOIE1);//Halitando interrupciòn por desbordamiento en TIMER1

TCNT1H=0x0ff;
TCNT1L=0x0fe; //maxval=(65536-4)=65532=0xfffc ->4 pulsos para
desbordamiento

sei(); //Habilito interrupciones globales

contador=0;
while(1)
{

}
}

Con 100 Hz

#include <avr/io.h>
#include <avr/interrupt.h> //LIBRERIA NECESARIA PARA TRABAJAR CON INTERRRUPCIONES

volatile int contador,a,b;

ISR(TIMER0_OVF_vect) //RUTINA DE SERVICIO DE INTERUUPCION INT0


{
b=1;
a=a+b;
PORTC ^=(1<<PORTC4);//Complementado la señal de salida
TCNT0=177; //maxval=(256-1)-78=177 ->78 pulsos para desbordamiento 100Hz
con 16MHz
b=a*b;
b=b*contador;
PORTB=b;
}

ISR(TIMER1_OVF_vect) //RUTINA DE SERVICIO DE INTERUUPCION INT0


{
contador=contador+1;
PORTC=contador; //Desbordamiento detectado
TCNT1H=0x0ff;
TCNT1L=0x09c; //maxval=(65536-1)-100=65532=0xff9c ->100 pulsos para
desbordamiento por 100Hz

int main(void)
{
int contador,a,b,c;
a=0;
b=1;
DDRC=0x0ff; //Puerto C todo salidas
DDRD=0b11011111; //Todo salidas excepto PD5/T1
PORTC=1;
DDRB=1;

TCCR0B |=(1<<CS00);
TCCR0B &=~(1<<CS01);
TCCR0B |=(1<<CS02); //configurando pre-escalador como contador de eventos internos
//con pre-escalamiento igual a (CLKio/1024)

TIMSK0 |=(1<<TOIE0);//Halitando interrupciòn por desbordamiento en TIMER0

TCNT0=177; //maxval=(256-1)-78=177 ->78 pulsos para desbordamiento 100Hz


con 16MHz

TCCR1B &=~(1<<CS10);
TCCR1B |=(1<<CS11);
TCCR1B |=(1<<CS12); //configurando pre-escalador por flanco de bajada en T1/PD5

TCCR1A = 0b00000000; //COM1x1=0;COM1x0=0->OP NORMAL


//WGM11=0;WGM10=0
TCCR1B &=~(1<<WGM13);
TCCR1B &=~(1<<WGM12);//WGM13=0;WGM12=0-> MODO 0 (NORMAL)

TIMSK1 |=(1<<TOIE1);//Halitando interrupciòn por desbordamiento en TIMER1

TCNT1H=0x0ff;
TCNT1L=0x09c; //maxval=(65536-4)=65532=0xfffc ->4 pulsos para desbordamiento

sei(); //Habilito interrupciones globales

contador=0;

while(1)
{

}
}

CUESTIONARIO
.
Explique la utilidad de los temporizadores.

Un temporizador básicamente es un registro de n-bits que se incrementa de manera


automática en cada ciclo de instrucción o cuando ocurre un evento externo.
Si la fuente de temporización es externa, se le conoce como contador de eventos.

El registro puede ser pre-cargado para iniciar su conteo a partir de un valor determinado.

Cuando ocurre un desbordamiento en el registro (una de transición de 1 a 0) se genera


alguna señalización.

Explique la generación de eventos temporizados.

Un registro puede ser cargado con un valor entre 0 y MAXVAL ( OCRn – Output Compare
Register ) y es comparado con el valor del Timer en cada ciclo de reloj, una coincidencia
produce un Evento El evento se indica con la bandera OCFn ( Output Compare Flag ).

Con el Temporizador 1es posible capturar eventos externos, un cambio en la terminal ICP
1 provocara que el timer sea leído y almacenado en el registro iCRn ( Input Capture
Register). Indicando el evento en la bandera ICFn ( Input Capture Flag), pueden ser útiles
para medir el ancho de pulsos externos.

CONCLUSIONES
 Los temporizadores son muy importantes, nos ayudan a capturar eventos externos
y son útiles para medir el ancho de pulsos.

BIBLIOGRAFIA

Manual de instrucciones, Arquitectura ATMEGA328P, Ing. Raúl Gómez, 2017


UNIVERSIDAD DEL VALLE
EXAMEN PREVIO

ESTUDIANTE: Ivan Anze B. CARRERA: IBI


ASIGNATURA: GRUPO:A DOCENTE: Ing. Gomez
LABORATORIO: GRUPO:A TEMA: PRACTICA Nº4
SEDE CENTRAL SUB SEDE:LPZ SUC
GESTIÓN: FECHA:
TDD

Con 1 Hz

#include <avr/io.h>
#include <avr/interrupt.h> //LIBRERIA NECESARIA PARA TRABAJAR CON
INTERRRUPCIONES

volatile int contador;

ISR(TIMER0_OVF_vect) //RUTINA DE SERVICIO DE INTERUUPCION INT0


{
PORTC ^=(1<<PORTC4);//Complementado la señal de salida
TCNT0=177; //maxval=(256-1)-78=177 ->78 pulsos para desbordamiento
100Hz con 16MHz
}

ISR(TIMER1_OVF_vect) //RUTINA DE SERVICIO DE INTERUUPCION INT0


{
contador=contador+1;
PORTC=contador; //Desbordamiento detectado
TCNT1H=0x0ff;
TCNT1L=0x0ce; //maxval=(65536-1)-3=65532=0xfffc ->3 pulsos para
desbordamiento
}

int main(void)
{
int contador;
DDRC=0x0ff; //Puerto C todo salidas
DDRD=0b11011111; //Todo salidas excepto PD5/T1
PORTC=1;

TCCR0B |=(1<<CS00);
TCCR0B &=~(1<<CS01);
TCCR0B |=(1<<CS02); //configurando pre-escalador como contador de eventos
internos
//con pre-escalamiento igual a (CLKio/1024)

TIMSK0 |=(1<<TOIE0);//Halitando interrupciòn por desbordamiento en TIMER0


TCNT0=177; //maxval=(256-1)-78=177 ->78 pulsos para desbordamiento
100Hz con 16MHz

TCCR1B &=~(1<<CS10);
TCCR1B |=(1<<CS11);
TCCR1B |=(1<<CS12); //configurando pre-escalador por flanco de bajada en
T1/PD5

TCCR1A = 0b00000000; //COM1x1=0;COM1x0=0->OP NORMAL


//WGM11=0;WGM10=0
TCCR1B &=~(1<<WGM13);
TCCR1B &=~(1<<WGM12);//WGM13=0;WGM12=0-> MODO 0 (NORMAL)

TIMSK1 |=(1<<TOIE1);//Halitando interrupciòn por desbordamiento en TIMER1

TCNT1H=0x0ff;
TCNT1L=0x0fe; //maxval=(65536-4)=65532=0xfffc ->4 pulsos para
desbordamiento

sei(); //Habilito interrupciones globales

contador=0;
while(1)
{

}
}

Con 100 Hz

#include <avr/io.h>
#include <avr/interrupt.h> //LIBRERIA NECESARIA PARA TRABAJAR CON INTERRRUPCIONES

volatile int contador,a,b;

ISR(TIMER0_OVF_vect) //RUTINA DE SERVICIO DE INTERUUPCION INT0


{
b=1;
a=a+b;
PORTC ^=(1<<PORTC4);//Complementado la señal de salida
TCNT0=177; //maxval=(256-1)-78=177 ->78 pulsos para desbordamiento 100Hz
con 16MHz
b=a*b;
b=b*contador;
PORTB=b;
}

ISR(TIMER1_OVF_vect) //RUTINA DE SERVICIO DE INTERUUPCION INT0


{
contador=contador+1;
PORTC=contador; //Desbordamiento detectado
TCNT1H=0x0ff;
TCNT1L=0x09c; //maxval=(65536-1)-100=65532=0xff9c ->100 pulsos para
desbordamiento por 100Hz
}

int main(void)
{
int contador,a,b,c;
a=0;
b=1;
DDRC=0x0ff; //Puerto C todo salidas
DDRD=0b11011111; //Todo salidas excepto PD5/T1
PORTC=1;
DDRB=1;

TCCR0B |=(1<<CS00);
TCCR0B &=~(1<<CS01);
TCCR0B |=(1<<CS02); //configurando pre-escalador como contador de eventos internos
//con pre-escalamiento igual a (CLKio/1024)

TIMSK0 |=(1<<TOIE0);//Halitando interrupciòn por desbordamiento en TIMER0

TCNT0=177; //maxval=(256-1)-78=177 ->78 pulsos para desbordamiento 100Hz


con 16MHz

TCCR1B &=~(1<<CS10);
TCCR1B |=(1<<CS11);
TCCR1B |=(1<<CS12); //configurando pre-escalador por flanco de bajada en T1/PD5

TCCR1A = 0b00000000; //COM1x1=0;COM1x0=0->OP NORMAL


//WGM11=0;WGM10=0
TCCR1B &=~(1<<WGM13);
TCCR1B &=~(1<<WGM12);//WGM13=0;WGM12=0-> MODO 0 (NORMAL)

TIMSK1 |=(1<<TOIE1);//Halitando interrupciòn por desbordamiento en TIMER1

TCNT1H=0x0ff;
TCNT1L=0x09c; //maxval=(65536-4)=65532=0xfffc ->4 pulsos para desbordamiento

sei(); //Habilito interrupciones globales

contador=0;

while(1)
{

}
}

Das könnte Ihnen auch gefallen