conceptos básicos de interrupciones y e/s atmel · puertos de entrada/salida los puertos de...
TRANSCRIPT
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 losmicrocontroladores para poder interactuar con el exterior.
• Permite interactuar con eventos sucediendo asíncronicamente a lastareas realizadas por el micro.
• Ejemplos: Un botón presionado por un usuario, Datos arribando por la UART, muestreos del ADC, un timer, etc.
Inst 1Inst 2Inst 3Inst 4Inst 5…Inst n
interrupción Inst 1Inst 2…Inst n
Programa Servicio deInterrupción
llamada
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ón2. Configuración de las máscaras de interrupción necesarias para
habilitar la interrupción deseada3. Configuración del registro de control (MCUCR)4. Habilitación de interrupciones global (SREG)
NOTA: Definición de nombresTodos 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.
;***** 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 TOIE1 =7
.equ OCIE1A =6
.equ OCIE1B =5
.equ TICIE =3
.equ TOIE0 =1
.equ TOV1 =7
.equ OCF1A =6
.equ OCF1B =5
.equ ICF1 =3
.equ TOV0 =1
.equ SRE =7
.equ SRW =6
.equ SE =5
.equ SM =4
.equ ISC11 =3
.equ ISC10 =2
.equ ISC01 =1
.equ ISC00 =0
8515def.inc
.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
.equ INT0addr=$001 ;External Interrupt0 Vector Addres s
.equ INT1addr=$002 ;External Interrupt1 Vector Addres s
.equ ICP1addr=$003 ;Input Capture1 Interrupt Vector A ddress
.equ OC1Aaddr=$004 ;Output Compare1A Interrupt Vector Address
.equ OC1Baddr=$005 ;Output Compare1B Interrupt Vector Address
.equ OVF1addr=$006 ;Overflow1 Interrupt Vector Addres s
.equ OC0addr =$007 ;Output Compare0 Interrupt Vector Address
.equ OVF0addr=$008 ;Overflow0 Interrupt Vector Addres s
.equ SPIaddr =$009 ;SPI Interrupt Vector Address
.equ URXCaddr=$00a ;UART Receive Complete Interrupt V ector Address
.equ UDREaddr=$00b ;UART Data Register Empty Interrup t Vector Address.equ UTXCaddr=$00c ;UART Transmit Complete Interrupt Vector Address.equ ACIaddr =$00d ;Analog Comparator Interrupt Vecto r Address
Vectores de interrupciones
Volvamos al ejemplo…Paso 1Seteo de las direcciones de salto en los vectores de interrupción
La memoria de programa, desde la dirección $0000, contiene la tabla deVectores 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 deInterrupción correspondientes.
Dirección de la rutina de manejo de interrupción externa INT0
INT1$0002
….….….
Dirección de la rutina de manejo de interrupción externa INT0
INT0$0001
Dirección de la rutina de reset del procesadorReset$0000
ComentarioVectorDirección
La directiva .orgDirectiva ampliamente usada en ensambladores para reservar y definir Espacios de memoria
; Interrupt service vectors; Handles reset and external interrupt vectors INT0 and INT1
.org $0000rjmp Reset ; Reset vector (when the MCU is reset)
.org INT0addrrjmp IntV0 ; INT0 vector (ext. interrupt from pin PD2)
.org INT1addrrjmp IntV1 ; INT1 vector (ext. interrupt from pin PD3)
; - Rutina Reset vectorReset:
ldi TEMP,low(RAMEND) ; Set initial stack ptr location at ramendout SPL,TEMPldi TEMP, high(RAMEND)out SPH, TEMP......
Paso 2Configuración de las máscaras de interrupción
necesarias para habilitar la interrupción deseada
Para este paso es necesario configurar bits particulares del registroGIMSK (General Interrupt MaSK register)
00000000
RRRRRRR/WR/W
------INT0INT1
01234567bit
Read/write
Valor inicial
GIMSK
Estos dos a ‘1’
Paso 3Configuración del registro de control (MCUCR)
00000000
ISC00ISC01ISC10ISC11SMSESRWSRE
01234567bit
Valor inicial
MCUCR
Se deben tocar estos cuatro
Para este paso es necesario configurar bits particulares del registroMCUCR (General Control register) NOTA: MCUCR es acrónimo de MCU Control Register
Configuración de ISCxx
Nivel de bajada en el pin INTx genera interrupción11
Nivel de subida en el pin INTx genera interrupción01
Reservado10
Nivel bajo en el pin INTx genera interrupción00
DescripciónISCx0ISCx1
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 4Habilitación de interrupciones global (SREG)
Para este paso es necesario configurar bits particulares del registroSREG (Status register)
00000000
CZNVSHTI
01234567bit
Valor inicial
SREG
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 programaDespués de la inicialización vista el programa hará lo siguiente:
1. Un evento externo genera una INT0 en el pin PD22. Se ejecuta la instrucción de salto en el vector INT03. Se ejecuta la rutina asociada al vector4. En algún momento se ejecuta un RETI retornando
al programa principal
NOTAR QUE en los vectores de interrupciónlo que hay son instrucciones de salto alas direcciones de las rutinas correspondientes
Programa .ASM de ejemploHints importantes en un código ASM:
• Programando interrupciones de dispositivos
.include "m8def.inc"
.def Temp1 = r16
.def Temp2 = r17
.def Temp3 = r18
.def item = r19
.def nivel = r20
.def char = r21
.equ CLOCK = 8000000
.equ BAUD = 9600
.equ UBRRVAL = CLOCK/(BAUD*16)-1
Definición de símbolos
Parámetros de inicializaciónDel Usart
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)
Programa .ASM de ejemploHints importantes en un código ASM:
• Programando interrupciones de dispositivos
.org 0x0000rjmp RESETrjmp INT0 rjmp Idlerjmp Idlerjmp Idle rjmp Idle rjmp Idle rjmp Idle rjmp Idle rjmp Idle rjmp Idle rjmp serialReceiverjmp Idle rjmp Idle rjmp Idle rjmp Idle rjmp Idlerjmp Idle rjmp Idle
Vector de la interrupción de reset
Vector de la interrupción de la Usartpor carácter recibido
Vector de la interrupción externa INT0
Programa .ASM de ejemploHints importantes en un código ASM:
• Programando interrupciones de dispositivos
serialReceive:push Temp1in Temp1, UDRmov char, Temp1rcall sendCharpop Temp1reti
INT0:ldi ZH,high(2*msgINT0)ldi ZL,low (2*msgINT0)rcall clearLcdldi char,0x03rcall printAtrcall loadBytereti
msgINT0:.db “INT0 activa",0
Servicio de interrupciónDe la Usart
Servicio de las demás interrupciones
Programa .ASM de ejemploHints importantes en un código ASM:
• Programando interrupciones de dispositivos; Aqui Comienza a ejecutar el procesador; --------------------------------------RESET:
; Inicializa el stack pointerldi Temp1, low(RAMEND)out SPL, Temp1ldi Temp1, high(RAMEND)out SPH, Temp1
;Inicializa la Uartldi Temp1, LOW(UBRRVAL)out UBRRL, Temp1ldi Temp1, HIGH(UBRRVAL)out UBRRH, Temp1; Formato: 8 Bitldi Temp1, 1<<URSEL)|(3<<UCSZ0)out UCSRC, Temp1sbi UCSRB, RXCIEsbi UCSRB, RXEN
Comienzo de la interrupción de reset
Carga el SP con el fin de RAM
Inicialización del dispositivoUsart
Programa .ASM de ejemploHints importantes en un código ASM:
• Programando interrupciones de dispositivos
;Inicializa PortD para irq int0ldi Temp1, 0x00out DDRD, Temp1ldi Temp1, 0b00000010out MCUCR, Temp1ldi Temp1, 0b01000000out GIMSK, Temp1
; Habilitar Interrupcionessei
;**********************************; Bucle Principal;**********************************final:
rjmp final
Puerto D seteado como input
Int 0 se activa en flancoAscendente de clock
Activa INT0
Habilita todas las interrupciones
Puesto que todo sucedeen las interrupcionesaca no se hace nada ySolo se itera
Puertos de entrada/salida
Los puertos de entrada/salida se mapean en la zona de memoriaa continuación del banco de registros y antes de la memoria de usogeneral
Tamaño variable según el modelo de microcontrolador dependiendo dela cantidad y tipo de dispositivos internos que posea
Diseño ortogonal:
Puertos
Registros de control y estado del MCU
Registros de flags del MCU
Registros de manejo de interrupciones externas
Registros de manejo de dispositivos internos
Registros de acceso a los puertos externos
Puertos E/S del ATmega8.equ SREG =$3f 63 ; status register.equ SPH =$3e 62 ; stack high.equ SPL =$3d 61 ; stack low
.equ GIMSK =$3b 59 ; general interrupt mask
.equ GIFR =$3a 58 ; general interrupt flag register
.equ TIMSK =$39 57 ; timer/counter interrupt mask register
.equ TIFR =$38 56 ; timer/counter interrupt flag register
.equ MCUCR =$35 53 ; MCU control register
.equ TCCR0 =$33 51 ; timer/counter0 control register
.equ TCNT0 =$32 50 ; timer/counter0
.equ TCCR1A =$2f 47 ; timer/counter1 control register A
.equ TCCR1B =$2e 46 ; timer/counter1 control register B
.equ TCNT1H =$2d 45 ; timer/counter1 high
.equ TCNT1L =$2c 44 ; timer/counter1 low
.equ OCR1AH =$2b 43 ; output compare register 1 A high
.equ OCR1AL =$2a 42 ; output compare register 1 A low
.equ OCR1BH =$29 41 ; output compare register 1 B high
.equ OCR1BL =$28 40 ; output compare register 1 B low
.equ ICR1H =$25 37 ; input capture register 1 high
.equ ICR1L =$24 36 ; input capture register 1 low
.equ WDTCR =$21 33 ; watch dog timer control
Flags y pila
INTs
Tim
er,
com
para
dor
y c
onta
dor
control
entrada
Watchdog
Puertos E/S del ATmega8.equ EEARH =$1f 31 ; eeprom address register high.equ EEARL =$1e 30 ; eeprom address register low.equ EEDR =$1d 29 ; eeprom data register.equ EECR =$1c 28 ; eeprom control register.equ PORTA =$1b 27 ; puerto A.equ DDRA =$1a 26 ; data direction register A.equ PINA =$19 25 ; pin A.equ PORTB =$18 24 ; puerto B.equ DDRB =$17 23 ; data direction register B.equ PINB =$16 22 ; pin B.equ PORTC =$15 21 ; puerto C.equ DDRC =$14 20 ; data direction register C.equ PINC =$13 19 ; pin C.equ PORTD =$12 18 ; puerto D.equ DDRD =$11 17 ; data direction register D.equ PIND =$10 16 ; pin D.equ SPDR =$0f 15 ; SPI data register.equ SPSR =$0e 14 ; SPI status register.equ SPCR =$0d 13 ; SPI control register.equ UDR =$0c 12 ; USART data register.equ USR =$0b 11 ; USART status register.equ UCR =$0a 10 ; USART control register.equ UBRR =$09 09 ; USART baud rate register.equ ACSR =$08 08 ; analog comp control and status register
Manejoeeprom
Puert
os d
e E
/S a
ccesib
les
por
pin
es
SPI
USART
Comp.
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-upen 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