




;Diseñar un circuito que permita contar la frecuencia de una señal digital utilizando los timer´s del uC Mega 16, el rango de frecuencias a ser contadas irá desde 1 Hz hasta 9999 Hz, valor que deberá ser mostrado en 4 displays de 7 segmentos.

.include "m16def.inc"

			.def binario=r20
			.def h=r21
			.def dig10=r18
			.def dig32=r17
			.def cont=r19
			.def tempo=r16
			.def t0high=r22

.org 0x0
			jmp inicio
.org 0x0c
			jmp int_comp1a ; se genera esta interrupción cada segundo
.org 0x12
			jmp int_ov0; se genera esta interrupcion cada vez que se desborde el counter0

inicio:

		    ldi tempo,0b00000000
		    out ddrb,tempo
			ldi tempo,0b01111111
			out ddrd,tempo
			ldi tempo,0b00001111
			out ddrc,tempo
			ldi tempo,high(ramend); se inicializa es stack
			out sph,tempo
			ldi tempo,low(ramend)
			out spl,tempo
			clr t0high
			ldi tempo,0b00000110
			out tccr0,tempo ; se configura para que el counter0 detecte flancos de bajada
			ldi tempo,high(15624); se carga este valor para que se genere una interrupción cada segundo
			out ocr1ah,tempo
			ldi tempo,low(15624); se carga este valor para que se genere una interrupción cada segundo
			out ocr1al,tempo
			ldi tempo,0b0000000
			out tccr1a,tempo
			ldi tempo,0b00001011
			out tccr1b,tempo
			ldi tempo,0b00010001
			out timsk,tempo
			sei

			ser tempo
			out portb,tempo
			clr tempo
			out sfior,tempo



; este es el lazo del programa principal, el barrido de displays
     
	 lazo1: 
			  mov tempo,dig10
			  andi tempo,0b00001111
			  rcall bcd_7seg
			  sbi portc,3
			  out portd,tempo
			  cbi portc,0
			  rcall retardo

			  mov tempo,dig10
			  swap tempo
			  andi tempo,0b00001111
			  rcall bcd_7seg
			  sbi portc,0
			  out portd,tempo
			  cbi portc,1
			  rcall retardo

			  mov tempo,dig32
			  andi tempo,0b00001111
			  rcall bcd_7seg
			  sbi portc,1
			  out portd,tempo
			  cbi portc,2
			  rcall retardo

			  mov tempo,dig32
			  swap tempo
			  andi tempo,0b00001111
			  rcall bcd_7seg
			  sbi portc,2
			  out portd,tempo
			  cbi portc,3
			  rcall retardo
 			  rjmp lazo1


;se llama a un retardo para la correcta visualización en los displays

retardo: 
 			 ldi tempo,100

lazo_ret:
			 dec tempo
			 brne lazo_ret
			 ret

; se incluye este programa para la decodificación de binario a 7segmentos

.include "bcd_7seg.asm"



; esta interrupcion lleva la cuenta de los ciclos ya que el counter se desborda

int_ov0: 
			push tempo
			in tempo,sreg
			push tempo
			inc t0high; se incrementa cada vez que el counter se desborda
			pop tempo
			out sreg,tempo
			pop tempo
			reti

;esta interrupcion se genera cada segundo

int_comp1a:
			push tempo
			in tempo,sreg
			push tempo
			in binario,tcnt0
			mov h,t0high
			ldi cont,16
			clr dig10
			clr dig32


; en este lazo se procede a la conversión de binario a bcd


lazo:
			  clc
			  rol binario
			  rol h
			  rol dig10
			  rol dig32
			  dec cont
			  breq fin
			  ldi tempo,0x03
			  add tempo,dig10
			  sbrc tempo,3
			  mov dig10,tempo
			  ldi tempo,0x30
			  add tempo,dig10
			  sbrc tempo,7
			  mov dig10,tempo
			  ldi tempo,0x03
			  add tempo,dig32
			  sbrc tempo,3
			  mov dig32,tempo
			  ldi tempo,0x30
			  add tempo,dig32
			  sbrc tempo,7
			  mov dig32,tempo
			  rjmp lazo
fin:
		   	clr tempo
			out tcnt0,tempo
			clr t0high ; se encera el contador
			out tcnt1h,tempo ; se encera el timer
			out tcnt1l,tempo ; se encera el timer
			pop tempo
			out sreg,tempo
			pop tempo
			reti





;SOFTWARE DEL PROGRAMA “bcd_7seg”


  .cseg
  bcd_7seg:
 
 .include "m16def.inc"
			 push zh
			 push zl
			 ldi zl,low(tabla_bcd_7seg*2)
			 ldi zh,high(tabla_bcd_7seg*2)
			 add zl,tempo
			 clr tempo
			 adc zh,tempo
			 lpm tempo,z
			 pop zl
			 pop zh
			 ret


tabla_bcd_7seg:


				.db 0b01000000,0b01111001
				.db 0b00100100,0b00110000
				.db 0b00011001,0b00010010
				.db 0b00000010,0b01111000
				.db 0b00000000,0b00010000
