Publicado el 2 de Agosto del 2017
1.172 visualizaciones desde el 2 de Agosto del 2017
211,5 KB
23 paginas
Creado hace 12a (03/10/2012)
Conceptos básicos de
Interrupciones y E/S
Atmel
Taller de Microcontroladores
año 2012
Optativa de grado y
Curso de Posgrado
Interrupciones: conceptos básicos
• Mecanismo de control de flujo implementado en la mayoría de los
microcontroladores para poder interactuar con el exterior.
• Permite interactuar con eventos sucediendo asíncronicamente a las
tareas realizadas por el micro.
• Ejemplos: Un botón presionado por un usuario, Datos arribando por la
UART, muestreos del ADC, un timer, etc.
interrupción
Programa
Inst 1
Inst 2
Inst 3
Inst 4
Inst 5
…
Inst n
Servicio de
Interrupción
Inst 1
Inst 2
…
Inst n
l l a m a d a
retorno
Interrupciones: conceptos básicos
Programa con soporte para interrupciones: estructura básica
Ejemplo: Un programa manejado por interrupción que haga “nada” y
se active externamente.
Pasos:
1. Seteo de las direcciones de salto en los vectores de interrupción
2. Configuración de las máscaras de interrupción necesarias para
habilitar la interrupción deseada
3. Configuración del registro de control (MCUCR)
4. Habilitación de interrupciones global (SREG)
NOTA: Definición de nombres
Todos los registros en la arquitectura se mapean en memoria física:
• banco de registros
• puertos de entrada/salida
• registros de control y estado
• vectores de interrupción…
• Por convención se usan ciertos nombre predefinidos y aceptados
• El mapeo de esos nombres a direcciones reales de memoria esta
en archivos de definición (*def.inc)
• Al incluir estos archivos se pueden utilizar en el programa todos los
nombres de puertos, los nombres de bits individuales, etc.
8515def.inc
;***** I/O Register Definitions
.equ SREG =$3f
.equ SPH
=$3e
.equ SPL
=$3d
.equ GIMSK =$3b
.equ GIFR =$3a
.equ TIMSK =$39
.equ TIFR =$38
.equ MCUCR =$35
.equ TCCR0 =$33
.equ TCNT0 =$32
.equ TCCR1A
.equ TCCR1B
.equ TCNT1H
.equ TCNT1L
.equ OCR1AH
.equ OCR1AL
.equ OCR1BH
.equ OCR1BL
=$2f
=$2e
=$2d
=$2c
=$2b
=$2a
=$29
=$28
;***** Bit Definitions
.equ INT1 =7
.equ INT0 =6
=6
=5
.equ TOIE1 =7
.equ OCIE1A
.equ OCIE1B
.equ TICIE =3
.equ TOIE0 =1
.equ TOV1 =7
.equ OCF1A =6
.equ OCF1B =5
.equ ICF1 =3
.equ TOV0 =1
=7
.equ SRE
=6
.equ SRW
=5
.equ SE
=4
.equ SM
.equ ISC11 =3
.equ ISC10 =2
.equ ISC01 =1
.equ ISC00 =0
.equ PORTA =$1b
.equ DDRA =$1a
.equ PINA =$19
.equ PORTB =$18
.equ DDRB =$17
.equ PINB =$16
.equ PORTC =$15
.equ DDRC =$14
.equ PINC =$13
.equ PORTD =$12
.equ DDRD =$11
.equ PIND =$10
8515def.inc
Vectores de interrupciones
.equ INT0addr=$001
.equ INT1addr=$002
.equ ICP1addr=$003
.equ OC1Aaddr=$004
.equ OC1Baddr=$005
.equ OVF1addr=$006
.equ OC0addr =$007
.equ OVF0addr=$008
.equ SPIaddr =$009
.equ URXCaddr=$00a
.equ UDREaddr=$00b
Address
.equ UTXCaddr=$00c
.equ ACIaddr =$00d
;External Interrupt0 Vector Address
;External Interrupt1 Vector Address
;Input Capture1 Interrupt Vector Address
;Output Compare1A Interrupt Vector Address
;Output Compare1B Interrupt Vector Address
;Overflow1 Interrupt Vector Address
;Output Compare0 Interrupt Vector Address
;Overflow0 Interrupt Vector Address
;SPI Interrupt Vector Address
;UART Receive Complete Interrupt Vector Address
;UART Data Register Empty Interrupt Vector
;UART Transmit Complete Interrupt Vector Address
;Analog Comparator Interrupt Vector Address
Volvamos al ejemplo…Paso 1
Seteo de las direcciones de salto en los vectores de interrupción
La memoria de programa, desde la dirección $0000, contiene la tabla de
Vectores de interrupción.
El programa real debe comenzar después de esa tabla.
La tabla almacena vectores que contienen la dirección de las rutinas de
Interrupción correspondientes.
Dirección
Vector
Comentario
$0000
$0001
$0002
….
Reset
INT0
INT1
….
Dirección de la rutina de
reset del procesador
Dirección de la rutina de
manejo de interrupción
externa INT0
Dirección de la rutina de
manejo de interrupción
externa INT0
….
La directiva .org
Directiva ampliamente usada en ensambladores para reservar y definir
Espacios de memoria
; Interrupt service vectors
; Handles reset and external interrupt vectors INT0 and INT1
.org $0000
rjmp Reset ; Reset vector (when the MCU is reset)
.org INT0addr
rjmp IntV0 ; INT0 vector (ext. interrupt from pin PD2)
.org INT1addr
rjmp IntV1 ; INT1 vector (ext. interrupt from pin PD3)
; - Rutina Reset vector
Reset:
ldi TEMP,low(RAMEND) ; Set initial stack ptr location at ramend
out SPL,TEMP
ldi TEMP, high(RAMEND)
out SPH, TEMP
...
...
Paso 2
Configuración de las máscaras de interrupción
necesarias para habilitar la interrupción deseada
Para este paso es necesario configurar bits particulares del registro
GIMSK (General Interrupt MaSK register)
GIMSK
bit
7
6
INT1
INT0
Read/write
R/W
R/W
Valor inicial
0
0
Estos dos a ‘1’
5
-
R
0
4
-
R
0
3
-
R
0
2
-
R
0
1
-
R
0
0
-
R
0
Paso 3
Configuración del registro de control (MCUCR)
Para este paso es necesario configurar bits particulares del registro
MCUCR (General Control register)
NOTA: MCUCR es acrónimo de MCU Control Register
MCUCR
bit
7
6
SRE
SRW
Valor inicial
0
0
5
SE
0
4
SM
0
3
2
1
0
ISC11
ISC10
ISC01
ISC00
0
0
0
0
Se deben tocar estos cuatro
Configuración de ISCxx
ISCx1
ISCx0
Descripción
0
0
1
1
0
1
0
1
Nivel bajo en el pin INTx genera interrupción
Reservado
Nivel de subida en el pin INTx genera interrupción
Nivel de bajada en el pin INTx genera interrupción
Si se desea que INT1 se active en flanco de subida
e INT0 en nivel bajo, los cuatro bits deberán ser:
1 0 0 0
Paso 4
Habilitación de interrupciones global (SREG)
Para este paso es necesario configurar bits particulares del registro
SREG (Status register)
SREG
bit
Valor inicial
7
I
0
6
T
0
5
H
0
4
S
0
3
V
0
2
N
0
1
Z
0
0
C
0
Se debe tocar este bit
I = 0 deshabilita TODAS las interrupciones
(la instrucción SEI hace lo mismo)
I = 1 habilita las interrupciones
Funcionamiento del programa
Después de la inicialización vista el programa hará lo siguiente:
1.
2.
3.
4.
Un evento externo genera una INT0 en el pin PD2
Se ejecuta la instrucción de salto en el vector INT0
Se ejecuta la rutina asociada al vector
En algún momento se ejecuta un RETI retornando
al programa principal
NOTAR QUE en los vectores de interrupción
lo que hay son instrucciones de salto a
las direcciones de las rutinas
correspondientes
Programa .ASM de ejemplo
Hints importantes en un código ASM:
• Programando interrupciones de dispositivos
Un programa con 3 interrupciones:
• La de reset (inicio del programa),
• La interrupción externa INT0, que muestra un mensage y
• El servicio de recepción de caracteres de la Usart (interrupción interna)
.include "m8def.inc"
.def Temp1 = r16
.def Temp2 = r17
.def Temp3 = r18
.def item = r19
.def nivel = r20
.def char = r21
.equ
.equ
.equ
CLOCK = 8000000
BAUD = 9600
UBRRVAL = CLOCK/(BAUD*16)-1
Definición de símbolos
Parámetros de inicialización
Del Usart
Programa .ASM de ejemplo
Hints importantes en un código ASM:
• Programando interrupciones de dispositivos
Vector de la interrupción de reset
Vector de la interrupción externa INT0
Vector de la interrupción de la Usart
por carácter recibido
0x0000
.org
rjmp RESET
INT0
rjmp
Idle
rjmp
Idle
rjmp
Idle
rjmp
Idle
rjmp
Idle
rjmp
Idle
rjmp
Idle
rjmp
Idle
rjmp
rjmp
Idle
rjmp serialReceive
Idle
rjmp
Idle
rjmp
rjmp
Idle
Idle
rjmp
Idle
rjmp
rjmp
Idle
Idle
rjmp
Programa .ASM de ejemplo
Hints importantes en un código ASM:
• Programando interrupciones de dispositivos
serialReceive:
push
in
mov
rcall
pop
reti
Temp1
Temp1, UDR
char, Temp1
sendChar
Temp1
INT0:
ldi
ldi
rcall
ldi
rcall
rcall
reti
ZH,high(2*msgINT0)
ZL,low (2*msgINT0)
clearLcd
char,0x03
printAt
loadByte
msgINT0:
.db
“INT0 activa",0
Servicio de interrupción
De la Usart
Servicio de las demás
interrupciones
Programa .ASM de ejemplo
Hints importantes en un código ASM:
• Programando interrupciones de dispositivos
; Aqui Comienza a ejecutar el procesador
; --------------------------------------
RESET:
Comienzo de la interrupción
de reset
; Inicializa el stack pointer
ldi
out
ldi
out
Temp1,
SPL,
Temp1,
SPH,
low(RAMEND)
Temp1
high(RAMEND)
Temp1
;Inicializa la Uart
Temp1, LOW(UBRRVAL)
UBRRL, Temp1
Temp1, HIGH(UBRRVAL)
UBRRH, Temp1
ldi
out
ldi
out
; Formato: 8 Bit
ldi
out
sbi
sbi
Temp1, 1<<URSEL)|(3<<UCSZ0)
UCSRC, Temp1
UCSRB, RXCIE
UCSRB, RXEN
Carga el SP con el fin de RAM
Inicialización del dispositivo
Usart
Programa .ASM de ejemplo
Hints importantes en un código ASM:
• Programando interrupciones de dispositivos
;Inicializa PortD para irq int0
ldi
out
ldi
out
ldi
out
Temp1
Temp1, 0x00
DDRD,
Temp1, 0b00000010
MCUCR, Temp1
Temp1, 0b01000000
GIMSK, Temp1
; Habilitar Interrupciones
sei
Bucle Principal
;**********************************
;
;**********************************
final:
rjmp final
Puerto D seteado como input
Int 0 se activa en flanco
Ascendente de clock
Activa INT0
Habilita todas las
interrupciones
Puesto que todo sucede
en las interrupciones
aca no se hace nada y
Solo se itera
Puertos de entrada/salida
Los puertos de entrada/salida se mapean en la zona de memoria
a continuación del banco de registros y antes de la memoria de uso
general
Tamaño variable según el modelo de microcontrolador dependiendo de
la cantidad y tipo de dispositivos internos que posea
Diseño ortogonal:
Registros de control y estado del MCU
Registros de flags del MCU
Puertos
Registros de manejo de interrupciones externas
Registros de manejo de dispositivos internos
Registros de acceso a los puertos externos
Puertos E/S del ATmega8
Flags y
pila
INTs
control
r
o
d
a
r
a
p
m
o
c
,
r
e
m
T
i
r
o
d
a
t
n
o
c
y
entrada
Watch
dog
.equ
.equ
.equ
.equ
.equ
.equ
.equ
.equ
.equ
.equ
.equ
.equ
.equ
.equ
.equ
.equ
.equ
.equ
.equ
.equ
.equ
SREG
SPH
SPL
GIMSK
GIFR
TIMSK
TIFR
=$3f
=$3e
=$3d
=$3b
=$3a
=$39
=$38
MCUCR =$35
TCCR0
=$33
TCNT0
=$32
TCCR1A =$2f
TCCR
Comentarios de: Conceptos básicos de Interrupciones y E/S Atmel (0)
No hay comentarios