13
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

micrococontroladores Atmega8

Embed Size (px)

DESCRIPTION

examen solucionado de microcontroladores astmega8

Citation preview

Page 1: micrococontroladores Atmega8

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

Page 2: micrococontroladores Atmega8

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

Page 3: micrococontroladores Atmega8

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

Page 4: micrococontroladores Atmega8

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

Page 5: micrococontroladores Atmega8

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

Page 6: micrococontroladores Atmega8

MOSTRANDO LA SUMA: 7+3=10(A)

MOSTRANDO LA SUMA: 1+3=4

Page 7: micrococontroladores Atmega8

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.

Page 8: micrococontroladores Atmega8

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

Page 9: micrococontroladores Atmega8

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

Page 10: micrococontroladores Atmega8
Page 11: micrococontroladores Atmega8

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

Page 12: micrococontroladores Atmega8

; ******************************************************

; 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

Page 13: micrococontroladores Atmega8

;**********************************************

;*******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