
























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
apostila de microcontrolador 8051 completa
Tipologia: Notas de estudo
1 / 32
Esta página não é visível na pré-visualização
Não perca as partes importantes!

























O AVMAC 8051 é um assembler (realocável), com recursos de macros para a família do MCS-51. O AVMAC51 recebe como entrada um arquivo com instruções em assemby e procede da seguinte forma:
Figura 5.1. Fluxograma para utilização do assembler e linker.
Para ativar o assembler usa-se o comando que está ilustrado na figura 5.2.
Nome do arquivo a ser assemblado. Primeiro procura o ARQUIVO e se não o encontra, busca o ARQUIVO.ASM
Opções da linha de comando
Figura 5.2. Linha de comando para a ativação do assembler.
O linker é usado da forma ilustrada na figura 5.3.
Nome do arquivo que recebe os códigos linkados Lista de arquivos objeto Figura 5.3. Linha de comando para a ativação do linker.
Por default, os arquivos absolutos serão feitos em formato INTEL HEX. Um programa em linguagem assembly consiste de uma seqüência de "sentenças", cada uma ocupando uma linha do arquivo. Cada sentença pode ter até 4 campos. Os campos são separados por espaços e tabulações.
Label Operação Operando Comentário
Existem sentenças de 2 tipos:
LABEL: é um identificador que opcionalmente pode ser seguido por : (dois pontos). Ao usá-lo, é definido como um símbolo de usuário e atribui-se o endereço do primeiro byte da instrução. Os labels devem ser colocados na primeira coluna do texto.
OPERAÇÃO: contém uma instrução do microcontrolador (em linguagem assembly) ou uma pseudo- instrução (diretiva para o assembler).
OPERANDO: Pode haver nenhum, um, dois ou mais operandos; no caso de 2 ou mais operandos estes são separados por vírgulas.
COMENTÁRIO: Qualquer seqüência de caracteres precedida por ; (ponto e vírgula).
IMPORTANTE: Labels → devem começar na primeira coluna. Códigos → não devem começar na primeira coluna. Comentários → pode começar na primeira coluna.
Os símbolos (labels) podem ter quantos caracteres se deseje mas somente os primeiros 32 são significativos. Podem ser: A → Z, 0 → 9, $.
5.2. PSEUDO-INSTRUÇÕES DO ASSEMBLER
Sempre que o assembler é chamado, este primeiro envia o arquivo fonte para o pré- processador. Pode-se evitar este passo com o seguinte comando (se não houver instruções para o pré-processador): AVMAC51 ARQ.ASM NOMACEVAL
Normalmente definir TRUE = 0FFFFH e FALSE = 0 evita problemas com relações.
END → deve estar presente em todo arquivo, se faltar, será gerado um.
EQU → atribui valores numéricos aos símbolos (os valores atribuídos são permanentes). TEQ → atribui valores numéricos aos símbolos (os valores atribuídos são temporários). OBSERVAÇÃO: é opcional a definição do tipo para os símbolos, os quais são: CODE → memória de programa, DATA → memória de dados interna, XDATA → memória de dados externa, BIT → endereços do espaço de bits, NUMBER → qualquer coisa, é válido em qualquer lugar. Exemplos: LB EQU 5, CODE → LB é um endereço de programa FLAG EQU P1.3,BIT → FLAG é um endereço de bit
DS → (Define Space) reserva espaço na RAM. Dentro do segmento de bits, DS reserva espaço em bits. Ex: DS 8 → reserva 8 bytes da RAM no segmento onde estiver, geralmente CODE. DB → (Define Byte) reserva e inicializa espaço Exemplos: TXT DB "Isto é uma string", 0DH,0AH, TXT DB "Isto é uma string\r\n\0" L1 DB 8 ;reserva 1 byte e o inicializa com 8 L2 DB 1, 2, 3 ;reserva 3 bytes e os inicializa com estes valores
\n nova linha \r retorno de carro \t tabulação \0 NULL ou 0 \x precede um hexadecimal de 2 dígitos(\x0A=line feed)
DW → (Define Word) é como DB, mas trabalha com words (16 bits). Ex: L3 DW 123H PROC ,ENDPROC → labels globais, permitem programas modulares. Símbolo local → começa com "L?XXXX" e só tem sentido entre PROC........ENPROC, quando se encontra ENPROC, todos os símbolos locais são destruídos. Exemplo: BLOCO1 PROC MOV A,# L?TOP: CPL P1.7 ;L?TOP é uma variável local DJNZ A,L?TOP ENDPROC
O pré-processador é chamado ADP. O assembler necessita encontrá-lo pois é a primeira ação a ser realizada. Todas as pseudo-operações relativas ao pré-processador começam com o caracter %.
%IF - %ELSE - %ELSEIF - %ENDIF → sem comentários
%SWITCH - %CASE - %DEFAULT - %ENDSW → idêntico à linguagem C. Ex: %SWITCH PARAM %CASE 1 ... %CASE 9 .... %DEFAULT ... %ENDSW
%REPT - %ENDREPT → repetir uma seção do programa. Ex: %REPT 5 ... %ENDREPT
%FOR - %ENDFOR → sem comentários. Ex: %FOR I = 1 TO 10 ... %ENDFOR
%MACRO → permite definir trechos de programa e representá-los por um símbolo. Exemplo: Definir um macro que represente 3 rotações para a esquerda: RL3 %MACRO ;exemplo de macro sem parametros RL A RL A RL A %ENDM Utilização desta macro: ADD A,# RL
Definição de uma macro para representar a soma de três variáveis: SOMA %MACRO x,y,z ;exemplo de macro com parametros MOV A,z ADD A,y MOV x,A %ENDM Utilização da macro recém definida: MOV B,A SOMA R7,R6,R MOV R3,A
%IFB - %IFNB → (If Blank - If Not Blank) se foi atribuído ou não valor a um parâmetro (blank significa que não foi atribuído nenhum valor); geralmente usado nas macros.
%IFEQ - %IFNEQ → compara dois parâmetros.
%GENSYM → gerar símbolos automaticamente Exemplo: A utilização do FOR pode resultar em repetição de um label: % FOR I IN "P1.7","P1.6","P1.5" AQUI JNB I,AQUI % ENDFOR
Vai resultar em: AQUI JNB P1.7,AQUI AQUI JNB P1.6,AQUI AQUI JNB P1.5,AQUI
O label AQUI foi definido três vezes, o que é um erro. A solução é usar GENSYM: % FOR I IN "P1.7","P.6","P1.5" % GENSYM AQUI AQUI JNB I,AQUI % ENDFOR Vai resultar em: ??0000 JNB P1.7,?? ??0001 JNB P1.6,?? ??0002 JNB P1.5,?? Notar que se evitou a repetição do mesmo label.
MAP = mapfile → redireciona o arquivo .MAP (MAP = COM). (MA=mapfile) NoMAP → não gera .MAP. (-NM) ORDER (seg nombre, seg nombre...) → força que os segmentos sejam carregados na seqüência especificada. (-OC seg1, seg2, ...) HEX = arquivo imagem → redireciona a saída .HEX. (HX = filename) NoOut → não gera .HEX. (-NO) Out Format = format_type → formato do arquivo absoluto: (OF= mot | mot0 | tek) HEX → Intel HEX. TEK → Tektronix. MOT → Motorola. SYmbols = symfile → redireciona a saída .SYM. (SY=filename) NoSymbols → não gera arquivo .SYM (default). (-NS) SYmbols → gera arquivo .SYM. (-SY) PlainDump → tabela de símbolos. (-PD) QUiet → não gera mensagens, incluindo os warnings. (-QU) STart (clase,endereço) → endereço de início para cada classe. ToP (clase,endereço) → endereço limite para cada classe. RecLen= tamanho → tamanho do record nos arquivos .HEX (default = 32). (-RL=tam) PutSeg (Segname, endereço) → realoca o segmento especificado em Segname. (-PS(seg,addr)) DefSym (symname, endereço) → define um símbolo público. (-DS(name,val)) MaxLen (segname, tamanho) → tamanho máximo para um segmento. (-ML(seg,len)) ShowsMods → coloca no arquivo .MAP a informação de cada arquivo .OBJ. (-SM) ShowPublics → mostra no .MAP os labels públicos de cada arquivo. (-SP) SortbyName → ordena a lista gerada por ShowPublics. (-SN) RumsAt(segname, addr) → ?.
HEXFORM → é um programa que ordena os arquivos .HEX de forma que os endereços mais baixos apareçam primeiro. Modelo para a utilização: HEXFORM ARQ_IN.HEX ARQ_OUT.HEX (não ordenado) (ordenado) Serve também para converter entre .HEX e o formato binário com a sintaxe: hexform ARQ=ARQ
AVLIB → permite a criação de bibliotecas. Modelo para a utilização: AVLIB ART.LIB = ARQ1.OBJ, ARQ2.OBJ Se um programa que usa a biblioteca ART.LIB, mas chama somente ARQ1, então ARQ2 não será linkado.
AVREF → gera a referência cruzada. Modelo para a utilização: AVREF TESTE = TESTE.SYM, ARQ1.XRF, ARQ2.XRF, ARQ3.XRF (Os arquivos ARQ1.XRF, ARQ2.XRF, ARQ3.XRF foram gerados por AVLINK). (O arquivo TESTE.HEX foi produzido pelos arquivos ARQ1.OBJ, ARQ2.OBJ, ARQ3.OBJ).
5.4. O FORMATO INTEL.HEX
O formato INTEL.HEX representa informações binárias através de um texto ASCII imprimível. Ele é organizado em uma série de records. Dentro de cada record o dado binário é representado por dígitos (hexadecimal) ASCII, 2 dígitos para cada byte. Cada record tem um endereço de carregamento a partir do qual os bytes devem ser carregados. Para cada record também há um checksum de 8 bits que é um complemento a 2 da soma dos bytes de dados, contador, tipo de record e endereço. Notar que os valores binários dos bytes, e não os códigos ASCII, são usados no cálculo do checksum. O checksum obtido somado ao que está no record deve resultar em zero.
DADOS : (^) (2*count) char COUNT 2 char
END. CARGA 4 char
TIPO 00
CHECKSUM 2 char CR^ LF
: COUNT 00^ END. INÍCIO 4 char^ TIPO 01^ CHECKSUM 2 char CR LF
CR - Carriage Return LF - Line Feed Figura 5.4. Descrição do formato INTEL.HEX.
Exemplo: Record com os dados 1,2,3,4,5 colocados a partir do endereço 1234H e com endereço de início em 0000H. : 05 1234 00 01 02 03 04 05 A : 00 0000 01 FF (foram deixados espaços para claridade)
Checksum para os records: 05 + 12H + 34H + 00 + 01 + 02 + 03 + 04 + 05 = 5AH → 0 - 5AH = A 00 + 00 + 00 + 01 = 01 → 0 - 01 = 0FFH
; Converter para BCD um numero binario entre 0 e 999 ; R7R6(BCD) ← R5R4(Bin) ; Esta rotina esta no exemplo E10 caso c
SEG CODE BB39 CLR A MOV R7,A ;ZERAR R7 E R MOV R6,A MOV A,R JZ LB1 ;SE R5=0, SALTAR ESSA FASE LB2 MOV A,R6 ;SOMAR 256 BCD TANTAS VEZES ADD A,#56H ;QUANTO EH O VALOR DE R DA A MOV R6,A MOV A,R ADDC A,# DA A MOV R7,A DJNZ R5,LB2 ;ZERO R
LB1 MOV A,R5 ;CONVERTE R4 PARA BCD MOV B,# DIV AB ;SEPARA CENTENAS ADD A,R DA A MOV R7,A MOV A,B MOV B,# DIV AB ;SEPARA DEZENAS SWAP A ADD A,B ADD A,R6 ;SOMA COM O QUE EXISTE DA A MOV R6,A MOV A,R ADDC A,# DA A MOV R7,A SJMP $ END
3 ; Converter para BCD um numero binario entre 0 e 999 4 ; R7R6(BCD) <-- R5R4(Bin) 5 ; Esta rotina está no exemplo E10 C 6 7 SEG CODE 0000' E4 8 BB39 CLR A 0001' FF 9 MOV R7,A ;ZERAR R7 E R 0002' FE 10 MOV R6,A 11 0003' ED 12 MOV A,R 0004' 60 0C 13 JZ LB1 ;SE R5=0, PULAR ESSA FASE 0006' EE 14 LB2 MOV A,R6 ;SOMAR 256 BCD TANTAS VEZES 0007' 24 56 15 ADD A,#56H ;QUANTO EH O VALOR DE R 0009' D4 16 DA A 000A' FE 17 MOV R6,A 000B' EF 18 MOV A,R 000C' 34 02 19 ADDC A,# 000E' D4 20 DA A 000F' FF 21 MOV R7,A 0010' DD F4 22 DJNZ R5,LB2 ;ZERO R 23 0012' EC 24 LB1 MOV A,R5 ;CONVERTE R4 PARA BCD 0013'75 F0 64 25 MOV B,# 0016' 84 26 DIV AB ;SEPARA CENTENAS 0017' 2F 27 ADD A,R 0018' D4 28 DA A 0019' FF 29 MOV R7,A 001A' E5 F0 30 MOV A,B 001C'75 F0 0A31 MOV B,# 001F' 84 32 DIV AB ;SEPARA DEZENAS 0020' C4 33 SWAP A 0021' 25 F0 34 ADD A,B 0023' 2E 35 ADD A,R6 ;SOMA COM O QUE EXISTE 0024' D4 36 DA A 0025' FE 37 MOV R6,A 0026' EF 38 MOV A,R 0027' 34 00 39 ADDC A,# 0029' D4 40 DA A 002A' FF 41 MOV R7,A 002B' 80 FE 42 SJMP $ ;LOOP ETERNO 43 END
3 ;Converter um byte nos 2 caracteres HEXA ASCII correspondentes 4 ;AB (HEXA ASCII) <-- A 5 ;Exemplo: se Acc=0110 1010 → Acc=36H e B=41H 6 ;Observacao: ASCII(6)=36H e ASCII(A)=41H 7 ;Corresponde ao exemplo E 8 9 ;Para ilustrar este programa sera criado o segmento "PROGRAMA", 10 ;do tipo CODE, realocavel. 11 12 DEFSEG PROGRAMA, CLASS=CODE ;CRIAR SEGMENTO 13 SEG PROGRAMA ;ENTRAR EM SEGMENTO 0000& F5 F0 14 HEXASC MOV B,A ;GUARDAR UM BYTE 0002& 54 0F 15 ANL A,#0FH ;SEPARAR LSNIBBLE 0004& ....X 16 ACALL NIBASC ;CONVERTER NIBBLE → ASCII 0006& C5 F0 17 XCH A,B ;RECUPERAR UM BYTE 0008& 54 F0 18 ANL A,#0F0H ;SEPARAR MSNIBBLE 000A& C4 19 SWAP A 000B& ....X 20 ACALL NIBASC 000D& 80 FE 21 SJMP $ ;PARAR EXECUÇÃO 22 23 ;Rotina para converter uma nibble em ASCII correspondente 000F& C0 E0 24 NIBASC PUSH ACC ;GUARDAR NIBBLE 0011& C3 25 CLR C 0012& 94 0A 26 SUBB A,#10 ;A-10 → CY=1 ==> A< 0014& D0 E0 27 POP ACC ; → CY=0 ==> A<= 0016& 50 03 28 JNC NIBASC 0018& 24 30 29 ADD A,#30H ;30H ... 39H 001A& 22 30 RET 001B& 24 37 31 NIBASC1 ADD A,#37H ;41H ... 46H 001D& 22 32 RET 33 END
5.6. CONCEITOS DO AVSIM 8051
O AVSIM51 é feito para ser usado com o AVMAC51. Este simulador oferece muitos recursos:
Chama-se o programa com: AVSIM51 [keystrokes]. A versão 1.0 suporta apenas um argumento. AVSIM51
Para que o AVSIM51 rode eficientemente devem estar presentes três arquivos:
Se não foi especificado na linha de comando, o AVSIM51, ao ser invocado, pode especificar o tipo de CPU. Existem dois modos de operação (troca-se de modo usando ESC ):
Neste modo o cursor sempre está em uma linha de comando - próximo na parte inferior do monitor. Dá assim a possibilidade de executar todos os comandos. O modo comando é feito por menus. Se o menu é muito extenso, usa-se a barra de espaço para mostrar o resto. Os comandos são selecionados por:
-Carregar arquivos: Load Prog → atribui memória e carrega o programa Load Data → atribui memória e carrega os dados Load symbols → carrega a tabela de .símbolos .do Cross.Assembler Load Avocet → Load Symbols (.PRN) Load Avocet → Load Program (.HEX ou .MIK)
-Arquivo de comando: evita a repetição dos comandos freqüentes. Load → executa arquivo de comando. Open → abrir arquivo de comando Close → fechar arquivo de comando Restart → reiniciar arquivo de comando
-Atribuir memória: Set memory_map: → atribui espaço de dados externo. (como ROM ou RAM e não pode ser liberada)
5.7.2.1. Breakpoints: Existem diversos tipos de breakpoints:
O número de breakpoints que podem estar ativos simultaneamente depende somente da memória disponível no PC. Dois breakpoints tipo "sticky" são instalados automaticamente: → todo endereço de memória não definido → toda faixa de memória definida como ROM tem o tipo "write only break point". Breakpoints incondicionais: sempre interrompem a execução quando há acesso a um endereço. Set sticky_bkpt → só é desativado pelo usuário. Set dynamic_bkpt → se auto apaga quando ocorre.
Acesso: read/write ou write only Endereço: valor ou faixa de valores Para retardar uma interrupção até n passos a partir do breakpoint, entre com um valor decimal antes da seleção de acesso/endereço. Breakpoint dinâmicos incondicionais podem ser ativadas usando "break point cursor keys" (F2, F3, F4). Quando um breakpoint ocorre, a execução do programa se detém antes da instrução que ativa o breakpoint. → Se é dinâmico, ele é apagado e a execução do programa pode prosseguir. → Se é do tipo "sticky" é necessário usar "single step".
Os comandos que operam com os breakpoints são:
5.7.2.2. Condições (Value, Range, Mask, Indirect)
VALUE → deve ser fornecido um valor de 8 bits o qual será comparado com o conteúdo, endereço ou registro sujeito a breakpoint. Exemplo: interrompe quando o conteúdo de R0 seja 0F0H. RANGE → deve-se definir um limite inferior e um superior; quando o conteúdo estiver nesta faixa (inclusive) o breakpoint é ativado. MASK → máscara de 8 bits com 0, 1 e X (don't care). Quando os bits da máscara coincidem com o conteúdo do endereço do registro é produzido um trap. Exemplo: mask = 1XXX XXX0. INDIRECT → agora o conteúdo do registro é interpretado como uma endereço e é usado para buscar um dado na memória, o qual é comparado com o valor. Um segundo valor de 16 bits (offset) deve ser fornecido para ser somado com o conteúdo do registro (index) e assim produzir um endereço alvo.
5.7.2.3. Pass Points: São idênticos aos breakpoints, mas em vez de gerar um trap, eles incrementam um contador de 32 bits.