






Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Uma descrição detalhada das interrupções no microcontrolador mcs-51, incluindo seus tipos, prioridades e o controle delas. O texto aborda os registros dedicados às interrupções, a ativação e desativação de interrupções, e a seqüência de polling para determinar a ordem de atendimento. Além disso, são discutidos os flags de interrupção e a ativação de interrupções por nível ou por borda de descida.
Tipologia: Notas de estudo
1 / 10
Esta página não é visível na pré-visualização
Não perca as partes importantes!







O 8051 apresenta 5 tipos de interrupções:
Os registros dedicados às interrupções permitem um controle total sobre as mesmas. Cada interrupção pode ser habilitada ou desabilitada individualmente. Também é possível desabilitar todas as interrupções de uma só vez. O registro IE (Interrupt Enable) controla a habilitação das interrupções e é ilustrado na figura 7.1.
1 habilita 0 desabilita 7 6 5 4 3 2 1 0
Figura 7.1. Registro IE - habilitação de interrupções.
Cada interrupção pode ter dois níveis de prioridade: prioridade alta ou prioridade baixa. Uma interrupção de alta prioridade pode interromper uma de baixa prioridade mas não acontece o contrário. Uma interrupção não pode interromper uma outra de mesma prioridade. Se forem
recebidas interrupções de diferentes prioridades, a de alta prioridade é atendida primeiro. Se forem recebidas duas interrupções de igual prioridade, determina-se por uma seqüência interna de polling (consulta) qual será atendida primeiro. Assim, dentro de um mesmo nível de prioridade, existe uma seqüência de atendimento (a seqüência do polling). O conteúdo do registro IP define as prioridades e é ilustrado na figura 7.2.
1 prioridade alta 0 prioridade baixa 7 6 5 4 3 2 1 0
Figura 7.2. Registro IP - prioridade das interrupções.
As duas interrupções externas (INT0 e INT1) podem ser acionadas por nível ou por borda de descida (↓). Isto é definido através de dois bits do registro TCON. Este registro também tem outra finalidade pois cada interrupção indica sua ativação usando um bit do registro TCON.
Figura 7.3. Registro TCON - diversas funções para interrupções e timers.
TF1 → flag de transbordamento (overflow) do contador/temporizador 1. Ativado por hardware quando há transbordamento no contador do timer 1 (timer/counter 1). É apagado por hardware quando o processador é desviado para a rotina de atendimento da interrupção. TR1 → bit de partida/parada (run/stop) do contador/temporizador 1.
Todos os bits que geram interrupção podem ser ativados por software com os mesmos resultados como se tivessem sido ativados por hardware. Isto quer dizer que uma interrupção pode ser ativada por software e também que as interrupções pendentes podem ser canceladas. Cada interrupção é vetorizada em um endereço pré-definido: RESET 00H Externa 0 IE0 03H Timer 0 TF0 0BH Externa 1 IE1 13H Timer 1 TF1 1BH Serial RI+TI 23H (o + indica OU) No endereço de vetorização das interrupções há pouco espaço, o suficiente para colocar umas poucas instruções. Portanto é normal colocar nestes endereços um desvio (jump) para um outro local, onde está a rotina que atende à interrupção.
7.3. MANEJO DE INTERRUPÇÕES
Os flags das interrupções são amostrados na segunda fase do quinto estado (S5P2) de cada ciclo de máquina. As amostras são submetidas a polling (consulta) durante o próximo ciclo de máquina. A figura 7.5 ilustra a seqüência para atendimento de uma interrupção. Se um dos flags (de interrupção) está ativo durante S5P2, o próximo ciclo de polling vai detectar e identificar a interrupção a ser atendida e será gerada uma instrução LCALL sempre que não seja bloqueada por:
S5P2 S6P1 S6P
polling para decidir a interrup.
LCALL para o endereço da rotina de interrupção
início da rotina de interrupção coloca-se no latch as interrupções interrupção ativada no passado Figura 7.5. Seqüência para atendimento a uma interrupção.
Na figura 7.5 é ilustrada a resposta mais rápida a uma interrupção. Neste caso CM2 é o final de uma instrução e não é um RETI nem uma escrita em IP ou IE. Quando CM2 é uma instrução RETI ou uma escrita em IP ou IE, uma instrução a mais será executada antes que a interrupção seja vetorizada. A seqüência de polling se repete a cada ciclo de máquina e os valores processados são aqueles que estarão presentes no instante S5P2 do ciclo de máquina anterior. Deve-se observar que se um flag de interrupção foi ativado mas não pôde ser atendido (por uma das condições de bloqueio) e é apagado antes da condição de bloqueio ser removida, a interrupção não será atendida. Quer dizer, o fato de um flag de interrupção estar ativo e não ser atendido, não será gravado. O processador reconhece um pedido de interrupção através da execução de um LCALL gerado por hardware. Normalmente o flag que gerou o pedido é zerado por hardware, exceto para:
7.4. INTERRUPÇÕES EXTERNAS
As duas interrupções externas (0 e 1) podem ser programadas para funcionar por nível (ITX=0) ou por borda de descida (↓) (ITX=1). Os pinos das interrupções são amostrados em cada ciclo de máquina (1 ciclo de máquina=12 períodos de clock); assim, uma interrupção externa deve permanecer constante por pelo menos 12 períodos de clock, caso contrário ela pode ser ignorada. Quando a interrupção opera por borda de descida (↓), o pino deve permanecer em alto por pelo menos 12 períodos de clock e depois em baixo por pelo menos 12 períodos de clock; isto garante a ativação do flag de interrupção. Os flags de interrupções externas (IEX0 ou IEX1) serão automaticamente zerados pela CPU quando uma rotina de serviço é chamada. Quando a interrupção opera por nível, o pino deve permanecer ativado (em baixo) até que a interrupção seja atendida; depois disso, o pedido deve ser removido antes que a rotina de serviço de interrupção termine caso contrário uma nova interrupção será gerada. O tempo de latência de uma interrupção depende, entre outras coisas, das condições de bloqueio já vistas. No caso destas condições de bloqueio existirem, leva-se entre 5 a 9 ciclos de máquina.
Uma interrupção não será re-atendida antes de terminar sua rotina. Essa rotina deve terminar com RETI e, depois dessa instrução, uma outra deverá ser executada antes de ser atendida a interrupção. Imagine um sistema onde a interrupção 1 está programada para trabalhar por nível e que a entrada INT1 esteja conectada a terra, ou seja, a interrupção está sempre sendo invocada. Se forem adicionadas a esse sistema uma rotina principal e uma rotina de serviço para a interrupção 1, cria-se o ambiente para executar passo a passo o programa principal. Cada vez que voltar da rotina de interrupção (com um RETI), será executada uma única instrução do programa principal e, em seguida, desviará novamente para a rotina de interrupção. Pode-se usar uma chave para marcar o instante de retorno da rotina de interrupção. O exercício 7.4 ilustra a utilização do recurso de passo a passo. A figura 11.5 (capítulo 11) mostra uma implementação possível para a execução passo a passo. Outra possibilidade, mais complexa mas sem bouncing na chave é mostrada na figura a seguir:
7.6. EXERCÍCIOS
No circuito de práticas existe um pushbutton (SW3) para a interrupção 1 que será usado para fazer acender os leds (vermelho, amarelo e verde) em seqüência. Cada vez que a chave for acionada, uma interrupção será gerada e a rotina de atendimento à interrupção deverá trocar o led aceso.
;LED_INT1.ASM DEFSEG PROG, CLASS=CODE, START= SEG PROG ; ORG RESET
; AJMP^ INICIO ORGAJMP EXTI1EXT ; INICIO ORGMOV^ 50HA,#01001001B CLRMOV CP1,A SETBSETB EX1EA ;HABILITAR;HABILITAR INT.FLAG EXT.GERAL 1 SJMP $ ;LOOP INFINITO ;;ROTINA PARA ATENDER A INTERRUPCAO EXTERNA 1 EXT1 RLCMOV AP1,A ;ACENDER LEDS EM SEQUENCIA RETI END
Nota-se um problema: os 3 leds se acendem quando a chave é acionada e só um led fica aceso quando se libera a chave, mas nunca se sabe qual. Este problema acontece porque a rotina de interrupção é muito mais rápida que a chave. Ao retornar da interrupção, a chave ainda está acionada e uma nova interrupção é gerada. Para solucionar isso, pode-se monitorar o sinal INT (P3.3) e só permitir o retorno depois de que a chave esteja liberada (vai para um). Para ilustrar esta solução, o programa LED_INT2.ASM foi implementado. O programa é idêntico ao anterior exceto por uma instrução antes do retorno da interrupção.
;LED_INT2.ASM DEFSEGSEG PROG PROG, CLASS=CODE, START= SW3; EQU P3. ORG RESET ; AJMP^ INICIO ORGAJMP EXTI1EXT ; ORG 50H INICIO MOV A,#01001001B CLRMOV CP1,A SETBSETB EX1EA ;HABILITAR;HABILITAR INT.FLAG EXT.GERAL 1 SJMP $ ;LOOP INFINITO ;;ROTINA PARA ATENDER A INTERRUPCAO EXTERNA 1 EXT1 RLCMOV AP1,A ;ACENDER LEDS EM SEQUENCIA
SW3 EQU P3. ; DEFSEGSEG PROG, CLASS=CODE,PROG START= ; ORG RESET
; AJMP^ INIC ORG EXTI ; AJMP^ EXT INIC ORGMOV^ 50HA,#01001001B ;CODIGO PARA ACENDER CLRMOV CP1,A ;LEDS EM SEQUENCIA SETB EX1 ;HABILITAR INT 1 SETBSETB EAIE1 ;HABILITAR;PROVOCAR INTGERAL 1
PRINCIPAL NOPRLC^ A ;AQUI;RODAR^ O CODIGOPROG^ INTERROMPE MOV P1,A ;ACENDER LEDS ; SJMP^ PRINCIPAL^ ;RETORNAR EXT1 ORGACALL^ 100HRBT_0_1 ;TRANSICAO DE 0 A 1 ACALLRETI RBT_1_0 ;TRANSICAO DE 1 A 0 ; ;ELIMINARRBT_0_1 BOUNCINGMOV NAS TRANSICOESR7,#RTD DE 0 PARA 1 LB1 JNBDJNZ SW3,RBT_0_1R7,LB
; RET ;ELIMINAR BOUNCING NAS TRANSICOES DE 1 PARA 0 RBT_1_0LB2 MOVJB R7,#RTDSW3,RBT_1_ DJNZRET R7,LB END