You are on page 1of 6

Escuela Politécnica Nacional.

Facultad de Ingeniería Eléctrica y Electrónica.


Departamento de Automatización y Control Industrial.
Laboratorio de Sistemas Microprocesados.

Nombre: Krissia Dalina Cabezas Rubio


Curso: GR13
PRÁCTICA N°12

TEMA:APLICACIONES DE CONTADORES Y TEMPORIZADORES USANDO LOS TIMERS


DEL MICROCONTROLADOR ATMEGA 164P

OBJETIVO:

Implementar un circuito que permita determinar la frecuencia de una señal


digital utilizando los timers del microcontrolador Atmega 164P.
TRABAJO PREPARATORIO.

Diseñar un circuito que permita determinar la frecuencia de una señal digital utilizando
los timers del uC ATmega 164p, el rango de frecuencias a ser medidas irá desde 1 Hz
hasta 9999 Hz en incrementos de 1Hz. El valor medido deberá ser mostrado en 4
displays de 7 segmentos y deberá tener un error máximo de + - 4 Hz respecto a la
frecuencia que muestra el generador de funciones. La lectura debe ser actualizada cada
segundo. Para la generación de la base de tiempo de 1 seg se utilizará uno de los timer
del AtMega164p en modo timer mientras que para contar el número de oscilaciones de
la señal en ese tiempo se deberá usar otro timer en modo counter. Cabe indicar que en
el laboratorio se ha estado utilizando el oscilador interno del microcontrolador, que no
es muy preciso, por lo que es posible que al realizar la medida, ésta difiera del valor que
indica el generador de funciones. Para obtener una lectura más precisa se deberá usar un
cristal externo, puede estar en el rango de 4 - 8 MHz.(En este caso, tomar en
consideración que el ciclo de máquina variará) Las conexiones para el cristal externo se
muestran a continuación. Cabe indicar que para trabajar con cristal externo hay que
cambiar la configuración de los fusibles. Una vez programados los fusibles, para poder
volver a reprogramar el micro en algunos de los programadores es necesario que esté
conectado el cristal . Hay algunos programadores que tienen una pata extra junto a
GND, que puede estar marcada como XTAL o algo similar, y en este caso no es
necesaria la presencia del cristal para reprogramarlo. Luego de concluida la práctica
puede reprogramar los fusibles al estado normal con el oscilador interno de 8MHz para
que pueda trabajar sin el cristal externo.

.include "m164pdef.inc"

.def tempo=r16

.dseg
.org 0x100
respuesta: .byte 2
digitos: .byte 4
segmentos: .byte 4

.cseg
.org 0x00
rjmp reset
.org 0x1A ;interrupcion por comparación a T1
rjmp mostrar_frecuencia
.org 0x20
rjmp contar_pulsos
reset:
;Puerto B y D como entrada
clr tempo
out ddrb,tempo
;out ddrd,tempo
ser tempo
out portb,tempo
;out portd,tempo
ldi tempo,0b00100000
out ddrd,tempo
com tempo
out portd,tempo
;Puerto A salida a siete segmentos
ldi tempo,0b01111111
out ddra,tempo
com tempo
out porta,tempo
;Puerto C LSB salida a transistores MSB como entrada
ldi tempo,0b00001111
out ddrc,tempo
ser tempo
out portc,tempo
;pull up
in tempo,mcucr
andi tempo,0b11101111
out mcucr,tempo
;stack point
ldi tempo,high(ramend)
out sph,tempo
ldi tempo,low(ramend)
out spl,tempo
;respuesta desde 0
clr tempo
sts respuesta,tempo
sts respuesta+1,tempo
;timer 0
clr tempo
out tcnt0,tempo
out ocr0a,tempo
ldi tempo,0b00000010
sts timsk0,tempo ;interrupcion por comparador A
ldi tempo,0b00000010 ;modo ctc
out tccr0a,tempo
ldi tempo,0b00000110 ;reloj externo en t0 flanco de bajada
out tccr0b,tempo
;timer 1:
;generar 1s (4000000 CM) preescalador=256, cargar 15624-1 en ocr1a, para osc=4MHz,
ldi r16,high(15624)
sts ocr1ah,r16
ldi r16,low(15624)
sts ocr1al,r16
ldi r16,0b01000000 ;desactivar pin oc1a, modo CTC (=OCR1A)
sts tccr1a,r16
ldi r16,0b00001100 ;modo CTC (=OCR1A), preescalador de 256
sts tccr1b,r16
ldi r16,0b00000010 ;interrupción por comparación con OCR1A
sts timsk1,r16
sei

lazo: call barrido


rjmp lazo

mostrar_frecuencia:
push r16
in r16,sreg
push r16

call bin_bcd
call bcd_segmentos
clr r16
sts respuesta,r16
sts respuesta+1,r16
out tcnt0,r16
out ocr0a,r16

pop r16
out sreg,r16
pop r16
reti

contar_pulsos:
push r16
in r16,sreg
push r16
push r17
push r18

ldi r18,1
lds r16,respuesta
lds r17,respuesta+1
add r16,r18
clr r18
adc r17,r18
sts respuesta,r16
sts respuesta+1,r17

pop r18
pop r17
pop r16
out sreg,r16
pop r16
reti

bin_bcd:
push r16
in r16,sreg
push r16
push r17
push r18
push r19
push r20
push r21
push xl
push xh
push yl
push yh
push zl
push zh

clr r20
ldi r21,3
ldi zl,low(valores<<1)
ldi zh,high(valores<<1)
ldi xl,low(respuesta)
ldi xh,high(respuesta)
ldi yl,low(digitos)
ldi yh,high(digitos)
ld r16,x+ ;valor LSB
ld r17,x ;valor MSB
siguiente: lpm r18,z+ ;constante LSB de tabla valores
lpm r19,z+ ;constante MSB de tabla valores
restar: sub r16,r18
sbc r17,r19
brcs restaurar
inc r20
rjmp restar
restaurar: add r16,r18
adc r17,r19
st y+,r20 ;guardar en digitos los BCD desde MSB a LSB
clr r20
dec r21
brne siguiente
st y,r16

pop zh
pop zl
pop yh
pop yl
pop xh
pop xl
pop r21
pop r20
pop r19
pop r18
pop r17
pop r16
out sreg,r16
pop r16
ret
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;$$$$$$$$$$$ Rutina BCD_7SEGMENTOS $$$$$$$$$$$$
bcd_segmentos:
push r16
in r16,sreg
push r16
push r17
push xl
push xh
push yl
push yh
push zl
push zh

ldi xl,low(digitos)
ldi xh,high(digitos)
ldi yl,low(segmentos)
ldi yh,high(segmentos)
ldi r17,4
pasar: ldi zl,low(tabla<<1)
ldi zh,high(tabla<<1)
ld r16,x+
add zl,r16
clr r16
adc zh,r16
lpm r16,z
st y+,r16
dec r17
brne pasar

pop zh
pop zl
pop yh
pop yl
pop xh
pop xl
pop r17
pop r16
out sreg,r16
pop r16
ret
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;$$$$$$$$$ Rutina BARRIDO de DISPLAYS $$$$$$$$$
barrido:
push r16
in r16,sreg
push r16
push r17
push r18
push r19
push r20
push xl
push xh

ldi r18,4
ldi xl,low(segmentos)
ldi xh,high(segmentos)
ldi r17,0b11110111
ser r16
out portc,r16
otrodig: ld r16,x+
out porta,r16
out portc,r17
call retardo
ldi r16,0b10000000
out porta,r16
ser r16
out portc,r16
sec
ror r17
dec r18
brne otrodig

pop xh
pop xl
pop r20
pop r19
pop r18
pop r17
pop r16
out sreg,r16
pop r16
ret
retardo:
ldi r20,0x10 ;0x43
retar0:
ldi r19,0xc6
retar1:
dec r19
brne retar1
dec r20
brne retar0
nop
ret
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

valores: .dw 1000, 100, 10

tabla: .db 0b10111111, 0b10000110 ; CÓDIGOS 0 y 1


.db 0b11011011, 0b11001111 ; CÓDIGOS 2 y 3
.db 0b11100110, 0b11101101 ; CÓDIGOS 4 y 5
.db 0b11111101, 0b10000111 ; CÓDIGOS 6 y 7
.db 0b11111111, 0b11101111 ; CÓDIGOS 8 y 9
SIMULACIÓN

BIBLIOGRAFIA:

AVR Instruction Set Manual, OTHER, [Online], Available: http://www.atmel.com/images/Atmel-0856-AVR-Instruction-


Set-Manual.pdf
https://vidaembebida.wordpress.com/2014/07/09/avr-programacion-en-c-04-puertos-de-entrada-y-salida/
http://bibdigital.epn.edu.ec/bitstream/15000/7138/1/CD-5329.pdf

You might also like