Você está na página 1de 34

Curso Superior de Tecnologia

Mecatrônica

Sistemas Microprocessados I
Nelson Alves Ferreira Neto

Aula 06

• Tópicos

– Interrupções no MSP430
– Códigos Fonte
– Assembly para MSP430
1. Interrupções no MSP430

• Tipos de Interrupções no MSP430

– No MSP430 existem três tipos de interrupções, que são


o reset, as interrupções não mascaradas (NMI) e
interrupções mascaradas.

1. Interrupções no MSP430

• Interrupções Não Mascaradas (NMI) no MSP430

– Uma NMI (No-Mascarable Interrupt) é uma interrupção


que não está associada ou mascarada pelo bit GIE. Ela
tem bits próprios que habilitam a sua ocorrência ou não;

– Uma NMI pode ser habilitada através dos bits NMIIE,


ACCVIIE e OFIE;

– Quando uma NMI ocorre, o programa inicia a sua


execução a partir do endereço armazenado no seu vetor
de interrupção, que no caso do MSP430 se encontra no
endereço 0x0FFFC;
1. Interrupções no MSP430
• Interrupções Não
Mascaradas (NMI) no
MSP430

– No MSP430 três fontes


diferentes podem gerar uma
interrupção NMI:

• Uma transição no pino RST/


NMI quando configurado no
NMI;

• Uma falha no funcionamento


do oscilador;

• Uma violação de acesso a


memória flash.

1. Interrupções no MSP430

• Interrupções Não Mascaradas (NMI) no MSP430

– NMI:

• A NMI ocorre sempre que o MSP430 for habilitada através do bit


NMIIE;

• Uma vez configurado o WDT (watchdog) para gerar interrupção,


este irá gerar um sinal que indicará o pedido de interrupção.
Este sinal irá ser colocado no pino RST/NMI;

• Uma vez que essa transição é percebida pelo MSP430 o bit


NMIIFG será “setado”;
1. Interrupções no MSP430
• Interrupções Não Mascaradas
(NMI) no MSP430

– Falha do oscilador:

• Este tipo de evento indica uma


falha no oscilador do MSP430;

• É possível associar este evento


à uma interrupção NMI apenas
configurando o bit OFIE
(Registrador IE1). Assim, toda
vez que este evento ocorrer e
este bit estiver “setado”, o bit
OFIFG (Registrador IF1) será
“setado” indicando a ocorrência
de uma falha no oscilador.

1. Interrupções no MSP430

• Interrupções Não Mascaradas (NMI) no MSP430

– Violação de acesso à Flash:

• Toda vez que o uma violação de acesso à memória flash é feita,


ou seja, uma leitura ou escrita não permitida é feita, o MSP430
pode ser configurado para gerar uma interrupção NMI associado
a este evento;

• Para habilitar a ocorrência dessa interrupção o bit ACCVIE


(Registrador IE1) deve ser “setado”;

• Sempre que este tipo de interrupção ocorrer o bit ACCVIFG


(Registrador IF1) é “setado”, indicando a ocorrência dessa
interrupção;
1. Interrupções no MSP430
• Interrupções Mascaradas no MSP430

– São interrupções causadas por periféricos e que podem ser habilitadas


individualmente e/ou através do GIE;

– Não só os periféricos do MSP430 mais também o Timer e o WDT são capazes de


gerar interrupções quando configurados para isso;

– Um pedido de interrupção leva seis (06) ciclos de clock para ser atendido;

– Quando uma instrução que esteja sendo executada é finalizada, o conteúdo do PC


(Contador de Programa) e do SR (Registrador Status) é colocado na pilha, a
interrupção de maior prioridade é selecionada, o flag de interrupção é limpo, o SR é
limpo e o conteúdo do vetor de interrupção é carregado no PC;

– Uma vez que o código associado a interrupção é executado uma instrução de retorno
chamada RETI tem que ser utilizada. Este retorno demora cinco (05) ciclos de clock.

1. Interrupções no MSP430

• Interrupções Mascaradas no MSP430


2. Códigos Fonte

• Montadores

– São programas que traduzem um código escrito em um editor de


texto simples por um ser humano (programador ou usuário), em um
código binário (de máquina). No caso de PCs, ele gerará um
código executável. E no caso de microcontroladores, este código
poderá ser gravado no microcontrolador.

– O código escrito pelo usuário utiliza comandos documentados pelo


próprio fabricante do microcontrolador utilizado.

– Os montadores utilizam linguagens de nível mais baixo, mas


ainda interpretáveis pelo ser humano, não sendo exatamente o
código binário.

2. Códigos Fonte

• Montadores

– Exemplos de montadores: IAR Embedded Workbench Kickstart e o


Code Composer Essentials v3 Core Edition.

– O IAR e o CCE também funcionam como simuladores e


compiladores.

– Simuladores permitem simular o código, rodando os mesmo e assim


testando suas diversas situações.

– O IAR e o CCE também tem a função de emular, que é transcrever


instruções de um processador para que este possa rodar em outro
processador.
2. Códigos Fonte

• Compiladores

– São programas que traduzem um código escrito em um editor de


texto simples por um ser humano (programador ou usuário), em um
código de nível mais baixo para posteriormente efetuar a
montagem, ou seja, a geração do código binário (de máquina).
No caso de PCs, ele gerará um código executável. E no caso de
microcontroladores, este código poderá ser gravado no
microcontrolador.

– O código escrito pelo usuário utiliza comandos documentados


pelo próprio fabricante do compilador.

– Os compiladores trabalham as chamadas linguagem de médio ou


alto nível, que permitem um maior grau de abstração.

2. Códigos Fonte

• Gravação

– O IAR ou CCE associado a uma interface JTAG permite


que o firmware seja gravado na memória do MCU:
2. Códigos Fonte

• Gravação

– Circuito da interface JTAG para gravação do MSP430:

2. Códigos Fonte
• Linguagem Assembly

– O Assembly é uma linguagem de nível mais alto que a de


máquina (código binário). O Assembly usa mnemonicos para
representar os códigos das instruções.

– Quando escrevemos em assembly estamos escrevendo o


chamado código fonte.

– A extensão de um código assembly geralmente é “*.ASM” , mas


nem sempre! No caso do MSP430 por exemplo é a “*.s43”;

– Um exemplo de código fonte é: MOV.W #0A00h,SP

– Este código fonte será transformado em object code, sendo o


firmware que irá ser escrito na memória do MCU.
2. Códigos Fonte

• Linguagem Assembly

– Para escrever um programa em Assembly é necessário


o conhecimento da arquitetura interna do
microcontrolador ou microprocessador.

– Um código em linguagem Assembly pode ser divido


em loop principal, sub-rotinas e interrupções.

– O programa principal em Assembly é inicializado


pela diretiva de processamento ORG. Essa diretiva diz
para o montador onde o código será escrito na memória
de programa.

2. Códigos Fonte
2. Códigos Fonte

• Exemplo de Fluxograma

2. Códigos Fonte

• Diretivas de Pré-processamento de um Código Assembly


(MSP430)

– Para qualquer plataforma de programação, as diretivas de


processamento são informações do usuário passadas ao
montador ou ao compilador no código fonte, instruindo o montador
ou compilador sobre como manipular determinadas informações do
usuário antes de efetuar a montagem ou compilação.

– Nota importante: As diretivas de processamento não são instruções


a serem executadas pelo microcontrolador!!!! São de uso apenas do
montador ou compilador!!!

– Veremos a seguir algumas utilizadas pelo IDE da IAR para


montagem/compilação do firmware de Microcontroladores MSP430.
2. Códigos Fonte
• Diretivas de Pré-processamento de um Código Assembly (MSP430)

– COMENTÁRIOS NO CÓDIGO: São feitos iniciando-se como o caractere “;”.


Após ele todas as expressões não serão utilizadas pelo montador para gerar
o código Hexadecimal (*.HEX).

– Ex.: ; Este é um comentário!!!!

– #INCLUDE (“Inclua”): Diretiva para inclusão de módulos de códigos


fonte a partir de arquivos externos. Geralmente têm a extensão “*.INC”,
mas poderia ser outra, como “*.ASM”. No IDE IAR, o #INCLUDE é utilizado
para incluir um arquivo de definição de constantes (endereços), com
extensão “*.H”, correspondentes aos nomes dos registradores e bits de um
dado Microcontrolador MSP430 da Texas.

– Formato: #INCLUDE “nome_do_arquivo.h” ; No caso, para MSP430

– Ex.: #include “msp430.h”

2. Códigos Fonte
• Diretivas de Pré-processamento de um Código Assembly (MSP430)

– EQU (“Equate”): Significa “Equivalente a ...” ou “Igual a...”. É utilizado para definir
constantes ou posições de memória para alocar variáveis.
– Formato: <nome_da_constante> EQU <valor_da_constante>

– Ex.: FLAGS EQU 32 ; O texto FLAGS será substituído por 32 (variável)

– #DEFINE: Substitui expressões inteiras por expressões inteiras.


– Formato: #DEFINE <NOME> <EXPRESSÂO>
– Ex: #DEFINE LED #1,&P1OUT ; bit 0 da Porta P1 será o LED

– Representação de Bases Numéricas (IAR para MSP430):

– Número Decimal: D’?? ou ??. Ex.: D’90’ ou 90


– Número Hexadecimal: H’?? ou ??H ou 0x??. Ex.: H’5A ou 5AH ou 0x5A
– Número Binário: B’????????. Ex.: B’01011010
– Caractere ASCII: ‘?’. Ex.: ‘A’
2. Códigos Fonte

• Diretivas de Pré-processamento de um Código Assembly


(MSP430)

– ORG (“Organize”): Informa ao montador que as instruções escritas


após esta diretiva deverão ser posicionadas no endereço de
memória de programa especificado.

– Formato: ORG <endereço>

– Ex.: ORG 0x0004; Da próxima linha em diante as instruções serão


posicionadas a
; partir do endereço 0x0004 da memória de
; programa

2. Códigos Fonte
• Diretivas de Pré-processamento de um Código Assembly (MSP430)

– HIGH: Informa ao montador que será utilizada a parte alta (os 8 bits mais
significativos - MSB) de uma word (16 bits), ou seja, do bit 15 ao bit 8.

– Formato: HIGH <endereço ou constante>

– Ex.: mov.w high #0x1805, R15 ; Será movido 0x18 para R15.

– LOW: Informa ao montador que será utilizada a parte baixa (os 8 bits menos
significativos - LSB) de uma word (16 bits), ou seja, do bit 7 ao bit 0.

– Formato: LOW <endereço ou constante>

– Ex.: mov.w low #0x1805, R15 ; Será movido 0x05 para R15.
2. Códigos Fonte
• Diretivas de Pré-processamento de um Código Assembly (MSP430)

– $: Informa ao montador que o endereço da memória de programa é o endereço


corrente.
– Ex.: GOTO $-3 ; Vai para 3 endereços atrás na memória de programa
– ; (3 instruções atrás).

– RÓTULOS: Informa ao montador que um nome deve ser atribuído ao endereço da


instrução onde o RÓTULO está posicionado.
– Formato: <nome do rótulo> ou <nome do rótulo>:
– Ex.: DIRECAO: bis.b #001h,&P1DIR ; Set P1.0 to output direction

– END: Diretiva que sinaliza para o montador o final do código fonte.


– Formato: END
– Ex.:
– ORG 0FFFEh ; MSP430 RESET Vector
– DW RESET ;
– END ; FIM DO PROGRAMA

2. Códigos Fonte
• Diretivas de Pré-processamento de um Código Assembly (MSP430)

– #IFDEF <CONSTANTE> E #IFNDEF <CONSTANTE>: Diretivas de compilação


condicional. Informa ao montador que as próximas instruções só deverão ser
montadas caso a constante tenha sido definida, no caso do #IFDEF, ou não tenha
sido, no caso do #IFNDEF. O bloco é encerrado com um #ENDIF

– Ex.: #define Teste


– #ifdef Teste ; Se “Teste” foi definida (e foi), monta o código abaixo
– ... ; (instruções aqui).
– #endif ; Fim da compilação condicional.

– MACROS: Informa ao montador para substituir uma sentença por um trecho de


código inteiro.

– OBSERVAÇÃO: Existem várias outras diretivas, mas nos atentamos para as mais
importantes. De qualquer forma, a existência delas é dependente do compilador e
da versão. Não é garantido que todas as diretivas de pré-processamento existam
em um compilador ou montador. Deve-se consultar o manual do fabricante.
2. Códigos Fonte

• Código Fonte Padrão

– Padrão geral adotado para o formato de cada linha de programa:

2. Códigos Fonte
• Trecho Exemplo de um Código Fonte
;*******************************************************************************
; MSP430x1xx Demo - Software Toggle P1.0
;
; Description; Toggle P1.0 by xor'ing P1.0 inside of a software loop.
; ACLK = n/a, MCLK = SMCLK = default DCO
; MSP430x1xx
;
; A. Dannenberg
; Texas Instruments, Inc
; January 2006
; Built with IAR Embedded Workbench Version: 3.40A
;*******************************************************************************
#include "msp430.h"
;-------------------------------------------------------------------------------
ORG 0FC00h ; Progam Start (1K Flash device)
;-------------------------------------------------------------------------------
RESET mov.w #0280h,SP ; Set stackpointer (128B RAM device)
StopWDT mov.w #WDTPW+WDTHOLD,&WDTCTL ; Stop watchdog timer
SetupP1 bis.b #001h,&P1DIR ; Set P1.0 to output direction
;
Mainloop xor.b #001h,&P1OUT ; Toggle P1.0
Wait mov.w #050000,R15 ; Delay to R15
L1 dec.w R15 ; Decrement R15
jnz L1 ; Delay over?
jmp Mainloop ; Again

;-------------------------------------------------------------------------------
; Interrupt Vectors
;-------------------------------------------------------------------------------
ORG 0FFFEh ; MSP430 RESET Vector
DW RESET ;
END
3. Assembly para MSP430
• Características da Linguagem Assembly para o MSP430

– O Assembly do MSP430 contém 27 instruções e 7 modos de


endereçamento.

– Os modos de endereçamento permitem o total acesso a memória do


MSP430.

– Os 7 modos de endereçamento são:

• Register Mode (Modo Registrador);


• Indexed Mode (Modo Indexado);
• Symbolic Mode (Modo Simbólico);
• Absolute Mode (Modo Absoluto);
• Indirect Register Mode (Modo Registrador Indireto);
• Indirect Autoincrement Mode (Modo Indireto Autoincrementado);
• Immediate Mode (Modo Imediato).

3. Assembly para MSP430

• Construção dos Op-codes


– Com 1 operando, dois operandos ou instrução de desvio
– Tamanho de op-code varia entre 1 e 3 palavras de 16 bits
3. Assembly para MSP430

• Construção dos Op-codes → 1 Operando


– 1 ou 2 palavras
• 1ª palavra é o op-code e o registrador fonte/destino
• 2ª palavra é posição da memória para operando
– B/W → 1 (8 bits), 0 (16 bits)
– Ad → 00 (Registrador), 01 (M[Reg+Operando]), 10 (M[Reg]),
11 (M[Reg])

3. Assembly para MSP430

• Construção dos Op-codes → 2 Operando


– 1 a 3 palavras
• 1ª palavra é o op-code e o registrador fonte/destino
• 2ª e 3ª são posições de memória para operando ou
constante
– B/W → 1 (8 bits), 0 (16 bits)
– Ad → 0 (Registrador), 1 (M[Reg+Operando])
– As → 00 (Registrador), 01 (M[Reg+Operando]), 10 (M[Reg]),
11 (M[Reg]+)
3. Assembly para MSP430

• Construção dos Op-codes → Desvio


– Condição → 000 (diferente), 001 (igual), 010 (C=0), 011
(C=1), 100 (N=1), 101 (maior ou igual), 110 (menor), 111
(incondicional)
– Deslocamento (10 bits)

3. Assembly para MSP430

• Modos de Endereçamento
– 7 tipos para origem e 4 para destino
3. Assembly para MSP430

• Modos de Endereçamento
– Os modos para operando fonte são selecionados pelos
campos As e S-Reg, no próprio op-code

3. Assembly para MSP430

• Modos de Endereçamento
– Os modos para operando destino são selecionados pelos
campos Ad e D-Reg, no próprio op-code
3. Assembly para MSP430

• Register Mode (Modo Registrador)

3. Assembly para MSP430

• Indexed Mode (Modo Indexado)


3. Assembly para MSP430

• Indexed Mode (Modo Indexado)

3. Assembly para MSP430

• Symbolic Mode (Modo Simbólico)


– MOV.B R8, TESTE → MOV.B R8, X(PC) onde X=TEST-PC
– É uma variação do modo indexado. Neste caso, o registrador
de índice é R0 (Contador de Programa ou PC)
– O endereço do operando fonte ou de destino é obtido pela
soma de uma constante imediata ao conteúdo do PC
– A codificação da instrução depende do endereço em que ela
foi montada, já que para calcular o valor de deslocamento a
ser adicionado ao registrador de índice (o PC), é necessário
conhecer o endereço da instrução.
3. Assembly para MSP430

• Absolute Mode (Modo Absoluto)


– MOV.B TESTE, &0x208 → MOV.B X(PC),&0x208 onde
X=TEST-PC
– Segunda variação do modo indexado. Neste caso, o
registrador de índice é R2 (Gerador de Constante)
– O endereço do operando fonte ou de destino é obtido pela
soma de uma constante imediata à constante 0
– As = 01 → Operando fonte é o indexado e S-Reg = 0 indica
que o registrador R0 (PC)
– Ad = 1 → Operando destino é indexado e D-Reg = 2 indica
R2

3. Assembly para MSP430

• Absolute Mode (Modo Absoluto)


3. Assembly para MSP430

• Absolute Mode (Modo Absoluto)

3. Assembly para MSP430

• Indirect Register Mode (Modo Registrador Indireto)


– MOV.B @R5, 0(R6)
– O endereço do operando é formado pelo conteúdo de R5
– É permitido apenas para operando origem
– Similar a indexado com índice igual a 0. (Não requer palavra
adicional)
– As = 10 → Operando fonte é indireto e S-Reg = 5 indica que
o registrador R5
– Ad = 1 → Operando destino é indexado e D-Reg = 6 indica
R2
3. Assembly para MSP430

• Indirect Register Mode (Modo Registrador Indireto)

3. Assembly para MSP430

• Indirect Autoincrement Mode (Modo Indireto


Autoincrementado)
– MOV.B @R10+, R4
– Similar ao anterior, mas com conteúdo do registrador
automaticamente incrementado após a sua leitura
– Somente podem ser utilizados os registradores de R1 a RI5
– As = 11 →Operando fonte é indireto auto-incremento e S-Reg
= 10 indica que o registrador R10
– Ad = 0 → Operando destino é registrador e D-Reg = 4 indica
R4
3. Assembly para MSP430

• Indirect Autoincrement Mode (Modo Indireto


Autoincrementado)

3. Assembly para MSP430

• Indirect Autoincrement Mode (Modo Indireto


Autoincrementado)
3. Assembly para MSP430

• Imediate Mode (Modo Imediato)


– MOV.W #100, R6 → MOV.B @PC+, R6
– O valor imediato é localizado na memória imediatamente
depois da instrução
– Somente disponível para operando origem
– É um caso especial de autoincremento com PC sendo origem
– As = 11 →Operando fonte é indireto auto-incremento e S-Reg
= 0 indica que o registrador R0 (PC)
– Ad = 0 → Operando destino é registrador e D-Reg = 6 indica
R6

3. Assembly para MSP430

• Imediate Mode (Modo Imediato)


3. Assembly para MSP430

• Imediate Mode (Modo Imediato)

3. Assembly para MSP430


• Set (Conjunto) de Instruções do Assembly para o MSP430

– O Assembly do MSP430 contém 27 instruções e 7 modos de


endereçamento.

– Essas 27 instruções são físicas. Há ainda 24 instruções chamadas


“emuladas”, perfazendo um total de 51 instruções.

– As instruções podem acessar a memória nos modos 8 e 16 bits,


otimizando o consumo de memória e propiciando um aumento de
desempenho.

– Os op-codes (códigos binários) são classificados em 3 categorias:

• Instruções de 1 operando (ex.: CALL DELAY);


• Instruções de 2 operandos (ex.: MOV #0x200,@R4);
• Instruções de desvio (ex.: JNE VOLTA).
3. Assembly para MSP430
• Set (Conjunto) de Instruções do Assembly para o MSP430

– Para fins didáticos, as 51 instruções do MSP430 estão


subdivididas em 4 categorias (PEREIRA, Fábio; 2005):

• Instruções de Movimentação e Manipulação de Dados (MOV, CLR,


SWPB, PUSH, POP, BIC, BIS);

• Instruções Lógicas e Aritméticas (ADD, ADDC, ADC, DADD, DADC,


SUB, SUBC, SBC, INC, INCD, DEC, DECD, RLA, RRA, SXT, AND,
XOR, INV, RLC, RRC);

• Instruções de Teste e Desvio (BIT, CMP, TST, BR, JMP, JEQ/JZ, JNE/
JNZ, JC/JHS, JNC/JLO, JGE, JL, JN, CALL, RET, RETI);

• Instruções de Controle da CPU (CLRC, CLRN, CLRZ, SETC, SETN,


SETZ, DINT, EINT, NOP).

3. Assembly para MSP430

• Set de Instruções – Movimentação e Manipulação de Dados


– Mnemônico “MOV”
3. Assembly para MSP430

• Set de Instruções – Movimentação e Manipulação de Dados


– Mnemônico “CLR”

3. Assembly para MSP430

• Set de Instruções – Movimentação e Manipulação de Dados


– Mnemônico “BIS”
3. Assembly para MSP430

• Set de Instruções – Movimentação e Manipulação de Dados


– Mnemônico “ADD”

3. Assembly para MSP430

• Set de Instruções – Movimentação e Manipulação de Dados


– Mnemônico “AND”
3. Assembly para MSP430

• Set de Instruções – Movimentação e Manipulação de Dados


– Mnemônico “DEC”

3. Assembly para MSP430

• Set de Instruções – Movimentação e Manipulação de Dados


– Mnemônico “INC”
3. Assembly para MSP430

• Set de Instruções – Movimentação e Manipulação de Dados


– Mnemônico “JMP”

3. Assembly para MSP430

• Set de Instruções – Movimentação e Manipulação de Dados


– Mnemônico “BIT”
3. Assembly para MSP430

• Set de Instruções – Movimentação e Manipulação de Dados


– Mnemônico “CALL”

3. Assembly para MSP430

• Set de Instruções – Movimentação e Manipulação de Dados


– Mnemônico “CMP”
3. Assembly para MSP430

• Set de Instruções – Movimentação e Manipulação de Dados


– Mnemônico “EINT”

3. Assembly para MSP430

• Set de Instruções – Movimentação e Manipulação de Dados


– Mnemônico “DINT”
Muito Obrigado

Você também pode gostar