Sunteți pe pagina 1din 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 .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ .equ TOIE1 =7 OCIE1A OCIE1B TICIE =3 TOIE0 =1 TOV1 =7 OCF1A =6 OCF1B =5 ICF1 =3 TOV0 =1 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
$0000

Vector
Reset

Comentario
Direccin de la rutina de reset del procesador Direccin de la rutina de manejo de interrupcin externa INT0 Direccin de la rutina de manejo de interrupcin externa INT0 .

$0001 $0002

INT0

INT1

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
7 INT1 6 INT0 R/W 0 5 R 0 4 R 0 3 R 0 2 R 0 1 R 0 0 R 0

Read/write Valor inicial

R/W 0

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
7 SRE 6 SRW 0 5 SE 0 4 SM 0 3 ISC11 0 2 ISC10 0 1 ISC01 0 0 ISC00 0

Valor inicial

Se deben tocar estos cuatro

Configuracin de ISCxx
ISCx1 0 0 1 1 ISCx0 0 1 0 1 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
7 I 6 T 0 5 H 0 4 S 0 3 V 0 2 N 0 1 Z 0 0 C 0

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

Servicio de interrupcin De la Usart

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

Servicio de las dems interrupciones

INT0 activa",0

Programa .ASM de ejemplo


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

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

; 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

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

Puertos E/S del ATmega8


Flags y pila .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 MCUCR TCCR0 TCNT0 TCCR1A TCCR1B TCNT1H TCNT1L OCR1AH OCR1AL OCR1BH OCR1BL ICR1H ICR1L WDTCR =$3f =$3e =$3d =$3b =$3a =$39 =$38 =$35 =$33 =$32 =$2f =$2e =$2d =$2c =$2b =$2a =$29 =$28 =$25 =$24 =$21 63 62 61 59 58 57 56 53 51 50 47 46 45 44 43 42 41 40 37 36 33 ; status register ; stack high ; stack low ; general interrupt mask ; general interrupt flag register ; timer/counter interrupt mask register ; timer/counter interrupt flag register ; MCU control register ; 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 ; input capture register 1 high ; input capture register 1 low ; watch dog timer control INTs

control Timer, comparador y contador entrada Watch dog

Puertos E/S del ATmega8


.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 Puertos de E/S accesibles por pines 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

S-ar putea să vă placă și