You are on page 1of 12

LABORATORIO N°2

MANEJO DE LCD, INTERRUPCIONES Y


TECLADO MATRICIAL
 Implementar de manera práctica las soluciones
I. INTRODUCCIÓN
propuestas para resolver los ejercicios.
Los ejercicios propuestos en este informe consiste en  Conocer bien el datasheet del Atmega16,
realizar dos programas en Avr studio, donde el primero
trata de diseñar un control de acceso por teclado matricial pantalla LCD y teclado matricial para proceder
para un usuario que tiene guardado varios objetos en una con las conexiones de los dispositivos
caja fuerte, además debe de usarse una pantalla LCD que electrónicos con el micro controlador y poder
inicialmente muestra “AccesS” “by keyboard!”, la clave de efectuar las simulaciones.
la caja fuerte es solo de tres dígitos el cual cuando se
ingresa cada dígito se encienden 3 LEDs en forma  Implementar las dos configuraciones de
progresiva para indicar la cantidad de dígitos ingresados, pantalla LCD, la primera en modo de 4 bits y la
cuando la clave es correcta se muestra en la pantalla LCD el
segunda en modo de 8 bits.
mensaje “#Good password”, cuando la clave es errada o
incorrecta se muestra en la pantalla “Wrong password”  Conocer bien las configuraciones de pantalla
“inserted” y luego de dos segundos se regresa al mensaje
inicial. El segundo ejercicio es sobre realizar un sumador o LCD, teclado matricial e interrupciones.
restador de dos datos de un dígito. Los dos datos a operar
son ingresados desde el teclado matricial y en la pantalla
LCD se deben mostrar los operandos, el signo de la
operación, el signo igual y el resultado de la operación
realizada, además la operación se selecciona con un
pulsador.
III. MATERIALES Y PROCEDIMIENTO
Para solucionar las dos temáticas es necesario tener los
conocimientos claros sobre el manejo y configuración de Para llevar a cabo la solución de los ejercicios se
interrupciones, teclado matricial y pantalla LCD, ya que si realizó primero las simulaciones en Proteus, donde a
existe uno o más errores en el programa no se van a continuación se expone los diagramas esquemáticos.
obtener las soluciones deseadas. Se puede decir que lo
complejo del primer ejercicio es que la pantalla LCD debe
configurarse en modo de 4 bits, y en el segundo que por 1. Diagrama esquemático para el ejercicio del control
medio del pulsador (interrupción), cada que se presiona de la caja fuerte.
cambia la operación y muestra el resultado y si los datos
cambian, el resultado se actualiza solamente al presionar el
pulsador. Por ende a medida del desarrollo del informe se
darán a conocer las soluciones propuestas para el resultado
eficaz de cada una de las temáticas propuestas.

II. OBJETIVOS

 Aprender a desarrollar los programas con el


micro controlador Atmega16, utilizando sus
instrucciones.

 Resolver la solución de los dos ejercicios


planteados.

 Realizar la simulación del micro controlador


Atmega16 con el software de Proteus.
1. Programa para el ejercicio del control de la caja
fuerte.
Lista de materiales utilizados en el montaje:
.include "m16def.inc"
 1 micro controlador Atmega16 .device ATMEGA16
 1 pantalla LCD
 1 Teclado matricial .org $0000
 Resistencias de 220Ω call espera2ms
 3 Leds JMP inicio

inicio:
Se tomó el puerto C para el teclado matricial, para la
pantalla se utilizó los pines B4,B5,B6,B7 del puerto B ya LDI R16, HIGH(RAMEND)
que esta en modo de 4bits, para RS,RW,E se utilizó OUT SPH, R16
A0,A1,A2. Y para los leds se utilizo D0, D1,D2. LDI R16, LOW(RAMEND)
OUT SPL, R16
2. Diagrama esquemático para el ejercicio del
sumador o restador. //configuracion de puertos

LDI R16,$FF ; configuro como salidas el puerto A


OUT DDRA,R16
LDI R16,$FF; configuro como salidas el puerto B
OUT DDRB,R16
LDI R16,$0F ; configuro la parte alta como entradas
OUT DDRC,R16 ; y la parte baja como salidas del teclado
LDI R16,$FF ; configuro como salidas el puerto D
OUT DDRD,R16

//inicializacion

LDI R16,$00 ; inicio todos los puertos apagados


OUT PORTA,R16
LDI R16,$00
OUT PORTB,R16
LDI R16,$00
OUT PORTC,R16
LDI R16,$00
OUT PORTD,R16

Lista de materiales utilizados en el montaje: //Configuracion LCD a 4 bits


LDI R18, $20
 1 micro controlador Atmega16 OUT PORTB, R18 //configuro la lcd a 4 bits
 1 pantalla LCD CBI PORTA, 2
 1 Teclado matricial CBI PORTA, 1
 1 Pulsador SBI PORTA, 0
 Resistencias de 220 Ω
CALL espera2ms
Se tomó el puerto C para el teclado matricial, para la CBI PORTA, 2
pantalla se utilizó el puerto B, ya que esta en modo de
8bits, para RS,RW,E se utilizó A0,A1,A2. Y para el
pulsador D3. //confi. lcd
LDI R18, $28 ; a modo de 4 bits, 2 líneas, 5x7
CALL comando
IV. RESULTADOS LDI R18, $06 ;movimiento del cursor a la
derecha,
A continuación se encuentran los dos códigos que se CALL comando ;sin desplazamiento automático de la
realizaron para la solución de los dos problemas: pantalla
LDI R18, $0C ;pantalla encendida, cursor
invisible,
CALL comando ;cursor sin parpadeo.
barrido:
SBIC PINC,4
llegada:
LDI R18, $01 ;borro la lcd JMP presion
CALL comando INC R18
//leds apagados CALL espera2ms
LDI R16,$00 ;inicio leds apagados SBIC PINC,5
OUT PORTD,R16 JMP presion
LDI R21,$00 ;inicio el registro en 0 INC R18
// ubico cursor CALL espera2ms
LDI R18, $85;cursor linea1,posicion 3 SBIC PINC,6
CALL comando JMP presion
//Iniciar el puntero Z para "Acces" INC R18
LDI ZH, HIGH (m1<<1) CALL espera2ms
LDI ZL, LOW (m1<<1) SBIC PINC,7
//mostrar mensaje JMP presion
CALL mostrar CALL espera2ms
//ubicar cursor JMP quelinea
LDI R18, $C2 ;cursor linea2, posicion 2
CALL comando
//Iniciar el puntero Z "By Keyboard" presion:
LDI ZH, HIGH (m2<<1) CALL tecla
LDI ZL, LOW (m2<<1) SBI PORTB,3
//Poner el mensaje CALL espera1s
CALL mostrar CBI PORTB,3
JMP arranca
CLR R25 ;limpio el registro
CLR R26 ;limpio el registro quelinea:
CLR R27 ;limpio el registro CPI R19,$00
arranca: BREQ linea2
CLR R16 CPI R19,$01
CLR R18//tecla actual BREQ linea3
CLR R19//linea barrido CPI R19,$02
BREQ linea4
linea1: CPI R19,$03
LDI R16,$01 BREQ nopresion
OUT PORTC,R16
JMP barrido
tecla:
linea2: INC R21 ;incremento el registro
INC R19 CLR XH ;limpio el puntero alto
INC R18 CLR XL ;limpio puntero bajo
LDI R16,$02 ADD XL,R17 ;sumo R17 con puntero bajo
OUT PORTC,R16 LD R16,X
JMP barrido JMP verificar
RET
linea3:
INC R19 verificar:
INC R18 CPI R21,$01 ;comparo si R21 esta en 01
LDI R16,$04 BREQ led1 ; si es asi salta led1
OUT PORTC,R16 CPI R21,$02 ; comparo si R21 es 02
JMP barrido BREQ led2 ; si es asi salta led2
CPI R21,$03 ; comparo R21 esta en 03
linea4: BREQ led3 ; si es asi salta led3
INC R19
INC R18
LDI R16,$08 led1:
OUT PORTC,R16 LDI R16,$01 ; enciendo el primer led
JMP barrido OUT PORTD,R16
CPI R18,$05 ;comparo si la tecla presionada es 5 CALL comando ; Acces by keyboard
BREQ correcto1; si es asi salta correcto1 JMP llegada
RET

led2: clavecorrecta:
LDI R16,$03 ; enciendo el primer y segundo leds //borro lcd
OUT PORTD,R16 LDI R18,$01 ;borro lcd
CPI R18,$06 ; compara si la tecla presionada es 2 CALL comando
BREQ correcto2; si es asi salta correcto2 //ubico
RET LDI R18,$85; ubico cursor en linea1 posicion 4
CALL comando
led3: //Iniciar el puntero Z para "Wrong"
LDI R16,$07 ; enciendo primer segundo y tercer led
OUT PORTD,R16 LDI ZH, HIGH (m3<<1)
CPI R18,$02 ;comparo si la tecla presionada es 1 LDI ZL, LOW (m3<<1)
BREQ correcto3 ; si es correcta salta a correcto3 //mostrar mensaje
JMP claveincorrecta; sino es asi salta a claveincorrecta CALL mostrar
//ubico
nopresion: LDI R18,$C4 ;ubico cursor linea2 pocision 4
JMP arranca CALL comando
//Iniciar el puntero Z para "Password"
correcto1: LDI ZH, HIGH (m5<<1)
LDI R25,$01 ;cargo R25 $01 LDI ZL, LOW (m5<<1)
ret ; y retorno //mostrar mensaje
correcto2: CALL mostrar
INC R25 ;cargo R26 $01 CALL espera2s; muestro espero 2 segundos
ret ; y retorno LDI R18,$01 ; borro lcd y me devuelvo mensaje
correcto3: CALL comando ; Acces by keyboard
INC R25 ; cargo R27 $01 JMP llegada
JMP sies ; salto a la subrutina

sies: ciclo:
CPI R25, $03 JMP ciclo
BREQ clavecorrecta
JMP claveincorrecta ;salto a clavecorrecta mostrar:
LPM R18, Z+ ;carga he incrementa puntero
CPI R18, $00 ;compara si R18 es 0
claveincorrecta: BREQ fin ;si es asi salta a fin
//borro lcd CALL dato; sino llama a dato
LDI R18,$01 ;borro lcd JMP mostrar
CALL comando
//ubico
LDI R18,$85; ubico cursor en linea1 posicion 4 fin:RET
CALL comando
//Iniciar el puntero Z para "Wrong" dato:
SBI PORTA, 0 ; rs en 1
LDI ZH, HIGH (m4<<1) JMP enter
LDI ZL, LOW (m4<<1)
//mostrar mensaje comando:
CALL mostrar
//ubico CBI PORTA, 0 ;rs 0
LDI R18,$C4 ;ubico cursor linea2 pocision 4 JMP enter
CALL comando
//Iniciar el puntero Z para "Password" enter:
LDI ZH, HIGH (m5<<1) CBI PORTA, 1 ;rw en 0
LDI ZL, LOW (m5<<1) OUT PORTB, R18
//mostrar mensaje SBI PORTA, 2 ; enable en 1
CALL mostrar CALL espera2ms
CALL espera2s; muestro espero 2 segundos CBI PORTA, 2 ;enable en 0
LDI R18,$01 ; borro lcd y me devuelvo mensaje SWAP R18
OUT PORTB, R18 CALL dato
SBI PORTA, 2; enable en 1 LDI R21,$6C
CALL espera2ms CALL dato
CBI PORTA, 2 LDI R21,$00
RET CALL dato
LDI R21,$81
CALL dato
3. Programa para el ejercicio del sumador o restador. LDI R21,$42
CALL dato
.include "m16def.inc" LDI R21,$3C
CALL dato
.device ATMEGA16
LDI R21,$00
CALL dato
//caracter 2
.org $0000 LDI R21,$50
CALL espera2ms CALL comando
JMP inicio LDI R21,$00
CALL dato
.org $0004 LDI R21,$7C
JMP cambio CALL dato
LDI R21,$EE
.org $0200 CALL dato
m1: .DB $01,$02, 0 LDI R21,$FC
CALL dato
inicio: LDI R21,$F8
LDI R16, HIGH(RAMEND) CALL dato
OUT SPH, R16 LDI R21,$F8
LDI R16, LOW(RAMEND) CALL dato
OUT SPL, R16 LDI R21,$FE
CALL dato
//configuracion de puertos LDI R21,$7E
LDI R16, $80 CALL dato
OUT MCUCSR, R16 /*
LDI R16,$FF ; configuro como salidas el puerto A ;caracter 3
OUT DDRA,R16 LDI R21,$48
LDI R16,$FF; configuro como salidas el puerto B CALL comando
OUT DDRB,R16 LDI R21,$0E
LDI R16,$0F ; configuro la parte alta como entradas CALL dato
OUT DDRC,R16 ; y la parte baja como salidas del teclado LDI R21,$1F
LDI R16,$F7 ; configuro como salidas el puerto D CALL dato
OUT DDRD,R16 LDI R21,$15
CALL dato
//inicializacion LDI R21,$1F
CALL dato
LDI R16,$00 ; inicio todos los puertos apagados LDI R21,$1F
OUT PORTA,R16 CALL dato
LDI R16,$00 LDI R21,$1F
OUT PORTB,R16 CALL dato
LDI R16,$00 LDI R21,$15
OUT PORTC,R16 CALL dato
LDI R16,$00 LDI R21,$00
OUT PORTD,R16 CALL dato
//caracter 4
//escribo caracteres LDI R21,$50
;caracter 1 CALL comando
LDI R21,$48 LDI R21,$00
CALL comando CALL dato
LDI R21,$00 LDI R21,$00
CALL dato CALL dato
LDI R21,$6C LDI R21,$1B
CALL dato OUT PORTC,R16
LDI R21,$00 JMP barrido
CALL dato
LDI R21,$00 linea2:
CALL dato INC R19
LDI R21,$1F INC R18
CALL dato LDI R16,$02
LDI R21,$00 OUT PORTC,R16
CALL dato JMP barrido
LDI R21,$00
CALL dato linea3:
*/ INC R19
INC R18
//Configuracion LCD a 4 bits LDI R16,$04
LDI R21, $20 OUT PORTC,R16
OUT PORTB, R21 //configuro la lcd a 4 bits JMP barrido
SBI PORTA, 2
CALL espera2ms linea4:
CBI PORTA, 2 INC R19
INC R18
//confi. lcd LDI R16,$08
LDI R21, $28 ; a modo de 4 bits, 2 líneas, 5x7 OUT PORTC,R16
CALL comando JMP barrido
LDI R21, $06 ;movimiento del cursor a la
derecha, quelinea:
CALL comando ;sin desplazamiento automático de la CPI R19,$00
pantalla BREQ linea2
LDI R21, $0C ;pantalla encendida, cursor CPI R19,$01
invisible, BREQ linea3
CALL comando ;cursor sin parpadeo. CPI R19,$02
LDI R21, $01 BREQ linea4
CALL comando CPI R19,$03
BREQ nopresion
;Configurar la interrupcion externa INT1
LDI R16, $08 barrido:
OUT MCUCR, R16 ; 0000 SBIC PINC,4
1000 JMP presion
LDI R16, $80 INC R18
OUT GICR, R16 ; 1000 CALL espera2ms
0000 SBIC PINC,5
LDI R16, $00 JMP presion
OUT GIFR, R16 ; INC R18
Limpia las banderas CALL espera2ms
;NO OLVIDAR ACTIVAR LA INTERRUPCION SBIC PINC,6
GLOBAL JMP presion
SEI INC R18
CALL espera2ms
CLR R20 ;de que ya presiono SBIC PINC,7
CLR R23 JMP presion
CLR R26 CALL espera2ms
CLR R25 JMP quelinea
CLR R27
nopresion:
arranca: JMP arranca
CLR R16
CLR R18//tecla actual presion:
CLR R19//linea barrido INC R20
CPI R20, $01
linea1: BREQ presiono1
LDI R16,$01 CPI R20, $02
BREQ presiono2 seis:
JMP arranca LDI R21, '6'
CALL dato
presiono1: JMP suma
JMP presiono1a siete:
presiono2: LDI R21, '7'
JMP presiono2a CALL dato
JMP suma
presiono1a: ocho:
CALL centrar1 LDI R21, '8'
CPI R18, $00 CALL dato
BREQ uno JMP suma
CPI R18, $01 nueve:
BREQ cuatro LDI R21, $39
CPI R18, $02 CALL dato
BREQ siete JMP suma
CPI R18, $04 error:
BREQ dos CALL error1
CPI R18, $05 LDI R20, $00
BREQ cinco JMP arranca
CPI R18, $06
BREQ ocho presiono2a:
CPI R18, $07 CALL centrar2
BREQ cero CPI R18, $07
CPI R18, $08 BREQ cero
BREQ tres CPI R18, $00
CPI R18, $09 BREQ uno
BREQ seis CPI R18, $01
CPI R18, $0A BREQ cuatro
BREQ nueve CPI R18, $02
CPI R18, $03 BREQ siete
BREQ error CPI R18, $04
CPI R18, $0B BREQ dos
BRSH error CPI R18, $05
JMP presiono1 BREQ cinco
CPI R18, $06
cero: BREQ ocho
LDI R21, '0' CPI R18, $08
CALL dato BREQ tres
JMP suma CPI R18, $09
uno: BREQ seis
LDI R21, '1' CPI R18, $0A
CALL dato BREQ nueve
JMP suma CPI R18, $03
dos: BREQ error
LDI R21, '2' CPI R18, $0B
CALL dato BRSH error
JMP suma JMP presiono1
tres:
LDI R21, '3'
CALL dato error1:
JMP suma CALL centrar1
cuatro: LDI R21, 'I'
LDI R21, '4' CALL dato
CALL dato LDI R21, 'N'
JMP suma CALL dato
cinco: LDI R21, 'C'
LDI R21, '5' CALL dato
CALL dato LDI R21, 'O'
JMP suma CALL dato
LDI R21, 'R' JMP arranca
CALL dato
LDI R21, 'R' resultado:
CALL dato CALL caracter
LDI R21, 'E' MOV R25, R28
CALL dato CPI R27, $01
LDI R21, 'C' BREQ resta
CALL dato CPI R27, $02
LDI R21, 'T' BREQ sumardenuevo
CALL dato JMP resultado
LDI R21, 'O'
CALL dato resta: JMP restan
CALL espera1s
LDI R21, $01 sumardenuevo:
CALL comando CALL centrar3
RET LDI R21, '+'
CALL dato
centrar1: LDI R27, $00
LDI R21, $83 LDI R21, $8B
CALL comando CALL comando
RET LDI R21, ' '
centrar2: CALL dato
LDI R21, $87 LDI R21, ' '
CALL comando CALL dato
RET LDI R21, $8B
CALL comando
centrar3: ;mas ADD R25, R26
LDI R21, $85 CPI R25, $60
CALL comando BREQ cero1
RET CPI R25, $61
centrar4: ;igual BREQ uno1
LDI R21, $89 CPI R25, $62
CALL comando BREQ dos1
RET CPI R25, $63
centrar5: ;resultado BREQ tres1
LDI R21, $8B CPI R25, $64
CALL comando BREQ cuatro1
RET CPI R25, $65
BREQ cinco1
igual: CPI R25, $66
MOV R26, R23 BREQ seis1
CALL centrar4 CPI R25, $67
LDI R21, '=' BREQ siete1
CALL dato CPI R25, $68
CALL centrar5 BREQ ocho1
JMP sumar CPI R25, $69
BREQ nueve1
suma: CPI R25, $6A
CPI R20, $02 BRSH unob
BREQ igual
CPI R20, $03 sumar:
BREQ resultado INC R20
CPI R27, $01 ADD R25, R26
BREQ resultado CPI R25, $60
MOV R25, R23 BREQ cero1
MOV R28, R25 CPI R25, $61
CALL centrar3 BREQ uno1
LDI R21, '+' CPI R25, $62
CALL dato BREQ dos1
CALL espera1s CPI R25, $63
BREQ tres1 MOV R23, R21
CPI R25, $64 CBI PORTA, 1 ;rw en 0
BREQ cuatro1 OUT PORTB, R21
CPI R25, $65 SBI PORTA, 2 ; enable en 1
BREQ cinco1 CALL espera2ms
CPI R25, $66 CBI PORTA, 2 ;enable en 0
BREQ seis1 SWAP R21
CPI R25, $67 OUT PORTB, R21
BREQ siete1 SBI PORTA, 2; enable en 1
CPI R25, $68 CALL espera2ms
BREQ ocho1 CBI PORTA, 2
CPI R25, $69 RET
BREQ nueve1
CPI R25, $6A cambio: ;Interrupcion
BRSH unob INC R27
JMP sumar RETI

cero1: JMP cero restan: ;R28 ES PRIMER NUMERO R26 SEGUNDO


uno1: JMP uno NUMERO
dos1: JMP dos CALL centrar3
tres1: JMP tres LDI R21, '-'
cuatro1: JMP cuatro CALL dato
cinco1: JMP cinco CP R28, R26
seis1: JMP seis BRSH mayor
siete1: JMP siete JMP menor
ocho1: JMP ocho
nueve1: JMP nueve mayor:
unob: MOV R24, R28
LDI R21, '1' SUB R24, R26
CALL dato CALL centrar5
CPI R25, $6A LDI R21, ' '
BREQ cero1 CALL dato
CPI R25, $6B LDI R21, ' '
BREQ uno1 CALL dato
CPI R25, $6C CALL centrar5
BREQ dos1 CPI R24, $00
CPI R25, $6D BREQ cerob
BREQ tres1 CPI R24, $01
CPI R25, $6E BREQ unoc
BREQ cuatro1 CPI R24, $02
CPI R25, $6F BREQ dosb
BREQ cinco1 CPI R24, $03
CPI R25, $70 BREQ tresb
BREQ seis1 CPI R24, $04
CPI R25, $71 BREQ cuatrob
BREQ siete1 CPI R24, $05
CPI R25, $72 BREQ cincob
BREQ ocho1 CPI R24, $06
CPI R25, $72 BREQ seisb
BRNE ocho1 CPI R24, $07
BREQ sieteb
dato: CPI R24, $08
SBI PORTA, 0 ; rs en 1 BREQ ochob
JMP enter CPI R24, $09
BREQ nueveb
comando: JMP mayor
CBI PORTA, 0 ;rs 0
JMP enter
menor:
enter: MOV R24, R26
SUB R24, R28 PREGUNTAS
CALL centrar5
LDI R21, '-' A) Explique el significado de cada uno de los bits del
CALL dato registro de fuses del ATMEGA16.Qué significado tiene el
CPI R24, $00 conjunto de bits CKSEL? Cómo se configuran para un reloj
BREQ cerob interno de 4MHz? Indique cual es el bit de JTAG y qué
CPI R24, $01 relación tiene con los pines del puerto C?
BREQ unoc
CPI R24, $02 R// En el caso específico del ATmega16, existen dos bytes
BREQ dosb para los fusibles conocidos como el byte alto y byte bajo de
CPI R24, $03 los fusibles.
BREQ tresb
CPI R24, $04 Parte alta de los fusibles (Fuse High Byte)
BREQ cuatrob
CPI R24, $05 No.
Valor por
BREQ cincob Nombre de Descripción
defecto
CPI R24, $06 Bit
BREQ seisb OCDEN 7 Habilitación OCD 1 (OCD
CPI R24, $07 deshabilitado)
BREQ sieteb JTAGEN 6 Habilitación JTAG 0 (JTAG
CPI R24, $08 deshabilitado)
BREQ ochob SPIEN 5 Habilitación de 0 (prog. SPI
CPI R24, $09 programación serial habilitado)
BREQ nueveb SPI
JMP menor CKOPT 4 Opciones del 1
oscilador
cerob: JMP cero EESAVE 3 Los datos en la 1 (EEPROM
unoc: JMP uno memoria EEPROM no
dosb: JMP dos son preservado)
tresb: JMP tres preservados cuando
cuatrob: JMP cuatro se borra el chip
cincob: JMP cinco BOOTSZ1 2 Selección del tamaño 0
seisb: JMP seis del Bootloader
sieteb: JMP siete BOOTSZ0 1 Selección del tamaño 0
ochob: JMP ocho del Bootloader
nueveb: JMP nueve BOOTRST 0 Selección del vector 1
de reset
caracter:
LDI R21, $C8
CALL comando Parte baja de los fusibles (Fuse Low Byte)
//caracteres
No.
LDI ZH, HIGH (m1<<1) Valor por
Nombre de Descripción
LDI ZL, LOW (m1<<1) defecto
Bit
CALL mostrar
RET BODLEVEL 7 Nivel de 1
detección bajo
mostrar: voltaje alim.
LPM R21, Z+ ;carga he incrementa BODEN 6 Habilitación 1 (BOD
puntero detector bajo deshabilitado)
CPI R21, $00 voltaje alim.
BREQ fin ;si es asi salta a fin SUT1 5 Selección de 1
CALL dato; sino llama a dato tiempo de
JMP espera2ms arranque
JMP espera2ms SUT0 4 Selección de 0
JMP espera2ms tiempo de
JMP mostrar arranque
CKSEL3 3 Selección fuente 0
fin:RET de reloj
CKSEL2 2 Selección fuente 0
de reloj SBIS: Prueba el estado de las entradas y descarta la
CKSEL1 1 Selección fuente 0 siguiente instrucción si hay un uno en el bit del registro
de reloj
CKSEL0 0 Selección fuente 1 SBIC: Prueba el estado de las entradas y descarta la
de reloj siguiente instrucción si hay un cero en el bit del registro.

JTAGEN: Este fusible habilita o deshabilita la interfaz


JTAG que se encuentra en el Puerto C del ATmega16. Es RETI realiza un retorno desde una interrupción. La
importante que cuando no se vaya a usar esta interfaz se dirección de retorno es cargada desde la pila y el flag de
garantice que este deshabilitada para que haya un
interrupción global está a set. El registro de estado no se
funcionamiento normal del Puerto C.
guarda automáticamente al entrar en una rutina de
interrupción, y no se restaura al volver de una rutina de la
SPIEN: Este fusible habilita o deshabilita la programación interrupción. Debe ser manejado por el programa de la
serial SPI. Si se esta usando este modo de programación, no aplicación. El puntero de pila usa un esquema de pre-
es posible cambiar este bit. incremento durante el RETI.

CKOPT: Este fusible selecciona entre dos modos de RET realiza un retorno de subrutina. La dirección de
amplificador del oscilador. Cuando esta programado el reloj retorno es cargada de la pila. El Stack Pointer (puntero de
es mas inmune al ruido y se pueden manejar un rango pila) utiliza durante el RET un esquema de post-
amplio de frecuencias, aunque con un consumo mayor de decremento.
portencia.
La diferencia entre RET y RETI es leve, porque ambos
EESAVE: La habilitación de este fusible genera que los toman la dirección de retorno de la pila. Lo que es diferente
datos en la memoria EEPROM no sean borrados cuando se es que RETI ('RETurn from Interrupt') libera las
realice una operación de borrado del microcontrolador. interrupciones del mismo nivel de prioridad que la
interrupción que ha causado la derivación, y RET (RETurn)
BOOTSZ1:0: Estos fusibles establecen el tamaño del no lo hace.
Bootloader.
C) Explique las instrucciones LPM y LD en qué se parecen
BOOTRST: Cuando este fusible es programado, el y en qué se diferencian.
dispositivo salta a la dirección de reset asignada con los
fusibles BOOTSZ1:0. Si no es programado, iniciara en la LD carga indirecta con Post-Incremento o Pre-
posición cero. Decremento

Esta instrucción permite cargar un byte a un registro con


BODLEVEL: Este fusible es usado para seleccionar entre
los dos niveles de voltaje en el cual el microcontrolador se direccionamiento indirecto, con o sin desplazamiento, de la
reinicia cuando la alimentación esta por debajo del nivel memoria de datos a un registro.
seleccionado. Sino esta programado este fusible, el nivel de
El registro puntero X, Y o Z, con la operacion no cambia o
voltaje es de 2.7V y si esta programado el nivel de voltaje
puede ser post-incrementado o pre-decrementado. Esta
es de 4.0V.
característica es especialmente aplicada para accesos a
BODEN: Este fusible habilita la protección por bajo arreglos, tablas y puntero del stack.
voltaje. Si este fusible es programado, el microcontrolador
LPM carga de memoria de programa
se reiniciará de acuerdo al nivel seleccionado con el fusible
BODLEVEL. Esta instrucción carga un byte apuntado por el registro Z en
el registro de destino Rd. La memoria de programa esta
SUT1:0: Estos fusibles seleccionan entre diferentes organizada como palabras de 16 bits mientras que el
retardos para el funcionamiento inicial del dispositivo. El
puntero Z apunta a la dirección de un byte. El bit menos
valor seleccionado depende del reloj seleccionado.
significativo (LSB) del puntero Z, selecciona o el byte bajo
CKSEL3:0: Estos fusibles permiten seleccionar entre o el alto de la dirección apuntada.
diferentes fuentes de reloj para el dispositivo. Esta instrucción puede direccionar los primeros 64K bytes
de la memoria de programa.

B) Explique para qué sirven las instrucciones SBIS, SBIC, V. CONCLUSIONES


RETI y RET. Explique la diferencia entre los dos últimos y
Fue significativo el aprendizaje de conocer otras
los dos primeros.
instrucciones AVR para la solución de los problemas
planteados a lo largo del informe, además nos permitió
fortalecer conocimientos vistos en clase porque nos ayuda
afianzar, analizar y realizar de manera más lógica la
solución a problemas similares.

Para la configuración de la pantalla LCD, teclado matricial


e interrupciones es exclusiva hacerla de manera correcta ya
que si no el programa no va a ejecutar como debe y no
hará las demás instrucciones programadas en el código.

Para la solución de ambos ejercicios fue relevante tener


claro cómo realizar las interrupciones ya que con estas se
ejecuta una subrutina en el programa principal, por ejemplo
en el segundo ejercicio q consiste en realizar la suma de dos
números se utiliza una interrupción externa la cual me
determina el signo de la operación. Además es importante
configurar las filas y las columnas del teclado matricial
junto con la rutina de determinar cuál tecla ha sido
presionada.

Se complementó de manera más profunda las instrucciones


AVR para la solución de ambos problemas planteados,
donde se logró con éxito el funcionamiento en la
simulación de Proteus, ya que al montar los esquemas con
sus respectivos códigos el resultado no fue el esperado, y
fue quizás por alguna mala conexión des esots dispositivos
en la protoboard.

VI. REFERENCIAS

 Datasheet del microcontrolador atmega16 e


instrucciones AVR.
 López, Lewin. Notas de Clase de Pantalla LCD.
Campus Virtual
 López, Lewin. Notas de Clase de interrupciones.
Campus Virtual
 López, Lewin. Notas de Clase de teclado matricial.
Campus Virtual
 http://www.atmel.com/images/Atmel-0856-AVR-
Instruction-Set-Manual.pdf

You might also like