Informe 3
Informe 3
Informe 3
FACULTAD DE TECNOLOGIA
ELECTRONICA Y TELECOMUNICACIONES
SEMESTRE II/2020
INFORME LABORATORIO # 3
INTERRUPCIONES EXTERNAS EN EL MICROCONTROLADOR ATMEGA 32
La Paz - Bolivia
INFORME LABORATORIO # 3
INTERRUPCIONES EXTERNAS EN EL MICROCONTROLADOR ATMEGA 32
1.- Realizar un programa en lenguaje ensamblador para ATMEGA 32 que habilite las
interrupciones externas 0 y 1, para ejecutar las siguientes acciones:
Las interrupciones deben ser configuradas para que sean detectadas mediante
flanco de subida para INT 0 y flanco de bajada para INT 1. (Se recomienda
implementar un eliminador de rebotes ya sea por Hardware o por Software)
Cuando se detecte la interrupción externa 0 la “variable contador” debe
incrementarse y su conteo debe ser visto en un display de 7 segmentos conectado
al puerto B del microcontrolador.
Cuando se detecte la interrupción externa 1 la “variable contador” debe
decrementarse y su conteo debe ser visto en un display de 7 segmentos conectado
al puerto B del microcontrolador.
CODIGO:
.INCLUDE "M32DEF.INC"
.ORG $00
JMP PROGRAMA ; Interrupción Reset
.ORG $02
JMP INTER0 ; Interrupción 0
.ORG $0004
JMP INTER1 ; Interrupción 1
PROGRAMA:
LDI R16, HIGH(RAMEND) ;Coloco la Pila al final de la RAM
OUT SPH, R16
LDI R16, LOW(RAMEND)
OUT SPL, R16
BUCLE:
RJMP BUCLE
INTER0:
CALL RETARDO ; Llama a subrutina RETARDO para eliminar rebotes
;SBIS PIND, 2 ; Omite la siguiente instrucción si bit 2 puerto D esta en 1
INC R20
MOV R17,R20
;INC R16
;IN R17,PINA ;lee el dato del puerto A y lo almacena en el
registroR16
LDI R16,0x00 ;carga el numero 0 en el registro R16
CP R16,R17 ;compara (resta R16-R17)
BREQ Case_Cero ;salta a "case ", si el resultado de la resta es cero
LDI R16,0x01 ;carga el numero 1 en el registro R16
CP R16,R17 ;compara (resta R16-R17)
BREQ Case_Uno ;salta a "case ", si el resultado de la resta es cero
LDI R16,0x02 ;carga el numero 2 en el registro R16
CP R16,R17 ;compara (resta R16-R17)
BREQ Case_Dos ;salta a "case", si el resultado de la resta es cero
LDI R16,0x03 ;carga el numero 3 en el registro R16
CP R16,R17 ;compara (resta R16-R17)
BREQ Case_Tres ;salta a "case ", si el resultado de la resta es cero
LDI R16,0x04 ;carga el numero 4 en el registro R16
CP R16,R17 ;compara (resta R16-R17)
BREQ Case_Cuatro ;salta a "case ", si el resultado de la resta es cero
LDI R16,0x05 ;carga el numero 5 en el registro R16
CP R16,R17 ;compara (resta R16-R17)
BREQ Case_Cinco ;salta a "case", si el resultado de la resta es cero
LDI R16,0x06 ;carga el numero 6 en el registro R16
CP R16,R17 ;compara (resta R16-R17)
BREQ Case_Seis ;salta a "case ", si el resultado de la resta es cero
LDI R16,0x07 ;carga el numero 7 en el registro R16
CP R16,R17 ;compara (resta R16-R17)
BREQ Case_Siete ;salta a "case", si el resultado de la resta es cero
LDI R16,0x08 ;carga el numero 8 en el registro R16
CP R16,R17 ;compara (resta R16-R17)
BREQ Case_Ocho ;salta a "case", si el resultado de la resta es cero
LDI R16,0x09 ;carga el numero 9 en el registro R16
CP R16,R17 ;compara (resta R16-R17)
BREQ Case_Nueve ;salta a "case ", si el resultado de la resta es cero
RETI
RETARDO:
LDI R25, 31 ;Configurado para evitar Rebote
Bucle_Externo:
LDI R24, 255
Bucle_Interno:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DEC R24
BRNE Bucle_Interno
DEC R25
BRNE Bucle_Externo
RET
Case_Cero:
LDI R18,0x3F ;carga el equivalente a 0 para mostrarlo en el display
OUT PORTB,R18 ;muestra el 0 por el puerto D
RETI ;salta o retorna al programa principal "bucle"
Case_Uno:
LDI R18,0x06 ;carga el equivalente a 1 para mostrarlo en el display
OUT PORTB,R18 ;muestra el 1 por el puerto D
RETI ;salta o retorna al programa principal "bucle"
Case_Dos:
LDI R18,0x5B ;carga el equivalente a 2 para mostrarlo en el display
OUT PORTB,R18 ;muestra el 2 por el puerto D
RETI
Case_Tres:
LDI R18,0x4F ;carga el equivalente a 3 para mostrarlo en el display
OUT PORTB,R18 ;muestra el 3 por el puerto D
RETI ;salta o retorna al programa principal "bucle"
Case_Cuatro:
LDI R18,0x66 ;carga el equivalente a 4 para mostrarlo en el display
OUT PORTB,R18 ;muestra el 4 por el puerto D
RETI
Case_Cinco:
LDI R18,0x6D ;carga el equivalente a 5 para mostrarlo en el display
OUT PORTB,R18 ;muestra el 5 por el puerto D
RETI ;salta o retorna al programa principal "bucle"
Case_Seis:
LDI R18,0x7D ;carga el equivalente a 6 para mostrarlo en el display
OUT PORTB,R18 ;muestra el 6 por el puerto D
RETI ;salta o retorna al programa principal "bucle"
Case_Siete:
LDI R18,0x07 ;carga el equivalente a 7 para mostrarlo en el display
OUT PORTB,R18 ;muestra el 7 por el puerto D
RETI ;salta o retorna al programa principal "bucle"
Case_Ocho:
LDI R18,0x7F ;carga el equivalente a 8 para mostrarlo en el display
OUT PORTB,R18 ;muestra el 8 por el puerto D
RETI ;salta o retorna al programa principal "bucle"
Case_Nueve:
LDI R18,0x67 ;carga el equivalente a 9 para mostrarlo en el display
OUT PORTB,R18 ;muestra el 9 por el puerto D
RETI ;salta o retorna al programa principal "bucle"
INTER1:
CALL RETARDO ; Llama a subrutina RETARDO para eliminar rebotes
DEC R20
MOV R17,R20
LDI R16,0x00 ;carga el numero 0 en el registro R16
CP R16,R17 ;compara (resta R16-R17)
BREQ Case_Cero ;salta a "case ", si el resultado de la resta es cero
LDI R16,0x01 ;carga el numero 1 en el registro R16
CP R16,R17 ;compara (resta R16-R17)
BREQ Case_Uno ;salta a "case ", si el resultado de la resta es cero
LDI R16,0x02 ;carga el numero 2 en el registro R16
CP R16,R17 ;compara (resta R16-R17)
BREQ Case_Dos ;salta a "case", si el resultado de la resta es cero
LDI R16,0x03 ;carga el numero 3 en el registro R16
CP R16,R17 ;compara (resta R16-R17)
BREQ Case_Tres ;salta a "case ", si el resultado de la resta es cero
LDI R16,0x04 ;carga el numero 4 en el registro R16
CP R16,R17 ;compara (resta R16-R17)
BREQ Case_Cuatro ;salta a "case ", si el resultado de la resta es cero
LDI R16,0x05 ;carga el numero 5 en el registro R16
CP R16,R17 ;compara (resta R16-R17)
BREQ Case_Cinco ;salta a "case", si el resultado de la resta es cero
LDI R16,0x06 ;carga el numero 6 en el registro R16
CP R16,R17 ;compara (resta R16-R17)
BREQ Case_Seis ;salta a "case ", si el resultado de la resta es cero
LDI R16,0x07 ;carga el numero 7 en el registro R16
CP R16,R17 ;compara (resta R16-R17)
BREQ Case_Siete ;salta a "case", si el resultado de la resta es cero
LDI R16,0x08 ;carga el numero 8 en el registro R16
CP R16,R17 ;compara (resta R16-R17)
BREQ Case_Ocho ;salta a "case", si el resultado de la resta es cero
LDI R16,0x09 ;carga el numero 9 en el registro R16
CP R16,R17 ;compara (resta R16-R17)
BREQ Case_Nueve ;salta a "case ", si el resultado de la resta es cero
RETI
R1
10k
U1
9 22
RESET PC0/SCL
23
PC1/SDA
13 24
XTAL1 PC2/TCK
12 25
XTAL2 PC3/TMS
26
PC4/TDO
40 27
PA0/ADC0 PC5/TDI
39 28
PA1/ADC1 PC6/TOSC1
38 29
PA2/ADC2 PC7/TOSC2
37
PA3/ADC3
36 14
PA4/ADC4 PD0/RXD
35 15
PA5/ADC5 PD1/TXD
34 16 INTERRUPCION 0
PA6/ADC6 PD2/INT0
33 17
PA7/ADC7 PD3/INT1
18
PD4/OC1B
1 19 INCREMENTA EL CONTADOR CON FLNCO DE SUBIDA
2
PB0/T0/XCK PD5/OC1A
20 R2
PB1/T1 PD6/ICP1 10k
3 21
PB2/AIN0/INT2 PD7/OC2
4
PB3/AIN1/OC0
5
PB4/SS
6
PB5/MOSI
7 32
PB6/MISO AREF
8 30
PB7/SCK AVCC
ATMEGA32
INTERRUPCION 1
R3
10k
CODIGO:
.INCLUDE<m32def.inc>
.org $0000
JMP main
main:
LDI R16,$04
OUT SPH,R16
LDI R16,$5F
OUT SPL,R16
SER R16
OUT DDRB,R16
LDI R16,$03 ;o 7F
OUT DDRC,R16
LDI R16,0b10000000 ;interruciones globales activaadas
OUT SREG,R16
bucle:
;LECTURA DEL ADC
LDI R16,$40
OUT ADMUX,R16
LDI R16,$95 ;10010101=95
OUT ADCSRA,R16
CALL delay200u
RJMP loop
RJMP bucle
;==================
;funciones de lectura
loop:
SBI ADCSRA,ADSC
convertir:
SBI ADCSRA,ADSC
RJMP leer
RJMP convertir
leer:
IN R16,ADCL
OUT PORTB,R16
IN R16,ADCH
OUT PORTC,R16
CALL delay25m
RJMP bucle
;===================
;RETARDOS
delay25m:
LDI R17,$A5
WGLOOP0: LDI R18,$C9
WGLOOP1: DEC R18
BRNE WGLOOP1
DEC R17
BRNE WGLOOP0
LDI R17,$03
WGLOOP2: DEC R17
BRNE WGLOOP2
NOP
RET
delay200u:
LDI R17,$02
WGLOOP3: LDI R18,$84
WGLOOP4: DEC R18
BRNE WGLOOP4
DEC R17
BRNE WGLOOP3
NOP
NOP
RET
ESQUEMA DEL CIRCUITO:
R1
10k
U1
9 22
RESET PC0/SCL 256
23
RV1 13
PC1/SDA
24
512
XTAL1 PC2/TCK
12 25
XTAL2 PC3/TMS
26
PC4/TDO
40 27
54%
PA0/ADC0 PC5/TDI
39 28
PA1/ADC1 PC6/TOSC1
38 29
PA2/ADC2 PC7/TOSC2
+2.70 37
PA3/ADC3
10k Volts 36 14
PA4/ADC4 PD0/RXD
35 15
512
256
128
PA5/ADC5 PD1/TXD
64
32
16
34 16 8
1
PA6/ADC6 PD2/INT0
33 17
PA7/ADC7 PD3/INT1
18
PD4/OC1B
1 19
1 PB0/T0/XCK PD5/OC1A
2 20
2 PB1/T1 PD6/ICP1
3 21
4 PB2/AIN0/INT2 PD7/OC2
4
8 PB3/AIN1/OC0
5
16 PB4/SS
6
32 PB5/MOSI
7 32
64 PB6/MISO AREF
8 30
128 PB7/SCK AVCC
ATMEGA32