Mudanças entre as edições de "MIC29004-2014-1"
(57 revisões intermediárias por um outro usuário não estão sendo mostradas) | |||
Linha 7: | Linha 7: | ||
* [[MIC-EngTel_(Plano_de_Ensino) |Ementa e referências bibliográficas]] | * [[MIC-EngTel_(Plano_de_Ensino) |Ementa e referências bibliográficas]] | ||
− | * [https://docs.google.com/spreadsheet/ccc?key= | + | * [https://docs.google.com/spreadsheet/ccc?key=0AolsLbqpwc8_dFlEbHhaWUhLa2g3cnB3Q3QxWFp6amc&usp=sharing Conceitos] |
− | == | + | == Material == |
*[[Media:mic-slides_1-handout.pdf|Slides Histórico]] | *[[Media:mic-slides_1-handout.pdf|Slides Histórico]] | ||
+ | *[http://tele.sj.ifsc.edu.br/~roberto.matos/mic/ApostilaMemorias.pdf Apostila Memória] | ||
+ | *[[Media:mic-slides_2-handout.pdf|Introdução à Microprocessadores]] | ||
+ | *[[Media:bip.pdf|Arquitetura e Organização do BIP]] | ||
+ | *[[Media:mic-slides_3-handout.pdf|Microcontrolador e 8051]] | ||
+ | ==Listas de Exercício== | ||
+ | *[[Media:Exercícios-sobre-a-programação-do-BIP.pdf|Lista Introdução a programação do BIP]] | ||
+ | |||
+ | * [[MIC29004-lista1 | Lista de Exercícios: Memória, Arquitetura, Organização e BIP]] | ||
+ | |||
+ | * [[MIC29004-lista2 | 2ª Lista de Exercícios: Microcontrolador 8051]] | ||
= Aula 11/02: Apresentação = | = Aula 11/02: Apresentação = | ||
Linha 26: | Linha 36: | ||
* Célula básica de memória | * Célula básica de memória | ||
* Circuito genérico de memória | * Circuito genérico de memória | ||
− | * | + | * Barramentos de dados, endereços e controle |
* Tamanho da memória e Largura da Palavra (N x M) | * Tamanho da memória e Largura da Palavra (N x M) | ||
* Capacidade em bits | * Capacidade em bits | ||
* Associação de Memórias | * Associação de Memórias | ||
+ | |||
+ | = Aula 20/02: Lab. Proteus – Memória = | ||
+ | {{Bit and byte prefixes}} | ||
+ | *Consolidar o conhecimento sobre memórias e barramentos de endereços, dados e controle através de um experimento no Proteus. | ||
+ | |||
+ | *Roteiro: | ||
+ | #Entrar no Windows. | ||
+ | #Baixe o [[Media:lab1-memoria.pdsprj.zip| arquivo]] de projeto. Coloque em um diretório conhecido. | ||
+ | #Clique sobre o arquivo. O PROTEUS será executado e o projeto aberto. | ||
+ | #Observe que o projeto está parcialmente pronto. Você pode entrar em modo simulação. O sistema está preparado para que se possa inserir ou ler manualmente posições de memória. | ||
+ | #Grave o dado Ah na posição 0 de memória e Bh na posição 8. | ||
+ | #Note o Chip Select está habilitado sempre. Coloque uma chave adicional para colocar o Chip Select e repita a operação de gravação anterior. | ||
+ | #Utilize a nova configuração para gravar o seu número de matrícula a partir da posição 0. | ||
+ | |||
+ | ==Exercícios== | ||
+ | *Usando a memória do experimento como bloco base, realize a ligação entre elas de modo que se construa um banco de memória de 32 palavras de 8 bits. | ||
+ | *Usando a memória do experimento como bloco base, realize a ligação entre elas de modo que se construa um banco de memória de 64 palavras de 4 bits. | ||
+ | *Quais os tamanhos dos barramentos de endereço e dado para uma Memória de 512x8 bits? | ||
+ | *Determine a capacidade final em bits e o endereço inicial e final em Hexadecimal das memórias com as seguintes características: | ||
+ | **512x4 | ||
+ | **4Kx8 | ||
+ | **128Kx8 | ||
+ | **2Mx16 | ||
+ | |||
+ | = Aula 25/02: Lab. Proteus – Memória (cont.) = | ||
+ | ==Exercícios== | ||
+ | * Usando a memória do experimento como bloco base, realize a ligação entre elas de modo que se construa um bancos de memórias de: | ||
+ | ** 16 palavras de 8 bits. | ||
+ | ** 32 palavras de 4 bits. | ||
+ | |||
+ | = Aula 27/02: Tipos de Memória = | ||
+ | *ROM (PROM, EPROM, EEPROM, FLASH); | ||
+ | *RAM (DRAM, SRAM, DDR) | ||
+ | *Diferença das células | ||
+ | |||
+ | = Aula 04/03: Não Houve Aula - CARNAVAL = | ||
+ | |||
+ | = Aula 06/03: Introdução à Arquitetura de Computadores= | ||
+ | |||
+ | = Aula 11/03: Não Houve Aula= | ||
+ | |||
+ | = Aula 13/03: Não Houve Aula - Treinamento Proteus= | ||
+ | |||
+ | = Aula 17/03: Arquitetura BIP = | ||
+ | *[[Media:Exercícios-sobre-a-programação-do-BIP.pdf|Lista Introdução a programação do BIP]] | ||
+ | |||
+ | = Aula 20/03: Organização BIP = | ||
+ | * [http://tele.sj.ifsc.edu.br/~roberto.matos/mic/proteus/bip-v1.zip BIP - Proteus] | ||
+ | * [http://tele.sj.ifsc.edu.br/~roberto.matos/mic/proteus/library_n_models.zip Bibliotecas] | ||
+ | |||
+ | = Aula 25/03: Exercício Proteus = | ||
+ | # Executar código da memória manualmente? Qual o valor final do Acumulador? | ||
+ | # "Desmontar" o conteúdo da memória de programa. | ||
+ | # Montar os exercícios de Assembly da lista de exercícios e executar. | ||
+ | # Implementar o circuito decodificador da Unidade de Controle. | ||
+ | # Quais são as BOM da UC e UE? | ||
+ | |||
+ | == Proteus == | ||
+ | * Barramentos (conexão, bifurcação) | ||
+ | * Terminal Mode | ||
+ | * Labels | ||
+ | * Teclas de atalhos | ||
+ | |||
+ | = Aula 27/03: Exercício Proteus (cont.) = | ||
+ | * Simulação das instruções (busca, decodificação e execução) | ||
+ | * Montagem de programa | ||
+ | * Criação do Circuito decodificador | ||
+ | |||
+ | == Proteus == | ||
+ | * Arquivos de Inicialização da Memória | ||
+ | * Watch window (16-bits) | ||
+ | |||
+ | |||
+ | = Aula 01/04: Integração do Decodificador = | ||
+ | |||
+ | * Geração da decodificação do BIP a partir do Opcode. | ||
+ | * Compreensão do conceito de "monociclo" (busca, decodificação e execução). | ||
+ | |||
+ | == Proteus == | ||
+ | * Criação de componente | ||
+ | * Criação de modelos de componentes simuláveis | ||
+ | |||
+ | = Aula 08/04: BIP II - Organização e arquitetura = | ||
+ | |||
+ | [http://tele.sj.ifsc.edu.br/~roberto.matos/mic/proteus/alu_bip1.pdsprj ALU Bip I] | ||
+ | |||
+ | |||
+ | = Aula 10/04: BIP II - Modificações PC, Decodificador e ALU = | ||
+ | |||
+ | [http://www.logicminimizer.com/blog/tiki-index.php?page=Solving+Large+Karnaugh+Maps+with+Smaller+Ones Solving Large Karnaugh Maps with Smaller Ones] | ||
+ | |||
+ | = Aula 17/04: BIP II - Projeto Decodificador BIP II = | ||
+ | |||
+ | |||
+ | = Aula 22/04: BIP II - Teste Decodificador BIP II = | ||
+ | * Teste decodificador. | ||
+ | * Reproduza cada um dos seguintes programas para assembly, atribuindo às variáveis valores que lhe permitam testar o seu programa. | ||
+ | <code> | ||
+ | |||
+ | a) if (a>=b) | ||
+ | b=b+1; | ||
+ | |||
+ | b) if (a>b) | ||
+ | a=a+1; | ||
+ | |||
+ | c) if (a==b) | ||
+ | a=a+1; | ||
+ | |||
+ | d) Adicione "else" nos exercícios anteriores. | ||
+ | |||
+ | e) a=0;c=5; | ||
+ | while (a<c){ | ||
+ | a=a+1; | ||
+ | } | ||
+ | |||
+ | f) a=0; | ||
+ | for (i=0; i<5 ;i++){ | ||
+ | a=a-1; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | = Aula 24/04: BIP II - Teste Decodificador BIP II = | ||
+ | * [http://tele.sj.ifsc.edu.br/~roberto.matos/mic/proteus/decode-bip2.pdsprj Decodificador BIP II] | ||
+ | |||
+ | = Aula 25/04: Revisão para Prova – Dúvidas Lista de Exercício = | ||
+ | |||
+ | = Aula 29/04: Não Houve Aula – Convocação RDP= | ||
+ | |||
+ | = Aula 01/05: Não Houve Aula – Dia do Trabalhador= | ||
+ | |||
+ | = Aula 06/05: 1ª Prova= | ||
+ | |||
+ | = Aula 08/05: Microcontroladores = | ||
+ | * Microcontrolador vs Microprocessador | ||
+ | * Aplicações | ||
+ | * Limitações | ||
+ | |||
+ | = Aula 13/05: 8051 = | ||
+ | * Introdução | ||
+ | * Arquitetura Interna | ||
+ | * Memória | ||
+ | |||
+ | = Aula 15/05: Assembly 8051 = | ||
+ | |||
+ | * Organização de um Código Assembly | ||
+ | * Instrução do montador: ORG, DB, END | ||
+ | * Prática com o [http://mcu8051ide.sourceforge.net/ MCU8051IDE]. | ||
+ | * [http://www.8052.com/set8051 Conjunto de Instruções] e [http://www.keil.com/support/man/docs/is51/is51_opcodes.htm Opcodes] | ||
+ | * Modos de Endereçamento: | ||
+ | |||
+ | ** Imediato | ||
+ | *:<code>MOV A, #100</syntaxhighlight> | ||
+ | ** Direto | ||
+ | *:<code>MOV A, 20</syntaxhighlight> | ||
+ | ** Indireto | ||
+ | *:<code>MOV A, @R0</syntaxhighlight> | ||
+ | ** Registro | ||
+ | *:<code>MOV A, R0</syntaxhighlight> | ||
+ | ** Registro Específico | ||
+ | *:<code>MOVX A, @DPTR</syntaxhighlight> | ||
+ | ** Indexado | ||
+ | *:<code>MOVC A, @A+DPTR</syntaxhighlight> | ||
+ | |||
+ | |||
+ | == Exemplo: == | ||
+ | <code> | ||
+ | ;INSTRUÇÕES DO 8051 | ||
+ | |||
+ | ORG 0 | ||
+ | Inicio: | ||
+ | mov 20h,#30h ;Ender. Imediato (valor constante esta' no opcode) | ||
+ | mov 30h,#07ah ;Ender. Imediato (valor constante esta' no opcode) | ||
+ | mov r0,30h ;Ender. Direto (operando especifica ENDERECO de 8 bits da RAM interna) | ||
+ | |||
+ | mov a,r0 ;Ender. via registrador (opcode contem 3 bits indicando qual registrador usar) | ||
+ | mov a,20h ;Ender. Direto (operando especifica ENDERECO de 8 bits da RAM interna) | ||
+ | mov a,#20h ;Ender. Imediato (valor constante esta' no opcode) | ||
+ | mov a,@r0 ;Ender. Indireto (registrador R0, R1, contem endereco do operando) | ||
+ | |||
+ | mov dptr,#tabela ;Ender. Imediato (valor constante esta' no opcode) | ||
+ | |||
+ | |||
+ | tabela: db 10h,20h,30h,0BBh,0AAh | ||
+ | |||
+ | end | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | = Aula 19/05: Exercícios Movimentação de Dados = | ||
+ | |||
+ | '''Transferência de dados IDATA''' | ||
+ | *Construir um trecho de código para colocar a mensagem "ALO" na memória RAM interna, a partir do endereço '''30H'''. Usar endereçamento imediato e direto. | ||
+ | *Construir um trecho de código para copiar 5 bytes consecutivos da memória RAM interna a partir do endereço '''50H''' para um destino a partir de '''42H'''. Usar somente endereçamento direto e por registrador. | ||
+ | * Repetir o exercício anterior usando somente endereço direto. | ||
+ | * Copiar 5 bytes consecutivos de uma área interna de memória de dados, a partir da posição '''40H''' para a posição '''66H'''. Usar endereçamento indireto e direto. | ||
+ | |||
+ | '''Transferência de dados XDATA''' | ||
+ | *Zerar as posições de memória RAM externa (XDATA) de número '''80FFH''', '''9765H''' e '''FEA5H'''. | ||
+ | *Colocar a mensagem "ALO" nas posições de memória externa de dados 0670h,0671h e 0672h. | ||
+ | *Copiar os bytes das posições '''4654H''', '''7687H''' e '''FADEH''' da XDATA para as posições '''0000H''', '''0005H''' e '''A000H''' respectivamente. | ||
+ | |||
+ | '''Leitura da memória CODE''' | ||
+ | *Uma mensagem "ALO" foi gravada na área CODE a partir da posição de memória 5465H. Copie esta mensagem para a área de memória interna de dados, a partir das posições 76H. | ||
+ | *Repetir o exercício anterior mas agora copiando para a RAM externa de dados para um destino a partir de F555H. | ||
+ | |||
+ | |||
+ | = Aula 20/05: Instruções de desvio = | ||
+ | |||
+ | *Introdução as instruções de desvio e loop. | ||
+ | **Desvio Incondicional: | ||
+ | *** AJMP adr11 | ||
+ | *** LJMP adr16 | ||
+ | *** SJMP Rel | ||
+ | *** JMP @A+DPTR | ||
+ | **Desvio Condicional: | ||
+ | ***JZ rel | ||
+ | ***JNZ rel | ||
+ | ***CJNE A, direto ,rel | ||
+ | ***CJNE A, #data ,rel | ||
+ | ***CJNE Rn,#data ,rel | ||
+ | ***CJNE Ri,#data ,rel | ||
+ | **Desvio baseado em bits: | ||
+ | ***JC rel | ||
+ | ***JNC rel | ||
+ | ***JB bit, rel | ||
+ | ***JNB bit, rel | ||
+ | ***JBC bit, rel | ||
+ | **Loop: | ||
+ | ***DJNZ Rn, rel | ||
+ | ***DJNZ direto, rel | ||
+ | |||
+ | *Observações: | ||
+ | **adr16 –> endereço de 16 bits (endereça 64 KB) | ||
+ | **adr11 –> endereço de 11 bits (endereça 2 KB) | ||
+ | **rel –> deslocamento relativo (complemento a 2: -128 a +127) | ||
+ | **Nas instruções CJNE o flag CARRY é setado caso o conteúdo do primeiro operando seja menor que o segundo operando. Nas demais instruções o CARRY não é afetado. | ||
+ | |||
+ | |||
+ | ==Exemplo:== | ||
+ | *Simule a execução do programa abaixo e confira o uso das instruções de jump e de endereços absolutos e relativos de long e short range. | ||
+ | |||
+ | <code> | ||
+ | . | ||
+ | 1: N 0000 org 0H | ||
+ | 2: 0000 21 00 ajmp BGN | ||
+ | 3: N 0100 org 100h | ||
+ | 4: 0100 74 30 BGN: mov A,#30H | ||
+ | 5: 0102 75 50 00 mov 50H,#00H | ||
+ | 6: 0105 B5 50 02 AGN: cjne A,50H,AEQ | ||
+ | 7: 0108 80 04 sjmp NXT | ||
+ | 8: 010A D5 50 F8 AEQ: djnz 50H,AGN | ||
+ | 9: 010D 00 nop | ||
+ | 10: 010E 78 FF NXT: mov R0,#0FFH | ||
+ | 11: 0110 D8 FE DWN: djnz R0,DWN | ||
+ | 12: 0112 E8 mov A,R0 | ||
+ | 13: 0113 70 03 jnz ABIG | ||
+ | 14: 0115 02 10 00 ljmp AZR0 | ||
+ | 15: 0118 00 ABIG: nop | ||
+ | 16: N 1000 org 1000H | ||
+ | 17: 1000 74 08 AZR0: mov A,#08H | ||
+ | 18: 1002 90 10 00 mov DPTR,#1000H | ||
+ | 19: 1005 73 jmp @A+DPTR | ||
+ | 20: 1006 00 nop | ||
+ | 21: 1007 00 nop | ||
+ | 22: 1008 01 00 HERE: ajmp AZR0 | ||
+ | 23: END | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | = Aula 21/05: Instruções de desvio – Exercícios = | ||
+ | |||
+ | *Assumindo que '''alfa''' é o registrador A e '''beta''' é um dado armazenado em 20H. Mapear em assembly as seguintes estruturas decisórias: | ||
+ | :<code> | ||
+ | if (alfa==beta) { | ||
+ | /* bloco1 */ | ||
+ | } else { | ||
+ | /* bloco2 */ | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | :<code> | ||
+ | if (alfa>=beta) { | ||
+ | /* bloco1 */ | ||
+ | } else { | ||
+ | /* bloco2 */ | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | :<code> | ||
+ | if (alfa>beta) { | ||
+ | /* bloco1 */ | ||
+ | } else { | ||
+ | /* bloco2 */ | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | *Construir uma estrutura equivalente a um "for"conforme mostrado abaixo. Use o acumulador como variável de controle. | ||
+ | :<code> | ||
+ | for (i=5;i<100;i++) { | ||
+ | /* bloco */ | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | *Construir uma estrutura em assembly equivalente a um comando ''case'' do C; | ||
+ | |||
+ | *Faça um programa que escreva os números de 1 a 15H na memória interna de dados a partir do endereço 50H e na memória externa de dados a partir do endereço 2200H. Utilize modo de endereçamento indireto para escrita nas duas regiões de memória. | ||
+ | |||
+ | *Faça um programa que copie os dados da região de memória de dados externa de 2100H a 210FH para a região de memória de dados externa que inicia em 2300H. | ||
+ | |||
+ | *Faça um programa que copie os dados da área de memória de programa que devem estar armazenados a partir do endereço "TAB:" para a memória interna de dados a partir do endereço 30H. A seqüência de dados na memória de programa deve ser finalizada com o código 00. O programa deve contar o número de dados da seqüência, menos o último valor = 00, e armazenar o resultado no endereço 20h da RAM interna. | ||
+ | |||
+ | = Aula 22/05: Continuação Exercícios = | ||
+ | |||
+ | |||
+ | = Aula 27/05: Pilha e Subrotinas = | ||
+ | * Funcionamento da Pilha (Registrador, Instruções, Exemplos de Uso) | ||
+ | * Subrotinas (Motivação, Instruções e funcionamento) | ||
+ | |||
+ | |||
+ | * Exemplo: Uma subrotina para zerar n posições de memória RAM interna onde n é passado como parâmetro em R0 e o início da área em R1. | ||
+ | :<code> | ||
+ | Zerar_N: | ||
+ | mov @R1,#00 | ||
+ | inc R1 | ||
+ | djnz R0,Zerar_N | ||
+ | ret | ||
+ | </syntaxhighlight> | ||
+ | Uso: | ||
+ | :<code> | ||
+ | : | ||
+ | mov R0,#10 | ||
+ | mov R1,#30h | ||
+ | lcall Zerar_N | ||
+ | : | ||
+ | mov R0,#20 | ||
+ | mov R1,#60h | ||
+ | lcall Zerar_N | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==Roteiro== | ||
+ | ===PARTE 1=== | ||
+ | |||
+ | |||
+ | * Implementar o seguinte programa: | ||
+ | |||
+ | <code> | ||
+ | mov A,#65H | ||
+ | mov B,#87H | ||
+ | push ACC | ||
+ | push B | ||
+ | mov A,#00H | ||
+ | mov B,#00H | ||
+ | pop B | ||
+ | pop ACC | ||
+ | loop: sjmp loop | ||
+ | END | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | * Execute passo a passo no simulador. Antes de executar a primeira instrução observe o valor do registrador SP; | ||
+ | * Execute passo a passo até a execução do push ACC. Verifique o valor de SP e da área 08H da IDATA; | ||
+ | * Execute a próxima instrução e as que se seguem observando a evolução do SP e da IDATA; | ||
+ | |||
+ | ===PARTE 2=== | ||
+ | |||
+ | * Construa e assemble o seguinte programa: | ||
+ | <code> | ||
+ | ORG 0000H | ||
+ | main: ljmp ponto1 | ||
+ | |||
+ | ORG 01E5H | ||
+ | ponto1: | ||
+ | mov R0,#55H | ||
+ | mov R1,#5 | ||
+ | acall setar_mem | ||
+ | mov R0,#77H | ||
+ | mov R1,#10 | ||
+ | acall setar_mem | ||
+ | loop: sjmp loop | ||
+ | |||
+ | ORG 0315h | ||
+ | setar_mem: | ||
+ | mov @R0,#0FFh | ||
+ | inc R0 | ||
+ | djnz R1,setar_mem | ||
+ | ret | ||
+ | END | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | * Observe o valor do PC e execute o ljmp. O que aconteceu com o PC? | ||
+ | * Execute até a instrução acall. Observe o valor do PC e do SP neste momento. Execute a instrução e verifique novamente o valor do PC. O que ocorreu? | ||
+ | * Observe o estado da pilha. Que valores foram empurrados para a pilha? | ||
+ | * Execute a subrotina até o ret (exclusive). Olhe para SP e IDATA. Execute o ret. O que aconteceu? | ||
+ | |||
+ | ===PARTE 3=== | ||
+ | |||
+ | *Construa uma subrotina para copiar uma string terminada em 0 que está armazenada na área de código (CODE) para uma área da XDATA. Passar o ponteiro para a área CODE em DPTR e para a área XDATA em R1R0. Salve na entrada da subrotina os registradores que serão modificados. Teste no simulador. Use o esqueleto de programa colocado a seguir: | ||
+ | |||
+ | <code> | ||
+ | main: | ||
+ | mov DPTR,#str1 | ||
+ | mov R1,#55H | ||
+ | mov R0,#0fdh | ||
+ | lcall copiar_str | ||
+ | loop: sjmp loop | ||
+ | |||
+ | copiar_str: | ||
+ | |||
+ | ret | ||
+ | str1: db 'IFSC',0 | ||
+ | END | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | OBS.: Use a instrução movc A,@A+DPTR para ler da área de código. Use instruções do tipo mov DPH,R0 ou mov DPL,R1 para colocar valores no DPTR a partir registradores de 8 bits. | ||
+ | |||
+ | ==Exercícios== | ||
+ | #Faça uma subrotina para copiar n posições de memória RAM interna para outra área da RAM interna. Passe os parâmetros em R0, R1 e R2. | ||
+ | #Implemente uma subrotina para concatenar duas strings terminadas em 0 que estão na área CODE (ponteiros em DPTR e R1R0) para a área IDATA (ponteiro em R2). | ||
+ | #Se a pilha for inicializada para o começo da memória RAM interna endereçável por byte (SP=2FH). Quantas chamadas aninhadas de subrotina é possível? | ||
+ | |||
+ | |||
+ | =Aula 29/05: Portas Paralelas= | ||
+ | * Conceitos arquiteturais | ||
+ | * Exercícios | ||
+ | |||
+ | ==Exercícios== | ||
+ | # Construir um programa para ler um código de 8 bits da porta P1 e acionar um relé pela porta P2.0 se o código for correto. Supor existência de uma subrotina esc_liberado_acesso e esc_acesso_negado. Use o bit P2.0 para validar a entrada do código. | ||
+ | #Faça um programa que possui uma chave como entrada. Se a chave estiver ON o conteúdo do registrador A é continuamente rotacionado a esquerda, caso contrário continuamente rotacionado a direita. | ||
+ | # Modifique o exercício para externar o conteúdo de A em uma porta que controla LEDs. | ||
+ | |||
+ | =Aula 10/06: Interrupção= | ||
+ | * Conceitos gerais | ||
+ | * Conceitos arquiteturais do 8051 | ||
+ | * Exercícios | ||
+ | |||
+ | ==Exercícios== | ||
+ | #Faça um programa que aceite int0 (acionada por borda). Quando a int0 for acionada, escrever na porta P1, caractere por caractere, a cadeia de 16 caracteres: ‘Microcontrolador’. | ||
+ | #Conceber um programa que controla o acionamento de uma bomba d'água que enche um tanque. Existem sensores para detectar um nível mínimo e um nível máximo. Quando a água chega em um nível máximo a bomba deve ser desligada e quando chega a um nível mínimo a bomba deve ser ligada. | ||
+ | |||
+ | |||
+ | |||
+ | =Aula 24/06: Timer/Contador= | ||
+ | * Conceitos gerais | ||
+ | * Conceitos arquiteturais do 8051 | ||
+ | * Exercícios | ||
+ | |||
+ | *Exemplo: | ||
+ | <code> | ||
+ | delay: | ||
+ | clr TR0 ;garante que timer esteja parado | ||
+ | clr TF0 ;garante que flag de estouro esteja zerado | ||
+ | mov TMOD,#00000001b ;configura timer0 para modo 0, sem controle externo | ||
+ | mov TH0,#0D8h ;\ | ||
+ | mov TL0,#0F0h ;/ => configura timer0 com D8F0h | ||
+ | setb TR0 ;liga timer0 | ||
+ | loop: | ||
+ | jnb TF0,loop ;espera que timer0 estoure | ||
+ | clr TR0 ;para o timer0 | ||
+ | clr TF0 ;zera TF0 - note que nao eh zerado de forma automática | ||
+ | ret | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==Exercícios== | ||
+ | #Construir uma subrotina que realiza um retardo de 50ms. Suponha clock de 12Mhz. | ||
+ | #Construir uma subrotina para aguardar 1s, usando a rotina de retardo de 50 ms. | ||
+ | #Construir uma subrotina que aguarda por N segundos, passando N no registrador A. | ||
+ | #Acender um led na freqüência de 10 Hz. Use interrupção. | ||
+ | #Acender um led na freqüência de 1 Hz. Use interrupção. | ||
+ | |||
+ | |||
+ | =Aula 26/06: Serial= | ||
+ | * Comunicação Paralela vs. Serial | ||
+ | * Comunicação Assíncrona vs. Síncrona | ||
+ | * Tipos de Canal (Simplex, Half-Duplex e Full-Duplex) | ||
+ | * Conceitos da Serial do 8051 | ||
+ | *Exemplos | ||
+ | |||
+ | ==Transmissão e recepção por polling== | ||
+ | |||
+ | *O programa a seguir transmite uma mensagem armazenada a partir do endereço "texto": | ||
+ | <code> | ||
+ | org 0h | ||
+ | main: | ||
+ | acall init_uart | ||
+ | acall envia_texto | ||
+ | final: sjmp final | ||
+ | |||
+ | ;inicia a uart para baudrate 9600 | ||
+ | init_uart: | ||
+ | mov TMOD,#00100000b ; timer 1 em modo 2 | ||
+ | mov TH1, #0FDh ; baudrate 9600 | ||
+ | setb TR1 ; liga timer 1 | ||
+ | mov SCON,#01010000b ; porta serial modo 1 | ||
+ | clr TI ; para garantir clear TI mas nao eh necessario | ||
+ | ret | ||
+ | |||
+ | ;envia mensagem texto | ||
+ | envia_texto: | ||
+ | mov DPTR,#texto | ||
+ | tx_msg: mov A,#0 | ||
+ | movc A,@A+DPTR | ||
+ | acall envia_car | ||
+ | inc DPTR | ||
+ | jnz tx_msg | ||
+ | fim_tx: ret | ||
+ | |||
+ | ;envia um caracter | ||
+ | envia_car: | ||
+ | mov SBUF,A | ||
+ | loop: jnb TI,loop | ||
+ | clr TI | ||
+ | ret | ||
+ | |||
+ | texto: db "Alo Mundo" | ||
+ | |||
+ | END | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | *O programa a seguir recebe uma mensagem: | ||
+ | <code> | ||
+ | buff_rec EQU 30h | ||
+ | org 0h | ||
+ | main: | ||
+ | acall init_uart | ||
+ | acall recebe_texto | ||
+ | final: sjmp final | ||
+ | |||
+ | recebe_texto: | ||
+ | push R0 | ||
+ | push A | ||
+ | mov R0,#buff_rec | ||
+ | receber: | ||
+ | acall rec_car | ||
+ | mov @R0,A | ||
+ | inc R0 | ||
+ | jnz A,receber | ||
+ | pop A | ||
+ | pop R0 | ||
+ | ret | ||
+ | |||
+ | rec_car: | ||
+ | loop: jnb RI,loop | ||
+ | clr RI | ||
+ | mov A,SBUF | ||
+ | ret | ||
+ | |||
+ | END | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==Usando Interrupção== | ||
+ | |||
+ | O programa a seguir recebe a mensagem por interupção: | ||
+ | |||
+ | \tasm | ||
+ | <code> | ||
+ | buff_rec EQU 30h | ||
+ | org 0h | ||
+ | ljmp main | ||
+ | org 23h | ||
+ | ljmp handler_tx | ||
+ | org 100h | ||
+ | main: | ||
+ | acall init_uart | ||
+ | mov IE,#10010000b | ||
+ | mov R0,#buff_rec | ||
+ | loop: sjmp loop | ||
+ | |||
+ | handler_tx: | ||
+ | push A | ||
+ | jnb RI,fim_int ;testa se a interrupcao eh recepcao | ||
+ | mov A,SBUF | ||
+ | mov @R0,SBUF | ||
+ | inc R0 | ||
+ | fim_int: | ||
+ | pop A | ||
+ | iret | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==Trabalho Final== | ||
+ | |||
+ | *Entrega até dia 11/07 | ||
+ | *Especificação até 04/07 | ||
+ | |||
+ | |||
+ | Equipe (André, Guilherme, Mathias): [[Letreiro_Digital_MIC29004-2014-1 | Letreiro Digital]] | ||
+ | |||
+ | Equipe (Matuzalem, Carlos): [[Alarme_MIC29004-2014-1 | Alarme]] | ||
+ | |||
+ | Equipe (Ana Luiza e Karoline): [[Teste-Reflexo_MIC29004-2014-1 | Teste Reflexo]] | ||
+ | |||
+ | Equipe (Roicenir e Vinicius): [[Frequencimetro_MIC29004-2014-1 | Frequencímetro ]] | ||
+ | |||
+ | |||
+ | *Display LCD: | ||
+ | **[http://www.feng.pucrs.br/~jbenfica/curso/tutorial_lcd.pdf Apostila] | ||
+ | **[[Media:Sst-lab2_VHDL_fluxo_quartus.pdf|Slides]] | ||
+ | |||
+ | =Aula 04/07: 2ª Entrega Especificação= | ||
+ | |||
+ | =Aula 10/07: 2ª Prova= | ||
+ | |||
+ | =Aula 11/07: Apresentação do Trabalho= | ||
+ | |||
+ | Horário a ser definido com as equipes. | ||
+ | |||
+ | =Aula 17/07: Recuperação= |
Edição atual tal como às 14h51min de 14 de julho de 2014
Microprocessadores: Diário de Aula 2014-1
Professor: Roberto de Matos
Encontros: 3ª e 5ª feira às 15:40.
Atendimento paralelo: 2ª feira das 15:40 às 17:30.
Material
- Slides Histórico
- Apostila Memória
- Introdução à Microprocessadores
- Arquitetura e Organização do BIP
- Microcontrolador e 8051
Listas de Exercício
Aula 11/02: Apresentação
- Apresentação do professor.
- Apresentação dos alunos: Nome, perfil, preferências, etc.
- Apresentação da disciplina: conteúdo, bibliografia e avaliação.
- Aula Introdutória: Projetos práticos com Microcontroladores
Aula 13/02: Histórico
- Evolução dos processadores
Aula 18/02: Introdução a Memória
- Latch D e Tristate
- Célula básica de memória
- Circuito genérico de memória
- Barramentos de dados, endereços e controle
- Tamanho da memória e Largura da Palavra (N x M)
- Capacidade em bits
- Associação de Memórias
Aula 20/02: Lab. Proteus – Memória
Multiples of bytes | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Fonte: http://en.wikipedia.org/wiki/Kilobyte |
- Consolidar o conhecimento sobre memórias e barramentos de endereços, dados e controle através de um experimento no Proteus.
- Roteiro:
- Entrar no Windows.
- Baixe o arquivo de projeto. Coloque em um diretório conhecido.
- Clique sobre o arquivo. O PROTEUS será executado e o projeto aberto.
- Observe que o projeto está parcialmente pronto. Você pode entrar em modo simulação. O sistema está preparado para que se possa inserir ou ler manualmente posições de memória.
- Grave o dado Ah na posição 0 de memória e Bh na posição 8.
- Note o Chip Select está habilitado sempre. Coloque uma chave adicional para colocar o Chip Select e repita a operação de gravação anterior.
- Utilize a nova configuração para gravar o seu número de matrícula a partir da posição 0.
Exercícios
- Usando a memória do experimento como bloco base, realize a ligação entre elas de modo que se construa um banco de memória de 32 palavras de 8 bits.
- Usando a memória do experimento como bloco base, realize a ligação entre elas de modo que se construa um banco de memória de 64 palavras de 4 bits.
- Quais os tamanhos dos barramentos de endereço e dado para uma Memória de 512x8 bits?
- Determine a capacidade final em bits e o endereço inicial e final em Hexadecimal das memórias com as seguintes características:
- 512x4
- 4Kx8
- 128Kx8
- 2Mx16
Aula 25/02: Lab. Proteus – Memória (cont.)
Exercícios
- Usando a memória do experimento como bloco base, realize a ligação entre elas de modo que se construa um bancos de memórias de:
- 16 palavras de 8 bits.
- 32 palavras de 4 bits.
Aula 27/02: Tipos de Memória
- ROM (PROM, EPROM, EEPROM, FLASH);
- RAM (DRAM, SRAM, DDR)
- Diferença das células
Aula 04/03: Não Houve Aula - CARNAVAL
Aula 06/03: Introdução à Arquitetura de Computadores
Aula 11/03: Não Houve Aula
Aula 13/03: Não Houve Aula - Treinamento Proteus
Aula 17/03: Arquitetura BIP
Aula 20/03: Organização BIP
Aula 25/03: Exercício Proteus
- Executar código da memória manualmente? Qual o valor final do Acumulador?
- "Desmontar" o conteúdo da memória de programa.
- Montar os exercícios de Assembly da lista de exercícios e executar.
- Implementar o circuito decodificador da Unidade de Controle.
- Quais são as BOM da UC e UE?
Proteus
- Barramentos (conexão, bifurcação)
- Terminal Mode
- Labels
- Teclas de atalhos
Aula 27/03: Exercício Proteus (cont.)
- Simulação das instruções (busca, decodificação e execução)
- Montagem de programa
- Criação do Circuito decodificador
Proteus
- Arquivos de Inicialização da Memória
- Watch window (16-bits)
Aula 01/04: Integração do Decodificador
- Geração da decodificação do BIP a partir do Opcode.
- Compreensão do conceito de "monociclo" (busca, decodificação e execução).
Proteus
- Criação de componente
- Criação de modelos de componentes simuláveis
Aula 08/04: BIP II - Organização e arquitetura
Aula 10/04: BIP II - Modificações PC, Decodificador e ALU
Solving Large Karnaugh Maps with Smaller Ones
Aula 17/04: BIP II - Projeto Decodificador BIP II
Aula 22/04: BIP II - Teste Decodificador BIP II
- Teste decodificador.
- Reproduza cada um dos seguintes programas para assembly, atribuindo às variáveis valores que lhe permitam testar o seu programa.
a) if (a>=b)
b=b+1;
b) if (a>b)
a=a+1;
c) if (a==b)
a=a+1;
d) Adicione "else" nos exercícios anteriores.
e) a=0;c=5;
while (a<c){
a=a+1;
}
f) a=0;
for (i=0; i<5 ;i++){
a=a-1;
}
</syntaxhighlight>
Aula 24/04: BIP II - Teste Decodificador BIP II
Aula 25/04: Revisão para Prova – Dúvidas Lista de Exercício
Aula 29/04: Não Houve Aula – Convocação RDP
Aula 01/05: Não Houve Aula – Dia do Trabalhador
Aula 06/05: 1ª Prova
Aula 08/05: Microcontroladores
- Microcontrolador vs Microprocessador
- Aplicações
- Limitações
Aula 13/05: 8051
- Introdução
- Arquitetura Interna
- Memória
Aula 15/05: Assembly 8051
- Organização de um Código Assembly
- Instrução do montador: ORG, DB, END
- Prática com o MCU8051IDE.
- Conjunto de Instruções e Opcodes
- Modos de Endereçamento:
- Imediato
MOV A, #100</syntaxhighlight>
- Direto
MOV A, 20</syntaxhighlight>
- Indireto
MOV A, @R0</syntaxhighlight>
- Registro
MOV A, R0</syntaxhighlight>
- Registro Específico
MOVX A, @DPTR</syntaxhighlight>
- Indexado
MOVC A, @A+DPTR</syntaxhighlight>
Exemplo:
- INSTRUÇÕES DO 8051
ORG 0
Inicio:
mov 20h,#30h ;Ender. Imediato (valor constante esta' no opcode)
mov 30h,#07ah ;Ender. Imediato (valor constante esta' no opcode)
mov r0,30h ;Ender. Direto (operando especifica ENDERECO de 8 bits da RAM interna)
mov a,r0 ;Ender. via registrador (opcode contem 3 bits indicando qual registrador usar)
mov a,20h ;Ender. Direto (operando especifica ENDERECO de 8 bits da RAM interna)
mov a,#20h ;Ender. Imediato (valor constante esta' no opcode)
mov a,@r0 ;Ender. Indireto (registrador R0, R1, contem endereco do operando)
mov dptr,#tabela ;Ender. Imediato (valor constante esta' no opcode)
tabela: db 10h,20h,30h,0BBh,0AAh
end
</syntaxhighlight>
Aula 19/05: Exercícios Movimentação de Dados
Transferência de dados IDATA
- Construir um trecho de código para colocar a mensagem "ALO" na memória RAM interna, a partir do endereço 30H. Usar endereçamento imediato e direto.
- Construir um trecho de código para copiar 5 bytes consecutivos da memória RAM interna a partir do endereço 50H para um destino a partir de 42H. Usar somente endereçamento direto e por registrador.
- Repetir o exercício anterior usando somente endereço direto.
- Copiar 5 bytes consecutivos de uma área interna de memória de dados, a partir da posição 40H para a posição 66H. Usar endereçamento indireto e direto.
Transferência de dados XDATA
- Zerar as posições de memória RAM externa (XDATA) de número 80FFH, 9765H e FEA5H.
- Colocar a mensagem "ALO" nas posições de memória externa de dados 0670h,0671h e 0672h.
- Copiar os bytes das posições 4654H, 7687H e FADEH da XDATA para as posições 0000H, 0005H e A000H respectivamente.
Leitura da memória CODE
- Uma mensagem "ALO" foi gravada na área CODE a partir da posição de memória 5465H. Copie esta mensagem para a área de memória interna de dados, a partir das posições 76H.
- Repetir o exercício anterior mas agora copiando para a RAM externa de dados para um destino a partir de F555H.
Aula 20/05: Instruções de desvio
- Introdução as instruções de desvio e loop.
- Desvio Incondicional:
- AJMP adr11
- LJMP adr16
- SJMP Rel
- JMP @A+DPTR
- Desvio Condicional:
- JZ rel
- JNZ rel
- CJNE A, direto ,rel
- CJNE A, #data ,rel
- CJNE Rn,#data ,rel
- CJNE Ri,#data ,rel
- Desvio baseado em bits:
- JC rel
- JNC rel
- JB bit, rel
- JNB bit, rel
- JBC bit, rel
- Loop:
- DJNZ Rn, rel
- DJNZ direto, rel
- Observações:
- adr16 –> endereço de 16 bits (endereça 64 KB)
- adr11 –> endereço de 11 bits (endereça 2 KB)
- rel –> deslocamento relativo (complemento a 2: -128 a +127)
- Nas instruções CJNE o flag CARRY é setado caso o conteúdo do primeiro operando seja menor que o segundo operando. Nas demais instruções o CARRY não é afetado.
Exemplo:
- Simule a execução do programa abaixo e confira o uso das instruções de jump e de endereços absolutos e relativos de long e short range.
.
1: N 0000 org 0H
2: 0000 21 00 ajmp BGN
3: N 0100 org 100h
4: 0100 74 30 BGN: mov A,#30H
5: 0102 75 50 00 mov 50H,#00H
6: 0105 B5 50 02 AGN: cjne A,50H,AEQ
7: 0108 80 04 sjmp NXT
8: 010A D5 50 F8 AEQ: djnz 50H,AGN
9: 010D 00 nop
10: 010E 78 FF NXT: mov R0,#0FFH
11: 0110 D8 FE DWN: djnz R0,DWN
12: 0112 E8 mov A,R0
13: 0113 70 03 jnz ABIG
14: 0115 02 10 00 ljmp AZR0
15: 0118 00 ABIG: nop
16: N 1000 org 1000H
17: 1000 74 08 AZR0: mov A,#08H
18: 1002 90 10 00 mov DPTR,#1000H
19: 1005 73 jmp @A+DPTR
20: 1006 00 nop
21: 1007 00 nop
22: 1008 01 00 HERE: ajmp AZR0
23: END
</syntaxhighlight>
Aula 21/05: Instruções de desvio – Exercícios
- Assumindo que alfa é o registrador A e beta é um dado armazenado em 20H. Mapear em assembly as seguintes estruturas decisórias:
if (alfa==beta) {
/* bloco1 */
} else {
/* bloco2 */
}
</syntaxhighlight>
if (alfa>=beta) {
/* bloco1 */
} else {
/* bloco2 */
}
</syntaxhighlight>
if (alfa>beta) {
/* bloco1 */
} else {
/* bloco2 */
}
</syntaxhighlight>
- Construir uma estrutura equivalente a um "for"conforme mostrado abaixo. Use o acumulador como variável de controle.
for (i=5;i<100;i++) {
/* bloco */
}
</syntaxhighlight>
- Construir uma estrutura em assembly equivalente a um comando case do C;
- Faça um programa que escreva os números de 1 a 15H na memória interna de dados a partir do endereço 50H e na memória externa de dados a partir do endereço 2200H. Utilize modo de endereçamento indireto para escrita nas duas regiões de memória.
- Faça um programa que copie os dados da região de memória de dados externa de 2100H a 210FH para a região de memória de dados externa que inicia em 2300H.
- Faça um programa que copie os dados da área de memória de programa que devem estar armazenados a partir do endereço "TAB:" para a memória interna de dados a partir do endereço 30H. A seqüência de dados na memória de programa deve ser finalizada com o código 00. O programa deve contar o número de dados da seqüência, menos o último valor = 00, e armazenar o resultado no endereço 20h da RAM interna.
Aula 22/05: Continuação Exercícios
Aula 27/05: Pilha e Subrotinas
- Funcionamento da Pilha (Registrador, Instruções, Exemplos de Uso)
- Subrotinas (Motivação, Instruções e funcionamento)
- Exemplo: Uma subrotina para zerar n posições de memória RAM interna onde n é passado como parâmetro em R0 e o início da área em R1.
Zerar_N:
mov @R1,#00
inc R1
djnz R0,Zerar_N
ret
</syntaxhighlight>
Uso:
:
mov R0,#10
mov R1,#30h
lcall Zerar_N
:
mov R0,#20
mov R1,#60h
lcall Zerar_N
</syntaxhighlight>
Roteiro
PARTE 1
- Implementar o seguinte programa:
mov A,#65H
mov B,#87H
push ACC
push B
mov A,#00H
mov B,#00H
pop B
pop ACC
loop: sjmp loop
END
</syntaxhighlight>
- Execute passo a passo no simulador. Antes de executar a primeira instrução observe o valor do registrador SP;
- Execute passo a passo até a execução do push ACC. Verifique o valor de SP e da área 08H da IDATA;
- Execute a próxima instrução e as que se seguem observando a evolução do SP e da IDATA;
PARTE 2
- Construa e assemble o seguinte programa:
ORG 0000H
main: ljmp ponto1
ORG 01E5H
ponto1:
mov R0,#55H
mov R1,#5
acall setar_mem
mov R0,#77H
mov R1,#10
acall setar_mem
loop: sjmp loop
ORG 0315h
setar_mem:
mov @R0,#0FFh
inc R0
djnz R1,setar_mem
ret
END
</syntaxhighlight>
- Observe o valor do PC e execute o ljmp. O que aconteceu com o PC?
- Execute até a instrução acall. Observe o valor do PC e do SP neste momento. Execute a instrução e verifique novamente o valor do PC. O que ocorreu?
- Observe o estado da pilha. Que valores foram empurrados para a pilha?
- Execute a subrotina até o ret (exclusive). Olhe para SP e IDATA. Execute o ret. O que aconteceu?
PARTE 3
- Construa uma subrotina para copiar uma string terminada em 0 que está armazenada na área de código (CODE) para uma área da XDATA. Passar o ponteiro para a área CODE em DPTR e para a área XDATA em R1R0. Salve na entrada da subrotina os registradores que serão modificados. Teste no simulador. Use o esqueleto de programa colocado a seguir:
main:
mov DPTR,#str1
mov R1,#55H
mov R0,#0fdh
lcall copiar_str
loop: sjmp loop
copiar_str:
ret
str1: db 'IFSC',0
END
</syntaxhighlight>
OBS.: Use a instrução movc A,@A+DPTR para ler da área de código. Use instruções do tipo mov DPH,R0 ou mov DPL,R1 para colocar valores no DPTR a partir registradores de 8 bits.
Exercícios
- Faça uma subrotina para copiar n posições de memória RAM interna para outra área da RAM interna. Passe os parâmetros em R0, R1 e R2.
- Implemente uma subrotina para concatenar duas strings terminadas em 0 que estão na área CODE (ponteiros em DPTR e R1R0) para a área IDATA (ponteiro em R2).
- Se a pilha for inicializada para o começo da memória RAM interna endereçável por byte (SP=2FH). Quantas chamadas aninhadas de subrotina é possível?
Aula 29/05: Portas Paralelas
- Conceitos arquiteturais
- Exercícios
Exercícios
- Construir um programa para ler um código de 8 bits da porta P1 e acionar um relé pela porta P2.0 se o código for correto. Supor existência de uma subrotina esc_liberado_acesso e esc_acesso_negado. Use o bit P2.0 para validar a entrada do código.
- Faça um programa que possui uma chave como entrada. Se a chave estiver ON o conteúdo do registrador A é continuamente rotacionado a esquerda, caso contrário continuamente rotacionado a direita.
- Modifique o exercício para externar o conteúdo de A em uma porta que controla LEDs.
Aula 10/06: Interrupção
- Conceitos gerais
- Conceitos arquiteturais do 8051
- Exercícios
Exercícios
- Faça um programa que aceite int0 (acionada por borda). Quando a int0 for acionada, escrever na porta P1, caractere por caractere, a cadeia de 16 caracteres: ‘Microcontrolador’.
- Conceber um programa que controla o acionamento de uma bomba d'água que enche um tanque. Existem sensores para detectar um nível mínimo e um nível máximo. Quando a água chega em um nível máximo a bomba deve ser desligada e quando chega a um nível mínimo a bomba deve ser ligada.
Aula 24/06: Timer/Contador
- Conceitos gerais
- Conceitos arquiteturais do 8051
- Exercícios
- Exemplo:
delay:
clr TR0 ;garante que timer esteja parado
clr TF0 ;garante que flag de estouro esteja zerado
mov TMOD,#00000001b ;configura timer0 para modo 0, sem controle externo
mov TH0,#0D8h ;\
mov TL0,#0F0h ;/ => configura timer0 com D8F0h
setb TR0 ;liga timer0
loop:
jnb TF0,loop ;espera que timer0 estoure
clr TR0 ;para o timer0
clr TF0 ;zera TF0 - note que nao eh zerado de forma automática
ret
</syntaxhighlight>
Exercícios
- Construir uma subrotina que realiza um retardo de 50ms. Suponha clock de 12Mhz.
- Construir uma subrotina para aguardar 1s, usando a rotina de retardo de 50 ms.
- Construir uma subrotina que aguarda por N segundos, passando N no registrador A.
- Acender um led na freqüência de 10 Hz. Use interrupção.
- Acender um led na freqüência de 1 Hz. Use interrupção.
Aula 26/06: Serial
- Comunicação Paralela vs. Serial
- Comunicação Assíncrona vs. Síncrona
- Tipos de Canal (Simplex, Half-Duplex e Full-Duplex)
- Conceitos da Serial do 8051
- Exemplos
Transmissão e recepção por polling
- O programa a seguir transmite uma mensagem armazenada a partir do endereço "texto":
org 0h
main:
acall init_uart
acall envia_texto
final: sjmp final
- inicia a uart para baudrate 9600
init_uart:
mov TMOD,#00100000b ; timer 1 em modo 2
mov TH1, #0FDh ; baudrate 9600
setb TR1 ; liga timer 1
mov SCON,#01010000b ; porta serial modo 1
clr TI ; para garantir clear TI mas nao eh necessario
ret
- envia mensagem texto
envia_texto:
mov DPTR,#texto
tx_msg: mov A,#0
movc A,@A+DPTR
acall envia_car
inc DPTR
jnz tx_msg
fim_tx: ret
- envia um caracter
envia_car:
mov SBUF,A
loop: jnb TI,loop
clr TI
ret
texto: db "Alo Mundo"
END
</syntaxhighlight>
- O programa a seguir recebe uma mensagem:
buff_rec EQU 30h
org 0h
main:
acall init_uart
acall recebe_texto
final: sjmp final
recebe_texto:
push R0
push A
mov R0,#buff_rec
receber:
acall rec_car
mov @R0,A
inc R0
jnz A,receber
pop A
pop R0
ret
rec_car:
loop: jnb RI,loop
clr RI
mov A,SBUF
ret
END
</syntaxhighlight>
Usando Interrupção
O programa a seguir recebe a mensagem por interupção:
\tasm
buff_rec EQU 30h
org 0h
ljmp main
org 23h
ljmp handler_tx
org 100h
main:
acall init_uart
mov IE,#10010000b
mov R0,#buff_rec
loop: sjmp loop
handler_tx:
push A
jnb RI,fim_int ;testa se a interrupcao eh recepcao
mov A,SBUF
mov @R0,SBUF
inc R0
fim_int:
pop A
iret
</syntaxhighlight>
Trabalho Final
- Entrega até dia 11/07
- Especificação até 04/07
Equipe (André, Guilherme, Mathias): Letreiro Digital
Equipe (Matuzalem, Carlos): Alarme
Equipe (Ana Luiza e Karoline): Teste Reflexo
Equipe (Roicenir e Vinicius): Frequencímetro
Aula 04/07: 2ª Entrega Especificação
Aula 10/07: 2ª Prova
Aula 11/07: Apresentação do Trabalho
Horário a ser definido com as equipes.
Aula 17/07: Recuperação