PDF de programación - Conceptos básicos de Interrupciones y E/S Atmel

Imágen de pdf Conceptos básicos de Interrupciones y E/S Atmel

Conceptos básicos de Interrupciones y E/S Atmelgráfica de visualizaciones

Publicado el 2 de Agosto del 2017
1.081 visualizaciones desde el 2 de Agosto del 2017
211,5 KB
23 paginas
Creado hace 11a (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
  • Links de descarga
http://lwp-l.com/pdf6013

Comentarios de: Conceptos básicos de Interrupciones y E/S Atmel (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad