4 - Interrupt y IO ATMEL

Anuncio
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.
Programa
interrupción
Inst 1
Inst 2
Inst 3
Inst 4
Inst 5
…
Inst n
Servicio de
Interrupción
llamada
reto
rno
Inst 1
Inst 2
…
Inst n
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
=$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 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
Reset
Dirección de la rutina de
reset del procesador
$0001
INT0
Dirección de la rutina de
manejo de interrupción
externa INT0
INT1
Dirección de la rutina de
manejo de interrupción
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
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
5
4
3
2
1
0
INT1
INT0
-
-
-
-
-
-
Read/write
R/W
R/W
R
R
R
R
R
R
Valor inicial
0
0
0
0
0
0
0
0
Estos dos a ‘1’
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
Valor inicial
7
6
5
4
3
2
1
0
SRE
SRW
SE
SM
ISC11
ISC10
ISC01
ISC00
0
0
0
0
0
0
0
0
Se deben tocar estos cuatro
Configuración de ISCxx
ISCx1
ISCx0
0
0
0
1
1
0
1
1
Descripción
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
6
5
4
3
2
1
0
I
T
H
S
V
N
Z
C
0
0
0
0
0
0
0
0
I = 0 deshabilita TODAS las interrupciones
(la instrucción SEI hace lo mismo)
Se debe tocar este bit
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
.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
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
.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 interrupción de reset
Vector de la interrupción externa INT0
Vector de la interrupción de la Usart
por carácter recibido
Programa .ASM de ejemplo
Hints importantes en un código 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 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:
; 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 interrupción
de reset
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
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 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
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 vía 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 habilitación de pull-up
en modo lectura
• PIN: valor de entrada en modo lectura
• DDR: selección de entrada o salida para cada pin
• 1 – salida
• 0 - entrada
Puerto de E/S genérico
Descargar