MICROCONTROLADOR 8051

Eng. Jefferson Couto

INDICE
1) SISTEMAS DE NUMERAÇÃO................................................................................................................................................... 3 1.1) SISTEMA BINÁRIO (BASE 2) ............................................................................................................................................ 3 1.2) SISTEMA HEXADECIMAL (BASE 16)................................................................................................................................ 4 1.3) FORMAS DE APRESENTAÇÃO ........................................................................................................................................ 4 1.4) CONVERSÃO DO SISTEMA BINÁRIO PARA O SISTEMA DECIMAL ............................................................................... 5 1.5) CONVERSÃO DO SISTEMA HEXADECIMAL PARA O SISTEMA DECIMAL .................................................................... 5 1.6) CONVERSÃO DO SISTEMA DECIMAL PARA O SISTEMA BINÁRIO ............................................................................... 5 1.7) CONVERSÃO DE DECIMAL PARA UMA BASE QUALQUER............................................................................................ 6 1.8) CONVERSÃO ENTRE AS BASES 2 E 16 .......................................................................................................................... 6 2) OPERAÇÕES ARITMÉTICAS NO SISTEMA BINÁRIO ............................................................................................................. 8 2.1) ADIÇÃO.............................................................................................................................................................................. 8 2.2) SUBTRAÇÃO ..................................................................................................................................................................... 8 2.3) COMPLEMENTO DE 2 ....................................................................................................................................................... 9 2.4) DESLOCAMENTO............................................................................................................................................................ 11 3) OPERAÇÕES LÓGICAS ......................................................................................................................................................... 12 3.1) AND.................................................................................................................................................................................. 12 3.2) OR .................................................................................................................................................................................... 13 3.3) NOT.................................................................................................................................................................................. 13 3.4) XOR.................................................................................................................................................................................. 14 4) TERMOS IMPORTANTES ....................................................................................................................................................... 16 5) MICROCONTROLADORES..................................................................................................................................................... 21 5.1) MICROPROCESSADOR: ................................................................................................................................................. 21 5.2) BARRAMENTOS DE UM MICROCONTROLADOR.......................................................................................................... 23 5.3) MODOS DE ATENDIMENTO DE I/O................................................................................................................................ 24 6) MICROCONTROLADOR 8031/8051........................................................................................................................................ 25 6.1) PINAGEM:........................................................................................................................................................................... 25 6.2) BARRAMENTO MULTIPLEXADO:............................................................................................................................................. 26 6.3) CLOCK NO 80C51............................................................................................................................................................ 27 ................................................................................................................................................................................................ 28 6.4) RESET DO MICROCONTROLADOR ............................................................................................................................... 28 6.5) INTERRUPÇOES ............................................................................................................................................................. 30 ................................................................................................................................................................................................ 33 6.6) INTERRUPÇÃO EXTERNA .............................................................................................................................................. 34 6.7) TEMPORIZADOR E CONTADOR .................................................................................................................................... 35 6.8) COMUNICAÇÃO SERIAL ................................................................................................................................................. 37 6.9) INTERFACE SERIAL NO 8051......................................................................................................................................... 38 6.10) TAXA DE TRANSMISSÃO PARA OS MODOS 1 E 3 .................................................................................................... 39 6.11) TABELA PRÁTICA COM TAXAS PARA O CRISTAL DE 11,0592 MHZ .......................................................................... 39 7) PROGRAMAÇÃO “C” PARA O MICROCONTROLADOR 8051.............................................................................................. 40 7.1) TIPOS DE VARIÁVEIS EM C ........................................................................................................................................... 41 7.2) OPERADORES ARITMÉTICOS ....................................................................................................................................... 41 7.3) OPERADORES LÓGICOS E RELACIONAIS ................................................................................................................... 42 7.4) OPERADORES DE MANIPULAÇÃO DE BIT ................................................................................................................... 42 7.5) DIRETIVAS FUNDAMENTAIS DO PRÉ – COMPILADOR................................................................................................ 43 7.6) CONTROLE DE FLUXO ................................................................................................................................................... 44 7.7) MAPA DE ALOCAÇÃO DE VARIÁVEIS NO 8051 ............................................................................................................ 50

8) AMBIENTE DE DESENVOLVIMENTO INTEGRADO ( IDE )................................................................................................... 51 8.1) MIDE-51 ........................................................................................................................................................................... 52 8.1.1) PRIMEIRO PROGRAMA ............................................................................................................................................... 53 8.1.2) COMPILANDO E CARREGADO O PROGRAMA .......................................................................................................... 54 8.1.3) CONFIGURANDO O EDITOR PARA A PLACA DIDÁTICA ........................................................................................... 55 8.2) W INLOADER51 ................................................................................................................................................................... 56 9) EXEMPLO DE PROGRAMAS PARA A PLACA DIDÁTICA PWLOADER51............................................................................ 60 9.1) ENTRADA DE DADOS PELO TECLADO E SAÍDA PELO DISPLAY DE LCD ....................................................................................... 60 9.2) LEITURA NO CONVERSOR ANALÓGICO/DIGITAL (A/D) ............................................................................................................. 61 9.3) ESCRITA NO CONVERSOR ANALÓGICO/DIGITAL (D/A) ............................................................................................................ 64 9.4) PHASE WIDTH MODULATION ( PWM) ........................................................................................................................... 65 9.5) MEDIR LARGURA DE PULSO .................................................................................................................................................. 67 10) FUNÇÕES DA BIBLIOTECA PWLIB..................................................................................................................................... 69 11) INFORMAÇÕES SOBRE O KIT ............................................................................................................................................ 78

PROWARE PROJ. E SIST. ELETRÔNICOS

1) SISTEMAS DE NUMERAÇÃO
Existem vários sistemas de numéricos, dentre os quais se destacam o decimal, o binário, o octal e o hexadecimal. O sistema decimal é utilizado por nós no dia a dia, e é sem dúvida o mais importante dos sistemas numéricos, com os quais podemos formar qualquer número através da lei de formação.

AnBn + An-1Bn-1 + An-2Bn-2 + ... + A0B0
Onde:

An = Algarismo B = Base do número n = quantidade de algarismos - 1
Ex: 25934 n = 5 -1 = 4 B = 10 A0 = 4; A1 = 3; A2= 9; A3 = 5; e A4 = 2 2.104 + 5.103 + 9.102 + 3.101 + 4.100 2.10000 + 5.1000 + 9.100 + 3.10 + 4.1 = 25934 1.1) SISTEMA BINÁRIO (BASE 2) O sistema binário de numeração apresenta apenas dois algarismos, o zero e o

um.

Cada algarismo ou dígito de um número binário é chamado de BIT que é a abreviação de BInary DigiT. O conjunto de 4 bits é denominado de NIBBLE, e o de 8 bits de BYTE. O sistema binário é utilizado em sistemas digitais e em microprocessadores, onde o 0 é representado por 0V e o 1 geralmente por 5V.

© Jefferson Leal Couto

Página

3

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
1.2) SISTEMA HEXADECIMAL (BASE 16) O sistema hexadecimal possui 16 símbolos para representar qualquer quantidade. Como são conhecidos apenas dez símbolos numéricos ( 0 a 9), adotouse outros seis ( A a F). O sistema hexadecimal também é muito utilizado na área de microprocessadores, e tem uma estreita relação com o sistema binário.

1.3) FORMAS DE APRESENTAÇÃO DECIMAL: BINÁRIO: HEXADECIMAL: 1234d ou (1234)10 0101b ou (0101)2 9CF7h ou (9CF7)16 CONVERSÃO ENTRE BASES DECIMAL 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 BINÁRIO 0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111 10000 HEXADECIMAL 0 1 2 3 4 5 6 7 8 9 A B C D E F 10

© Jefferson Leal Couto

Página

4

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS

1.4) CONVERSÃO DO SISTEMA BINÁRIO PARA O SISTEMA DECIMAL Para converter um número binário em decimal basta utilizar a lei de formação. EX: Convertendo o número 101b em decimal: n= 3 -1= 2 A0 = 1; A1 = 0 e A2 = 1 1.22 + 0.21 + 1.20 = 1.4 + 0.2 + 1.1 = 4+0+1=5 1.5) CONVERSÃO DO SISTEMA HEXADECIMAL PARA O SISTEMA DECIMAL Para converter um número hexadecimal em decimal basta utilizar a lei de formação. EX: Convertendo o número ABh em decimal: n= 2 -1= 1 A0 = 11(B) e A1 = 10(A) 10.161 + 11.160 = 171d 1.6) CONVERSÃO DO SISTEMA DECIMAL PARA O SISTEMA BINÁRIO Quando trabalhamos com sistemas digitais, muitas vezes existe a necessidade de convertermos os valores decimais em binários. Para converter um número decimal basta dividi-lo pela base 2 tantas vezes quantas necessárias para que o quociente da divisão seja menor que a base 2. O Último quociente da divisão e os restos das divisões sucessivas, tomados na ordem inversa, correspondem ao número na base 2. EX: 129d = ?b

© Jefferson Leal Couto

Página

5

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS

129d = 10000001b

1.7) CONVERSÃO DE DECIMAL PARA UMA BASE QUALQUER Para converter de decimal para a base “B” basta utilizar o método das divisões sucessivas dividindo o número pela base “B”

3882d = F2Ah 1.8) CONVERSÃO ENTRE AS BASES 2 E 16 Existe uma relação estreita entre os sistemas binário e hexadecimal. Esta relação vem do fato de que o número 16 pode ser escrito como 24. Os números hexadecimais podem ser vistos como uma forma compacta de representar os números binários. Para converter de binário para hexadecimal devemos seguir os seguintes passos: 1) Divide-se o número em grupos de 4 algarismos da direita para a esquerda. 2) Converte-se cada grupo no seu equivalente em hexadecimal, conforme a tabela dada anteriormente. Ex: 1001 1010 0010 1110b 9 A 2 E h A conversão de hexadecimal para binário é realizada na seqüência inversa.

© Jefferson Leal Couto

Página

6

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
1) Converte-se cada algarismo no seu equivalente em binário utilizando sempre 4 algarísmos. Coloca-se zeros a esquerda quando necessário. 2) Reune-se os grupos de 4 algarismos. Ex: A2C7h = ?b A 2 C 7 1010 0010 1100 0111 A2C7h = 1010001011000111b Exercícios: Converter os números na base solicitada. 1) 23Fh = ?d 2) 47d = ?b 3) 11010011b = ?d 4) 11100010b = ?h 5) A2Ch = ?d 6) 2DAh = ?b 7) 1110 0001b = ?d 8) 352d = ?h 9) 510d = ?h 10) 120d = ?b

Se você está confuso e não sabe qual o método usado para fazer a conversão, lembre-se: • Para converter de binário ou hexadecimal para decimal utilize a lei de formação. • Para converter de decimal para hexadecimal ou binário faça divisões sucessivas. • Para converter entre binário e hexadecimal utilize a tabela.

© Jefferson Leal Couto

Página

7

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
2) OPERAÇÕES ARITMÉTICAS NO SISTEMA BINÁRIO
2.1) ADIÇÃO Para efetuarmos a adição no sistema binário, devemos agir como numa adição convencional do sistema decimal. Convém observar que no sistema decimal 1+1 = 2d e no sistema binário como temos apenas dois algarismos 1+1 = 0 e transporta 1. A operação de transporte também é denominada carry. Ex: 11b + 10b

Ex: 110b + 111b

2.2) SUBTRAÇÃO O método de resolução é análogo a uma subtração no sistema decimal. È importante observar o caso 0 - 1, onde o resultado será igual a 1 porém haverá um transporte para a coluna da esquerda que deve ser acumulado (somado) no subtraindo e, obviamente subtraído do minuendo. A este estouro dá-se o nome de borrow.

© Jefferson Leal Couto

Página

8

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
Ex: 1000 - 0011

2.3) COMPLEMENTO DE 2 Uma forma para representar números binários negativos bastante utilizada nos sistemas já citados é a notação de complemento de 2 (C2), mas para obtê-la, devemos primeiramente converter o número na notação de complemento de 1. A obtenção do complemento de um ( C1) de um número binário se dá pela troca de cada bit do número pelo seu inverso ou complemento. Binário: 1011 Complemento 1: 0 1 0 0 A notação de complemento de 2 é utilizada para representar números binários negativos. Para obter basta somar 1 ao complemento de 1 do número binário inicial. Decimal Binário Comp. 2 -1 - 0001 1111 -2 - 0010 1110 -4 - 0100 1100 -8 - 1000 1000

© Jefferson Leal Couto

Página

9

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
O método do complemento de 2 é muito útil nas operações de subtração. Ex: Subtração do binário 1110 - 0011 em complemento de 2

Ex: Subtração de 0101 - 1100

Como o resultado é negativo para obtermos o módulo devemos fazer o C2 da adição para obtermos o módulo da subtração de 0101 - 1100. Portanto teremos: 0110 (C1) + 1 = 0111

© Jefferson Leal Couto

Página

10

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
2.4) DESLOCAMENTO Deslocando-se os algarismos de um número para a sua esquerda, o resultado será o número multiplicado pela sua base. Ex:

O número que inicialmente era 0010 ( 2d) foi multiplicado pela sua base (2), que resultou no binário 0100 (4d). De forma análoga se deslocarmos os algarismos de um número para a direita, o resultado será a divisão do número pela sua base. Ex:

O binário 1000 que representa 8d como foi deslocado para a direita resultou em 0100 que representa 4d, portanto podemos verificar que o número foi dividido pela base 2.

© Jefferson Leal Couto

Página

11

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
3) OPERAÇÕES LÓGICAS

3.1) AND Esta função executa a multiplicação de duas ou mais variáveis booleanas. Sua representação algébrica para duas variáveis é S = A.B, onde se lê S = A e B.

A 0 0 1 1

B 0 1 0 1

S 0 0 0 1

© Jefferson Leal Couto

Página

12

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
3.2) OR A função “OR” é aquela que assume valor 1 quando uma ou mais entradas forem iguais a “um” e assume valor “zero” se todas as entradas forem zero. Sua representação algébrica para duas variáveis de entrada é S = A + B, onde se lê S = A ou B.

A 0 0 1 1

B 0 1 0 1

S 0 1 1 1

3.3) NOT A função “not” inverte ou complementa o estado da variável, ou seja, se a variável estiver em zero, a saída vai para 1, e se estiver em 1, a saída vai a zero. É representada algebricamente da seguinte forma S = /A, onde se lê não A.

A 0 1

S 1 0

© Jefferson Leal Couto

Página

13

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
3.4) XOR A função lógica “xor”, também conhecida como ou-exclusivo, apresenta como resultado nível lógico 1 sempre que existir um número “impar” de níveis lógicos 1 nas entradas. A sua representação algébrica é a seguinte S = A ⊕ B.

A 0 0 1 1

B 0 1 0 1

S 0 1 1 0

A função xor é utilizada para gerar PARIDADE PAR, onde este é um dos métodos para detecção de erro em comunicação digital.

© Jefferson Leal Couto

Página

14

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS

Exercícios: Obtenha o resultado lógico em hexadecimal para as seguintes operações: 1) 10d AND 4d 2) 3Fh OR 80h 3) 1001b XOR 1010b 4) 13d OR 9Ch 5) 11000010 AND FFh 6) 24h OR 0d 7) 82h XOR 13h 8) 10101010 AND 55h 9) 5d OR 3h 10) 10111100 AND 00001010 11) NOT 5Ah 12) NOT 13d

© Jefferson Leal Couto

Página

15

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
4) TERMOS IMPORTANTES
4.1) BUFFER: Em geral, chamamos de buffer o circuito que tem por objetivo o armazenamento temporário de informações. 4.2) DRIVER: Amplificador de corrente. Usado quando temos que ampliar a capacidade de fornecimento de uma porta. 4.3) FIRMWARE: Programa associado a um hardware para a execução de funções específicas. Ex: programa gravado em eprom 4.4) TRI-STATE: Nome dado, quando o sistema está fisicamente ligado, porém não interfere no sistema devido a alta resistência apresentada. 4.5) LATCH: Componente eletrônico que tem a função de “trava” de informações. O latch funciona como uma porta, que estando ativa, deixa passar a informação presente em suas entradas, e se inativa, faz com que a informação na saída não se altere, independente das alterações na entrada. 4.6) MAPEAMENTO REDUNDANTE: Cada endereço decodificado não é único. O decodificador é projetado para separar apenas os dispositivos entre si. Este tipo apresenta hardware menos complexo. 4.7) MAPEAMENTO NÃO REDUNDANTE: Cada endereço decodificado é único. Constrói-se o decodificador utilizando o menor espaço de memória. Este tipo de decodificação necessita de um hardware bastante complexo. 4.8) CHIP SELECT (/CS): Este pino está presente na grande maioria dos dispositivos associados a microprocessadores. Como todos os dispositivos (EPROM, RAM, I/O) estão ligados à via de dados (D0 ... D7), os mesmos devem estar sempre em alta impedância para evitar que enquanto um bit esteja em “0”, outro esteja em “1”, ocasionando um conflito e até mesmo danificando o sistema. Normalmente todos os dispositivos estão com o /CS em “1”, e somente irá a “0” aquele dispositivo que está sendo acionado e apenas durante o tempo necessário. Estes tempos e esta seleção são efetuados por “circuitos lógicos” conhecidos como DECODIFICADORES DE ENDEREÇO.

© Jefferson Leal Couto

Página

16

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
EX: Projetar um decodificador para I/O mapeado em memória nas seguintes configurações: A) 32K bytes de RAM, 32K bytes para I/O mapeamento redundante. A.1) Utilizando portas lógicas A15 = 0 32k inferior A15 = 1 32k superior

A.2 ) Utilizando o 74139 Tabela verdade: A 0 0 1 1 B 0 1 0 1 Y0 0 1 1 1 Y1 1 0 1 1 Y2 1 1 0 1 Y3 1 1 1 0

© Jefferson Leal Couto

Página

17

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
A.3 ) Utilizando apenas 2 decodificador 74139

A.4 ) Utilizando apenas 1 decodificador 74139

© Jefferson Leal Couto

Página

18

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
B) 32K RAM, 32K para I/O com mapeamento redundante nos endereços 8000H e 8001H B.1 ) Utilizando portas lógicas

B.2 ) Utilizando o 74139

C) 32K RAM, 32K para I/O com mapeamento não redundante nos endereços 8000H e 8001H

© Jefferson Leal Couto

Página

19

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
Exercícios: 1) Projetar um decodificador com 16K de RAM e 48K bytes de I/O, mapeando 16K para cada dispositivo. Mapeamento redundante. 2) Projetar um decodificador com 16K de RAM e os endereços 8000, A000 e C000 para I/O mapeamento redundante. 3) Projetar um decodificador de I/O mapeado em memória com 24K de RAM e o restante em 3 endereços para I/O. Mapeamento redundante. 3.1) Utilizar o 74xx139 3.2) Utilizar o 74xx138 4) Projetar um decodificador de I/O mapeado em memória com 32K de RAM e os endereços 8000h, 8004h, 8008h e 800Ch para I/O. 4.1) Utilizar o 74xx139 4.2) Utilizar o 74xx138 5) Projetar um decodificador com 32K de RAM e 8 saídas para I/O. Mapeamento redundante: 5.1) Utilizar o 74xx139 5.2) Utilizar o 74xx138

A maior dificuldade em projetar um decodificador é que não existe uma formula ou receita pronta. Um bom projeto, depende basicamente de experiência e conhecimento de circuitos digitais. Algumas dicas que poderão ajudar. • Em mapeamento redundante, devemos analisar o menor espaço de memória utilizado no projeto e então definir a quantidade de endereços do barramento que serão necessários. O 8051 acessa 64K de memória RAM com seus 16 endereços. • Em mapeamento não redundante devemos utilizar sempre todos os endereços para mapear o dispositivo de I/O, pois o endereço é específico.

© Jefferson Leal Couto

Página

20

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
5) MICROCONTROLADORES
5.1) MICROPROCESSADOR: É uma máquina seqüencial que executa um conjunto de comandos (instruções ) previamente gravados em uma memória (ROM). Embora todos os microprocessadores utilizem um sinal de clock, é comum encontrar na literatura, a classificação de microprocessadores síncronos e assíncronos. Com a evolução tecnológica, principalmente na confecção de CI’s, os fabricantes de microprocessadores começaram a incorporar memórias e dispositivos periféricos na mesma pastilha de seus microprocessadores. Surgiram então os microcontroladores. Uma vez que incorporam grande parte dos dispositivos periféricos, a construção de um sistema baseado em um microcontrolador, freqüentemente se resume a um circuito com um cristal, um botão de reset e a memória de programa.

Arquitetura Von Nuemann - A maioria dos microprocessadores segue esta arquitetura. O microprocessador é composto por um conjunto de blocos funcionais, controlados por uma máquina seqüencial que determina os tempos em que cada sinal de controle está presente nos barramentos internos e externos. É importante ressaltar que nesta arquitetura não temos distinção entre a memória de programa e dados. Para caracterizar uma arquitetura Von Nuemann o processador deve atender três postulados: 1) Um único controle central.

© Jefferson Leal Couto

Página

21

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
2) Uma única memória para programa e dados 3) As instruções devem fazer operações elementares sobre os dados. O Z80 é um exemplo de processador que utiliza arquitetura Von Nuemann.

Arquitetura Harvard – Esta arquitetura apresenta memórias distintas para programa e dados, isto é, o processador é projetado para gerar sinais de leitura e escrita distintos para cada memória. Uma das vantagens desta arquitetura, é evitar que a memória se torne o fator limitante no desempenho do processador. Alguns processadores mais modernos já utilizam esta arquitetura. O 8051 é um exemplo. Destas arquiteturas surgiram duas tendências: RISC - Reduce Instruction Set Computer CISC - Complex Instruction Set Computer

A CPU do tipo CISC possui um conjunto muito grande de instruções (8051, Z80). VANTAGENS: Possibilita a confecção de programas enxutos. Grande número de modos de endereçamento. Uma instrução executa muitas tarefas. DESVANTAGEM: Difícil memorização dos comandos. Instruções com diferentes tamanhos de ciclos de máquina. Subutilização da CPU. Difícil depuração. A CPU do tipo RISC possui um conjunto de instruções reduzido. VANTAGEM: Fácil memorização, rapidez, fácil depuração. DESVANTAGEM: Programa muito extenso. Número reduzido de registradores e modos de endereçamento. Muitas instruções para realizar uma tarefa simples.

© Jefferson Leal Couto

Página

22

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
5.2) BARRAMENTOS DE UM MICROCONTROLADOR

Barramento de endereço: Barramento unidirecional, por onde trafega os sinais que endereçam os dispositivos de memória e I/O. Em geral, os microprocessadores de 8 bits endereçam 64 Kbytes de memória.

Barramento de dados: Barramento bidirecional por onde trafegam dados entre os dispositivos externos e o microcontrolador. O tamanho deste barramento define o tamanho do microcontrolador. O 8051 é de 8 bits.

Barramento de controle: dispositivos externos.

Barramento por onde o microcontrolador controla os

© Jefferson Leal Couto

Página

23

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
5.3) MODOS DE ATENDIMENTO DE I/O

Pooling: Neste tipo de atendimento, a CPU fica constantemente questionando o dispositivo de I/O se o mesmo necessita receber ou enviar um dado. Este tipo de atendimento é fácil de implementar, porém desperdiça o tempo da CPU. Interrupção: Neste tipo de atendimento, a CPU é avisada pelo dispositivo de I/O, que o mesmo necessitam receber ou enviar dados. Este tipo de atendimento é mais complexo, tendo como vantagem não desperdiçar o tempo da CPU. Como é um evento assíncrono, a CPU sempre atende no momento solicitado. Necessita de um hardware adicional. DMA (Direct Memory Acess) : Este tipo de atendimento é o mais complexo, porém o mais rápido. O dispositivo de I/O solicita os barramentos da CPU (Tri - State) e acessa diretamente a memória, transferindo então os dados. Nem toda a CPU suporta este tipo de atendimento.

© Jefferson Leal Couto

Página

24

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
6) MICROCONTROLADOR 8031/8051

6.1) Pinagem:

© Jefferson Leal Couto

Página

25

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
6.2) Barramento Multiplexado: Para evitar que o chip tenha mais que 40 pinos, a Intel® adotou a solução de multiplexar no mesmo barramento os dados e endereço.

Desta forma, devemos utilizar a seguinte ligação para obter as 16 linhas de endereços e 8 de dados no 8051.

© Jefferson Leal Couto

Página

26

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
6.3) CLOCK NO 80C51 Existem duas formas de gerar circuito de clock no microcontrolador. O clock pode ser externo ou interno. uso do clock externo é interessante quando temos outros dispositivos que utilizam um sinal TTL para gerar sua base de tempo. Sua implementação resume-se em colocar o pino 19 (XTAL1) no nível de terra e injetar o sinal externo no pino 18 (XTAL2), que irá diretamente para o sistema de controle e temporização do chip.

Para utilizar o clock interno, devemos colocar entre os pinos 18 e 19 um cristal ou um ressonados cerâmico (o oscilador com cristal é mais estável e preciso ) na freqüência desejada e dois capacitores de realimentação. Geralmente utilizamos capacitores entre 27 e 33pF.

© Jefferson Leal Couto

Página

27

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
O clock do microcontrolador é chamado de “ciclo de clock” e ele é a referência ou base para geração do “ciclo de máquina”. O ciclo de máquina é calculado dividindo a freqüência do cristal por 12 (doze) no 80C51. Para um sistema utilizando um cristal de 12Mhz, teremos um ciclo de máquina de 1Mhz, isto é, o microcontrolador irá executar a seqüência de busca, decodificação e execução em tempos de no mínimo 1µs.
Lembre – se, o ciclo de clock depende basicamente do cristal utilizado na CPU e o ciclo de máquina determina o tempo necessário para executar as instruções. No 8051 o Ciclo Máquina = Ciclo de clock / 12

6.4) RESET DO MICROCONTROLADOR O reset no 80C51 é ativado quando o pino 9 (RST) permanece em nível lógico 1 por 2 ou mais ciclos de máquina. Neste caso a CPU executa o chamado reset interno, que consiste em inicializar seus registros internos com valores predeterminados: • O PC, o ACC (acumulador), o registro B (Auxiliar), os Flags, O DPTR e todos os registros de temporização e contagem serão zerados. • O SP (stack pointer - pilha) é carregado com o valor 07H. • As portas P0 a P3 terão o valor FFH. • O SBUF (buffer serial) estará com um valor indeterminado e o registro de controle da porta serial - SCON será zerado. • O registro PCON terá apenas seu bit mais significativo zerado. • Os registradores de interrupção IE (Interrupt Enable) e IP (Interrupt Priorit) terão o valor XXX00000, onde X representa um valor irrelevante (Don’t Care) • A memória interna não é afetada pelo reset forçado, sendo que ao ligar seu valor é aleatório.

© Jefferson Leal Couto

Página

28

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
Ao inicializarmos um sistema é necessário que uma seqüência de funções sejam executadas, desta forma podemos afirmar que nosso sistema irá executar as tarefas para o qual foi projetado. Toda vez que realizamos um reset no 8051, ele irá começar a executar o software a partir do endereço 0000H da memória de programa. Geralmente esta rotina é conhecida como Inicialização do sistema. O microcontrolador pode ser resetado automaticamente toda vez que a fonte é ligada. Normalmente utilizamos um resistor de 10K entre o pino do reset e o terra, e um capacitor de 10µF entre o VCC e o pino de reset.

© Jefferson Leal Couto

Página

29

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
6.5) INTERRUPÇOES A interrupção é, uma das formas mais importantes de atendimento aos dispositivos de I/O. Este recurso permite interromper o fluxo normal de execução do firmware para a execução de um fluxo específico do programa. No 8051, temos três fontes geradoras de interrupção, a interrupção de software (instrução) a solicitada por um periférico externo e a interrupção gerada por dispositivos internos do processador (timer, serial, etc). Para o bom entendimento deste recurso, devemos esclarecer alguns conceitos: Mascaramento - É a capacidade de inibir, geralmente via software que uma determinada interrupção seja atendida. Prioridade - Define o grau ou a preferência que uma determinada interrupção será executada. Interrupção vetorada ou não vetorada - Define se ao atender uma interrupção o microcontrolador irá executar uma rotina em um endereço fixo de memória e que não pode ser alterado, ou se o programa irá para um endereço definido pelo programador. O 8051 possui todas as suas interrupções vetoradas, isto é, com o endereço de desvio determinado pelo fabricante do componente. Ativação - Existem três formas que o sistema pode reconhecer uma interrupção: • pelo nível (alto ou baixo) • pela borda (subida ou descida) • pela combinação de borda e nível. O 8051 possui 5 formas de interrupção: Interrupção externa 0 - INT0\ Interrupção externa 1 - INT1\ Interrupção do timer\contador 0 - T0 Interrupção do timer\contador 1 - T1 Interrupção do canal serial - TI ou RI
No 8051, todas as interrupções são mascaráveis e vetoradas.

© Jefferson Leal Couto

Página

30

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
Sendo que cada uma destas interrupções será desviada para os seguintes endereços: INT0\ ………………. 03H T0 .………………… 0BH INT1\ ……………….. 13H T1 …………………… 1BH TI - RI ………………. 23H

A seguir temos um mapa parcial da memória de programa do 8051 com seus respectivos endereços de interrupção e reset.

© Jefferson Leal Couto

Página

31

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
O processador possui um recurso de prioridade interna, que permite determinar qual interrupção será atendida ou se uma interrupção em andamento deverá ser interrompida para o atendimento de outra de maior prioridade.

Para determinar quais interrupções estarão habilitadas, devermos escrever no registrador especial IE - (Interrupt Enable) do SFR.

EA - Localizado no bit 7 do IE, Habilita todas as interrupções quando em nível lógico 1, desde que estas estejam habilitadas individualmente. Quanto em nível lógico 0, desabilita todas as interrupções, mesmo que estejam ativadas individualmente. ES - Localizado no bit 4 do IE, Habilita a comunicação serial quando em nível lógico 1 e desabilita em nível lógico 0 mesmo que o bit EA esteja ativado. ET1 - Localizado no bit 3 do IE, Habilita o timer/conter 1 quando em nível lógico 1 e desabilita em nível lógico 0 mesmo que o bit EA esteja ativado. EX1 - Localizado no bit 2 do IE, Habilita a interrupção externa 1 quando em nível lógico 1 e desabilita em nível lógico 0, mesmo que o bit EA esteja em 1. ET0 - Localizado no bit 1 do IE, Habilita o timer/conter 0 quando em nível lógico 1 e desabilita em nível lógico 0 mesmo que o bit EA esteja ativado. EX0 - Localizado no bit 0 do IE, Habilita a interrupção externa 0 quando em nível lógico 1 e desabilita em nível lógico 0, mesmo que o bit EA esteja em 1. Para alterar a seqüência padrão de prioridade das interrupções devemos habilitar os bit`s do registrador IP (Interrupt Priorit)

© Jefferson Leal Couto

Página

32

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS

Onde, PS - Localizado no bit 4, seleciona prioridade da serial. Quanto em 1 define como alta a prioridade da serial. PT1 - Localizado no bit 3, seleciona prioridade do timer1. Quanto em 1 define como alta a prioridade do timer 1.

PX1 - Localizado no bit 2, seleciona prioridade da interrupção externa 1. Quanto em 1 define como alta a prioridade da interrupção externa 1. PT0 - Localizado no bit 1, seleciona prioridade do timer0. Quanto em 1 define como alta a prioridade do timer 0. PX0 - Localizado no bit 0, seleciona prioridade da interrupção externa 0. Quanto em 1 define como alta a prioridade da interrupção externa 0.
Um certo tempo irá decorrer entre o reconhecimento da interrupção pelo processador e o efetivo desvio para o respectivo vetor. No melhor caso teremos um atraso de 3,2 ciclos de máquina e no pior caso teremos um atraso de 7,2 ciclos de máquina.

© Jefferson Leal Couto

Página

33

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
6.6) INTERRUPÇÃO EXTERNA As interrupções externa0 e externa1 podem ser configuradas para reconhecer uma transição de 1 para 0 (borda de descida) ou um nível lógico 0. A configuração deste controle é feito no registrador TCON (Timer Control) através do nibble menos significativo.

Onde, IT0 - Localizado no bit 0 de TCON. Quando em nível lógico 0 a interrupção Externa0 será aceita simplesmente pela presença do nível zero no pino. Quando em nível lógico 1 a interrupção será aceita quanto ocorrer uma transição de 1 para 0 e o sinal permanecer em zero por pelo menos 1ciclo de máquina. IE0 - Localizado no bit 1 de TCON. É setado pelo hardware interno quando for detectado um pedido de interrupção. É resetado quando a interrupção for atendida. IT1 - Localizado no bit 2 de TCON. Quando em nível lógico 0 a interrupção Externa1 será aceita simplesmente pela presença do nível zero no pino. Quando em nível lógico 1 a interrupção será aceita quanto ocorrer uma transição de 1 para 0 e o sinal permanecer em zero por pelo menos 1ciclo de máquina. IE1 - Localizado no bit 3 de TCON. É setado pelo hardware interno quando for detectado um pedido de interrupção. É resetado quando a interrupção for atendida.

© Jefferson Leal Couto

Página

34

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
6.7) TEMPORIZADOR E CONTADOR

O 8051 possui 2 T/C (timer/conter) que são configurados através do firmware e podem operar de maneira totalmente independente dos demais recursos do chip. Os dois T/C podem ser ativados ou desativados pelo hardware ou pelo software, dependendo da configuração adotado pelo projetista. No nibble mais significativo de TCON podemos ativar ou desativar os T/C`s como veremos a seguir:

Onde, TF1 - É setado pelo hardware sempre que ocorrer um overflow (estouro no contador) no T/C1. É resetado ao final da rotina de interrupção de T/C1. TR1 - Quando em nível lógico 1 irá ligar o T/C1, e quando em zero o mesmo será desligado. TF0 - É setado pelo hardware sempre que ocorrer um overflow (estouro no contador) no T/C0. É resetado ao final da rotina de interrupção de T/C0. TR0 - Quando em nível lógico 1 irá ligar o T/C0, e quando em zero o mesmo será desligado. Para realizar a configuração do modo de funcionamento do temporizador/contador devemos manipular os bit`s de TMOD.

Onde, Gate0; Gate1 – Definem como o timer/contador irá funcionar. Quando este bit estiver em nível lógico 1 o timer/contador será ativado se TRn e o pino INTn forem 1. Esta configuração é bastante útil quando queremos medir largura de pulso externo. Quando este bit estiver em nível lógico 0 o timer/contador será ativado simplesmente colocando TRn em 1.

© Jefferson Leal Couto

Página

35

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
C/T0;C/T1 - Definem a fonte do sinal de clock. Quando em nível lógico 0 ele terá a função de timer e a base de tempo será o clock do cristal. Quando este bit estiver em 1 ele estará operando como contador e o clock será os pulsos presentes no pino Tn M1-x;M0-x - Determinam o modo como irá operar o Timer/contador, como veremos a seguir:

MODO 0 - Temporizador/Contador de 8 bit`s com divisor de freqüência de até 32 vezes. Neste modo o TL0 ou TL1 servem como prescaler do divisor e os registradores TH0 e TH1 como contador de 8 bit`s. MODO 1 - Temporizador/Contador de 16 bit`s. Neste modo o TLn e THn formam um par de forma a obter um registrador de 16 bit`s. Neste modo podemos contar até 65535, com o valor inicial programável por software. MODO 2 - Contador/Temporizador de 8 bit`s com recarga automática. Neste modo o registrador TLn realiza a contagem e o registrador THn possui o valor que será recarregado em TLn sempre que ocorrer um overflow (estouro do contador). Os registradores podem ser alterados por software a qualquer momento, tornando bastante flexível o uso. MODO 3 - Intervalador ou contador de eventos em 8 bit`s e temporizador de 8 bit`s. OBS: Este modo não é muito usual e não será estudado.

© Jefferson Leal Couto

Página

36

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
6.8) COMUNICAÇÃO SERIAL Na comunicação serial, a transmissão de um byte é feita pelo envio seqüencial de cada bit, um após o outro. Para permitir a comunicação entre os sistemas, criou-se um código binário para cada caractere de forma a existir uma padronização entre os sistemas. Este código é conhecido por ASCII ( American Standart Code for Interchange of Information). Neste código, cada caractere possui seu valor em binário, incluindo os caracteres de controle e especiais, totalizando 256 símbolos.

O modo mais utilizado de comunicação entre sistemas de controle e automação é o sistema assíncrono. Neste modo não há necessidade de gerarmos o sincronismo (sinal de clock entre os sistemas). Neste modo cada caractere é transmitido individualmente, e para caractere é enviado um bit de início da transmissão (start bit) e um de final de transmissão (stop bit).

Existem, três formas de interligar os sistemas digitais (considerando apenas os sinais de dados): A) Simplex: A comunicação é feita apenas em um sentido B) Half Duplex: A comunicação é feita nos dois sentidos, mas não simultânea C) Full Duplex: Comunicação nos dois sentidos e de forma simultânea.

© Jefferson Leal Couto

Página

37

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS

6.9) INTERFACE SERIAL NO 8051 No 8051 temos uma interface serial do tipo full duplex. Desta forma, sistemas de comunicação podem enviar e receber dados de forma simultânea com o microcontrolador. Para este fim, o 8051 possui um registrador chamado SBUF(Serial Buffer).Quando queremos enviar uma informação pelo canal serial devemos escrever o byte no SBUF, e quando desejamos receber o byte pelo microcontrolador devemos ler o SBUF. Pode parecer que ele possui apenas um registrador para Tx e Rx, mas na verdade existem dois registradores com o mesmo nome e que serão reconhecidos pelo sistema através da instrução assembler. Para fazer e analisar a configuração da serial devemos acessar o registrador SCON (Serial Control) como veremos a seguir.

Onde, RI - É setado pelo hardware ao receber o oitavo bit no modo síncrono ou no meio do stop bit no modo assíncrono. Deve ser zerado para permitir que sejam geradas novas interrupções. TI - É setado pelo hardware ao transmitir o oitavo bit no modo síncrono ou no início do stop bit no modo assíncrono. Permite que a transmissão dos dados seja independente do fluxo principal do programa. Deve ser zerado para permitir que sejam geradas novas interrupções. RB8 - No modo 0 indica o estado do stop bit Nos modos 2 e 3 indica o estado do nono bit recebido. TB8 - Nos modos 2 e 3 é usado para transmitir o nono bit. REN - Habilita a recepção serial. Se estiver zerado a recepção estará desabilitada e o pino RXD pode ser usado como pino de I/O SM2 - No modo 0 deve permanecer zerado. No modo 1 não gera pedido de interrupção se estiver setado e o stop bit for inválido. Nos modos 2 e 3 permite a interligação entre vários 8051

© Jefferson Leal Couto

Página

38

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
SM1,SM0 - A combinação destes bits fornece o modo de funcionamento da serial: SM0 0 0 1 1 SM1 0 1 0 1 MODO 0 1 2 3 Taxa de comunicação Fclock / 12 Variável (Conforme Timer1) Fclock / 32 ou Fclock / 64 Variável (Conforme Timer1)

O modo 0 é usado para comunicação serial síncrona e os demais para comunicação assíncrona. No modo 1 são transmitidos 8 bits de dados, 1 stop bit e o start bit. No modo 3 após os 8 bits de dados é transmitido um nono bit.

6.10) TAXA DE TRANSMISSÃO PARA OS MODOS 1 E 3

Frequência( Mhz).106 TH 1 = 256 − 384.Taxa( BPS )

2 SMOD .Frequência TAXA = 384 ( 256 − THI )
6.11) TABELA PRÁTICA COM TAXAS PARA O CRISTAL DE 11,0592 Mhz

TAXA (BPS) 300 1200 2400 4800 9600

VALOR RECARGA(TH1) 160 232 244 250 253

Os valores da tabela foram calculados para SMOD = 0.

© Jefferson Leal Couto

Página

39

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
7) PROGRAMAÇÃO “C” PARA O MICROCONTROLADOR 8051
Existem basicamente três linguagens de programação que são utilizadas com o 8051, o BASIC, ASSEMBLY e o C. Nos últimos cinco anos, a programação de microcontroladores em linguagem C tem sido adotada pela maioria das empresas devido as facilidades para programação e ao nível de portabilidade apresentada. Muitos livros ensinam a programação padrão ANSI C, porém devemos tomar o cuidado ao utilizar este tipo de bibliografia, pois ela aborda a programação para o PC. Funções do tipo “printf”, “scanf”, “sprintf” entre outras, geralmente não estão disponíveis para o projetista ou apresentam um comportamento diferente quando utilizamos o compilador para microcontrolador. No nosso curso, será abordado o compilador SDCC. Outro detalhe importante é que no 8051 podemos utilizar uma grande variedade de modos de acesso a memória. Como o microcontrolador suporta acesso a BIT, memória RAM interna, memória RAM externa devemos ficar atento ao padrão adotado pelo compilador(small ou large para o SDCC) ou especificar onde desejamos que a memória seja reservada.

Se você utilizar um compilador como o Turbo C, Visual C ou outro para PC nenhum “santo” vai fazer seu programa funcionar. Eu teria receio de gravar o programa no KIT ou na memória EPROM. Quando você estiver programando para o 8051, devemos utilizar SEMPRE um compilador próprio para o microcontrolador como o SDCC que veremos no curso.

© Jefferson Leal Couto

Página

40

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
7.1) TIPOS DE VARIÁVEIS EM C TIPO char unsigned char Int unsigned int long float void NUMERO DE BITS 8 bits 8 bits 16 bits 16 bits 32 bits 32 bits 0 ALCANCE -128 a + 127 0 a 255 -32768 a 32767 0 a 65535 -2147483648 a +2147483647 3.4e-38 a 3.4e38 Sem valor

Exemplo de declaração de variáveis: Int iLContador; // Variável do tipo inteiro com sinal unsigned char ucGLeitura;// Variável do tipo char sem sinal char buffNome[6]; // Array do tipo char com 6 posicões Int buffTotal[4]; // Array do tipo int com sinal com 4 posições

7.2) OPERADORES ARITMÉTICOS + * / % ++ -Subtração ou sinalização de negativo Soma Multiplicação Divisão Resto da divisão Incremento (Variável = Variável + 1) Decremento (Variável = Variável – 1)

Exemplo de operações aritméticas iLTotal = iLContador * 3; ucLLeitura++; // Atribui para iLTotal o valor de //ILContador multiplicado por 3 // ucLLeitura será incrementada de uma //unidade

© Jefferson Leal Couto

Página

41

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
7.3) OPERADORES LÓGICOS E RELACIONAIS > < >= <= == != && || ! Maior que Menor que Maior ou igual que Menor ou igual que igual Diferente Relacional “e” Relacional “ou” Relacional “não”

7.4) OPERADORES DE MANIPULAÇÃO DE BIT & | ^ ~ >> << Operação lógica AND Operação lógica OR Operação lógica XOR Operação lógica NOT Operação de deslocamento(shift) em bit para a direita Operação de deslocamento em bit para a esquerda

Exemplo de operação com bit ucLValor = ucLValor & 0x7F; ucLValor = ucLValor | 0x02; // Zera o bit mais significativo do byte //ucLValor // Coloca em um o segundo bit do byte // ucLValor

© Jefferson Leal Couto

Página

42

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
7.5) DIRETIVAS FUNDAMENTAIS DO PRÉ – COMPILADOR A) #DEFINE <NOME> <ATRIBUICAO> Permite atribuir antes da compilação um valor para NOME. Exemplo: #define LIGADO #define MAXIMO 1 50

//`Substitui o nome MAXIMO por 50 no programa

B) #INCLUDE <ARQUIVO> Informa ao que deverá ser incluído o ARQUIVO antes de realizar a compilação do programa. Exemplo: #include <8051.h> #include “8051.h” // Inclui o arquivo 8051.h da pasta padrão // Inclui o arquivo 8051.h da pasta do programa

Se você pretende utilizar uma constante várias vezes no programa utilize a diretiva DEFINE. Esta prática é muito utilizada por programadores mais experientes. O formato do INCLUDE depende onde está seu arquivo HEADER. Ele geralmente é um arquivo .h

Agora estou entendendo. Então se meu arquivo HEADER estive na pasta padrão do compilador uso <ARQUIVO> e se estiver na mesma pasta do programa uso o formato “ARQUIVO”

© Jefferson Leal Couto

Página

43

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
7.6) CONTROLE DE FLUXO A) IF – ELSE A atribuição IF-ELSE permite que um determinado enunciado, que pode ser simples ou composto, seja executado desde que uma determinada condição seja satisfeita. A sintaxe é a seguinte: If (condição) enunciado1; else enunciado2; Embora a condição normalmente estar relacionada com um operador relacional, pode, também ser qualquer expressão que resulte em um valor ZERO caso não seja verdadeira ou um valor diferente de ZERO se a condição for verdadeira. Exemplo: Se o valor da variável for zero o pino zero da porta P3 deverá ser colocado em nível lógico 1 senão em nível lógico zero
#include <pwlib.h> unsigned char ucGLeitura; void main (void) { ucGLeitura = P1; if(!ucGLeitura) P3_0 = 1; else P3_0 = 0; }

A presença do ELSE e consequentemente o enunciado2, é opcional, se não estiver presente e a condição for verdadeira, o enunciado1 será executado. Se não estiver presente e a condição for FALSA o fluxo do programa será desviado para o enunciado seguinte ao da instrução IF. If (condição) enunciado1;

© Jefferson Leal Couto

Página

44

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
Exemplo: Se o valor da variável for zero o pino zero da porta P3 deverá ser colocado em nível lógico 1.
#include <pwlib.h> unsigned char ucGLeitura; void main (void) { ucGLeitura = P1; if(!ucGLeitura) P3_0 = 1; }

Se tivermos enunciados compostos, ou seja um conjunto de enunciados, é obrigatório o uso do delimitador chaves. If (condição) { enunciado11; enunciado12; } else { enunciado21; enunciado22; enunciado23; } Exemplo de enunciado composto:
#include <pwlib.h> unsigned char ucGLeitura; void main (void) { ucGLeitura = P1; if(!ucGLeitura) { P3_0 = 1; P3_1 = 0; } else { P3_0 = 0; P3_1 = 1: } } Você quer a minha opinião?! …. Faz o seguinte, como você ainda não tem experiência com a programação C, utilize sempre os delimitadores chaves. Mesmo em enunciados simples !!!

© Jefferson Leal Couto

Página

45

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
B) SWITCH – CASE A instrução SWITCH-CASE visa substituir em muitas situações o uso da instrução IFELSE aninhadas. A instrução possibilita que, de acordo com o valor de entrada para a expressão, seja executado um entre vários enunciados. Será selecionado para execução o enunciado que estiver associado ao CASE cujo valor for equivalente ao de entrada. A sintaxe é a seguinte: SWITCH(VALOR) { CASE comparacao1: enunciado1; BREAK; CASE comparacao2: enunciado2; BREAK; DEFAULT: enunciado3; } BREAK;

A palavra chave DEFAULT, tem por objetivo especificar um enunciado para ser executado caso o valor de entrada não seja encontrado em nenhum valor de comparação do CASE. Se não for necessário executar um enunciado quando o valor não for encontrado a palavra chave DEFAULT não será necessária. Exemplo: Se o valor da variável for 00h o microcontrolador deverá mostrar “desligado” se for FFh deverá mostrar “maximo valor” senão a mensagem “intermediario”

© Jefferson Leal Couto

Página

46

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
#include <pwlib.h> #include <8051.h> unsigned char ucGLeitura; void main (void) { ucGLeitura = P1; switch(ucGLeitura) { case 0x00: PWDisplayEscreveString("Desligado break; case 0xFF: PWDisplayEscreveString("Maximo break; default: } } break;

",2,1);

",2,1);

PWDisplayEscreveString("Intermediario ",2,1);

C) WHILE A instrução WHILE possibilita a repetida execução de um enunciado simples ou composto, enquanto uma determinada condição for satisfeita. Esta instrução é bastante versátil. A sintaxe é a seguinte: WHILE(condição) { Enunciado1; }
Uma aplicação bem interessante para o while é utilizar com a condição 1. Desta forma o microcontrolador ficará em um loop infinito.

© Jefferson Leal Couto

Página

47

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
Exemplo: Enquanto o usuário não digitar uma tecla fica aguardando
#include <pwlib.h> #include <8051.h> unsigned char ucGLeitura; void main (void) { ucGLeitura = P1; ucGLeitura = PWLeTeclado( ); PWDisplayEscreveString (“Selecione tecla: ”,1,1); while (ucGLeitura == 0) { ucGLeitura = PWLeTeclado( ); } }

D) DO – WHILE A instrução DO – WHILE permite que o enunciado1, que pode ser simples ou composto, seja executado enquanto a condição for verdadeira. A diferença entre a instrução DO-WHILE e a WHILE resume-se no fato de que, enquanto a instrução WHILE testa a condição antes da execução do enunciado1, esta testa a condição após a execução do enunciado1, isto é, o enunciado1 será executado pelo menos uma vez. Veja que neste exemplo não é necessário a primeira leitura da tecla

#include <pwlib.h> #include <8051.h> unsigned char ucGLeitura; void main (void) { ucGLeitura = P1; PWDisplayEscreveString (“Selecione tecla:”,1,1); do { ucGLeitura = PWLeTeclado ( ); } } while (ucGLeitura == 0);

© Jefferson Leal Couto

Página

48

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
E) FOR A instrução FOR possibilita a execução de um conjunto de enunciados enquanto o valor da variável varia entre uma faixa de valores. A principal vantagem em relação ao uso do WHILE consiste no fato da instrução for manter centralizado o controle do loop, resultando em um programa mais claro. A sintaxe é a seguinte: FOR(expressao1; expressao2;expressao3) { enunciado1; } onde, A expressao1 é a inicialização, sendo executada apenas uma vez, normalmente para inicializar uma variável presente na condicao2. A expressao2 é a condição, cujo resultado determina se o enunciado1 que pode ser simples ou composto será executado. A expressao3 é o incremento ou decremento, sendo executado ao final da passagem do loop. O loop só será abandonado quando a condição(expressao2) for falsa ou quando dentro do loop for executada a instrução break ou return. Exemplo: O programa limpa com espaço as 20 posições do array do tipo char
#include <pwlib.h> #include <8051.h> unsigned char ucGLoop; void main (void) { unsigned char ucLBuffNome[20]; for(ucGLoop = 0; ucGLoop < 20; ucGLoop++) { ucLBuffNome[ucGLoop] = ‘ ‘; } }

F) RETURN A instrução RETURN possibilita que se retorne da execução de uma função. Quando retorna, podemos passar um valor para a função que originou a chamada. Caso seja retornado um valor, é necessário que o tipo seja o mesmo especificado na declaração da função.

© Jefferson Leal Couto

Página

49

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
7.7) MAPA DE ALOCAÇÃO DE VARIÁVEIS NO 8051 Um dos pontos importantes mas de difícil compreensão é o mapa de memória da arquitetura MCS51. A Intel® originalmente colocou no mercado o processador chamado de 8031 que não tinha memória de programa interno. Posteriormente foi lançado o 8051 já com memória ROM interna. Estes microcontroladores permitem o armazenamento de até 128 bytes de dados em memória RAM interna no modo direto e 64K bytes de memória RAM externa.Com a boa aceitação do microcontrolador pelo mercado foi produzido os modelos 8032 e 8052 com a mesma característica de memória de programa do 8031/8051 respectivamente porém com um adicional de 128 bytes de memória de dados. Esta memória possui o mesmo endereço dos registradores do SFR e devido a este fato foi implementado o acesso por endereçamento indireto. Para permitir o acesso a todos estes modos distintos de memória de dados, o compilador SDCC possui os seguintes tipos de alocação de memória DATA (DSEG) : Intervalo do endereço 00h ao 7Fh. Inclui o banco de registradores, a área bit endereçável e o “stack pointer”. O SDCC pode ser configurado para iniciar a alocação a partir do endereço 30h que é posterior aos 4 bancos de registradores e no topo da área bit endereçável. XDATA (XSEG) : Se você possui memória RAM externa na CPU então esta memória é acessada com este modo de endereçamento. Os dispositivos de I/O mapeado em memória também são acessados através deste segmento. CODE (CSEG) : Construído na área interna ou externa da memória de programa (ROM/EPROM). Bastante utilizado quando desejamos armazenar um array de constantes, como mensagens em display. IDATA (ISEG) : Este são os128 bytes extra de memória de dados acessados através do endereçamento indireto. É importante lembrar que IDATA está disponível apenas nas versões 8032, 8052 ou similar. BIT (BSEG): Esta área fica entre os endereços 20h e 2Fh na memória de acesso direto. Ela é bastante útil quando queremos sinalizar situações do tipo VERDADEIRO ou FALSO, LIGADO ou DESLIGADO permitindo uma eficiente economia de espaço de memória.

© Jefferson Leal Couto

Página

50

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
8) AMBIENTE DE DESENVOLVIMENTO INTEGRADO ( IDE )

Atualmente, existem vários fabricantes de compiladores para microcontroladores da família MCS-51. Um dos melhores compiladores para 8051 é o ambiente integrado da Keil, que possui todos os recursos necessário para escrever, compilar e analisar o programa, porém este apresenta um custo muito elevado até mesmo, para o desenvolvimento de projetos comerciais, onde teremos retorno do capital investido. Uma ferramenta de desenvolvimento como esta, está custando em torno de US$ 3000,00. Desta forma, buscamos algumas alternativas que apresentem um ambiente integrado para o desenvolvimento de projetos e com uma boa relação custo/benefício. Neste capítulo, conheceremos um ambiente integrado adaptado que apresenta características dos melhores ambientes existentes no mercado e com uma grande vantagem, totalmente GRÁTIS. O IDE é composto de três aplicativos, a saber: 1) MIDE-51 – Editor utilizado para escrever o programa em “C” e com a interface para o compilador e aplicativo de carga. 2) WinLoader51 – Aplicativo em plataforma Windows® para a carga do firmware na placa didática. 3) SDCC – Compilador freeware para os principais microcontroladores existentes no mercado (Z80, 8051, PIC, etc)

© Jefferson Leal Couto

Página

51

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
8.1) MIDE-51 A seguir temos uma imagem do editor MIDE-51

Suas principais características são: 1) Identificação destacada para as palavras reservadas utilizadas na linguagem C e para os registradores padrão da família MCS-51. 2) Área de trabalho com suporte para múltiplos arquivos. 3) Suporte as principais características dos editores como copiar, colar, procurar, substituir. 4) Configuração do tamanho e tipo de fonte. 5) Salvar o arquivo aberto recentemente. 6) Atalho para o manual do compilador SDCC 7) Relatório com as mensagens do compilador SDCC

© Jefferson Leal Couto

Página

52

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
8) Copiar e Colar arquivos manipulados através do Windows Explorer 9) Suporte para mouse com Scroll 10) Bookmark para até 10 posições no programa fonte. 11) Ativar ou desativar o número das linhas no editor. 8.1.1) PRIMEIRO PROGRAMA Veremos agora como iniciar o editor e escrever um pequeno programa. 1) Abrir o editor com um duplo clique no ícone da figura abaixo que está na área de trabalho do Windows®

2) Com o ambiente do editor aberto, selecione no menu FILE / NEW. 3) Coloque o cabeçalho do projeto , a chamada para a biblioteca padrão para a placa didática e a rotina principal MAIN como no exemplo abaixo:
/*############################################################### # # # PROWARE PROJ. E SIST. ELETRONICOS # # # # PROJETO: TESTE # # # # MODULO: PRIMEIRO.C # # # # REVISÃO: 1 # # # # FUNCAO: # # # # HISTORICO: # # # # - Software inicial # # Autor: Jefferson Couto Data: 20/03/06 # # # ##############################################################*/ #include <pwlib.h> void main( ) { /* Escreva o seu programa aqui */ } © Jefferson Leal Couto Página 53 Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
4) Salve o arquivo em FILE / SAVE AS como Primeiro.C. Se tudo você fez todos os passos de forma correta, o programa deverá ficar com alguns detalhes com cor diferente. 5) Escreva o seu programa.

Como você está utilizando um ambiente adaptado, é importante tomar um pequeno cuidado com o nome do arquivo. Ele deve seguir o padrão utilizado pelo antigo DOS, isto é, você pode utilizar no máximo 8 letras para o nome do arquivo.

8.1.2) COMPILANDO E CARREGADO O PROGRAMA Para compilar o programa, basta clicar no ícone da figura abaixo.

Se tudo correr bem e o programa não possuir nenhum erro, na parte de baixo do editor vai aparecer uma mensagem que o arquivo HEX foi gerado. DONE. C:\PROJETOS\PRIMEIXO.HEX HAD BEEN GENERATED Para carregar o firmware na placa didática, basta clicar no icone da figura abaixo.

© Jefferson Leal Couto

Página

54

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
8.1.3) CONFIGURANDO O EDITOR PARA A PLACA DIDÁTICA Para que o arquivo HEX gerado pelo edito seja compatível com a placa didática utilizada na escola, devemos configurar o editor da seguinte forma: Selecione no menu EDIT / PREFERENCE. No TAB C-COMPILER verifique a existência das seguintes linhas de configuração: PARAMETER
-l pwlib.lib --code-loc 0x0000 --iram-size 0xFF --idata-loc 0x80 --xram-loc 0x0000

PATH
c:\mide\sdcc

No TAB PROGRAMMER verifique a existência da seguinte linha de configuração: EXECUTE FILE
C:\Arquivos de programas\WinLoader51\WinLoader51.exe

© Jefferson Leal Couto

Página

55

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
8.2) WinLoader51 Agora veremos um pouco sobre o aplicativo utilizado para a carga do programa na placa didática. Na figura abaixo temos a imagem da interface principal do programa.

Após clicar no icone para fazer a carga do firmware ( 8.1.2 ) o botão de GRAVAR no aplicativo deverá estar habilitado se o programa for compilado e carregado com sucesso, isto é, o texto “Gravar” deverá estar na cor verde. Caso o botão esteja com o texto em cinza existem duas possibilidades: 1) O arquivo HEX não foi gerado devido a algum erro no programa. 2) O arquivo gerado não pode ser aberto pelo aplicativo. 3) O aplicativo não conectou com a placa porque não estava em modo carga. Se o botão estiver habilitado, você poderá ver na parte de baixo do aplicativo o nome do arquivo HEX que foi carregado pelo WinLoader51 e o Checksum do firmware selecionando a opção FERRAMENTAS / STATUS. NOTA: O checksum é a soma de todos os bytes do arquivo HEX gerado pelo compilador. Para gravar o programa na placa didática devemos seguir os seguintes passos: Pressione o botão de CARGA na placa didática de forma que o LED da placa fique na cor vermelha. Se o aplicativo estiver sendo executado, o LED de STATUS deverá ficar na mesma cor da placa, informando que existe comunicação entre eles.

© Jefferson Leal Couto

Página

56

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
Havendo comunicação com a placa, no menu SOBRE / PROGRAMA O usuário poderá verificar que o aplicativo estará em MODO DESENVOLVIMENTO

Neste momento, o usuário deve clicar no botão “Gravar”. Após alguns segundos o aplicativo deve mostrar uma barra com o andamento da carga do firmware na placa.

© Jefferson Leal Couto

Página

57

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
O usuário deverá pressionar novamente o botão CARGA na placa didática. O LED do aplicativo deve alterar para a cor verde. A placa deve executar o programa que foi enviado pela interface serial.

© Jefferson Leal Couto

Página

58

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
8.2.1) RECURSOS AVANÇADOS DO APLICATIVO O aplicativo WinLoader51 foi desenvolvido com alguns recursos para agilizar o processo de carga do firmware na placa didática. Devido ao fato de utilizarmos a interface serial para fazer a carga do programa, em alguns casos, a porta serial poderá estar sendo utilizada pelo sistema operacional para o controle do “mouse”. O aplicativo possui um recurso de varredura que procura a placa na porta serial que estiver disponível. Se realmente não for possível a conexão, você será informado com uma mensagem de erro.

Se o usuário desejar verificar se o conteúdo do buffer do aplicativo ( Arquivo HEX gerado ) foi transferido com sucesso, basta clicar no botão VERIFICAR que o aplicativo faz a verificação do checksum armazenado na placa. Se o valor estiver correto o aplicativo mostrara a seguinte mensagem:

As principais dúvidas do usuário poderão ser esclarecidas através do help do aplicativo. Basta clicar em SOBRE / AJUDA para abrir o programa de ajuda.

© Jefferson Leal Couto

Página

59

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
9) EXEMPLO DE PROGRAMAS PARA A PLACA DIDÁTICA PWLOADER51
9.1) Entrada de dados pelo teclado e saída pelo display de LCD
##################################################################################### # # # PROWARE PROJ. E SIST. ELETRONICOS # # # # PROJETO: DIGITAR VELOCIDADE # # # # MODULO: TECLCD.C # # # # REVISÃO: 1 # # # # FUNCAO: # # # # HISTORICO: # # # # - Software inicial # # Autor: Jefferson Couto Data: 10/09/06 # # # # # # # #####################################################################################*/ #include <pwlib.h> unsigned int uiGVelocidade; void main() { unsigned char ucLContador; while(1) {

PWDisplayLimpa(); PWDisplayEscreveString ("Velocidade =" 1,1); uiGVelocidade = PWEntraIntxxxxx (); PWDisplayEscreveString ("Digitado= "2,1); PWMostraIntxxxxx (uiGVelocidade);

// Limpa display // Mostra mensagem na linha 1 // Aguarda usuário digitar valor // Coloca mensagem na posição … // Mostra variável inteiro no display

for(ucLContador = 0; ucLContador < 8; ucLContador++) { PWDelayms (250); // Delay de 250ms x 8 } } }

© Jefferson Leal Couto

Página

60

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS

9.2) Leitura no conversor Analógico/Digital (A/D)
##################################################################################### # # # PROWARE PROJ. E SIST. ELETRONICOS # # # # PROJETO: CONVERSOR ANALOGICO DIGITAL # # # # MODULO: AD/DA.C # # # # REVISÃO: 1 # # # # FUNCAO: # # # # HISTORICO: # # # # - Software inicial # # Autor: Jefferson Couto Data: 10/09/06 # # # ##################################################################################### #include <pwlib.> #include <8051.h> void InicializaRegistradores(void); void main(void) { unsigned char ucLRetorno; unsigned char ucLPosicaoLCD; unsigned char ucLContador = 0; unsigned char ucLOpcao; unsigned char ucLByte; unsigned char ucLCanal = 0; InicializaRegistradores(); PWDisplayInicializa(); PWDisplayPosicionaCursor(2,7); PWDelay(30000); PWDisplayEscreveString(" Teste AD/DA ",1,1); PWDisplayEscreveString(" ",2,1); PWDelay1Segundo(1); ucLPosicaoLCD = 0; ucLContador = 0; while(1) { PWDisplayEscreveString("Selecione Opcao:",1,1); PWDisplayEscreveString(" 1-A/D 2-D/A ",2,1); do { ucLRetorno = PWLeTeclado(); }while(ucLRetorno == 0);

© Jefferson Leal Couto

Página

61

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS

if((ucLRetorno >= '1')&&(ucLRetorno < '3')) { ucLOpcao = ucLRetorno; switch(ucLOpcao) { case '1': PWDisplayEscreveString("Selecione Canal:",1,1); PWDisplayEscreveString("1-A/D0 2-A/D1 ",2,1); do { ucLRetorno = PWLeTeclado(); } while(ucLRetorno != 0); do {

ucLRetorno = PWLeTeclado(); switch(ucLRetorno) { case '1': ucLCanal = 1; break; case '2': ucLCanal = 2; break;

} }while(ucLCanal == 0); break; case '2': PWDisplayEscreveString("Selecionado: ",1,1); PWDisplayEscreveString("Conversor D/A 0 ",2,1); break;

} PWDelay1Segundo(1); break; } else {

}

PWDisplayEscreveString("Selecao invalida",1,1); PWDisplayEscreveString("Tente novamente.",2,1); PWDelay1Segundo(1);

} ucLByte = 0; PWDisplayLimpa();

© Jefferson Leal Couto

Página

62

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS

if(ucLOpcao == '2') { PWDisplayEscreveString("Fechar jump. JP1",1,1); PWDisplayEscreveString("pres. tecla test",2,1); do { ucLRetorno = PWLeTeclado(); } }while(ucLRetorno == 0);

while(1) { if(ucLOpcao == '1') { if(ucLCanal == 1) { ucLByte = PWLeituraAD(0); } else { ucLByte = PWLeituraAD(1); } PWBinToASCII(2,1,ucLByte ); PWDelay1Segundo(1);

// Seleciona leitura do A/D canal 0

}

if(ucLOpcao == '2') { PWDisplayEscreveString("WR ",1,1); PWDisplayEscreveString("RD PWEscreveDA(0,ucLByte); PWDelayms(50); PWBinToASCII(1,4,ucLByte ); ucLByte++; do { ucLRetorno = PWLeituraAD(0); PWDelay1Segundo(1); PWBinToASCII(2,4,ucLRetorno ); ucLRetorno = PWLeTeclado(); } while(ucLRetorno == 0);

// Seleciona escrita no D/A canal 0 ",2,1);

// Escreve valor da variável

} }

} void InicializaRegistradores(void) { IP = 0x00; TMOD = 0x00; IE = 0x00; TMOD = 0x01; TR0 = 1; // Configura prioridade padrao para interrupcoes // Configura modo do TIMER // Habilita interrupção timer 0 // Timer zero no modo 1

© Jefferson Leal Couto

Página

63

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
}

9.3) Escrita no Conversor Analógico/Digital (D/A)
##################################################################################### # # # PROWARE PROJ. E SIST. ELETRONICOS # # # # PROJETO: CONTROLE DE SAIDA DO D/A # # # # MODULO: DIGITAVO.C # # # # REVISÃO: 1 # # # # FUNCAO: # # # # HISTORICO: # # # # - Software inicial # # Autor: Jefferson Couto Data: 20/03/06 # ##################################################################################### #include <PWlib.h> #include <8051.h> void MostraValor(unsigned char); void InicializaRegistradores(void); void main() { unsigned char ucLValor; unsigned char ucLCopia; InicializaRegistradores(); // Chama subrotina que inicializa registradores PWDisplayInicializa(); PWDisplayLimpa(); while(1) { PWDisplayEscreveString("Tensao VO: ",1,1); ucLValor = PWEntraCharx_x(1,11); ucLValor = ucLValor * 2; PWEscreveDA(0,ucLValor); MostraValor(ucLValor); PWDisplayLimpaLinha(2); }

}

void InicializaRegistradores(void) { IP = 0x00; // Configura prioridade padrao para interrupcoes TMOD = 0x00; // Configura modo do TIMER IE = 0x00; // Desabilita interrupções } void MostraValor(unsigned char Valor) { unsigned char ucLTecla; PWDisplayEscreveString ("DEC: ",2,1); PWMostraCharxxx(Valor); do { ucLTecla = PWLeTeclado(); }while( ucLTecla == 0); // Mostra valor atual da variável // Aguarda usuário pressionar uma tecla

}

© Jefferson Leal Couto

Página

64

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS

9.4) PHASE WIDTH MODULATION ( PWM)
##################################################################################### # # # PROWARE PROJ. E SIST. ELETRONICOS # # # # PROJETO: PWM # # # # MODULO: PWM.C # # # # REVISÃO: 1 # # # # FUNCAO: # # # # HISTORICO: # # # # - Software inicial # # Autor: Jefferson Couto Data: 28/05/06 # ##################################################################################### #include <PWlib.h> #include <8051.h> void InicializaRegistradores(void); unsigned char ucGPwmHigh = 0; unsigned char ucGPwmLow = 0; unsigned char ucGTecla; unsigned char ucAtualiza = 0; unsigned char ucGDutyCicle = 50; #define CONTAGEM 46 // Tempo de 1ms Ciclo de máquina x 9 X 100 = aproximadamente 1mS #define CONTAGEMH (65535-CONTAGEM)/256 #define CONTAGEML (65535-CONTAGEM) void Int_Timer0(void) interrupt 1 { IT0 = 0; if(ucGPwmHigh > 0) { P1_0 = 1; ucGPwmHigh--; } else { if(ucGPwmLow > 0) { P1_0 = 0; ucGPwmLow--; } else { if(ucGDutyCicle == 0) P1_0 = 0; else P1_0 = 1; ucGPwmHigh = ucGDutyCicle; ucGPwmLow = 100 - ucGDutyCicle; } } TH0 = CONTAGEMH; TL0 = CONTAGEML; IT0 = 1; } void main()

© Jefferson Leal Couto

Página

65

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
{ ucGDutyCicle = 50; // Duty cicle do PWM em 50% InicializaRegistradores(); PWDisplayInicializa(); PWDisplayLimpa(); PWDisplayEscreveString ("GERANDO PWM ",1,1); PWMostraCharxxx(ucGDutyCicle); PWEscreveCaractere('%'); while(1) { ucGTecla = PWLeTeclado(); if(ucGTecla == '2') { if(ucGDutyCicle < 100) ucGDutyCicle++; PWDisplayLimpa(); PWDisplayEscreveString("Aumenta PWM ",1,1); PWMostraCharxxx(ucGDutyCicle); PWEscreveCaractere('%'); PWDelayms(100); ucAtualiza = 1; // Mostra mensagem na linha 1

} if(ucGTecla == '1') { if(ucGDutyCicle > 0) ucGDutyCicle--;

} if((ucAtualiza)&&(ucGTecla == 0)) // Se nenhuma tecla pressionada e alterou Duty Cicle { PWDisplayLimpa(); PWDisplayEscreveString ("GERANDO PWM ",1,1); PWMostraCharxxx(ucGDutyCicle); PWEscreveCaractere('%'); ucAtualiza = 0; } } } void InicializaRegistradores(void) { IP = 0x00; // Configura prioridade padrao para interrupcoes IE = 0x82; // Habilita interrupção timer 0 TMOD = 0x01; // Timer zero no modo 1 TR0 = 1; TH0 = CONTAGEMH; TL0 = CONTAGEML;

PWDisplayLimpa(); PWDisplayEscreveString("Diminui PWM ",1,1); PWMostraCharxxx(ucGDutyCicle); PWEscreveCaractere('%'); PWDelayms(100); ucAtualiza = 1;

// Mostra mensagem na linha 1

}

© Jefferson Leal Couto

Página

66

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
9.5) Medir largura de pulso
##################################################################################### # # # PROWARE PROJ. E SIST. ELETRONICOS # # # # PROJETO: MEDIR LARGURA DE PULSO # # # # MODULO: LARGURAP.C # # # # REVISÃO: 1 # # # # FUNCAO: # # # # HISTORICO: # # # # - Software inicial # # Autor: Jefferson Couto Data: 20/03/06 # #####################################################################################* #include<PWlib.h> #include <8051.h> void InicializaRegistradores(void); unsigned char ucAtualiza = 0; unsigned char ucGFlag = 0; unsigned int uiGLarguraPulso; void Int_Ex1(void) interrupt 2 { EX1 = 0; TR1 = 0; if(!ucGFlag) { ucGFlag = 1; ucAtualiza = 1; uiGLarguraPulso = ((256 * TH1) + TL1); } else { TH1 = 0; TL1 = 0; EX1 = 1; ucGFlag = 0; TR1 = 1;

// Desliga a interrupção externa 0

// Zera regustradores utilizados na medida // Liga a interrupção externa 0

} }

© Jefferson Leal Couto

Página

67

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
void main() { unsigned char ucLByte; SP = 0x80; // Inicializa Stack Pointer RS0 = 0; // Seleciona banco zero RS1 = 0; // Seleciona banco zero uiGLarguraPulso = 0; // Duty cicle do PWM em 50% PWDisplayInicializa(); PWDisplayLimpa(); PWDisplayEscreveString("Largura = ",1,1); // Mostra mensagem na linha 1 InicializaRegistradores(); // Chama subrotina que inicializa registradores ucAtualiza = 1; while(1) { if(ucAtualiza) { PWEscreveComando(0x8A); PWMostraIntxxxx(uiGLarguraPulso); PWDisplayEscreveString("TH1=",2,1); ucLByte = TH1; PWMostraCharxxx(ucLByte); PWDisplayEscreveString("TL1=",2,9); ucLByte = TL1; PWMostraCharxxx(ucLByte); ucAtualiza = 0; PWDelayms(400); IE1 = 0; EX1 = 1; } } } void InicializaRegistradores(void) { IP = 0x00; IE = 0x84; TMOD = 0x90; TCON = 0x41; TH1 = 0; TL1 = 0; } // Configura prioridade padrao para interrupcoes // Habilita interrupção Externa 1 // Timer UM no modo 1 medindo largura de pulso // Liga TR1 e Configura Int Externa 0 por borda

© Jefferson Leal Couto

Página

68

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
10) FUNÇÕES DA BIBLIOTECA PWLIB
10.1) void PWDelayms(unsigned int) Descrição: Rotina de delay por software. Entrada: Tempo de atraso multiplo de 1ms. Saida: Nenhuma Exemplo: PWDelayms(45); // Delay de 45 ms

10.2) void PWDelay1Segundo(char) Descrição: Rotina de delay por software. Entrada: Tempo de atraso multiplo de 1 segundo Saida: Nenhuma Exemplo: PWDelay1Segundo(4); // Delay de 4 segundos

10.3) void PWDelay (int) Descrição: Rotina de delay por software. Entrada: Tempo de atraso Saida: Nenhuma Exemplo: PWDelay(3000); // Delay

10.4) void PWDisplayInicializa (void) Descrição: Inicializa o display (programação inicial). Entrada: Nenhuma Saida: Nenhuma Exemplo: PWDisplayInicializa(); // Inicializa o display

© Jefferson Leal Couto

Página

69

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
10.5) void PWDisplayEscreveString (unsigned char*,char,char) Descrição: Mostra uma sequência de caracteres no display de LCD. Entrada: Ponteiro para a string Linha do display Coluna do display Saida: Nenhuma Exemplo: PWDisplayEscreveString(“Proware”,2,1); // Mensagem na Linha 2 Coluna 1

10.6) void PWEscreveStringPadrao (void) Descrição: Mostra uma sequência padrão de caracteres no display de LCD. Entrada: Nenhuma Saida: Nenhuma Exemplo: PWEscreveStringPadrao ( ); // Mostra tela padrão

10.7) void PWDisplayLimpa(void) Descrição: Limpa todo o display de LCD. Entrada: Nenhuma Saida: Nenhuma Exemplo: PWDisplayLimpa (); // Limpa do display

10.8) void PWDisplayLimpaLinha(char) Descrição: Limpa uma das linhas do display. Entrada: 1 – Para limpar primeira linha e 2 – Para limpar segunda linha Saida: Nenhuma Exemplo: PWDisplayLimpaLinha(2); // Limpa segunda linha do display

© Jefferson Leal Couto

Página

70

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
10.9) void PWEscreveCaractere (unsigned char) Descrição: Mostra o caractere na posição atual do display. Entrada: Caractere a ser mostrado no display de LCD Saida: Nenhuma Exemplo: PWEscreveCaractere (‘J’); // Mostra a letra ‘J’ no display de LCD

10.10) void PWEscreveComando(unsigned char) Descrição: Envia comando de programação para o display de LCD. Entrada: Comando a ser enviado para o display Saida: Nenhuma Exemplo: PWEscreveComando (0xC0); // Comando para posicionar o cursor na Linha 2 e // Coluna 1

10.11) void PWDisplayAtivaCursor(void) Descrição: Faz com que o cursor fique visível no LCD. Permite que o usuário visualize a posição atual do cursor. Entrada: Nenhuma Saida: Nenhuma Exemplo: PWDisplayAtivaCursor();

// Ativa o cursor no LCD

10.12) void PWDisplayDesativaCursor(void) Descrição: Faz com que o cursor fique invisível no LCD. O usuário não poderá visualizar a posição atual do cursor. Entrada: Nenhuma Saida: Nenhuma Exemplo: PWDisplayDesativaCursor();

// Desativa o cursor no LCD

© Jefferson Leal Couto

Página

71

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
10.13) void PWDisplayPosicionaCursor (char,char) Descrição: Posiciona o cursor em uma determinada linha e coluna do LCD. Entrada: Linha – 1 para primeira linha e 2 - para segunda linha Coluna – 1 a 16 – Conforme colunas do display Saida: Nenhuma

Exemplo: PWDisplayPosicionaCursor (2,4); // Posiciona o cursor da linha 2 coluna 4

10.14) char PWLeTeclado (void) Descrição: Faz a varredura do teclado e verifica se alguma tecla foi pressionada. Entrada: Nenhuma Saida: Retorna 00h se nenhuma tecla foi pressionada ou o valor da tecla em ASCII conforme a tecla que foi pressionada. Exemplo: ucLTecla = PWLeTeclado (); // Armazena em ucLTecla o valor lido no teclado 10.15) char PWLeituraAD (unsigned char) Descrição: Faz a leitura do conversor A/D, conforme o número do conversor. Entrada: 0 – A/D0 , 1 – A/D1, 2 – A/D2 e 3 – A/D3 ( Sendo A/D 2 e 3 na expansão) Saida: Retorna um valor de 8 bits ( 0 a 255 ) conforme a leitura do A/D Exemplo: ucLAD = PWLeituraAD (0); // Armazena em ucLAD o valor lido no A/D

10.16) void PWEscreveDA ( char, unsigned char ) Descrição: Escreve no conversor Digital/Analógico um valor de 8 bits na saída determinada pelo parâmetro número do D/A Entrada: Saída – Valor de 0 a 3 conforme conversor Dado – Valor entre 0 a 255 referente ao dado a ser gravado no conversor. Saida: Nenhuma

© Jefferson Leal Couto

Página

72

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
Exemplo: PWEscreveDA (0,Byte); // Armazena o Byte na saída do conversor D/A0

10.17) char PWConfiguraSerial8N1(unsigned char) Descrição: Programa a velocidade da serial assíncrona no modo 8 bits de dados, sem paridade e um stop bit. Entrada: 0 – 1200, 1 – 2400, 2 – 4800, 3 - 9600 Saida: Nenhuma. Exemplo: PWConfiguraSerial8N1(3); // Programa na velocidade de 9600 bps.

10.18) char PWEnviaSerial(char*, unsigned char) Descrição: Envia um array pela porta serial. Entrada: Dados – Ponteiro para o array Tamanho – Quantidade de bytes ( 0 a 255 ) Saida: Retorna um byte com a resposta do dispositivo ou 0 se não recebeu nenhum byte como retorno. Exemplo: PWEnviaSerial(BuffDados,12 ); // Envia o conteúdo de BuffDados

10.19) char PWEnviaRecebeSerial(char*, unsigned char,unsigned char) Descrição: Envia um array pela porta serial. Aguarda os dados da resposta. Entrada: Dados – Ponteiro para o array com dados enviados e recebidos. TamanhoSaida – Quantidade de bytes que serão enviados( 0 a 255 ) TamanhoEntrada – Quantidade de bytes que serão recebidos Saida: Retorna um byte com 0 para sucesso e 1 para erro. Exemplo: PWEnviaRecebeSerial(BuffDados,12,3 ); // Envia 12 bytes de BuffDados e // armazena 3 bytes de retorno em // BuffDados.

© Jefferson Leal Couto

Página

73

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
10.20) void PWBinToASCII (unsigned char,unsigned char,unsigned char) Descrição: Mostra o valor de um byte em binário no display de LCD. Entrada: Byte que será convertido para binário. Linha – Número da linha onde será mostrado no display ( 1 ou 2 ) Coluna – Número da coluna onde será mostrado no display ( 1 a 16 ) Saida: Nenhuma Exemplo: PWBinToASCII ( Byte,1,1 ); // Mostra o valor de Byte na linha 1 e coluna 1

10.21) void PWMostraCharxx(unsigned char) Descrição: Mostra o conteúdo de um variável byte no formato decimal na posição atual do display. Valor entre 00 e 99. Entrada: Byte que será mostrado no LCD Saida: Nenhuma Exemplo: PWMostraCharxx(Byte); // Mostra o valor de Byte no LCD

10.22) void PWMostraCharxxx(unsigned char) Descrição: Mostra o conteúdo de uma variável byte no formato decimal na posição atual do display. Valor entre 00 e 255. Entrada: Byte que será mostrado no LCD Saida: Nenhuma Exemplo: PWMostraCharxxx(Byte); // Mostra o valor de Byte no LCD

10.23) void PWMostraIntxxx(unsigned int) Descrição: Mostra o conteúdo de uma variável word no formato decimal na posição atual do display. Valor entre 00 e 999. Entrada: Word que será mostrado no LCD Saida: Nenhuma Exemplo: PWMostraIntxxx(uiLValor); // Mostra o valor de uiLValor no LCD

© Jefferson Leal Couto

Página

74

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
10.24) void PWMostraIntxxxx(unsigned int) Descrição: Mostra o conteúdo de uma variável word no formato decimal na posição atual do display. Valor entre 00 e 9999. Entrada: Word que será mostrado no LCD Saida: Nenhuma Exemplo: PWMostraIntxxxx(uiLValor); // Mostra o valor de uiLValor no LCD

10.25) void PWMostraIntxxxxx(unsigned int) Descrição: Mostra o conteúdo de uma variável word no formato decimal na posição atual do display. Valor entre 00 e 65535. Entrada: Word que será mostrado no LCD Saida: Nenhuma Exemplo: PWMostraIntxxxx(uiLValor); // Mostra o valor de uiLValor no LCD

10.26) void PWMostraIntxx_xx (unsigned int) Descrição: Mostra o conteúdo de uma variável word no formato decimal com duas casas decimais na posição atual do display. Valor entre 00 e 99,99. Entrada: Word que será mostrado no LCD. Valor dividido por 100 Saida: Nenhuma Exemplo: PWMostraIntxx_xx(1278); // Mostra o valor 12,78 no LCD

10.27) unsigned char PWEntraCharx_x(unsigned char, unsigned char) Descrição: Solicita a entrada de um valor com uma casa decimal. Retorna um valor entre 0 e 255 ( 255 / 10 ). Anula limpa valor e solicita nova entrada. Entrada: Linha no LCD onde será feita a entrada dos dados. Coluna no LCD onde será feita a entrada dos dados. Saida: Valor entre 0 e 255 conforme o valor digitado pelo usuário. Exemplo: ucLByte = PWEntraCharx_x(1,4); // Aguarda o usuário digital o valor

© Jefferson Leal Couto

Página

75

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
10.28) unsigned char PWEntraCharxx_x(unsigned char, unsigned char) Descrição: Solicita a entrada de um valor com uma casa decimal. Retorna um valor entre 0 e 255 ( 255 / 100 ). Anula limpa valor e solicita nova entrada. Entrada: Linha no LCD onde será feita a entrada dos dados. Coluna no LCD onde será feita a entrada dos dados. Saida: Valor entre 0 e 255 conforme o valor digitado pelo usuário. Exemplo: ucLByte = PWEntraCharxx_x(1,4); // Aguarda o usuário digital o valor

10.29) unsigned char PWEntraCharxx(unsigned char, unsigned char) Descrição: Solicita a entrada de um valor com duas casas. Retorna um valor entre 0 e 99. Anula limpa valor e solicita nova entrada. Entrada: Linha no LCD onde será feita a entrada dos dados. Coluna no LCD onde será feita a entrada dos dados. Saida: Valor entre 0 e 99 conforme o valor digitado pelo usuário. Exemplo: ucLByte = PWEntraCharxx(1,4); // Aguarda o usuário digital o valor 10.30) unsigned char PWEntraCharxxx(unsigned char, unsigned char) Descrição: Solicita a entrada de um valor com três casas. Retorna um valor entre 0 e 255. Anula limpa valor e solicita nova entrada. Entrada: Linha no LCD onde será feita a entrada dos dados. Coluna no LCD onde será feita a entrada dos dados. Saida: Valor entre 0 e 255 conforme o valor digitado pelo usuário. Exemplo: ucLByte = PWEntraCharxxx(1,4); // Aguarda o usuário digital o valor

10.31) unsigned int PWEntraIntxxx(unsigned char, unsigned char) Descrição: Solicita a entrada de um valor com três casas. Retorna um valor entre 0 e 999. Anula limpa valor e solicita nova entrada. Entrada: Linha no LCD onde será feita a entrada dos dados. Coluna no LCD onde será feita a entrada dos dados. Saida: Valor entre 0 e 999 conforme o valor digitado pelo usuário. Exemplo: uiLValor = PWEntraIntxxx(1,4); // Aguarda o usuário digital o valor

© Jefferson Leal Couto

Página

76

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
10.32) unsigned int PWEntraIntxxxx(unsigned char, unsigned char) Descrição: Solicita a entrada de um valor com três casas. Retorna um valor entre 0 e 9999. Anula limpa valor e solicita nova entrada. Entrada: Linha no LCD onde será feita a entrada dos dados. Coluna no LCD onde será feita a entrada dos dados. Saida: Valor entre 0 e 9999 conforme o valor digitado pelo usuário. Exemplo: uiLValor = PWEntraIntxxxx(1,4); // Aguarda o usuário digital o valor 10.33) unsigned int PWEntraIntxxxxx(unsigned char, unsigned char) Descrição: Solicita a entrada de um valor com três casas. Retorna um valor entre 0 e .65535 Anula limpa valor e solicita nova entrada. Entrada: Linha no LCD onde será feita a entrada dos dados. Coluna no LCD onde será feita a entrada dos dados. Saida: Valor entre 0 e 65535 conforme o valor digitado pelo usuário. Exemplo: uiLValor = PWEntraIntxxxx(1,4); // Aguarda o usuário digital o valor 10.34) unsigned int PWEntraIntxx_xx (unsigned char, unsigned char) Descrição: Solicita a entrada de um valor com duas casas decimais. Retorna um valor entre 0 e 9999. Anula limpa valor e solicita nova entrada. Entrada: Linha no LCD onde será feita a entrada dos dados. Coluna no LCD onde será feita a entrada dos dados. Saida: Valor entre 0 e 9999 conforme o valor digitado pelo usuário. O valor em ponto flutuante será multiplicado por 100. Exemplo: uiLValor = PWEntraIntxx_xx(1,4); // Aguarda o usuário digital o valor Se o usuário digitar 76,25, o valor de uiLValor será 7625 sem vírgulas.

© Jefferson Leal Couto

Página

77

Rev. E

PROWARE PROJ. E SIST. ELETRÔNICOS
11) INFORMAÇÕES SOBRE O KIT

© Jefferson Leal Couto

Página

78

Rev. E

Sign up to vote on this title
UsefulNot useful