Post on 16-Apr-2015
description
UNIVERSIDAD NACIONAL DEL CALLAO
FACULTAD DE INGENIERIA ELECTRICA Y ELECTRONICA ESCUELA PROFESIONAL DE INGENIERIA ELECTRONICA
SOLUCIONARIO DEL EXAMEN FINAL DE MICROCONTROLADORES
PROFESOR:
Ing. Zenón Cucho Mendoza
ALUMNO: VICENTE LEIVA, PERCY DAVID 090619F
2012-B
SOLUCIONARIO
EXAMEN FINAL DE MICROCONTROLADORES
PREGUNTA1:
a. Complete el siguiente programa para hacer parpadear el diodo led, en el puerto PB4.
Complete el programa principal.
b. Halle el periodo de la onda de salida (en ms) por el puerto PB4. Considere la
Fclk=1MHz
; ******************************************************
; COMPLETE EL SIGUIENTE PROGRAMA PARA PARPADEAR UN LED
; ******************************************************
.include "C:\Users\PERCY\Desktop\VMLAB\include\m8def.inc"
RJMP INICIO
INICIO:
LDI R16, HIGH(RAMEND);iniciamos la PILA
OUT SPH, R16
LDI R16, LOW(RAMEND)
OUT SPL, R16
LDI R16, $10 ;puerto PB4 como salida
OUT DDRB, R16
; PROGRAMA PRINCIPAL
BUCLE:
LDI R16, $10
OUT PORTB, R16
RCALL RETARDO
CLR R16
OUT PORTB, R16
RCALL RETARDO
RJMP BUCLE
; Subrutina RETARDO
RETARDO:
LDI R17, 800 ;1 ciclo
LAZO:
DEC R17 ;1 ciclo
CPI R17, $00 ;1 ciclo
BRNE LAZO ;2 ciclos
RET ;5 ciclos
c. Si se desea hacer parpadear el led con un periodo de 1ms. Modifique la subrutina de
RETARDO.
Lo que hacemos es cambiar esta instrucción de nuestra subrutina RETARDO:
PREGUNTA2:
Desarrolla un programa para el microcontrolador que permita leer un número de 2 bits y
otro de 3 bits, empleando interruptores para cada bit. Luego, con un pulsador (al
presionarlo y soltarlo) permita ver la suma en un visualizador de 7 segmentos. La suma se
observa en formato hexadecimal.
Se pide:
a. Completar el cronograma principal.
b. Completar la subrutina LECTURA_DE_NUMEROS.
;subrutina RETARDO
RETARDO:
LDI R17, 1147 ;1 ciclo
LAZO:
DEC R17 ;1 ciclo
CPI R17, $00 ;1 ciclo
BRNE LAZO ;2 ciclos
RET ;5 ciclos
Datos:
K0 PD0; es bit LBS
K1 PD1
Segundo número:
K2 PD2; es bit
K3 PD3
K4 PD4
El pulsador a PC5 y el display al puerto B:
Programa:
; ******************************************************
; Ingreso un numero de 2 bits y otro de 3 bits
; los cuales seran sumados al presionar y soltar
; un pulsador, y seran mostrados en un display
; en formato Hexadecimal.
; ******************************************************
.include "C:\Users\PERCY\Desktop\VMLAB\include\m8def.inc"
.CSEG
.ORG $00
RJMP INICIO
INICIO:
LDI R16, HIGH(RAMEND)
OUT SPH, R16
LDI R16, LOW(RAMEND)
OUT SPL, R16
RCALL CONFIG_PUERTOS
LAZO:
RCALL LECTURA_DE_NUMEROS
ADD R16, R18 ;suma los números
ESPERA_PULSO:
SBIS PINC, 5
RJMP ESPERA_PULSO
ESPERA_SOLTAR:
SBIC PINC, 5
RJMP ESPERA_SOLTAR
;código para mostrar el resultado
LDI ZL, LOW(TABLA1*2)
LDI ZH, HIGH(TABLA1*2)
CLR R17
ADD ZL, R16
ADC ZH, R17
LPM R19, Z
OUT PORTB, R19
RJMP LAZO
MOSTRANDO LA SUMA: 7+0=7
;*****************************************
;**********configuramos puertos***********
CONFIG_PUERTOS:
LDI R17, $FF
OUT DDRB, R17
OUT PORTD, R17
RET
;*****************************************
; subrutina que halla los numeros de 2 bits
; y de 3 bits en R16 y en R18 respectivamente
LECTURA_DE_NUMEROS:
IN R16, PIND
ANDI R16, $03 ;#1 EN PD1 Y PD0
IN R18, PIND
ANDI R18, $38 ;#2 EN PD5, PD4 Y PD3
LSR R18
LSR R18
LSR R18
RET
;*****************************************
; ahora ingresaremso los valores a la tabla
TABLA1:
.DB 0B00111111, 0B00000110 ;0,1
.DB 0B01011011, 0B01001111 ;2,3
.DB 0B01100110, 0B01101101 ;4,5
.DB 0B01111101, 0B00000111 ;6,7
.DB 0B01111111, 0B01101111 ;8,9
.DB 0B01110111, 0B01111100 ;A,B
MOSTRANDO LA SUMA: 7+3=10(A)
MOSTRANDO LA SUMA: 1+3=4
MOSTRANDO LA SUMA: 4+2=6
PREGUNTA3:
Se tiene 4 diodos leds, y un interruptor conectados al microcontrolador. Implemente un
programa para obtener un contador ascendente de números pares desde 2 hasta el 12 y
se repita, es decir cuando llega a 12, nuevamente comienza en 2. La función del
interruptores comenzar la cuenta cuando está cerrado, si está abierto la cuenta esta en
cero es decir los leds están apagados.
Cada valor debe mostrarse 600 ms después del anterior. Se configura el temporizador 1,
usando el preescalador igual a 64, en modo CTC, para la frecuencia de reloj igual a 1MHz.
El trabajo de la cuenta debe realizarse en la rutina de servicio de interrupción RSI, no en el
programa principal. El programa “no habrá nada”.
a. Diagrama de flujo del p.p.
b. Diagrama de flujo de la RSI.
c. Subrutina de la configuración del timer.
d. Subrutina de servicio de interrupción.
e. Programa principal.
SOLUCION:
Subrutina de TIMER1:
INICIO
Configura puertoB como
salida
Configura TiMER1
Pulsar y soltar
pulsador
Incremento de
contador <= 12
Muestro en puertoB
NO
NO
;******************************************************
;*********configuramos TIMER1,modo CTC******************
CONFIG_TIMER1:
;preescalamiento 1:64
;modo CTC
LDI R16,$00
OUT TCCR1A, R16
LDI R16, $0B
OUT TCCR1B, R16
;valor del registro OCR1A: 249E
LDI R20,$24
LDI R21,$9E
OUT OCR1AH, R20 ;(1us)x(64)x(OCR1A+1)=600ms
OUT OCR1AL, R21
RET
Programa principal:
; ******************************************************
; Contador par ascendente del 2 al 12, y que se repita
; Se inicia cuenta con pulsador, inicialmente apagados.
; tiempo entre valores debe ser de 600ms.
; configuraremos el TIMER1, con preescalador en 64, modo CTC
; ******************************************************
.include "C:\Users\PERCY\Desktop\VMLAB\include\m8def.inc"
.CSEG
.ORG $00
RJMP INICIO
INICIO:
LDI R16, $0F ;puertoB como salida PB3-PB0
OUT DDRB, R16
CLR R16
OUT PORTB, R16
RCALL CONFIG_TIMER1
PULSAR:
SBIS PINC,0
RJMP PULSAR
SOLTAR:
SBIC PINC,0
RJMP SOLTAR
CONTEO:
LDI R17, $00 ;registro que llevara el conteo
CLR R18
SONDEO:
;***son deamos el OCF1A (bit4 del TIFR)
IN R16, TIFR
ANDI R16, $10
CPI R16, $10
BRNE SONDEO
IN R16, TIFR
ORI R16, $10
OUT TIFR, R16
;****incrementamos la cuenta***
LDI ZL, LOW(DATOS*2)
LDI ZH, HIGH(DATOS*2)
ADD ZL, R17
ADC ZH, R18
LPM R19, Z
INC R17
CPI R17, 7
BREQ CONTEO
OUT PORTB, R19
RJMP SONDEO
DATOS:
.DB $02,$04,$06,$08,$0A,$0C
PREGUNTA4:
Escriba:
a. La instrucción que permite borrar todas las interrupciones en el CPU.
b. Que función cumple la instrucción RETI.
Retorna y habilita después de una interrupción.
c. La instrucción que permite tener un preescalamiento igual a 8, para el modo CTC del
timer1.
d. Las instrucciones que definen el vector de interrupción para el timer0 cuando ocurre
el desborde.
Verificamos el flag TOV0 del registro TIFR
REGUNTA5:
El siguiente circuito mide la variación de un divisor de voltaje, utilizando un potenciómetro
y determina si se encuentra establecido. Cuando el valor leído esta entre 1 voltio y menor
que 2.5 voltios se prende el diodo led D1, cuando el valor leído esta entre 2.5 y 4 voltios se
prende el led D2 y cuando supera el valor de 4 voltios se prende el diodo D3. Inicialmente
los diodos están apagados. Se pide escribir un programa que cumpla con los
requerimientos solicitados. El potenciómetro esta conectado al pin PC1 y los leds D1, D2 y
D3 a los pines PB0, PB1 y PB2 del microcontrolador. La resolución es de 8 bits.
Datos de la subrutina que configura el ADC
; canal seleccionado:1
; modo de conversión: única
; división del preescalador: 8
; ajuste del resultado: izquierdo
;voltaje de referencia AVCC
LDI R16, $0B
OUT TCCR1B, R16
SONDEO:
IN R16, TIFR
ANDI R16, $01
CPI R16, $01
BRNE SONDEO
; ******************************************************
; D1,D2,D3 ==> PB0,PB1,PB2
; ******************************************************
.include "C:\Users\PERCY\Desktop\VMLAB\include\m8def.inc"
.CSEG
.ORG $00
RJMP INICIO
INICIO:
LDI R16, HIGH(RAMEND)
OUT SPH, R16
LDI R16, LOW (RAMEND)
OUT SPL, R16
RCALL CONFIG_PUERTOS
RCALL CONFIG_ADC
CLR R16
OUT PORTB, R16 ;LEDS INICIALMENTE APAGADOS
;*********SE ACTIVA CONVERSION*****************
SBI ADCSR, ADEN
;*********SE INICIALIZA CONVERSION*************
INICIA_CONVERSION:
SBI ADCSR, ADSC
;*********ESPERA FIN CONVERSION****************
ESPERA_FIN_CONVERSION:
SBIS ADCSR, ADIF
RJMP ESPERA_FIN_CONVERSION
IN R16, ADCL
IN R16, ADCH
CPI R16, $80
BRLO ON_D1
RJMP ON_D2
RJMP INICIA_CONVERSION
IN R16, ADCL
IN R16, ADCH
CPI R16, $CD
BRLO ON_D2
RJMP ON_D3
ON_D1:
LDI R20, $01
OUT PORTB, R20
CBI ADCSR, ADIF
RJMP INICIA_CONVERSION
ON_D2:
LDI R20, $02
OUT PORTB, R20
CBI ADCSR, ADIF
RJMP INICIA_CONVERSION
ON_D3:
LDI R20, $04
OUT PORTB, R20
CBI ADCSR, ADIF
RJMP INICIA_CONVERSION
;**********************************************
; subrutina configurar puerto
;**********************************************
CONFIG_PUERTOS:
LDI R16, $00
OUT DDRC, R16
LDI R16, $07
OUT DDRB, R16
RET
;**********************************************
;*******SUBRUTINA CONFIGURAR ADC***************
; canal seleccionado: 1
; modo de conversion: unica
; factor de division del pre-escalador: 8
; ajuste del resultado: izquierdo
; voltaje de referencia: AVCC
;**********************************************
CONFIG_ADC:
LDI R16, $61 ;MUX3..MUX0=0000 :canal1
OUT ADMUX, R16 ;REFS1 REFS0=01:AVCC; ADLAR=1
; ajuste a la izquierda
LDI R16, $83 ;modo de conversion unica
OUT ADCSR, R16 ;ADPS2..ADPS0=011: pre-escalador 8
RET