Escola de Engenharia Elétrica, Mecânica e de Computação Universidade Federal de Goiás Laboratório de Microprocessadores e Microcontroladores Experimento 4: Motor de Passo e Display LCD Alunos: Matrícula: Prof. Dr. José Wilson Lima Nerys Goiânia, 1º semestre de 2017
Laboratório de Microprocessadores e Microcontroladores 2 SUMÁRIO 1 Motor de Passo e Display LCD... 3 1.1 Motor de Passo... 3 1.2 Display LCD... 4 2 Atividades do Experimento 4... 5 2.1 Acionamento de Motor de Passo com Leitura de Tabela... 5 2.2 Acionamento de Motor de Passo com Rotação de Bits... 6 2.3 Contagem Crescente no Display LCD... 7 2.4 Contagem Decrescente no Display LCD... 10 2.5 Acionamento do Motor de Passo com Mensagem no Display LCD... 10
Laboratório de Microprocessadores e Microcontroladores 3 1 Motor de Passo e Display LCD 1.1 Motor de Passo O motor de passo consiste de um estator contendo bobinas que são acionadas usando corrente contínua e um rotor de ímã permanente, que gira a cada mudança das bobinas acionadas. Embora nas figuras a seguir as quatro bobinas sejam mostradas como únicas (concentradas), na prática elas são distribuídas ao longo do estator. Assim, pode-se obter um passo bem pequeno entre um pedaço de bobina e outro. O ângulo de passo típico do motor de passo utilizado aqui é 7,5. As figuras abaixo ilustram, de maneira simplificada, o funcionamento de um motor de passo. Observe que, na figura, uma volta completa do motor é alcançada após percorrer todas as bobinas uma vez. Na prática, uma volta completa é conseguida após uma passagem por todas as partes de cada bobina. Se cada passo for de 7,5, uma volta completa é alcançada com 48 passos. Na Fig. 1 também são mostrados os transistores usados no acionamento e as bobinas concentradas. É mostrada também uma tabela com os comandos que devem ser enviados para a porta de saída (na verdade, dados enviados ao periférico motor de passo) de forma que o motor de passo gire de meio em meio passo e com passo completo. Tabela 1: valores para acionamento do motor de passo - passo completo Passo P3 P2 P1 P0 HEX 1 0 0 0 1 01 2 0 0 1 0 02 3 0 1 0 0 04 4 1 0 0 0 08 5 0 0 0 1 01 Fig. 1: Esquema do motor de passo e tabela de acionamento O circuito da Fig. 1 é o circuito típico utilizado no acionamento de motor de passo, entretanto, há pastilhas integradas que são também utilizadas para essa função. Um circuito integrado que pode ser usado para esse fim é o CI ULN2803A, mostrado na Fig. 2. Trata-se de um conjunto de transistores do tipo darlington, com capacidade de corrente de 500 ma. Cada uma das 4 bobinas do motor é ligada a uma das saídas (OUT) e ao terminal comum (COM), que é conectado à fonte de alimentação do motor de passo, que não precisa, necessariamente, ser a mesma do microcontrolador. Fig. 2: Driver para motor de passo - ULN2803A
Laboratório de Microprocessadores e Microcontroladores 4 1.2 Display LCD Na explicação desta seção é usado um display LCD de 2 linhas x 16 colunas, cuja pinagem é mostrada na Fig. 3. O número de linhas e colunas é uma informação enviada na forma de comando para o LCD, numa rotina de inicialização necessária a cada vez que o LCD vai ser usado. Outras informações necessárias são: se o cursor vai ficar piscando, se a mensagem vai rolar para a esquerda ou para a direita, ou não vai rolar, se serão usados 4 ou 8 bits para os dados etc. A Tabela 2 mostra os sinais de controle para escrita e leitura do LCD. A Tabela 3 mostra as instruções mais comuns utilizadas no uso do LCD. Fig. 3: Display LCD de 2 linhas por 16 colunas Tabela 2: Habilitação do display LCD E RW RS Operação 0 Display desabilitado 1 0 0 Escrita de Instrução no LCD 1 0 1 Escrita de Dados no LCD 1 1 0 Leitura de Instrução do LCD 1 1 1 Leitura de Dados do LCD Tabela 3: instruções mais comuns utilizadas para o display LCD DESCRIÇÃO MODO RS R/W Código (Hexa) Display Liga (sem cursor) 0 0 0C Desliga 0 0 0A/08 Limpa Display com Home cursor 0 0 01 Controle do Cursor Liga 0 0 0E Desliga 0 0 0C Desloca para Esquerda 0 0 10 Desloca para Direita 0 0 14 Cursor Home 0 0 02 Cursor Piscante 0 0 0D Cursor com Alternância 0 0 0F Sentido de deslocamento do cursor ao Para a esquerda 0 0 04 entrar com caractere Para a direita 0 0 06 Deslocamento da mensagem ao entrar Para a esquerda 0 0 07 com caractere Deslocamento da mensagem sem entrada de caractere Endereço da primeira posição Primeira linha 0 0 80 Segunda linha 0 0 C0 Para a direita 0 0 05 Para a esquerda 0 0 18 Para a direita 0 0 1C A Tabela 4 mostra o endereço em decimal de cada posição do LCD de 16 colunas x 2 linhas. Tabela 4: Endereços em decimal do display LCD Colunas 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Linha 1 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 Linha 2 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207
Laboratório de Microprocessadores e Microcontroladores 5 2 Atividades do Experimento 4 Os programas das tarefas a seguir devem ser digitados e compilados no simulador MCU8051 e executados no simulador do kit didático e no kit didático real do microcontrolador 8051. No acionamento do motor de passo serão utilizadas duas maneiras de acionar o motor: através da leitura de uma tabela com os valores a serem enviados para o motor e através da rotação de bits na porta em que o motor está conectado. O motor de passo será acionado no sentido horário e no sentido antihorário, com passo completo e com meio passo. 2.1 Acionamento de Motor de Passo com Leitura de Tabela No roteiro da Tabela 5 a Flag F0 é utilizada para mudar o sentido de rotação do motor de passo. Ela é alterada através da interrupção externa 0. A chave no pino P3.3, denominada Meio, é usada para mudar de passo completo para meio passo. Obs.: a interrupção externa 1 não é utilizada neste experimento. Tabela 5: Acionamento de motor de passo usando tabela Rótulo Instrução Rótulo Instrução 1 Meio EQU P3.3 27 HORARIO: JNB Meio,Hora_Meio 2 Offset EQU 10H 28 MOV DPTR,#Tab_Hora 3 29 SJMP V1 4 ORG 00H 30 Hora_Meio: MOV DPTR,#Tab_Hora2 5 LJMP INICIO 31 6 32 V1: MOV A,Offset 7 ORG 03H 33 MOVC A,@A+DPTR 8 CPL F0 34 CJNE A,#0FFH, ENVIA 9 CLR IE0 35 SJMP V0 10 RETI 36 11 37 ENVIA: MOV P2,A 12 ORG 30H 38 LCALL ATRASO 13 INICIO: MOV SP, #2FH 39 INC Offset 14 MOV IE,#81H 40 SJMP V2 15 MOV TCON,#01H 41 16 42 Tab_Anti: DB 01h, 02h, 04h, 08h, 0FFh 17 V0: MOV Offset,#00H 43 Tab_Anti2: DB 01h, 03h, 02h, 06h, 04h, 0Ch, 08h, 09h, 0ffh 18 V2: JB F0,HORARIO 44 Tab_Hora: DB 08H, 04H, 02H, 01H, 0FFh 19 JNB Meio, Anti_Meio 45 Tab_Hora2: DB 09h, 08h, 0Ch, 04h, 06h, 02h, 03h, 01h, 0ffh 20 46 21 MOV DPTR,#Tab_Anti 47 ATRASO: MOV R0, #100 22 SJMP V1 48 V3: MOV R1, #200 23 49 DJNZ R1, $ 24 Anti_Meio: MOV DPTR,#Tab_Anti2 50 DJNZ R0, V3 25 SJMP V1 51 RET 26 52 END Questão 1: Qual a função da instrução JB F0, HORARIO, no programa da Tabela 5? Questão 2: Qual a função da instrução JNB Meio, Anti_Meio, no programa da Tabela 5?
Laboratório de Microprocessadores e Microcontroladores 6 Questão 3: Qual a função do trecho da linha 7 à linha 10? Questão 4: Qual a função do trecho da linha 18 à linha 30? Questão 5: Qual a função do trecho da linha 32 à linha 40? 2.2 Acionamento de Motor de Passo com Rotação de Bits No roteiro da Tabela 6 as interrupções externas são utilizadas para a rotação do motor de passo no sentido anti-horário (INT0 acionada por nível) e no sentido horário (INT1 por transição, com prioridade alta). Tabela 6: Acionamento de motor de passo usando rotação de bits Rótulo Instrução Rótulo Instrução 1 ORG 00H 17 ANTI_HORARIO: MOV P2,A 2 LJMP INICIO 18 RL A 3 19 LCALL ATRASO 4 ORG 03H 20 RETI 5 LJMP ANTI_HORARIO 21 6 22 HORARIO: MOV R7,#100 7 ORG 13H 23 V1: MOV P2,A 8 LJMP HORARIO 24 RR A 9 25 LCALL ATRASO 10 ORG 30H 26 DJNZ R7, V1 11 INICIO: MOV SP, #2FH 27 CLR IE1 12 MOV IE,#85H 28 RETI 13 MOV TCON,#04H 29 14 MOV IP,#04H 30 ATRASO: MOV R0, #200 15 MOV A,#11H 31 V3: MOV R1, #200 16 SJMP $ 32 DJNZ R1, $ 33 DJNZ R0, V3 34 RET 35 END Questão 1: Qual a configuração resultante da execução do trecho da linha 12 à linha 16? Questão 2: Qual a condição para a execução do trecho da linha 17 à linha 20?
Laboratório de Microprocessadores e Microcontroladores 7 Questão 3: Qual a condição para a execução do trecho da linha 22 à linha 28? Qual a finalidade da instrução CLR IE1 na linha 27? 2.3 Contagem Crescente no Display LCD O programa da Tabela 7 mostra no display LCD uma contagem decimal crescente de 0000 a 9999. O byte superior da contagem é guardado em R1 e o byte inferior em R0. O display LCD está conectado à porta P0. Os pinos P3.5, P3.6 e P3.7 são pinos de controle do display. Tabela 7: Contagem no display LCD Rótulo Mnemônico Comentário sobre o Efeito da Operação 1 RS EQU P3.5 ; RS = 0 INSTRUÇÃO. RS = 1 DADO 2 RW EQU P3.6 ; RW =0 ESCRITA. RW = 1 LEITURA 3 EN EQU P3.7 ; PINO DE HABILITAÇÃO DO LCD 4 LCD EQU P0 ; Porta P0 é o canal de dados 5 6 ORG 00H 7 LJMP INICIO 8 9 ORG 30H 10 INICIO: MOV SP,#2FH ; Apontador de pilha SP = 2FH 11 MOV R0,#00 ; Byte inferior da contagem 12 MOV R1,#00 ; Byte superior da contagem 13 MOV R7,#0FFH ; Contador 14 LCALL INICIA ; Chama subrotina de inicialização do LCD 15 LCALL LINHA1 ; Chama subrotina que mostra mensagem na linha 1 16 LCALL LINHA2 ; Chama subrotina que mostra mensagem na linha 2 17 18 REPETE: LCALL CONTAGEM ; Chama subrotina de contagem decimal contagem de 0000 a 9999 19 LCALL DISPLAY ; Chama subrotina que mostra a contagem no display 20 LCALL ATRASO 21 LCALL ATRASO 22 LCALL ATRASO 23 SJMP REPETE ; Volta para o início 24 25 ; SUBROTINA DE INICIALIZAÇÃO DO DISPLAY LCD 26 INICIA: MOV A,#38H ; Instrução que indica display de 16 colunas e 2 linhas 27 LCALL INSTR_WR ; Chama subrotina para escrever instrução no LCD 28 MOV A,#38H ; Instrução que indica display de 16 colunas e 2 linhas 29 LCALL INSTR_WR ; Chama subrotina para escrever instrução no LCD 30 MOV A,#0EH ; Instrução para ligar o cursor 31 LCALL INSTR_WR ; Chama subrotina para escrever instrução no LCD 32 MOV A,#06H ; Instrução para deslocar cursor para a direita 33 LCALL INSTR_WR ; Chama subrotina para escrever instrução no LCD 34 MOV A,#01H ; Instrução para limpar LCD 35 LCALL INSTR_WR ; Chama subrotina para escrever instrução no LCD 36 RET 37 38 LINHA1: INC R7 ; Incrementa contador 39 MOV A,R7 ; Carrega acumulador com o conteúdo do contador 40 MOV DPTR,#MSG1 ; DPTR recebe o endereço da mensagem MSG1 41 MOVC A,@A+DPTR ; Acumulador recebe o código do caractere do endereço A+DPTR 42 CJNE A,#0FFH,V1 ; Se A = 0FFH fim da mensagem. Caso contrário, pula para V1 43 RET 44 V1: LCALL TEXTO_WR 45 SJMP LINHA1 46
Laboratório de Microprocessadores e Microcontroladores 8 47 LINHA2: MOV A,#192 ; Instrução para definir endereço do LCD: 192 = C0H 48 LCALL INSTR_WR ; Chama subrotina para escrever instrução no LCD 49 MOV R7,#0FFH ; Contador recebe valor FFH 50 V3: INC R7 ; Incrementa contador 51 MOV A,R7 ; Carrega acumulador com o conteúdo do contador 52 MOV DPTR,#MSG2 ; DPTR recebe o endereço da mensagem MSG2 53 MOVC A,@A+DPTR ; Acumulador recebe o código do caractere do endereço A+DPTR 54 CJNE A,#0FFH,V2 ; Se A = 0FFH fim da mensagem. Caso contrário, pula para V2 55 RET 56 57 V2: LCALL TEXTO_WR ; Chama subrotina para escrever dados no LCD 58 SJMP V3 59 60 INSTR_WR: SETB EN ; Habilita LCD 61 CLR RW ; Operação de escrita no LCD 62 CLR RS ; Operação com instrução 63 MOV LCD, A ; Transfere a instrução para o LCD 64 CLR EN ; Desabilita LCD 65 LCALL ATRASO_LCD ; Chama subrotina de atraso do LCD 66 RET 67 68 TEXTO_WR: SETB EN ; Habilita LCD 69 CLR RW ; Operação de escrita no LCD 70 SETB RS ; Operação com dados 71 MOV LCD, A ; Transfere os dados para o LCD 72 CLR EN ; Desabilita LCD 73 LCALL ATRASO_LCD ; Chama subrotina de atraso do LCD 74 RET 75 76 CONTAGEM: MOV A,R0 ; Carrega acumulador com valor atual do byte inferior 77 ADD A,#01H ; Incrementa acumulador em uma unidade 78 DA A ; Faz o ajuste decimal do byte inferior 79 MOV R0,A ; Atualiza o valor de R0 80 JNC V4 ; Desvia para V4 se não houver Carry, ou seja, se R0 =< 99 81 82 MOV A,R1 ; Carrega acumulador com valor atual do byte superior 83 ADD A,#01H ; Incrementa acumulador em uma unidade 84 DA A ; Faz o ajuste decimal do byte superior 85 MOV R1,A ; Atualiza o valor de R1 86 V4: NOP 87 RET 88 89 ; SUBROTINAS PARA CONVERTER VALORES EM ASCII E MOSTRAR NO DISPLAY 90 DISPLAY: MOV A,#0F0H ; Prepara a separação do nibble superior de R1 91 ANL A,R1 ; Separa nibble superior de R1 92 SWAP A ; Inverte nibble superior com inferior 93 ORL A,#30H ; Converte nibble superior de R1 em ASCII 94 LCALL MOSTRA4 ; Mostra o dígito mais significativo da contagem 95 96 MOV A,#0FH ; Prepara a separação do nibble inferior de R1 97 ANL A,R1 ; Separa nibble inferior de R1 98 ORL A,#30H ; Converte nibble inferior de R1 em ASCII 99 LCALL TEXTO_WR ; Mostra Dígito 3 no display LCD 100 101 MOV A,#0F0H ; Prepara a separação do nibble superior de R0 102 ANL A,R0 ; Separa nibble superior de R0 103 SWAP A ; Inverte nibble superior com inferior 104 ORL A,#30H ; Converte nibble superior de R1 em ASCII 105 LCALL TEXTO_WR ; Mostra Dígito 2 no display LCD 106 107 MOV A,#0FH ; Prepara a separação do nibble inferior de R0 108 ANL A,R0 ; Separa nibble inferior de R0 109 ORL A,#30H ; Converte nibble inferior de R0 em ASCII 110 LCALL TEXTO_WR ; Mostra Dígito 1 no display LCD 111 RET 112
Laboratório de Microprocessadores e Microcontroladores 9 113 ; SUBROTINA PARA MOSTRAR NO DISPLAY O DÍGITO 4 DA CONTAGEM 114 MOSTRA4: PUSH ACC ; Guarda dígito 4 na pilha, antes de definir endereço no LCD 115 MOV A,#202 ; Endereço do dígito 4 116 LCALL INSTR_WR ; Chama subrotina para escrever instrução no LCD 117 POP ACC ; Recupera dígito 4 da pilha 118 LCALL TEXTO_WR ; Chama subrotina para escrever dados no LCD dígito 4 119 RET 120 121 ATRASO_LCD: MOV R4,#10 ; Carrega registrador R4 com valor decimal 10 122 V6: MOV R5,#80 ; Carrega registrador R5 com valor decimal 80 123 DJNZ R5,$ ; Aguarda registrador R5 zerar 124 DJNZ R4,V6 ; Decrementa R4. Enquanto não for zero, volta para recarregar R5 126 RET ; Retorna de subrotina de atraso de tempo 127 128 ATRASO: MOV R4,#50 ; Carrega registrador R4 com valor decimal 50 129 V5: MOV R5,#250 ; Carrega registrador R5 com valor decimal 250 130 DJNZ R5,$ ; Aguarda registrador R5 zerar 131 DJNZ R4,V5 ; Decrementa R4. Enquanto não for zero, volta para recarregar R5 132 RET ; Retorna de subrotina de atraso de tempo 133 134 MSG1: DB MICROCONTROLADOR, 0FFH 135 136 MSG2: DB CONTAGEM:,0FFH 137 FIM: NOP 138 END Após a inicialização do LCD através das sub-rotinas INICIA, LINHA1 e LINHA2, a rotina principal do programa é o trecho da linha 18 à linha 23. A partir desse trecho todas as outras sub-rotinas são chamadas. Questão 1: Qual a função das sub-rotinas INSTR_WR (linhas 60 a 66) e TEXTO_WR (linhas 68 a 74)? Questão 2: Como funciona a sub-rotina CONTAGEM, das linhas 76 a 87? Questão 3: Como funciona a sub-rotina DISPLAY, das linhas 90 a 111?
Laboratório de Microprocessadores e Microcontroladores 10 2.4 Contagem Decrescente no Display LCD No programa da Tabela 7, adapte a sub-rotina CONTAGEM de modo que a contagem passe a ser decrescente (9999 até 0000). Tabela 8: Sub-rotinas para as contagens crescente e decrescente no display LCD ; CONTAGEM DE 0000 A 9999 ; CONTAGEM DE 9999 A 0000 CONTAGEM: MOV A,R0 CONTAGEM: ADD A,#01H DA A MOV R0,A JNC V4 MOV A,R1 ADD A,#01H DA A MOV R1,A V4: NOP RET 2.5 Acionamento do Motor de Passo com Mensagem no Display LCD O roteiro da Tabela 9 deve ser implementado apenas no Simulador do Kit Didático (porque, no Kit Didático real não é possível utilizar de forma simultânea os módulos do motor e do display). Nesse roteiro a Flag F0 é utilizada para definir o sentido de rotação horário (F0 =1) ou antihorário (F0 = 0), do motor de passo. Uma mensagem é enviada ao display, com o sentido de rotação. O estado de F0 é alterado através da interrupção externa zero. A chave do pino P3.3 é usado para Ligar (P3.3 = 0) e Desligar (P3.3 = 1) o motor de passo. Tabela 9: Acionamento do motor de passo com mensagem no display LCD Rótulo Mnemônico Rótulo Mnemônico 1 LIGA EQU P3.3 60 LINHA1: MOV A,R7 2 RS EQU P3.5 61 MOV DPTR,#MSG1 3 RW EQU P3.6 62 MOVC A,@A+DPTR 4 EN EQU P3.7 63 CJNE A,#0FFH,V1 5 LCD EQU P0 64 RET 6 65 7 ORG 00H 66 V1: LCALL TEXTO_WR 8 LJMP INICIO 67 INC R7 9 68 SJMP LINHA1 10 ORG 03H 69 11 CPL F0 70 LINHA2: MOV A,#192 12 CLR IE0 71 LCALL INSTR_WR 13 RETI 72 MOV R7,#00H 14 73 V3: MOV A,R7 15 ORG 30H 74 MOVC A,@A+DPTR 16 INICIO: MOV SP,#2FH 75 CJNE A,#0FFH,V2 17 MOV IE,#81H 76 RET 18 MOV TCON,#01H 77 V2: LCALL TEXTO_WR 19 MOV R7,#00H 78 INC R7 20 MOV R6,#11H 79 SJMP V3 21 LCALL INICIA 80 22 LCALL LINHA1 81 INSTR_WR: SETB EN 23 82 CLR RW 24 V0: JNB LIGA,ACIONA 83 CLR RS 25 MOV DPTR,#MSG4 84 MOV LCD, A 26 LCALL LINHA2 85 CLR EN 27 SJMP V0 86 LCALL ATRASO_LCD 28 87 RET
Laboratório de Microprocessadores e Microcontroladores 11 29 ACIONA: JB F0,HORARIO 88 TEXTO_WR: SETB EN 30 MOV DPTR,#MSG2 89 CLR RW 31 LCALL LINHA2 90 SETB RS 32 MOV P2,R6 91 MOV LCD, A 33 LCALL ATRASO 92 CLR EN 34 MOV A,R6 93 LCALL ATRASO_LCD 35 RL A 94 RET 36 MOV R6,A 95 37 SJMP V0 96 38 97 ATRASO_LCD: MOV R4,#10 39 HORARIO: MOV DPTR,#MSG3 98 V6: MOV R5,#80 40 LCALL LINHA2 99 DJNZ R5,$ 41 MOV P2,R6 100 DJNZ R4,V6 42 LCALL ATRASO 101 RET 43 MOV A,R6 102 44 RR A 103 45 MOV R6,A 104 ATRASO: MOV R4,#150 46 SJMP V0 105 V5: MOV R5,#250 47 106 DJNZ R5,$ 48 INICIA: MOV A,#38H 107 DJNZ R4,V5 49 LCALL INSTR_WR 108 RET 50 MOV A,#38H 109 51 LCALL INSTR_WR 110 52 MOV A,#0EH 111 MSG1: DB Motor de Passo, 0FFh 53 LCALL INSTR_WR 112 MSG2: DB Anti-Horario, 0FFh 54 MOV A,#06H 113 MSG3: DB Sentido Horario, 0FFh 55 LCALL INSTR_WR 114 MSG4: DB Desligado, 0FFh 56 MOV A,#01H 115 57 LCALL INSTR_WR 116 END 58 RET 117 59 Questão 1: Qual é a configuração resultante da execução das instruções das linhas 17 a 20? Questão 2: A rotina principal do programa da Tabela 9 está no trecho das linhas 24 a 46. Explique o funcionamento dessa rotina.