Está en la página 1de 23

Conceptos bsicos de

Interrupciones y E/S
Atmel
Taller de Microcontroladores
ao 2012
Optativa de grado y
Curso de Posgrado

Interrupciones: conceptos bsicos


Mecanismo de control de flujo implementado en la mayora de los
microcontroladores para poder interactuar con el exterior.
Permite interactuar con eventos sucediendo asncronicamente a las
tareas realizadas por el micro.
Ejemplos: Un botn presionado por un usuario, Datos arribando por la
UART, muestreos del ADC, un timer, etc.
Programa

interrupcin

Inst 1
Inst 2
Inst 3
Inst 4
Inst 5

Inst n

Servicio de
Interrupcin
llamada

reto

rno

Inst 1
Inst 2

Inst n

Interrupciones: conceptos bsicos


Programa con soporte para interrupciones: estructura bsica
Ejemplo: Un programa manejado por interrupcin que haga nada y
se active externamente.
Pasos:
1. Seteo de las direcciones de salto en los vectores de interrupcin
2. Configuracin de las mscaras de interrupcin necesarias para
habilitar la interrupcin deseada
3. Configuracin del registro de control (MCUCR)
4. Habilitacin de interrupciones global (SREG)

NOTA: Definicin de nombres


Todos los registros en la arquitectura se mapean en memoria fsica:

banco de registros
puertos de entrada/salida
registros de control y estado
vectores de interrupcin

Por convencin se usan ciertos nombre predefinidos y aceptados


El mapeo de esos nombres a direcciones reales de memoria esta
en archivos de definicin (*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
=$2f
.equ TCCR1B
=$2e
.equ TCNT1H
=$2d
.equ TCNT1L
=$2c
.equ OCR1AH
=$2b
.equ OCR1AL
=$2a
.equ OCR1BH
=$29
.equ OCR1BL
=$28

;***** Bit Definitions


.equ INT1 =7
.equ INT0 =6
.equ
.equ
.equ
.equ
.equ

TOIE1 =7
OCIE1A
OCIE1B
TICIE =3
TOIE0 =1

.equ
.equ
.equ
.equ
.equ

TOV1 =7
OCF1A =6
OCF1B =5
ICF1 =3
TOV0 =1

.equ
.equ
.equ
.equ
.equ
.equ
.equ
.equ

SRE =7
SRW =6
SE
=5
SM
=4
ISC11 =3
ISC10 =2
ISC01 =1
ISC00 =0

=6
=5

.equ
.equ
.equ
.equ
.equ
.equ
.equ
.equ
.equ
.equ
.equ
.equ

PORTA =$1b
DDRA =$1a
PINA =$19
PORTB =$18
DDRB =$17
PINB =$16
PORTC =$15
DDRC =$14
PINC =$13
PORTD =$12
DDRD =$11
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 ejemploPaso 1
Seteo de las direcciones de salto en los vectores de interrupcin
La memoria de programa, desde la direccin $0000, contiene la tabla de
Vectores de interrupcin.
El programa real debe comenzar despus de esa tabla.
La tabla almacena vectores que contienen la direccin de las rutinas de
Interrupcin correspondientes.
Direccin

Vector

Comentario

$0000

Reset

Direccin de la rutina de
reset del procesador

$0001

INT0

Direccin de la rutina de
manejo de interrupcin
externa INT0

INT1

Direccin de la rutina de
manejo de interrupcin
externa INT0

$0002

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
Configuracin de las mscaras de interrupcin
necesarias para habilitar la interrupcin deseada
Para este paso es necesario configurar bits particulares del registro
GIMSK (General Interrupt MaSK register)

GIMSK
bit

INT1

INT0

Read/write

R/W

R/W

Valor inicial

Estos dos a 1

Paso 3
Configuracin del registro de control (MCUCR)
Para este paso es necesario configurar bits particulares del registro
MCUCR (General Control register)
NOTA: MCUCR es acrnimo de MCU Control Register

MCUCR
bit

Valor inicial

SRE

SRW

SE

SM

ISC11

ISC10

ISC01

ISC00

Se deben tocar estos cuatro

Configuracin de ISCxx
ISCx1

ISCx0

Descripcin
Nivel bajo en el pin INTx genera interrupcin
Reservado
Nivel de subida en el pin INTx genera interrupcin
Nivel de bajada en el pin INTx genera interrupcin

Si se desea que INT1 se active en flanco de subida


e INT0 en nivel bajo, los cuatro bits debern ser:

Paso 4
Habilitacin de interrupciones global (SREG)
Para este paso es necesario configurar bits particulares del registro
SREG (Status register)

SREG
bit

Valor inicial

I = 0 deshabilita TODAS las interrupciones


(la instruccin SEI hace lo mismo)

Se debe tocar este bit


I = 1 habilita las interrupciones

Funcionamiento del programa


Despus de la inicializacin vista el programa har lo siguiente:
1.
2.
3.
4.

Un evento externo genera una INT0 en el pin PD2


Se ejecuta la instruccin de salto en el vector INT0
Se ejecuta la rutina asociada al vector
En algn momento se ejecuta un RETI retornando
al programa principal

NOTAR QUE en los vectores de interrupcin


lo que hay son instrucciones de salto a
las direcciones de las rutinas
correspondientes

Programa .ASM de ejemplo


Hints importantes en un cdigo ASM:
Programando interrupciones de dispositivos
Un programa con 3 interrupciones:
La de reset (inicio del programa),
La interrupcin externa INT0, que muestra un mensage y
El servicio de recepcin de caracteres de la Usart (interrupcin interna)

.include "m8def.inc"
.def Temp1
.def Temp2
.def Temp3
.def item
.def nivel
.def char
.equ
.equ
.equ

=
=
=
=
=
=

r16
r17
r18
r19
r20
r21
CLOCK = 8000000
BAUD = 9600
UBRRVAL = CLOCK/(BAUD*16)-1

Definicin de smbolos

Parmetros de inicializacin
Del Usart

Programa .ASM de ejemplo


Hints importantes en un cdigo ASM:
Programando interrupciones de dispositivos
.org
0x0000
rjmp RESET
rjmp
INT0
rjmp
Idle
rjmp
Idle
rjmp
Idle
rjmp
Idle
rjmp
Idle
rjmp
Idle
rjmp
Idle
rjmp
Idle
rjmp
Idle
rjmp serialReceive
rjmp
Idle
rjmp
Idle
rjmp
Idle
rjmp
Idle
rjmp
Idle
rjmp
Idle
rjmp
Idle

Vector de la interrupcin de reset

Vector de la interrupcin externa INT0

Vector de la interrupcin de la Usart


por carcter recibido

Programa .ASM de ejemplo


Hints importantes en un cdigo ASM:
Programando interrupciones de dispositivos
serialReceive:
push
Temp1
in
Temp1, UDR
mov
char, Temp1
rcall
sendChar
pop
Temp1
reti
INT0:
ldi
ldi
rcall
ldi
rcall
rcall
reti
msgINT0:
.db

ZH,high(2*msgINT0)
ZL,low (2*msgINT0)
clearLcd
char,0x03
printAt
loadByte

INT0 activa",0

Servicio de interrupcin
De la Usart

Servicio de las dems


interrupciones

Programa .ASM de ejemplo


Hints importantes en un cdigo ASM:
Programando interrupciones de dispositivos
; Aqui Comienza a ejecutar el procesador
; -------------------------------------RESET:

; Inicializa el stack pointer


ldi
Temp1,
low(RAMEND)
out
SPL,
Temp1
ldi
Temp1,
high(RAMEND)
out
SPH,
Temp1

;Inicializa la Uart
ldi
Temp1,
out
UBRRL,
ldi
Temp1,
out
UBRRH,
; Formato: 8 Bit
ldi
Temp1,
out
UCSRC,
sbi
UCSRB,
sbi
UCSRB,

LOW(UBRRVAL)
Temp1
HIGH(UBRRVAL)
Temp1
1<<URSEL)|(3<<UCSZ0)
Temp1
RXCIE
RXEN

Comienzo de la interrupcin
de reset
Carga el SP con el fin de RAM

Inicializacin del dispositivo


Usart

Programa .ASM de ejemplo


Hints importantes en un cdigo ASM:
Programando interrupciones de dispositivos

;Inicializa PortD para irq int0


ldi
Temp1, 0x00
out
DDRD,
Temp1
ldi
Temp1, 0b00000010
out
MCUCR, Temp1
ldi
Temp1, 0b01000000
out
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 continuacin del banco de registros y antes de la memoria de uso
general
Tamao variable segn el modelo de microcontrolador dependiendo de
la cantidad y tipo de dispositivos internos que posea
Diseo 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

Flags y
pila

.equ
.equ
.equ

SREG
SPH
SPL

=$3f
=$3e
=$3d

63
62
61

; status register
; stack high
; stack low

INTs

.equ
.equ
.equ
.equ

GIMSK
GIFR
TIMSK
TIFR

=$3b
=$3a
=$39
=$38

59
58
57
56

; general interrupt mask


; general interrupt flag register
; timer/counter interrupt mask register
; timer/counter interrupt flag register

control

.equ

MCUCR

=$35

53

; MCU control register

Timer, comparador
y contador

Puertos E/S del ATmega8

.equ
.equ
.equ
.equ
.equ
.equ
.equ
.equ
.equ
.equ

TCCR0
TCNT0
TCCR1A
TCCR1B
TCNT1H
TCNT1L
OCR1AH
OCR1AL
OCR1BH
OCR1BL

=$33
=$32
=$2f
=$2e
=$2d
=$2c
=$2b
=$2a
=$29
=$28

51
50
47
46
45
44
43
42
41
40

; timer/counter0 control register


; timer/counter0
; timer/counter1 control register A
; timer/counter1 control register B
; timer/counter1 high
; timer/counter1 low
; output compare register 1 A high
; output compare register 1 A low
; output compare register 1 B high
; output compare register 1 B low

entrada

.equ
.equ

ICR1H
ICR1L

=$25
=$24

37
36

; input capture register 1 high


; input capture register 1 low

Watch
dog

.equ

WDTCR

=$21

33

; watch dog timer control

Puertos E/S del ATmega8


Puertos de E/S accesibles
por pines

.equ
Manejo .equ
eeprom .equ
.equ
.equ
.equ
.equ
.equ
.equ
.equ
.equ
.equ
.equ
.equ
.equ
.equ
.equ
SPI
.equ
.equ
.equ
USART .equ
.equ
.equ
Comp. .equ

EEARH
EEARL
EEDR
EECR
PORTA
DDRA
PINA
PORTB
DDRB
PINB
PORTC
DDRC
PINC
PORTD
DDRD
PIND
SPDR
SPSR
SPCR
UDR
USR
UCR
UBRR
ACSR

=$1f
=$1e
=$1d
=$1c
=$1b
=$1a
=$19
=$18
=$17
=$16
=$15
=$14
=$13
=$12
=$11
=$10
=$0f
=$0e
=$0d
=$0c
=$0b
=$0a
=$09
=$08

31
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
15
14
13
12
11
10
09
08

; eeprom address register high


; eeprom address register low
; eeprom data register
; eeprom control register
; puerto A
; data direction register A
; pin A
; puerto B
; data direction register B
; pin B
; puerto C
; data direction register C
; pin C
; puerto D
; data direction register D
; pin D
; SPI data register
; SPI status register
; SPI control register
; USART data register
; USART status register
; USART control register
; USART baud rate register
; analog comp control and status register

Pines de E/S
Accesibles va cuatro puertos de 8 bits (A, B, C, D)
Puertos configurables bit a bit como entrada, salida, pull-up o triestado
Tres registros por cada puerto:
PORT : valor de salida en modo escritura o habilitacin de pull-up
en modo lectura
PIN: valor de entrada en modo lectura
DDR: seleccin de entrada o salida para cada pin
1 salida
0 - entrada

Puerto de E/S genrico

También podría gustarte