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