Anda di halaman 1dari 101

Universidade de Aveiro

Departamento de Engenharia Mecânica


Tecnologias de Accionamento e Comando 2009/2010

1 COMANDO do NÍVEL da ÁGUA a partir de um µC

Objectivos:
- Compreensão da arquitectura interna dos µControladores;
- Introdução à programação dos µC , em “Assembler”;
- Utilização do ambiente integrado de desenvolvimento de programas – MPLAB;
- Aprender a transferir para a memória flash do µC esse programa;
- Utilização das entradas e saídas digitais dos µC.

Material a utilizar:
Software: MPLAB (IDE), MPASM Toolsuite (assembler, Linker, Librarian).
Hardware: Placa branca de montagem, µC, Regulador de tensão, 2 leds, 2 resistências de 4k7.

Data de entrega:
O programa do µC deve ser enviado por correio electrónico até às 24h de 12 Novembro.

Pretende-se ligar a electroválvula de entrada sempre que o reservatório atinja o nível N2. A
electroválvula de entrada deve permanecer ligada até que a água no reservatório atinja o nível N3.
A electroválvula de saída deve estar ligada sempre que o nível de água seja superior ao nível N1.

Figura 1.1: Reservatório

Tecnologia de Accionamento e Comando 2009/2010, Trabalho Nº 1 1


APÊNDICE I

1.1 Introdução aos microControladores

Os microControladores surgiram pela mão da General Instruments, nos anos 70, e tinham a
designação de “Peripheral Intelligent Computer - PIC”. Estes PICs tinham por objectivo libertar
os microprocessadores, usados nos computadores, do processamento e tratamento de entradas e
saídas digitais dos dispositivos periféricos.
Mais tarde, a General Instruments vendeu a sua divisão de semicondutores à Microchip
Technology o que potenciou o desenvolvimento dos microcontroladores.
Actualmente, os PIC são verdadeiros computadores num só chip, possuem Arithmetic Logic Unit -
ALU, Random Acess Memory - RAM, Electric Erasable Programmable ROM - EEPROM,
conversores A/D, interfaces de comunicação e são usados em quase tudo, desde em telemóveis,
DVDs , cameras, carros, frigoríficos, brinquedos, fotocopiadores, impressoras, domótica, e em
muitos outros equipamentos.

1.1.1 Os microControladores e os PLCs


Apesar das diferenças, os microControladores possuem várias semelhanças com os autómatos
programáveis PLCs:

- Os dois possuem memória interna para armazenarem os seus programas;


- Ambos podem executar autonomamente esses programas;
- Os seus programas são escritos em computador e depois de compilados são transferidos para
as suas memórias internas;
- Ambos podem ter entradas e saídas eléctricas: digitais e analógicas;
- Os dois podem ter interfaces de comunicação do tipo Rs232, Rs485, Ethernet, CAN, etc.

Figura 1.2: MicroControlador

Existem também diferenças entre os dois, os PLCs foram concebidos para funcionar em ambientes
industriais e possuem por isso protecções mecânicas e eléctricas que os µC não possuem. Além
disso os µC s geram tensões iguais ou inferiores a 5v e apenas podem debitar intensidades de
corrente reduzidas.

Tecnologia de Accionamento e Comando 2009/2010, Trabalho Nº 1 2


Contudo, os µC têm a seu favor um preço imbatível, uma reduzida dimensão e um baixo consumo
eléctrico. Estas características permitem a sua utilização em inúmeros equipamentos, mais
exactamente, “dentro” de inúmeros equipamentos “embedded”, ao passo que um computador ou
um PLC não poderia ser utilizado nas mesmas situações devido ao seu elevado consumo eléctrico,
grandes dimensões e preço elevado.

1.1.2 Arquitectura interna dos µC

Os µC possuem uma memória para os programas e outra memória para os dados. As duas podem
ser acedidas simultaneamente pela unidade central de processamento “Central Processing Unit -
CPU”, pois existem dois barramentos independentes, um para os dados e outro para as instruções.
Esta arquitectura é conhecida por “arquitectura de Harvard”. Os µC possuem também diversas
entradas e saídas, digitais e analógicas, e também interfaces de comunicação (Figura 1.3).

Figura 1.3: Arquitectura interna de um micro controlador [Rizonni, pp 673]

a) Pinos externos

Cada pino de um µC pode ter diversas funcionalidades, pode por exemplo: actuar como uma
saída digital de 5V, como uma entrada digital, ou como uma saída analógica (0 a5v). É este o
caso do pino nº1 do µC que vamos utilizar neste trabalho. Tal como a Figura 1.4 ilustra, o pino
nº1 deste µC pode actuar como uma entrada ou saída digital (RA2), como uma entrada
analógica (AN2) ou como uma saída analógica (Vref). Para que isto seja possível, é necessário
que cada pino externo possa ser ligado, de forma selectiva e programável, a um dos vários
circuitos internos do µC. Isto é conseguido se o nosso programa, ao ser executado pelo µC,
escrever nalguns bits de memória do µC o valor “0” ou valor “1”. O valor destes bits activam

Tecnologia de Accionamento e Comando 2009/2010, Trabalho Nº 1 3


determinados selectores electrónicos (AND, OR, …) permitindo estabelecer diferentes ligações
eléctricas entre os pinos externos e os circuitos internos.
Este µC é alimentado a 5 volt, +5v no pino Vdd e zero volt no pino Vss.
Pode também ter um cristal externo, ligado aos pinos OSC1 e OSC2, para gerar um sinal de
relógio.

Figura 1.4: microControlador P16F628A

b) Memória de dados
O PIC16F628A tem 224 bytes de memória de dados e
cada byte tem, naturalmente, oito bits.
Algumas destas posições de memória contêm os bits
especiais referidos na alínea anterior e podem ser usados
pelo programador para configurar alguns pinos externos
como entradas ou saídas, para activar ou desactivar
temporizadores internos, configurar interfaces de
comunicação Rs232, etc.
Outras posições de memória estão livres e podem ser
utilizadas livremente pelo programador, como variáveis
para armazenar números, caracteres, etc “General
Purpose Register”. Esta memória é uma memória RAM,
e perde os seus dados quando se desliga o µC (memória
volátil). Figura 1.5: Memória de dados

c) Memória dos programas

Os µC possuem também uma memória interna para armazenar os programas. O µC que vamos
utilizar neste trabalho possui uma memória Flash de 2048 posições. Sendo uma memória Flash
o programa não se perde mesmo quando se desliga o µC e este tipo de memória pode ser
reprogramado inúmeras vezes.

Tecnologia de Accionamento e Comando 2009/2010, Trabalho Nº 1 4


Cada posição de memória do programa deste µC tem 14 bits
e armazena uma instrução máquina (Figura 1.6).

Os bits de configuração

Os bits de configuração do µC residem na memória de


programas do µC, neste µC residem no endereço 2007h, e são
gravados durante a programação do µC (Figura 1.6).
Analise todas as opções de configuração do µC,
Configuration Bits, disponíveis no final do ficheiro
“p16f628a.inc”. Consulte o livro “Desbravando o PIC, pág
59” ou o manual da Microchip, “PIC16F627A/628A/648
Data Sheet, pág 95“.
Figura 1.6:Memória de programa

Figura 1.7: Registo de Configuração

Tecnologia de Accionamento e Comando 2009/2010, Trabalho Nº 1 5


a) Descreva por palavras suas para que servem os bits de configuração:

_BOREN_ON _BOREN_OFF

_CP_ON _CP_OFF

_DATA_CP_ON _DATA_CP_OFF

_PWRTE_OFF _PWRTE_ON

_WDT_ON _WDT_OFF

_LVP_ON _LVP_OFF

_MCLRE_ON _MCLRE_OFF

_RC_OSC_CLKOUT

_RC_OSC_NOCLKOUT

_HS_OSC

_XT_OSC

_LP_OSC

_ER_OSC_CLKOUT ;Backwards compatability to 16F62X

_ER_OSC_NOCLKOUT ;Backwards compatability to 16F62X

_INTRC_OSC_CLKOUT ;Backwards compatability to 16F62X

_INTRC_OSC_NOCLKOUT ;Backwards compatability to 16F62X

Tecnologia de Accionamento e Comando 2009/2010, Trabalho Nº 1 6


1.1.3 Compilação e transferência de programas para o µC

Convém relembrar o que significa “compilar um programa”, Figura 1.8.


Dá-se o nome de Compilação, à conversão de um o ficheiro de texto, neste caso escrito em
assembler, num ficheiro com código binário em que cada sequência de 14, 16, 18 ou 32 bits
corresponde a uma instrução máquina reconhecida pelo µC. O µC P16F628A reconhece e processa
instruções de 14 bits.
Como o nosso programa está escrito em assembler é necessário recorrer a um compilador de
assembler, neste exemplo vamos utilizar o compilador “MPASM suite”,

Figura 1.8: Compilação

Como resultado da compilação obtemos um novo ficheiro em disco, contendo código máquina,
que é necessário transferir posteriormente do computador para a memória do µC.
Podemos transferir esse código para o µC através de um programador. Existem diversos tipos de
programadores, por essa razão temos de indicar ao MPLAB qual dos programadores existentes
está disponível no laboratório. Como o programador disponível é o In Circuit Debugger - ICD2,
deverá seccionar a opção “Programmer  Select Programmer  MPLAB ICD2”

Utilizando o programador ICD2 transfira o programa para o µC. Ligue o ICD2 ao computador
através de uma ligação USB ou Rs232 (Figura 1.9).

Figura 1.9: Programador ICD2

Tecnologia de Accionamento e Comando 2009/2010, Trabalho Nº 1 7


Ligue o ICD2 ao µC através de um cabo próprio disponível no laboratório (Figura 1.10).

Figura 1.10: Ligações do programador ao µC

Teste as opções: “Programmer  Select Programmer  MPLAB ICD2”


“Programmer  MPLAB Setup ICD2 Wizard”
“Programmer  Settings”

Depois de transferir o programa para o µC, não se esqueça de fazer “Release” do pino “Master
Clear- MCLR” no ambiente integrado MPLAB. Só dessa forma o programa do µC poderá começar
a ser executado.

Tecnologia de Accionamento e Comando 2009/2010, Trabalho Nº 1 8


1.2 Como activar uma saída digital

Neste exemplo pretende-se que o programa do µC active a saída digital RB0. Os 5 volt que serão
disponibilizados pelo µC, no pino RB0, serão usados para alimentar um led.

1.2.1 Monte os componentes


Para implementar este exemplo é necessário utilizar um µC, um led, uma resistência e uma fonte
de alimentação de 5v. Em alternativa à fonte de alimentação podemos utilizar uma pilha de 9V (ou
um carregador de telemóvel, antigo) e um regulador de tensão de 5v.
Microcontrolador Reguladores de tensão
P16F628A MC78L05A
LM78L05

L7805

Figura 1.11: Componentes

Na montagem da Figura 1.11 não será utilizado um cristal externo, mas sim o oscilador interno de
4Mhz que este µC possui.
a) Dimensione o valor da resistência que deve colocar em série com o Led para impedir uma
corrente excessiva que danifique o led ou o µC.

R = _____ Ω

b) Desenhe o circuito na placa de montagem

Figura 1.12: Placa de montagem

Tecnologia de Accionamento e Comando 2009/2010, Trabalho Nº 1 9


1.2.2 Bits de memória importantes para configurar e activar uma saída digital

Um exemplo em assembler para configurar e activar a saída RB0.

Tecnologia de Accionamento e Comando 2009/2010, Trabalho Nº 1 10


1.2.3 Exemplo - programa “Saída digital”
Utilize um editor de texto simples como o “Notepad” para criar o ficheiro de texto no computador
“programa0.asm”. Este exemplo permite activar uma saída digital (Figura 1.10).

SaidaDigital.asm
As opções de configuração “__CONFIG” permitem que o
list p=p16f628A programa gerado, quando for transferido para o µC , configure
#include <p16f628A.inc> os recursos internos do µC .

__CONFIG _INTRC_OSC_CLKOUT & Por exemplo:


_CP_OFF & _PWRTE_OFF & A opção _INTRC_OSC_CLKOUT configura o µC para usar
_WDT_OFF & _LVP_OFF & um sinal de relógio interno. No caso do PIC16F628A, esse
_MCLRE_ON relógio tem 4 Mhz e dispensa a utilização externa de cristais ou
circuitos RC.
org 0x00
goto iniciar A opção _CP_OFF configura o µC para proteger o código
nele gravado, não permitindo uma leitura posterior. Mas
iniciar permite novas gravações de novos programas na sua memória
banksel TRISB interna (Flash).
bcf TRISB,0 A opção _WDT_OFF configura o µC para desligar o seu
banksel PORTB watchdog interno. Se o WDT estivesse ligado o programa
gravado no µC tinha de periodicamente pôr a zero uma posição
main de memória específica do µC caso contrário o µC reiniciava-se
bsf PORTB,0 sozinho.
goto main
end
Figura 1.13: Programa 0 – Activação de uma saída digital

a) Analise o ficheiro P16F628A.INC


Localize e visualize o conteúdo do ficheiro de texto “p16f628a.inc”. Este ficheiro de texto deverá
estar localizado no directório:
C:\Programas\Microchip\MPASM Suite\P16F628A.INC

b) Analise os bits especiais de configuração


Escreva por palavras suas a finalidade de cada um dos bits especiais:
_INTRC_OSC_CLKOUT
_CP_OFF
_WDT_OFF
_WDT_OFF
_LVP_OFF

c) Analise as instruções em Assembler


Analise todas as instruções usadas neste programa. Leia o manual da Microchip,
“PIC16F627A/628A/648 Data Sheet, pág 116” ou o livro “Desbravando o PIC, pág 209”. Escreva
por palavras suas a finalidade de cada uma das seguintes instruções:
org 00:

goto:

bcf:

bsf:

banksel:

Tecnologia de Accionamento e Comando 2009/2010, Trabalho Nº 1 11


1.2.4 Execução de programas em modo simulado, no computador

Se não tiver à sua disposição um µC e um programador de µCs pode, alternativamente à


programação do µC real, simular no próprio computador a execução do seu programa, passo a
passo, e observar em modo simulado, no monitor do seu computador, o valor que as saídas do µC
assumiriam. Pode também simular que activa as entradas do µC e observar o que acontece.
Para simular no computador a execução do seu programa deve utilizar o programa MPLAB,
escolher o seu menu “Debugger” e seleccionar a ferramenta “MPLAB Sim”. Consulte o livro
“Desbravando o PIC” (pág 179).

Teste as opções: “Debugger  Select Tool  MPLAB Sim ”


“Debugger  Stimulus”
“Debugger  Settings”
“View  Watch”
“View  Program Memory”
“View  Special Function Registers

1.3 Leitura de uma entrada digital

Neste exemplo pretende-se adquirir o valor de uma entrada digital, mais exactamente da entrada
RA2 e em função do valor da entrada RA2 pretende-se também activar ou desactivar a saída RB0
(Figura 1.14).

1.3.1 Monte os componentes

Figura 1.14: Componentes da montagem 1

O pino RA2 será utilizado como uma entrada digital. A saída digital continua a ser utilizada para
activar um led como no exemplo anterior. Nesta montagem vamos utilizar um cristal externo de
20Mhz para gerar o sinal eléctrico de relógio.

Tecnologia de Accionamento e Comando 2009/2010, Trabalho Nº 1 12


1.3.2 Bits de memória importantes para configurar e activar uma entrada digital
Para ler uma entrada digital do µControlador é necessário em primeiro lugar, configurar um dos
pinos para actuar como uma entrada digital e em segundo lugar, saber em que posição de memória
ler o valor da entrada digital.

1 – Para que um dos pinos do µControlador possa actuar como uma entrada digital é necessário
escrever o valor um (1 - Input) num dos bits dos registos TRISA ou TRISB. Cada um destes
registos possui oito bits RA0:RA7 e RB0:RB7, respectivamente.
Neste exemplo vamos configurar o pino RA2 para actuar como uma entrada digital, capaz de
detectar se externamente lhe foi aplicada uma tensão de 5 ou 0 volt.
É necessário que o bit RA2 do registo TRISA seja colocado a “1” – Input para que o pino RA2 do
µControlador possa actuar como uma entrada digital.

2 – O µControlador fará com que o bit RA2 do registo PORTA assuma o valor “1”, se
externamente for aplicada uma tensão de 5v a este pino. O programa do µControlador deverá ler o
valor de RB1 e processá-lo em conformidade.

3- Como sabem, devido ao reduzido número de pinos cada um deles pode assumir diferentes
papéis. Os pinos RA0/AN0, RA1/AN1, RA2/AN2 e RA3/AN3 por exemplo, podem ser usados
como entradas analógicas ou como entradas/saídas digitais. Quando o µC é ligado estes quatro bits
valem “0” pelo que todos os pinos acima referidos actuam como entradas analógicas.
O programa do µC tem de escrever nos bits CM2, CM1, e CM0 do registo CMCON diferentes
combinações de “1” e “0” para alterar a forma como cada um destes pinos deve actuar (Tabela 1).

Tabela 1: Configuração das entradas analógicas/digitais


CM2,CM1,CM0 AN0/RA0 AN1/RA1 AN2/RA2 AN3/RA3
000 A A A A A – Analog
001 A A A A
010 A A A A
011 A A A D D – Digital
100 A A A A
101 D A A D
110 A A A D
111 D D D D

Por exemplo, para configurarmos estes quatro pinos para actuarem como entradas/saídas digitais
devemos usar as seguintes instruções: BANKSEL CMCON ; Selecção do Banco 0
MOVLW 0X07 ; 0x07 = B’00000111’
MOVWF CMCON ; RA1 passa a ser digital em vez de analógico

Tecnologia de Accionamento e Comando 2009/2010, Trabalho Nº 1 13


1.3.3 Exemplo - programa “Entrada digital”

Este programa permite ler uma entrada digital e activar uma saída em conformidade.
EntradaDigital.asm

list p=p16f628A A opção _HS_OSC:


#include <p16f628A.inc>
configura o µC para usar um cristal
externo. Neste caso um cristal de
__CONFIG _HS_OSC & _CP_OFF & _PWRTE_OFF & _WDT_OFF
20Mhz.
& _LVP_OFF & _MCLRE_ON

#define led PORTB,0


#define botao PORTA,1
org 0x00 #define:
goto iniciar

iniciar
banksel TRISB ; Selecção do banco 1
bsf TRISA,1 ; RA1 input Btfsc:
bcf TRISB,0 ; RB0 output
banksel PORTB ; Selecção do banco 0
MOVLW 0X07
MOVWF CMCON ; RA1 passa a ser digital em vez de analógico Movlw
main
BTFSC botao ; Testa o bit RA1. IF RA1 <> 0
goto ligasaida ; THEN goto ligasaida
goto desligasaida ; ELSE goto desligasaida
ligasaida Movwf
bsf led ; RB0=1
goto main
desligasaida
bcf led ; RB0=0
goto main
end
Figura 1.15: Programa 1 – Leitura de uma entrada digital

a) Analise as instruções em Assembler


Analise todas as instruções novas usadas neste programa. Leia o manual da Microchip,
“PIC16F627A/628A/648 Data Sheet ou o livro “Desbravando o PIC. Escreva por palavras suas a
finalidade de cada uma das seguintes instruções:
btfsc:

btfss:

movlw:

movwf:

b) Execute o programa em modo simulado, no computador

c) Compile e transfira o programa para o µC

Tecnologia de Accionamento e Comando 2009/2010, Trabalho Nº 1 14


1.4 Bibliografia
[Souza 2006] Souza, D.J. (2006). Desbravando o PIC. 8º Edição, Editora Érica. S.Paulo.

[PIC16F628A] PIC16F627A/628A/648A Datasheet, Microchip.

Tecnologia de Accionamento e Comando 2009/2010, Trabalho Nº 1 15


Universidade de Aveiro
Departamento de Engenharia Mecânica
Tecnologias de Accionamento e Comando 2009/2010

2 MOTOR DE CORRENTE CONTÍNUA - Controlo


de velocidade e sentido de rotação
Objectivos:
Pretende-se utilizar uma entrada analógica do µC e adquirir o valor do sinal externo.
Pretende-se gerar um sinal PWM, a partir de uma saída digital e de um temporizador do µC.

Material a utilizar:
Motor de corrente contínua, Ponte H, microControlador, 1 potenciómetro, 2 interruptores.

Data de entrega:
O programa do µC deve ser enviado por correio electrónico até às 24h de 19 Novembro.

Pretende-se controlar a velocidade de rotação de um motor CC a partir de um potenciómetro, e o


seu sentido rotação a partir de dois interruptores. Em função desse potenciómetro e dos dois
interruptores o µC deverá gerar os sinais necessários para controlar o motor CC.
Considere o esquema da figura 2.1 e elabore o programa do µC.

Figura 2.1: Controlo de um motor de corrente contínua

Tecnologias e Accionamento e Comando 2009/2010, Trabalho Nº 2 16


APÊNDICE II

2.1 Relembre o funcionamento do motor de corrente contínua

Como sabe a velocidade de rotação de um motor de corrente contínua CC, de íman permanente, é
directamente proporcional à tensão aplicada aos seus terminais e o seu sentido de rotação depende
da polaridade da tensão que lhe é aplicada (Figura 2.2).

Figura 2.2: Motor de corrente contínua

2.1.1 Conceitos sobre velocidade e binário de motores de corrente contínua


Nos motores de corrente contínua, com íman permanente no estator e enrolamento no rotor:
- A velocidade de rotação (Rpm – rotações por minuto) é directamente proporcional à tensão
aplicada às suas bobines, dado que o fluxo magnético do estator Ф é constante.

Rpm = V / K Ф
Rpm Rotações por minuto
V Tensão aplicada ao motor (Volt)
K Valor numérico constante.
Ф Fluxo magnético (Webber)

- O binário T, no veio do motor, é directamente proporcional à corrente eléctrica I que percorre os


seus enrolamentos.

T=KIФ
T Binário no veio do motor (Nm)
K Valor numérico constante.
I Intensidade da corrente (ampere)
Ф Fluxo magnético (Webber)

Tecnologias e Accionamento e Comando 2009/2010, Trabalho Nº 2 17


2.1.2 Circuito de controlo de velocidade por PWM
Para variar a velocidade de rotação de um motor CC podemos variar o valor médio da tensão
aplicada ao motor. Na montagem seguinte o transístor funciona ao corte e à saturação, actuando
como um interruptor, que controla a passagem da corrente através do motor (Figura 2.3).
Configure o gerador de sinal para gerar uma tensão que varie entre 0 e 5 volt, com um “duty cycle”
de 50% e uma forma de onda quadrada entre 0 e 5 volt.

BC547 – NPN

Figura 2.3: Variação do “Duty cycle” e da frequência da tensão aplicada ao motor CC

Se aumentar o “duty cycle” do sinal aplicado à base do transístor e dessa forma aumentar o tempo
em que o transístor está à saturação, relativamente ao tempo em que está ao corte (Pulse Wide
Modulation), o motor atinge velocidades de rotação mais elevadas.
Se mantiver o “duty cycle” constante e aumentar a frequência da tensão aplicada à base do
transístor, as rpm do motor aumentam, diminuem, ou mantêm-se?

2.1.3 Circuito de controlo do sentido de rotação do motor através de uma Ponte H


Controle o sentido e a velocidade de rotação do motor utilizando um circuito conhecido por ponte
H. Para montar este circuito no laboratório vamos utilizar 4 transístores e a fonte de alimentação
do laboratório. Complete o circuito seguinte para que seja possível inverter o sentido de rotação do
motor (Figura 2.4).

Figura 2.4: Ponte H

Tecnologias e Accionamento e Comando 2009/2010, Trabalho Nº 2 18


2.2 Aquisição um sinal analógico

2.2.1 Conceitos

Para ser possível converter uma grandeza física num número digital, proporcional a essa grandeza,
várias etapas são necessárias (Figura 2.5):
Em primeiro lugar, é necessário recorrer a um sensor que permita converter uma grandeza física
num sinal eléctrico (Sensor). Este sinal eléctrico, eventualmente analógico, pode necessitar de ser
amplificado, filtrado, etc (condicionamento do sinal). Mesmo depois de termos um sinal eléctrico
devidamente tratado é necessário capturar (amostrar), quantificar esse sinal analógico e codificá-lo
num valor digital (conversão A/D).

Figura 2.5: Aquisição de sinais [Rizzoni]

Amostragem

Por amostragem entende-se a medição do valor que um sinal possui num determinado instante.
A Figura 2.6 apresenta uma forma de amostrar o sinal e de manter o seu valor constante durante o
processo posterior de conversão A/D.
Va(t) é o sinal que se pretende amostrar e VSH (t) é o sinal amostrado que será posteriormente
quantificado.

Figura 2.6: Amostragem do sinal [Rizzoni, pp.691]

Intervalo de amostragem
Como a grandeza real que se pretende amostrar varia de amplitude em cada instante, é conveniente
que o intervalo de tempo entre amostragens seja o menor possível. O mesmo é dizer que a
frequência de amostragem deve ser a maior possível.

Teorema de Nyquist
De acordo com o teorema de Nyquist a frequência de amostragem de um sinal deve ser no mínimo
o dobro da frequência máxima que o sinal pode ter.

Tecnologias e Accionamento e Comando 2009/2010, Trabalho Nº 2 19


Tempo mínimo de amostragem
Contudo, só depois do primeiro valor ter sido amostrado e convertido num valor digital se pode
amostrar e converter um segundo valor. Por isso, a frequência máxima de amostragem está
dependente da rapidez do equipamento utilizado. Por exemplo, o circuito de amostragem presente
na Figura 2.6 possui um condensador para “adquirir e manter” o valor da tensão que se pretende
amostrar. Mas a tensão aos terminais de um condensador não varia instantaneamente, demora
várias constantes de tempo (RC) até que a tensão aos terminais do condensador seja igual ou
parecida com tensão que se pretende amostrar.

Conversão Analógico Digital - A/D


A conversão A/D compreende duas etapas: a quantificação do sinal amostrado e a sua posterior
representação digital.

Quantificação
Por quantificação entende-se a conversão de uma grandeza analógica num valor discreto.
Através da comparação do valor amostrado com um conjunto finito de níveis, previamente
definidos, é possível determinar o nível no qual o valor amostrado se situa. O número destes níveis
é finito e quanto maior for o seu número, maior é a resolução da medição. Contudo, quanto maior
for o número de níveis também maior é o numero de bits necessários para os numerar.
A Figura 2.7 apresenta um exemplo com oito níveis de quantificação. Neste exemplo, cada nível
representa 5/7 de volt. Se a tensão amostrada possuir um valor inferior a 5/7 v a quantificação em 8
níveis representa-a como valendo 1. Se a tensão amostrada for igual ou superior a 5/8 e inferior a
10/8 de volt a quantificação em 8 níveis representa-a como valendo 2 e assim sucessivamente.
Como resultado da quantificação podemos obter oito valores inteiros, entre 0 e 7. Para representar
estes valores numa codificação binária podemos usar três bits.

Figura 2.7: Níveis de quantificação [Sanchez’ 07]

Num caso destes, com 8 níveis apenas, a resolução é de:

Resolução = Tensão maxima / (Nº níveis-1)


Resolução = 5/(8-1) = 0,714 V

Com 8 níveis apenas o erro de quantificação é muito grande.

Tecnologias e Accionamento e Comando 2009/2010, Trabalho Nº 2 20


DAC - Conversão por seguimento ou por aproximações sucessivas

Conversão A/D por seguimento é uma forma de realizar a conversão. Neste tipo de conversão o
comparador analisa se o sinal externo tem uma amplitude superior ou inferior a um sinal interno.
Este sinal interno é gerado por uma conversão digital/analógica DAC a partir de um valor digital,
valor esse que pode ser incrementado ou decrementado. Se o sinal interno for inferior ao sinal
externo o número digital é incrementado (Figura 2.8).

Figura 2.8: DAC por seguimento (aproximações sucessivas) [Rizzoni, pp718]

DAC – Conversão Flash A/D

A figura seguinte apresenta um circuito de conversão


rápida A/D. Neste circuito têm de existir tantos
amplificadores operacionais AMPOP quantos os
níveis de quantificação. Desta forma quanto maior for
a amplitude do sinal que se pretende converter, maior
é o número de AMPOP com a saída activa “1”. Desta
forma o codificador “encoder” converte as suas 7
entradas/níveis em três sinais binários (b2b2b0).

Figura 2.9: DAC – conversão rápida “Flash” [Rizzoni, pp719]

Tecnologias e Accionamento e Comando 2009/2010, Trabalho Nº 2 21


2.2.2 Configuração do µC para realizar a aquisição de um sinal analógico

O PIC16F877 possui 8 pinos que podem ser usados como entradas analógicas (AN0 .. AN7).

Figura 2.10: MicroControlador PIC16F877


Como estes pinos externos também podem ser usados como entradas/saídas digitais é necessário
configurá-los para actuarem como sinais analógicos através dos bits PCFG0:3 do registo ADCON1
(Figura 2.11).

ADCON1 (Banco 1)

Figura 2.11: Registo ADCON1

Tecnologias e Accionamento e Comando 2009/2010, Trabalho Nº 2 22


A conversão do sinal analógico num valor digital gera um número binário com 10 bits. Como cada
posição de memória deste µC tem 8bits são necessárias duas posições de memória (ADRESL e
ADRESH) para guardar o resultado da conversão (Figura 2.12).

Figura 2.12: Selecção do canal analógico

Este µC só possui um circuito interno de conversão analógica/digital “ADC”, por isso é necessário
definir qual das várias entradas analógicas previamente definidas deve ser “amostrada” e
“quantificada” para gerar o resultado digital (ADRESL, ADRESH). Para seleccionar qual dos pinos
externos previamente configurados como analógicos deve ser “amostrado”, deverá configurar os
bits CHS2:CHS0 do registo ADCON0 (Figura 2.13).
Para ligar o circuito interno de conversão A/D deve activar o bit ADON. Não confundir este bit
com o bit de início de conversão GO/DONE.

Para iniciar o processo de conversão A/D o programa deverá activar o bit GO/DONE. Este bit será
posto a zero pelo hardware, automaticamente, quando a conversão estiver concluída.

Tecnologias e Accionamento e Comando 2009/2010, Trabalho Nº 2 23


Os bits ADSC1 e ADSC0 permitem dividir a frequência do sinal de relógio para que o circuito
interno tenha tempo para adquirir o sinal analógico. O tempo de aquisição depende do tempo que o
condensador do conversor A/D demora a carregar, ou seja, ficar com a mesma tensão do sinal que
se pretende converter.

ADCON0 (Banco 0)

Figura 2.13: Registo ADCON0

2.2.3 Exemplo – programa “Analógico-Digital”

Para configurar um entrada analógica é necessário efectuar os passos seguintes:

1. Configurar o registo ADCON1 para definir quais os pinos externos que actuam como
entradas analógicas. (Bits PCFG3,2,1 e 0)
2. Configurar o registo TRISA para definir que o pino respectivo actua como uma entrada.
3. Configurar o registo ADCON0 para,
- definir a frequência do relógio (clock); (Bits ADCS1,0)
- definir qual das entradas analógicas deve ser amostrada (só pode ser amostrada
uma entrada analógica de cada vez); (Bits CHS2,1 e 0)
- alimentar o circuito interno de conversão.
4. Dar ordem de início de conversão activando o bit GO = 1 do registo ADCON0.

Por exemplo, se quisermos que o µC adquira valores de um sinal analógico no pino AN0 e o
resultado da conversão seja guardado nos 10 bits mais significativos de ADRESH+ADRESL
O programa deve configurar os bits que a seguir se definem

Tecnologias e Accionamento e Comando 2009/2010, Trabalho Nº 2 24


BANKSEL ADCON0
BSF ADCON0,7
BCF ADCON0,6
BCF ADCON0,5
BCF ADCON0,4
ADCS1:0 = 11 ; divide a frequência de relógio por 32. BCF ADCON0,3
CHS2:0 = 000 ; selecciona para ser amostrado e quantificado BSF ADCON0,0
; o canal AN0.
BANKSEL ADCON1
ADON = 1 ; alimenta/liga o circuito analógico interno.
BCF ADCON1,7
ADFM = 0 ; alinha o resultado da conversão à esquerda (10 bits), BSF ADCON1,3
; ficam 8 bits em ADRESH e 2 bits em ADRESL BSF ADCON1,2
PCFG3:0= 1110 ; Só o pino RA0/AN0 fica configurado como BSF ADCON1,1
;entrada analógica. BCF ADCON1,0

2.2.4 Exemplo - programa “EntradaAnalog.asm”


Este programa permite ler uma entrada analógica e activar as saídas digitais RB0 a RB7 com o
valor binário correspondente à entrada analógica (Figura 2.14).

EntradaAnalog.asm
list p=pic16f877
#include <p16f877.inc>
__CONFIG _HS_OSC & _CP_OFF & _WDT_OFF
; Start at the reset vector
Org 0x00
goto iniciar

iniciar
banksel TRISB
CLRF TRISB ; Os RB0:7 são todos saídas
bsf TRISA,0
; Os 8bits mais significativos da conversão
Ficam em ADRESH, os 2 bits menos significativos ficam
em ADRESL
bcf ADCON1,7
; Apenas AN0 é uma entrada analógica
bsf ADCON1,3
bsf ADCON1,2
bsf ADCON1,1
bcf ADCON1,0

banksel PORTB
bsf ADCON0,7 ; Fosc/32
bcf ADCON0,6
bcf ADCON0,5 ;Canal AN0
bcf ADCON0,4
bcf ADCON0,3
bsf ADCON0,0 ; A/D enabled

Ciclo
bsf ADCON0,2 ; início da conversão

espera
btfsc ADCON0,2
goto espera

;conversão completa
movfw ADRESH
movwf PORTB
goto Ciclo
Figura 2.14: Entrada analógica
end

Tecnologias e Accionamento e Comando 2009/2010, Trabalho Nº 2 25


2.3 Como gerar um sinal PWM com o microControlador

Recorda-se que PWM significa Pulse Wide Modulation, ou seja modulação da largura do pulso.
Um sinal eléctrico PWM observado num osciloscópio tem a forma de uma onda quadrada, com
uma tensão nula durante um tempo “t1” e com uma tensão diferente de zero durante um tempo
“t2”.

Através de uma saída digital do µC é possível gerar uma onda quadrada, que durante um tempo t1
valha zero volt e durante um tempo t2 valha 5 volt.

As saídas digitais já foram estudadas no trabalho anterior, falta apenas aprender a utilizar os
temporizadores internos do µC para dessa forma controlar o tempo que uma saída digital vale zero
volt “t1” e o tempo em que a saída vale 5 volt “t2”. Controlando t1 e t2 e controlamos a largura do
pulso “Off” e do pulso “On” dessa onda quadrada.

Monte os componentes

Figura 2.15: Componentes da montagem Timer0

A saída digital continua a ser utilizada para activar um led como no exemplo anterior. Nesta
montagem vamos utilizar o cristal externo de 4 Mhz (Figura 2.15).

Tecnologias e Accionamento e Comando 2009/2010, Trabalho Nº 2 26


2.3.1 Temporizador TMR0

O exemplo seguinte pretende explicar como configurar e utilizar o temporizador “TMR0”, do µC.
O “TMR0” não é mais que uma posição da memória de dados, de 8 bits, que tem a particularidade
do seu valor poder ser incrementado automaticamente pelo hardware. Esta posição de memória
pode ser incrementada a partir do sinal de relógio “clock” do próprio µC, ou a partir de uma tensão
externa aplicada a um pino específico do µC. Sempre que ocorrer uma transição do sinal de
“clock” ou do sinal externo aplicado a esse pino, o valor do “Timer0”é automaticamente
incrementado. Quando, e se, esta posição de memória exceder o valor 255 = 28 diz-se que houve
um “estouro do Timer”. Esta ocorrência pode activar um bit da memória de dados, conhecido por
“TMR0 Interrupt Flag - T0IF” e pode gerar uma interrupção “interrupt”.

Para configurarmos se o OPTION (Banco 1)


“TMR0” é incrementado a partir
do sinal de “Clock” ou do sinal
externo aplicado no pino
RA4/T0CKI, devemos escrever
no bit TOCS o valor “0” ou “1”,
respectivamente.

Para definirmos se o “TMR0” é


incrementado na transição
positiva ou negativa do sinal,
devemos escrever no bit de
memória T0SE o valor “0” ou
“1”, respectivamente.

Como o sinal de “clock” tem


em geral uma frequência muito
elevada o TMR0 pode demorar
poucos milissegundos a
“estourar”. Se pretendermos ter
temporizadores da ordem dos
segundos, é necessário
configurar o hardware para
incrementar de uma unidade o
Timer0 só quando o sinal de INTCON (Banco 1, 2)
relógio tiver oscilado 2, 4, 8,
16, 32, 64, 128 ou mesmo 256
vezes, “Prescaler”. Escrevendo
nos bits PS2,PS1 e PS0
combinações de “0” e “1” é
possível configurar o hardware
para dividir o sinal de clock ou
o sinal externo por 2, 4, 8, 16,
32, 64, 128 e 254.

Este programa permite configurar e activar o temporizador “TMR0” fazendo com que a saída
digital RB0 se altere sempre que o TMR0 estourar (Figura 2.16).

Tecnologias e Accionamento e Comando 2009/2010, Trabalho Nº 2 27


Timer0.asm

list p=pic16f877
#include <p16f877.inc>

__CONFIG _INTRC_OSC_CLKOUT & _CP_OFF & _PWRTE_OFF & _WDT_OFF & _LVP_OFF
; Start at the reset vector
Reset_Vector code 0x000
goto iniciar

iniciar
banksel TRISB
clrf TRISB
bcf OPTION_REG,T0CS ; TOCS = 0 O sinal de Clock incrementa o Timer0
bcf OPTION_REG, T0SE ; TOSE = 0 A transição do sinal de 0 para 1 incrementa o Timer0
bsf OPTION_REG, PS2 ; PS2 = 1 256 transições do sinal produz um incremento de Timer0
bsf OPTION_REG,PS1 ; PS1 = 1
bsf OPTION_REG, PS0 ; PS0 = 1
banksel PORTB

espera ; início do ciclo de espera


btfss INTCON,T0IF
goto espera ; fim do ciclo de espera
bcf INTCON,T0IF ; limpa a flag de estouro do Timer0
INCF PORTB,f ; Incrementa o valor do registo PORTB
goto espera

end

Figura 2.16: Programa Timer 0

Determine de quanto em quanto tempo a saída RB7 se altera. Considere que está a utilizar o
relógio interno do P16F628A (4 Mhz) ?

a) Execute o programa em modo simulado, no computador

b) Compile e transfira o programa para o µC

Tecnologias e Accionamento e Comando 2009/2010, Trabalho Nº 2 28


2.3.2 Temporizador TMR1

O temporizador TMR1 tem 16 bits, mais exactamente, o TMR1 corresponde fisicamente a duas
posições da memória de dados, de 8 bits cada, conhecidas pelas designações TMR1L e TMR1H.

Para o temporizador TMR1 ser


T1CON (Banco 0)
incrementado a partir do relógio do
µC, ou do sinal externo aplicado no
pino RB6/T1OSC, devemos escrever
no bit TMR1CS o valor “0” ou “1”,
respectivamente.
Para activar o Timer1 deve escrever
no bit de memória TMR1ON o valor
“1”.

Como o sinal de relógio “clock” tem


em geral uma frequência muito
elevada, o TMR1 pode demorar
poucos milissegundos a “estourar”.
Se pretendermos ter temporizadores
da ordem dos segundos, ou minutos, é
necessário configurar o hardware para
incrementar de uma unidade o Timer1
só quando o sinal de relógio tiver
oscilado 2,4 ou mesmo 8 vezes,
“Prescaler”. Escrevendo nos bits
T1CKPS0 e 1 combinações de “0” e
“1” é possível configurar o hardware PIR1 (Banco 0)
para dividir o sinal de “clock” ou o
sinal externo por 2,4 ou 8.

Monte os componentes

Figura 2.17: Componentes da montagem 1

Tecnologias e Accionamento e Comando 2009/2010, Trabalho Nº 2 29


A saída digital continua a ser utilizada para activar um led como no exemplo anterior. Nesta
montagem vamos continuar a utilizar o cristal externo de 4 Mhz (Figura 2.17).

Escreva o programa “Timer1”


Este programa permite configurar e activar o Timer1 fazendo que a saída digital RB0 (PORTB)
seja alterada sempre que o Timer1 estourar (Figura 2.18). Determine de quanto em quanto tempo a
saída RB7 se altera?

Timer1.asm

list p=pic16f877
#include <p16f877.inc>

__CONFIG _HS_OSC & _CP_OFF & _PWRTE_OFF & _WDT_OFF & _LVP_OFF
; Start at the reset vector
org 0x00
goto iniciar

iniciar
banksel TRISB
clrf TRISB ; Todos os pinos de RB passam a ser saídas

banksel PORTB
bsf T1CON,5 ; prescaler /8
bsf T1CON,4 ; prescaler
bsf T1CON,3 ; osc enabled
bcf T1CON,1 ; internal clock
bsf T1CON,0 ; enables timer1

espera ; início do ciclo - espera que TMR1 estoure


btfss PIR1,TMR1IF
goto espera ; fim do ciclo – espera que TMR1 estoure
bcf PIR1,TMR1IF ; limpa a flag que indica o estouro de TMR1
incf PORTB ; incrementa o valor da posição de memória conhecida por PORTB
goto espera ; reinicia o ciclo de espera

end

Figura 2.18: Programa Timer 1

Tecnologias e Accionamento e Comando 2009/2010, Trabalho Nº 2 30


2.3.3 Exemplo - PWM com duty cycle de 33%

O programa “PWM.asm” activa uma saída digital durante 0,25s e desactiva-a durante 0,5s,
sucessivamente. Desta forma vamos gerar um sinal PWM com um período de 0,75s e um “duty
cycle” de 33% (Figura 2.20).

Escreva o programa “PWM.asm”

PWM.asm

list p=pic16f877
#include <p16f877.inc>

__CONFIG _HS_OSC & _CP_OFF & _PWRTE_OFF & _WDT_OFF & _LVP_OFF

; Start at the reset vector


org 0x00
goto iniciar

iniciar
banksel TRISB
clrf TRISB
banksel PORTB
bsf T1CON,5 ; prescaler
bsf T1CON,4 ; prescaler
bsf T1CON,3 ; osc enabled
bcf T1CON,1 ; internal clock
bsf T1CON,0 ; enables timer1

Ciclo
movlw 0x80 ; TMR1 = 0x8000 = 65536/2 = 32678 dec
movwf TMR1H

T0_espera
btfss PIR1,TMR1IF
goto T0_espera
bcf PIR1,TMR1IF ; limpa a flag
bcf PORTB,0

movlw 0x00
movwf TMR1H
T1_espera
btfss PIR1,TMR1IF
goto T1_espera
bcf PIR1,TMR1IF ; limpa a flag
bsf PORTB,0

goto Ciclo
end

Figura 2.19: Programa PWM

Tecnologias e Accionamento e Comando 2009/2010, Trabalho Nº 2 31


Monte os componentes

Figura 2.20: Componentes da montagem 1

A saída digital continua a ser utilizada para activar um led como no exemplo anterior. Nesta
montagem vamos continuar a utilizar o cristal externo de 4 Mhz.

a) Analise as instruções em Assembler


Analise todas as instruções novas usadas neste programa. Leia o manual da Microchip,

b) Programe o uC e analise o seu funcionamento.

c) Altere o programa para activar a saída digital durante 0,1s e desactivá-la durante 0,2s.

Tecnologias e Accionamento e Comando 2009/2010, Trabalho Nº 2 32


2.3.4 Exemplo - Gerar um sinal PWM controlado por uma entrada analógica

EntradaAnalogPWM.asm
iniciar
banksel TRISB
clrf TRISB ; PORTB output
bsf TRISA,0 ; RA0 input
bcf ADCON1,7
; O resultado da conversão fica em ADRESH,
; apenas 2 bits da conversão ficam em ADRESL
bsf ADCON1,3 ; AN0
bsf ADCON1,2 ; "
bsf ADCON1,1 ; "
bcf ADCON1,0 ; "

banksel PORTB
bsf ADCON0,7 ; Fosc/32
bcf ADCON0,6 ; "
bcf ADCON0,5 ;Canal AN0
bcf ADCON0,4 ; "
bcf ADCON0,3 ; "
bsf ADCON0,0 ; A/D enabled

bsf T1CON,5 ; prescaler timer1


bsf T1CON,4 ; prescaler "
bsf T1CON,3 ; osc enabled
bcf T1CON,1 ; internal clock
bsf T1CON,0 ; enables timer1
Ciclo
; ----- Conversão A/D
bsf ADCON0,2 ; início da conversão

Conv_espera
btfsc ADCON0,2
goto Conv_espera
; conversão completa,
; valor guardado em ADRESH

; ------ GERA um periodo PWM


movfw ADRESH ; TMR1 = ADRESH
movwf TMR1H

bcf PORTB,2 ; desliga a saída RB2


T0_espera
btfss PIR1,TMR1IF
goto T0_espera
bcf PIR1,TMR1IF ; limpa a flag
list p=pic16f877
movlw 0x00
#include <p16f877.inc>
movwf TMR1H
BSF PORTB,2
__CONFIG _HS_OSC & _CP_OFF & _PWRTE_OFF
T1_espera
& _WDT_OFF & _LVP_OFF
btfss PIR1,TMR1IF
goto T1_espera
; Start at the reset vector
bcf PIR1,TMR1IF ; limpa a flag
Org 0x00
; Fim PWM
goto Ciclo
goto iniciar
end
Figura 2.21: Saída PWM controlada por uma entrada analógica

Tecnologias e Accionamento e Comando 2009/2010, Trabalho Nº 2 33


2.4 Circuitos com µC para controlo de Motores CC

2.4.1 Circuito de controlo de velocidade e sentido de rotação

L293D

[Johnson’00]

Tecnologias e Accionamento e Comando 2009/2010, Trabalho Nº 2 34


2.4.2 Circuito de controlo de velocidade e sentido de rotação com transístores

[Iovine’00]

2.4.3 Circuito de controlo de velocidade e sentido com Mosfet

Tecnologias e Accionamento e Comando 2009/2010, Trabalho Nº 2 35


2.4.4 Circuito de controlo de velocidade de um motor CC sem inversão de sentido

[Iovine’00]

Tecnologias e Accionamento e Comando 2009/2010, Trabalho Nº 2 36


2.5 Controlo de posição de um servo motor por PWM.

2.5.1 Servo Motor


Este tipo de servomotores pode rodar o seu veio apenas 180º, de 0 a 180º. Consoante o duty cycle
do sinal aplicado a este motor, o seu veio assume um determinado ângulo e permanece nessa
posição enquanto o sinal mantiver o mesmo duty cycle.
Neste caso, o pulso positivo aplicado a este motor pode variar entre 1 e 2 ms, permanecendo o
sinal nulo 17 a 16 ms, perfazendo um período constante de 18 ms ( Figura 2.22).
Se a largura do pulso positivo for de 1 ms o veio do motor forma o ângulo de 0º e se o pulso
positivo for de 2 ms o veio posiciona-se a 180º.

Figura 2.22: Servo motor

2.5.2 Exemplo – programa “ServoMotor.asm”

O programa seguinte permite posicionar o veio do servomotor num determinado ângulo, de 0º a


180º, em função de um pulso de 5volt com a duração de 1 a 2ms.
Neste exemplo vamos fazer algumas simplificações. O programa seguinte mantém a saída RB2 a
zero durante 17 ms, independentemente da variação do duty cycle. Simultaneamente, este
programa permite variar a duração do pulso positivo de 0 a 2 ms. Desta forma o período do sinal
gerado na saída RB2 pode variar de 17 a 19 ms, não respeitando por isso o período constante de 18
ms que o servomotor estaria à espera.
A largura do pulso positivo depende do sinal analógico, adquirido no pino AN0 do µC.
Também aqui é feita uma simplificação, como sabe, o resultado da conversão analógico digital tem
10 bits, e esse resultado é guardados nos registos ADRESL e ADRESH.
Neste programa vamos considerar apenas os 8 bits mais significativos (ADRESH) e em função
destes 8 bits, vamos variar a duração do pulso positivo.
É utilizado o timer TMR1 para controlar a duração do pulso positivo (0 a 2 ms) e também
controlar a duração do sinal nulo (17 ms).
Considerando um cristal de 4 Mhz e um prescaler (1/8), podemos afirmar que o TMR1 é
incrementado de 4 000 000/4/8 = 125000 unidades por segundo, ou seja a cada 8us o temporizador
TMR1 é incrementado uma unidade. O mesmo é dizer que incrementar o byte menos significativo
de TMR1 (TMR1L) de 0 a 255 demora 2 ms. Podemos por isso afirmar que incrementar o
temporizador TMR1 de 0xFF00 a 0xFFFF demora 2 ms.

Tecnologias e Accionamento e Comando 2009/2010, Trabalho Nº 2 37


Podemos também afirmar que incrementar TMR1 de 2521 unidades, por exemplo de 0xF7B3 a
0xFFFF, demora 17 ms.

bsf T1CON,5 ; prescaler timer1 /8


bsf T1CON,4 ; prescaler "
bsf T1CON,3 ; osc enabled
bcf T1CON,1 ; internal clock
bsf T1CON,0 ; enables timer1

Ciclo

; ----- Conversão A/D


bsf ADCON0,2 ; início da conversão

Conv_espera
btfsc ADCON0,2
goto Conv_espera
; conversão completa,
; valor guardado em ADRESH
list p=pic16f877
#include <p16f877.inc> ; ------ GERA um periodo PWM
; TMR1= 0xFD70 até 0xFFFF demora 0,01seg
__CONFIG _HS_OSC & _CP_OFF & _WDT_OFF movlw 0xFF
; Start at the reset vector movwf TMR1H
org 0x00 movfw ADRESH ;TMR1 = 0xFF + ADRESH
goto iniciar movwf TMR1L
bsf PORTB,2 ; liga a saída de 0 a 2 ms
iniciar T0_espera
banksel TRISB btfss PIR1,TMR1IF
clrf TRISB ; PORTB output goto T0_espera
bcf PIR1,TMR1IF ; limpa a flag
bcf ADCON1,7 ; O resultado da conversão fica em
ADRESH, apenas 2 bits da conversão fica em movlw 0xB3
ADRESL movwf TMR1L
bsf ADCON1,3 ; AN0 movlw 0xF7
bsf ADCON1,2 ; " movwf TMR1H ; Desliga a saída 17ms
bsf ADCON1,1 ; " bcf PORTB,2
bcf ADCON1,0 ; " T1_espera
btfss PIR1,TMR1IF
banksel PORTB goto T1_espera
bsf ADCON0,7 ; Fosc/32 bcf PIR1,TMR1IF ; limpa a flag
bcf ADCON0,6 ; " ; Fim PWM
bcf ADCON0,5 ;Canal AN0
bcf ADCON0,4 ; " goto Ciclo
bcf ADCON0,3 ; " end
bsf ADCON0,0 ; A/D enabled

Figura 2.23: Controlo servo motor por PWM

Tecnologias e Accionamento e Comando 2009/2010, Trabalho Nº 2 38


2.6 Bibliografia

[Rizzoni 2007] Rizzoni, G. (2007). Principles and Applications of Electrical Engineering. 5th, McGraw Hill
International. Capítulo 17.

[Paul 1992] Paul, C.R., Nasar, S.A., Unnewehr, L.E., (1992). IntrodµC tion to Electrical Engineering. 2th,
McGraw Hill. Capítulo 13

[Souza 2006] Souza, D.J. (200?). Desbravando o PIC. 8º Edição, Editora Érica. S.Paulo.

[PIC16F877] PIC16F87X Datasheet, Microchip, 2001.

[AN893] Low-Cost Bidirectional Brushed DC Motor Control, Microchip, 2003.

[Johnson’00] Johnson L. (2000). Experimenting With the Picbasic Pro Compiler. 1ºEd. Rosetta Technologies.
Crownhill Associates Ltd.

[Iovine’00] Iovine,J. (2000). PIC Microcontroller project book. McGraw-Hill

[Sanchez’07] Sanchez, J., Canton M. (2007). Microcontroller Programming The Microchip PIC. Taylor & Francis.
CRC Press.

[Bates’06] Bates, M. (2006).Interfacing PIC Microcontroller-Embedded Design by Interactive Simulation.


Elsevier, Newnes. Great Britain

Tecnologias e Accionamento e Comando 2009/2010, Trabalho Nº 2 39


Universidade de Aveiro
Departamento de Engenharia Mecânica
Tecnologias de Accionamento e Comando 2009/2010

3 MOTOR DE PASSO - Controlo de velocidade e sentido de rotação

Objectivos:
Compreensão do funcionamento dos motores de passo.
Utilização das saídas digitais do µC para comandar de um motor de passo.

Material a utilizar:
µC, Motor de passo, interruptores e potenciómetro.

Data de entrega:
O programa do µC deve ser enviado por correio electrónico até às 24h de 26 de Novembro.

Desenvolva o programa do µC que lhe permita controlar o sentido e a velocidade de rotação do


motor de passo. Escolha as entradas e saídas, digitais e analógicas que preferir.

Figura 3.1: Controlo de velocidade e sentido d e rotação do motor de passo

Tecnologias e Accionamento e Comando 2009/2010, Trabalho Nº 3 40


APÊNDICE III

3.1 Relembrar o funcionamento do motor de passo

Conforme pode observar na figura, os enrolamentos destes motores situam-se no estator e o rotor
pode ser constituído por um íman permanente, ou por um material metálico de baixa relutância
magnética (ferromagnético). O rotor, seja ele de íman permanente ou de material ferro magnético,
alinha-se com o campo magnético criado pelo(s) enrolamento(s) do estator.

Figura 3.2: Motor de passo [AN822] [Rizzoni]

Tecnologias e Accionamento e Comando 2009/2010, Trabalho Nº 3 41


3.1.1 Conceitos sobre velocidade e binário dos motores de passo

A velocidade de rotação de um motor deste tipo depende da cadência com que os seus
enrolamentos são, sequencialmente, alimentados. Como o rotor se alinha como o campo magnético
criado pelo estator, quanto mais depressa alimentar o enrolamento seguinte, do estator, maior será
a velocidade de rotação do rotor.
Existe contudo um limite para a velocidade máxima de rotação do motor. Devido à indutância dos
enrolamentos do estator, tanto a corrente que percorre cada enrolamento como o campo magnético
por si criado, demoram algum tempo a atingir o seu valor máximo. Se um enrolamento estiver
ligado pouco tempo, para seja possível ligar rapidamente o enrolamento seguinte e dessa forma
tentar aumentar as rpm do motor, pode acontecer que o binário produzido por esse enrolamento
não chegue a ser suficiente para o rotor rodar. Podemos por isso dizer que o aumento da rotação de
um motor deste tipo tem como consequência a diminuição do seu binário. Pelo contrário, quando
um motor deste tipo está ligado mas parado tem binário e o seu valor é máximo (Figura 3.3).

Figura 3.3: Binário versus RPMs [AN822]

Unipolares
Quando os enrolamentos de um motor forem sempre alimentados com a mesma polaridade e a
corrente que os percorrer tiver sempre o mesmo sentido, designam-se por motores unipolares.

Motores de relutância variável


Um motor de relutância variável possui bobines no estator e um rotor ferromagnético.
Da mesma forma que um metal é atraído por um íman, tanto pelo seu pólo norte como pelo seu
pólo sul, o rotor de um motor de passo de relutância variável é atraído para o pólo do estator mais
próximo, independentemente desse pólo ser o norte ou o sul. Por essa razão os motores de passo de
relutância variável são motores unipolares, pois a polaridade da alimentação dos seus enrolamentos
e consequente polaridade não afecta o seu funcionamento. Na figura 3.4 pode observar que os
enrolamentos são ligados sequencialmente ao longo do tempo.

Figura 3.4: Motor de relutância variável [AN907]

Tecnologias e Accionamento e Comando 2009/2010, Trabalho Nº 3 42


a) De acordo com o exemplo da figura 3.4 e da sequência de activação dos enrolamentos nela
descrita, diga se o rotor do motor de relutância variável roda no sentido horário ou anti-
horário?
b) Qual é o passo deste motor, em graus?

Motores de íman permanente, unipolares e bipolares


Os motores de passo, com rotor de íman permanente, podem ser unipolares ou bipolares, tudo
depende como os enrolamentos do estator foram bobinados durante a construção do motor.

Bipolar 6 pólos no rotor

Figura 3.5: Motor de íman permanente bipolar [AN822]

a) De acordo com o exemplo da figura 3.5 e da sequência de activação dos enrolamentos nela
descrita, diga se o rotor do motor de passo bipolar roda no sentido horário ou anti-horário?
b) Qual é o passo deste motor, em graus?

Unipolar 6 pólos no rotor e 4 pólos no estator.

Figura 3.6: Motor de íman permanente unipolar [AN907]

Tecnologias e Accionamento e Comando 2009/2010, Trabalho Nº 3 43


a) De acordo com o exemplo da figura 3.6 e da sequência de activação dos enrolamentos nela
descrita, diga se o rotor do motor bipolar de íman permanente roda no sentido horário ou
anti-horário?
b) Qual é o passo deste motor, em graus?

Motores mistos
Os motores mistos possuem um rotor de íman permanente mas com a mesma geometria dos
rotores de relutância variável.

Figura 3.7: Motor de íman permanente bipolar [AN907]

Características importantes na selecção de motores de passo:


Relutância variável versus íman permanente versus misto
Bipolar versus unipolar
Step size: Ângulo mínimo que o veio do motor pode rodar.
Max RPMs: Rotação máxima a que o motor pode rodar, atendendo às indutâncias das suas
bobines e às suas limitações mecânicas.
Holding torque: Quando estão activos este tipo de motores têm binário, mesmo quando estão
parados. O binário externo necessário para obrigar o rotor a rodar quando, as suas
bobines estão activas e a forçar o motor a parar, designa-se por Holding Torque.
Pull-in torque: Binário de arranque máximo que o motor consegue fornecer à carga sem perder
nenhum passo, desde as zero rpm até às rpm nominais.
Pull-out torque: Binário máximo que o motor pode fornecer à carga a uma velocidade nominal
Detent torque: Binário externo necessário para fazer rodar o rotor do motor quando ele está
desligado

Circuito de controlo de motores de passo de íman permanente, bipolares

Figura 3.8: Circuito de controlo de motores de passo de íman permanente bipolares [AN907]
Tecnologias e Accionamento e Comando 2009/2010, Trabalho Nº 3 44
3.1.2 Circuitos de controlo

Circuito de controlo de motores de relutância variável

Figura 3.9: Circuito de controlo de motores de relutância variável [AN907]

Circuito de controlo de motores de passo de íman permanente, unipolares

[AN907]

[Rizzoni, 2007]
Figura 3.10: Circuito de controlo de motores unipolares de íman permanente

Tecnologias e Accionamento e Comando 2009/2010, Trabalho Nº 3 45


3.2 Exemplo - programa “StepMotor.asm”

list p=pic16f877
#include <p16f877.inc>
local tempo
__CONFIG _HS_OSC & _CP_OFF & _WDT_OFF & _LVP_OFF clrf PORTB
bsf PORTB,0 ; Activa RB0
ORG 0X00 clrf TMR1L
goto iniciar movf tempo
movwf TMR1H
iniciar T1_espera ; Espera 0 a 1 seg
banksel TRISB btfss PIR1,TMR1IF
clrf TRISB ; PORTB output goto T1_espera
;bcf ADCON1,7 ; O resultado da conversão fica em bcf PIR1,TMR1IF
;ADRESH, apenas 2 bits da
;conversão fica em ADRESL
;bsf ADCON1,3 ; AN0 clrf PORTB
;bsf ADCON1,2 ; " bsf PORTB,1 ; Activa RB1
;bsf ADCON1,1 ; " clrf TMR1L
;bcf ADCON1,0 ; " movf tempo
movlw B'00001110' movwf TMR1H
movwf ADCON1 T2_espera ; Espera 0 a 1 seg
Btfss PIR1,TMR1IF
banksel PORTB GOTO T2_espera
;bsf ADCON0,7 ; Fosc/32 BCF PIR1,TMR1IF
;bcf ADCON0,6 ; "
;bcf ADCON0,5 ;Canal AN0 clrf PORTB
;bcf ADCON0,4 ; " bsf PORTB,2 ; Activa RB2
;bcf ADCON0,3 ; " clrf TMR1L
;bsf ADCON0,0 ; A/D enabled movf w tempo
Movlw B'10000001' movwf TMR1H
movwf ADCON0 T3_espera ; Espera 0 a 1 seg
btfss PIR1,TMR1IF
;bsf T1CON,5 ; prescaler timer1 goto T3_espera
;bsf T1CON,4 ; prescaler " bcf PIR1,TMR1IF
;bsf T1CON,3 ; osc enabled
;bcf T1CON,1 ; internal clock
;bsf T1CON,0 ; enables timer1 clrf PORTB
movlw B'00111001' bsf PORTB,3 ; Activa RB3
movwf T1CON clrf TMR1L
movf tempo
Ciclo movwf TMR1H
T4_espera ; Espera 0 a 1 seg
; ----- Conversão A/D btfss PIR1,TMR1IF
bsf ADCON0,2 ; inicio da conversão goto T4_espera
Conv_espera bcf PIR1,TMR1IF
btfsc ADCON0,2
GOTO Conv_espera
; conversão completa, goto Ciclo
; valor guardado em ADRESH end

movfw ADRESH
movwf tempo

Tecnologias e Accionamento e Comando 2009/2010, Trabalho Nº 3 46


3.3 Bibliografia

[Rizzoni 2007] Rizzoni, G. (2007). Principles and Applications of Electrical Engineering. 5th, McGraw Hill
International. Capítulo 18.

[PIC16F877] PIC16F87X Datasheet, Microchip., 2001.

[AN822] Padmaraja Y. et. Al., Stepper Motor Microstepping with PIC18C452, Microchip, 2002.

[AN907] Reston C., et. Al., Stepping Motors Fundamentals, Microchip, 2004.

Tecnologias e Accionamento e Comando 2009/2010, Trabalho Nº 4 47


Universidade de Aveiro
Departamento de Engenharia Mecânica
Tecnologias de Accionamento e Comando 2009/2010

4 COMUNICAÇÃO SÉRIE Rs232

Objectivos:
Pretende-se utilizar a interface de comunicação USART / Rs232 do µC.

Material a utilizar:
µC, Conversor MAX232, cabo Rs232, um computador com o Hyperterminal.

Data de entrega:
O programa do µC deve ser enviado por correio electrónico até às 24h de 3 de Dezembro.

As redes industriais permitem controlar e monitorizar as actividades produtivas com maior rapidez
e menores custos, por essas razões as redes de comunicação de dados são cada vez mais utilizadas
na indústria.
Neste trabalho vamos utilizar o protocolo de comunicação Rs232. Utilize o programa
“Hyperterminal”, disponível no computador, para receber os dados vindos do µC.
Desenvolva um programa em assembler que faça o µC enviar, de meio em meio segundo, o estado
das suas entradas e saídas. Mais exactamente, o µC deve enviar o valor das saídas digitais (RB0 e
RB1), da entrada digital (RA1) e também o valor da entrada analógica (AN0).

Pretende-se que comunicação tenha os seguintes parâmetros: 2400 bits/segundo, 8 bits dados, sem
bit de paridade e 1 stop bit.

Figura 1.1: Ligação PLC - PC, desenho do cabo de ligação.

Tecnologias e Accionamento e Comando 2009/2010 48


APÊNDICE IV

4.1 Revisão do protocolo de comunicação Rs232

Para os equipamentos poderem comunicar entre si têm de respeitar um conjunto de regras comuns.
A esse conjunto de regras de comunicação chama-se protocolo de comunicação.

A Recomendação para Standard 232 – RS232 tinha por objectivo permitir a ligação de
equipamentos digitais a redes públicas analógicas, por exemplo, a ligação de terminais e
computadores à rede telefónica usando para o efeito modems. Convém lembrar que na época a
única rede de comunicação mundial era a rede telefónica, analógica, concebida para transmitir a
voz humana.
Este protocolo foi aprovado pela Electronic Industries Association -EIA, sob a designação
EIA232C. A norma EIA-232 tem tido várias evoluções, desde a primeira versão elaborada em
1960, até à versão EIA-232F.

EIA-232D/V.24 Rede telefónica EIA-232D/V.24

Recurso Modem Modem Recurso


A A B B

.25 .25 Modo de teste


.24 .24 TxClk (sinal de relógio do sinal emitido pelo recurso A
.23 .23 DSRD - data signal rate detector
.22 .22 RI - ring indicator (Indicação de toque)
.21 .21 SQD - sinal quality detector (Detecção de qualidade do sinal)
.20 .20 DTR - data terminal ready (Terminal pronto a receber)
.19 .19 RTS secundário
.18 .18 Ciclo fechado - local
.17 .17 Rx-Clock (sinal de relógio do sinal recebido)
.16 .16 Rx secundário
.15 .15 Tx-Clock (sinal de relógio do sinal emitido pelo modem A)
.14 .14 Tx secundário
.13 .13 CTS secundário
.12 .12 CD secundário
.11 .11 Reservado para testes
.10 .10 Reservado para testes
. 9 .9 Reservado para testes
. 8 .8 CD - carrier detection (detecção de portadora)
. 7 .7 Terra (0 V)
. 6 .6 DSR - DCE set ready (DCE pronto para enviar)
. 5 .5 CTS - clear to send (Pode enviar dados)
. 4 .4 RTS - request to send (Pedido de envio de dados)
. 3 .3 Rx: Recepção de dados
. 2 .2 Tx: Envio de dados
. 1 .1 Massa

Figura 4.1: A génese do protocolo Rs232


Os modems convertem sinais digitais em sinais analógicos, o que é fundamental quando se
pretende transmitir informação a grandes distâncias usando as linhas analógicas da rede telefónica.
Os sinais analógicos, com frequências adequadas, sofrem menor atenuação e menor distorção ao
longo de condutores de cobre, sendo por isso capazes de percorrer distancias maiores que os sinais
digitais.

Tecnologias e Accionamento e Comando 2009/2010 49


Note que a norma EID-232D/V.24 apenas define a interface entre cada recurso e o seu modem
respectivo, definindo por exemplo o significado e utilidade de cada pino das fichas DB25 (na
Figura 4.1). Para interligar fisicamente recursos que se encontrem próximos um do outro pode-se
ligar as suas portas série directamente, sem recorrer a modems.
Os pinos Tx e Rx são utilizados pelo recurso (A) para enviar e receber dados. Os outros pinos são
utilizados para controlar: o início e fim da ligação telefónica, o fluxo de dados e ainda se for caso
disso controlar o sincronismo do recurso (A) com o modem (A). Os pinos secundários permitem
que uma segunda transferência de informação possa ocorrer em simultâneo usando a mesma ficha
(a mesma interface).
A versão EID-232D prevê dois tipos comunicação: síncrona e assíncrona. Numa comunicação
assíncrona o sinal gerado pelo emissor, mais exactamente o instante da transição do sinal (de 0
para 1 e de 1 para 0) depende apenas do seu relógio interno. Pelo contrário numa comunicação
síncrona tanto o emissor como o receptor dependem do mesmo relógio para determinar os
instantes da transição do sinal. No modo de comunicação síncrona além de ser necessário utilizar
os pinos Tx e Rx para enviar e receber dados é necessário também utilizar os pinos TxClock e
RxClock para sincronizar o emissor e o receptor.
A revisão D, normalizou a utilização das fichas DB25 e permitiu o aumento da tensão que passou
de ±15 para ±25 V. A distância máxima de 15 metros também foi alterada, actualmente a distância
máxima pode ser superior, mas a capacidade parasita do circuito não pode exceder os 2,5 nF.
A revisão E, aprovou a utilização de uma nova ficha de 26 pinos, a ficha ALT-A.

Topologia

Neste contexto, por topologia entende-se a forma geométrica como os equipamentos se encontram
fisicamente ligados entre si. Existem várias topologias possíveis, a saber: barramento, anel, árvore,
estrela e topologia mista/híbrida
No caso do protocolo Rs232, está prevista a ligação entre dois equipamentos apenas, não se trata
por isso de uma verdadeira rede, mas sim uma ligação ponto a ponto, entre dois equipamentos.

Meio comunicação

Os fios de cobre, os cabos coaxiais, a fibra óptica e mesmo o ar, são alguns exemplos de meios de
comunicação que podem ser usados para transmitir dados entre equipamentos.
No caso vertente, o protocolo Rs232 preconiza a utilização do fio de cobre para interligar os dois
equipamentos.

Sinais eléctricos

Dependendo do meio de comunicação utilizado, alguns protocolos de comunicação podem optar


pela utilização de sinais eléctricos, ópticos, ou de rádio frequência, para transmitir bits entre
equipamentos.
No caso do protocolo Rs232 é aplicada uma tensão positiva, entre 5 e 25 volts, para enviar um bit
com o valor lógico “0”, e uma tensão negativa, entre -5 e - 25 volt, para enviar um bit com o valor
lógico “1”.
A Figura 4.2 descreve como os sinais Rs232 são gerados a partir de tensões TTL. As tensões
Transístor Transístor Logic - TTL só podem assumir os valores 0 ou 5 volt, impõem-se por isso
converter estas tensões nas tensões definidas no protocolo Rs232.

Tecnologias e Accionamento e Comando 2009/2010 50


O tipo de sinais eléctricos aplicados a cada um dos pinos Tx e Rx destas fichas encontram-se
regulados pela norma V.28.
b0 bn
“0” > +3 Volts
+V 0 1 1 0 1 1 0 1 0 Volts
“01101101” “1” < -3 Volts

Tx
-V
+V

Rx
-V Neutro

Blindagem do cabo

Figura 4.2: Transmissor, Receptor Rs232, conversão TTL

Este protocolo define também o tempo que o emissor deve manter a tensão constante, positiva ou
negativa, por cada bit enviado (bit time). Quanto menor for este tempo, maior é o número de bits
que o emissor pode enviar por segundo. Várias taxas de transferência (baudrate) estão previstas
neste protocolo: 150, 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 bits/s.

A Figura 4.3 ilustra as tensões e a frequência do sinal eléctrico aplicados num fio de cobre durante
uma transmissão de vários bits, com uma taxa de 9600 bits/s. Pode observar-se que é aplicada uma
tensão negativa de – 5 volt, durante 1/9600 seg (bit time) para transmitir um bit com o valor lógico
“1”.

Taxa Distância
transferência aprox.(m)
110 850
300 800
600 700
1200 500
2400 200
4800 100
9600 70
19200 50
115 000 20

Figura 4.3: Sinais eléctricos de uma transmissão Rs232 (osciloscópio)

Formato da palavra série


Cada palavra série é constituída por um “start bit”, seguido de 5, 6, 7 ou 8 bits de dados, um bit de
paridade e no final o “stop bit”:

- O “start bit” corresponde a uma tensão positiva aplicada durante um “bit time”;
- Podem ser enviados 7 ou 8 bits de dados em cada palavra série;
- O bit de paridade é opcional, pode ou não ser utilizado. No caso de ser utilizada a paridade
par, este bit assume o valor “1” ou “0” por forma ao número de bits a “1” enviados na
palavra série seja sempre um número par.
- O “stop bit” corresponde a uma tensão negativa aplicada no fio de cobre durante 1, 1½, ou 2
“bit time”.

Tecnologias e Accionamento e Comando 2009/2010 51


A Figura 4.4 ilustra o envio de uma palavra série com uma
taxa de transferência de 9600 bit/s, 7 bits de dados,
paridade par - “Even” e 1 stop bit.

Detecção de erros de transmissão

O protocolo Rs232 prevê o envio de um bit de paridade


para permitir que o equipamento receptor possa detectar
eventuais erros de transmissão. É esse o papel do bit de
paridade representado a vermelho na figura. Este bit é Figura 4.4: Palavra série (osciloscópio)
adicionado automaticamente pelo emissor e é analisado
pelo receptor.
Se os dois equipamentos forem previamente configurados para utilizarem uma comunicação com
paridade par, e se dos 7 ou 8 bits de dados enviados numa palavra série, apenas 3 tiverem o valor
lógico “1”, o número de “Uns” a enviar nessa palavra seria ímpar. Nestes casos o bit de paridade
da palavra assume automaticamente o valor “1”, de forma que o número total de bits a “1” numa
palavra série passe a ser sempre um número par (numa comunicação com paridade par).
Desta forma, o receptor sabe que receberá sempre um número par de “1” em cada palavra série,
caso contrário houve um erro de transmissão.

Tipo de diálogo

Quando apenas um dos equipamentos pode enviar dados e outro se limita a receber, diz-se que têm
um diálogo do tipo “simplex”.
Quando os dois equipamentos podem receber e enviar dados, mas não em simultâneo, diz-se que
têm um diálogo do tipo “half duplex”.
Quando os dois equipamentos podem enviar e receber dados em simultâneo, têm um diálogo do
tipo “full duplex”.
Numa comunicação Rs232 existem dois fios de cobre distintos para a transmissão de dados, um
em cada sentido, por essa razão os dois equipamentos podem receber e enviar dados em
simultâneo. Diz-se por isso que estamos na presença de um diálogo do tipo “Full duplex”.

Controlo do fluxo de dados

O protocolo Rs232 prevê duas formas do equipamento receptor pedir ao emissor para suspender
por momentos o envio de dados. Na terminologia inglesa, controlo de fluxo designa-se por
“Handshake”.
Uma das formas de controlar o fluxo de informação entre os equipamentos, consiste no envio do
receptor para o emissor de uma palavra série especial (Xoff- 0x13 = 00010011 bin = 19 dec ).
Quando emissor recebe a palavra Xoff suspende o envio de novos dados até que o receptor lhe
envie a palavra Xon (Controlo de fluxo por Xon-Xoff).
A segunda forma de controlar o fluxo de informação entre o emissor e o receptor, consiste na
utilização de fios de cobre adicionais a ligar as portas Rs232 dos dois equipamentos. Mais
exactamente, fios de cobre adicionais a ligar o pino Request to Send - RTS ao Clear To Send –
CTS . Quando emissor pretender enviar dados activa o pino RTS e o receptor pode activar o seu
pino CTS para indicar que aceita receber dados (Controlo de fluxo por hardware).

Tecnologias e Accionamento e Comando 2009/2010 52


Fichas EIA232

As fichas DB25 e DB9, descritas na


Figura 4.5, são fichas macho, disponíveis nos computadores e outros equipamentos do tipo DTE -
Data Terminating Equipment. A ficha RJ45 presente na figura é uma ficha fêmea.

Figura 4.5: Fichas EIA232 [Sanchez’ 2007]

Cabos Rs232

Nalgumas fichas, o pino Tx corresponde ao pino número 2, noutros casos ao número 3. Mas,
independentemente da ficha ser macho ou fêmea, independentemente do equipamento ser um
computador (DTE – Data Terminal Equipment) ou um modem (DCE – Data Communication
Equipment), o pino de transmissão Tx de um equipamento liga sempre ao pino Rx do outro
equipamento. Nalgumas fichas o pino “terra” corresponde ao pino 5, noutras corresponde ao pino
7. Em todo o caso, os pinos “terra” das duas fichas devem ser ligados.

Cabo cruzado Cabo cruzado, c/ control de fluxo

Figura 4.6: Cabos EIA232 [Sanchez’ 2007]

O cabo descrito no lado esquerdo da Figura 4.6 permite uma comunicação Rs232, contudo este
cabo não permite um controlo de fluxo por hardware. Já o cabo do meio permite o controlo de
fluxo entre equipamentos através dos pinos Clear To Send - CTS e Request To Send – RTS.

Tecnologias e Accionamento e Comando 2009/2010 53


Conversão dos níveis TTL para os níveis Rs232

A interface USART/Rs232 de um µC pode apenas gerar tensões de 0 e 5 volt, ao passo que os


sinais eléctricos gerados durante uma comunicação Rs232 atingem tensões entre 5 e 25 volt,
positivas e negativas. Por esta razão é necessário utilizar um conversor de tensões. O circuito
integrado MAX232 desempenha essa função e converte uma tensão de + 5 v numa tensão negativa
de -7 v, e uma tensão de 0 volt numa tensão positiva de +7 v, e vice-versa.

Figura 4.7: MAX232 - Conversão de níveis TTL para níveis Rs232

Tecnologias e Accionamento e Comando 2009/2010 54


4.2 Como utilizar e configurar a interface RS232 do µC

Para o µC enviar para outros equipamentos uma palavra série, com 8 bits de dados, através de uma
ligação Rs232, o programa do µC deve escrever esses 8bits na posição da memória de dados
conhecida por, registo TXREG e esses bits serão automaticamente enviados. Por exemplo, se
pretender enviar o valor B’00010001’ para o computador, deve fazer:

movlw B’00010001’ ; número a enviar


movwf TXREG

Compete também ao programador configurar previamente a taxa de transferência que o uC


utilizará para enviar, bit a bit, os dados para o outro equipamento. O µC acrescenta
automaticamente o start bit e o stop bit.

Para configurar a interface Rs232 do uC, deve activar ou desactivar alguns bits dos registos
RXSTAT e TXSTAT. Cada uma destas posições de memória têm 8 bits, no entanto, neste caso,
apenas é necessário configurar 3 destes bits.

bcf TXSTAT,4 ; TXSTAT.sync=0 comunicação assíncrona


bcf TXSTAT,6 ; TXSTAT.TX9 = 0 não usa o 9º bit (bit de paridade)
bsf RCSTAT,7 ; RCSTAT.spen= 1 activa a porta série

Os 3 bits anteriores valem “0” por defeito, por isso basta alterar/activar um bit, o bit SPEN.

TXSTAT RCSTAT

Para configurar a taxa de transferência, é necessário escrever no registo SPBRG um valor


adequado. Esta posição de memória, como todas as outras posições de memória do PIC16F877

Tecnologias e Accionamento e Comando 2009/2010 55


tem 8 bits e pode guardar números de 0 a 255. A fórmula de cálculo, usada para determinar o valor
a atribuir a SPBRG, é a seguinte:

Se o bit BRGH=0 então a fórmula é SPBRG = Fosc/TaxaTransf/64 -1 (1)

Por exemplo, se o cristal utilizado for de 4 Mhz e se pretender uma taxa de transferência de:

2400 bit/s o valor é SPBRG = 4000000/2400/64 – 1 = 25,042


4800 bit/s o valor é SPBRG = 4000000/4800/64 – 1 = 12,020
9600 bit/s o valor é SPBRG = 4000000/9600/64 – 1 = 5,510

Em resumo, o código necessário para activar a interface Rs232 do uC, com 4800 bit/s, sem bit de
paridade e com 1 stop bit, resume-se a 3 instruções:

bsf RCSTAT,7 ; RCSTAT.spen= 1 activa a porta série


movlw 12
movwf SPBRG ; Taxa de transferência = 4800 bit/s

Para enviar uma palavra série com o número 00110000 deve escrever esse número no registo
TXREG.

movlw B’00110000’
movwf TXREG ; Envia uma palavra série com 8 bits de dados

Nos exemplos anteriores, a fórmula de cálculo utilizada permitiu determinar o valor a atribuir ao
registo SPBRG, como o bit BRGH valia zero por defeito e a fórmula era:
SPBRG = Fosc/TaxaTransf/64 -1

Contudo, dependendo do cristal utilizado e da taxa de transferência pretendida, O valor anterior


pode não ser muito exacto. Quando a margem de erro for elevada é possível utilizar uma fórmula
de cálculo diferente. Compete ao programador seleccionar qual das duas fórmulas permite ao µC
aproximar-se mais do valor da taxa de transferência pretendida, em função do cristal utilizado e da
margem de erro obtida. Para isso o programador deve activar o bit BRGH = 1 e nessa altura a
fórmula a utilizar para calcular o valor a atribuir SPBRG é:

Se BRGH=1 então a fórmula é SPBRG = Fosc/TaxaTransf/16 -1 (2)

Por exemplo, se o cristal utilizado for de 4 Mhz e se pretender uma taxa de transferência de:

2400 bit/s o valor é SPBRG = 4000000/2400/16 – 1 = 103,16667


4800 bit/s o valor é SPBRG = 4000000/4800/16 – 1 = 51,0833
9600 bit/s o valor é SPBRG = 4000000/9600/16 – 1 = 25,0416

Tecnologias e Accionamento e Comando 2009/2010 56


4.3 Exemplo - programa “Rs232Tx.asm”

Com este programa, o µC envia uma palavra série para o equipamento remoto (ex. Computador).

1 – Seleccionar o modo assíncrono, fazendo o bit Sync = 0


2 – Seleccionar a taxa de transferência, fazendo o registo Serial Port Baudrate, SPBRG= 12
3 – Autorizar o envio, fazendo o bit Transmission Enable, TXEN= 1
4 – Activar a interface de comunicação, fazendo o bit Serial Port Enable, SPEN= 1
5 – Activar o pino TX, fazendo o bit nº 6 do registo TRISC6= 1
6 – Por fim escrever em TXREG o(s) byte(s) que pretender enviar para o equipamento remoto.

Figura 4.8: Comunicação Rs232 – Envio [Sanchez’ 07]

list p=p16f877A
#include <p16f877A.inc>
__CONFIG _XT_OSC & _CP_OFF & _PWRTE_OFF & _WDT_OFF & _BODEN_OFF
; Start at the reset vector
org 0x00
goto iniciar

org 0x04
retfie

iniciar
; ---- Configuração da USART = Rs232: 4800,8,n,1
banksel TRISB
bsf TRISC,6 ; Activa o pino TX (corresponde RC6)
bcf TXSTA,4 ; SYNC = 0 (comunicação assíncrona)
bsf TXSTA,5 ; TXEN = 1 ( autoriza envio )
movlw .12 ; Baudrate = 4800
movwf SPBRG
banksel RCSTA
bsf RCSTA,7 ; SPEN = 1 (Activa a porta série)
; ------- fim da configuração da USART

main
movlw A'1' ; Na tabela ASCII, caracter '1'
; corresponde ao número 49 = 110001 = 0x31
movwf TXREG ; Envia um byte para o equip remoto
end

Tecnologias e Accionamento e Comando 2009/2010 57


4.4 Exemplo - programa “Rs232Rx.asm”

Este programa permite ao µC receber palavras série, e com base nos bytes recebidos activar as
saídas RB0:RB7

1 – Seleccionar o modo assíncrono, fazendo o bit Sync = 0


2 – Seleccionar a taxa de transferência, fazendo o registo Serial Port Baudrate, SPBRG= 12
3 – Autorizar a recepção continua, fazendo o bit Continous Reception Enable, CREN= 1
4 – Activar a interface de comunicação, fazendo o bit Serial Port Enable, SPEN= 1
5 – Activar o pino RX, fazendo o bit nº 7 do registo TRISC7= 1
6 – Por fim ler no registo RCREG o byte recebido, se o bit Reception RCIF for igual a 1.

Figura 4.9: Comunicação Rs232 –Recepção [Sanchez’ 07]

list p=p16f877A
#include <p16f877A.inc>
__CONFIG _HS_OSC & _CP_OFF & _PWRTE_OFF & _WDT_OFF & _LVP_OFF
org 0x00
goto configura
; ------ Rotina de serviço ao Interrupt
org 0x04
retfie

configura
; ------------- Configura a Porta Rs2321
banksel TRISB ; Selecciona banco 1
clrf TRISB ; Activa todos os pinos RB como saída
bsf TRISC,7 ; Activa o pino RC7/RX
bcf TXSTA,4 ; SYNC = 0 Activa comunicação assíncrona
movlw .12 ; Define o baudrate = 4800
movwf SPBRG
banksel RCSTA ; Selecciona o banco 0
bsf RCSTA,7 ; SPEN Serial port enable
bsf RCSTA,4 ; CREN Continuos reception enable
; ------------------------------------

main
btfss PIR1,RCIF ; IF Verifica se chegou nova palavra série
goto main ; ELSE ainda não chegou -> goto main
movfw RCREG ; THEN lê o byte recebido da porta Rs232 - Rx
movwf PORTB ; Activa as saídas RB com o bits do Byte recebido
goto main
end

Tecnologias e Accionamento e Comando 2009/2010 58


4.5 Exemplo - programa “Rs232RxTx.asm”

Este programa permite ao µC receber palavras série, e com base nos bytes recebidos activar as
saídas RB0:RB7 como no exemplo anterior, mas além disso, todos os bytes recebidos na porta
série do µC são reenviados para o emissor. O programa configura a interface Rs232 com uma taxa
de transferência de 9600bits/s, 1 stop bit, e sem bit de paridade.

1 – Seleccionar o modo assíncrono, fazendo o bit Sync = 0


2a– Activar o bit BRGH=1
2b– Seleccionar a taxa de transferência, fazendo o registo Serial Port Baudrate, SPBRG= 25
3a– Autorizar a recepção continua, fazendo o bit Continous Reception Enable, CREN= 1
3b– Autorizar o envio, fazendo o bit Transmission Enable, TXEN= 1
4 – Activar a interface de comunicação, fazendo o bit Serial Port Enable, SPEN= 1
5a– Activar o pino RX, fazendo o bit nº 7 do registo TRISC7= 1
5b– Activar o pino TX, fazendo o bit nº 6 do registo TRISC6= 1
6a– Ler no registo RCREG o byte recebido, se o bit Reception RCIF for igual 1.
6b– Escrever no registo TXREG o byte recebido.

Figura 4.10: Comunicação Rs232 – Envio/Recepção [Sanchez’ 07]

list p=p16f877A
#include <p16f877A.inc>
__CONFIG _HS_OSC & _CP_OFF & _PWRTE_OFF & _WDT_OFF & _LVP_OFF
org 0x00
goto configura
org 0x04
retfie

configura
; ------------- Configura a Porta Rs2321
banksel TRISB
bsf TRISC,7 ; Activa o pino RC7/RX
bsf TRISC,6 ; Activa o pino RC6/TX
bcf TXSTA,4 ; SYNC = 0 Activa comunicação assíncrona
bsf TXSTA,5 ; Activa TXEN=1
bsf TXSTA,2 ; BRGH = 1
movlw .25 ; Define o baudrate 9600
movwf SPBRG

Tecnologias e Accionamento e Comando 2009/2010 59


banksel RCSTA ; Selecciona o banco 0
bsf RCSTA,7 ; SPEN Serial port enable
bsf RCSTA,4 ; CREN Continuos reception enable
;-------------------------------

main
btfss PIR1,RCIF
goto main
movfw RCREG ; Lê o byte recebido da porta Rs232 - Rx
movwf TXREG ; reenvia o byte recebido para o equipamento remoto
goto main
end

4.6 Bibliografia

[Rizzoni 2007] Rizzoni, G. (2007). Principles and Applications of Electrical Engineering. 5th, McGraw Hill
International. Capítulo 18.

[PIC16F877] PIC16F87X Datasheet, Microchip., 2001.

[AN822] Padmaraja Y. et. Al., Stepper Motor Microstepping with PIC18C452, Microchip, 2002.

[AN907] Reston C., et. Al., Stepping Motors Fundamentals, Microchip, 2004.

[Sanchez’07] Sanchez, J., Canton M. (2007). Microcontroller Programming The Microchip PIC. Taylor & Francis.
CRC Press.

Tecnologias e Accionamento e Comando 2009/2010 60


Universidade de Aveiro
Departamento de Engenharia Mecânica
Tecnologias de Accionamento e Comando 2009/2010

5 COMANDO EM MALHA FECHADA

Objectivos:
Compreensão e utilização das interrupções.
Directivas do compilador

Material a utilizar:
µC, “encoder” incremental, motor de passo

Data de entrega:
O programa do µC deve ser enviado por correio electrónico até às 24h de 10 de Dezembro.

Desenvolva um programa que permita ao PIC16F877 adquirir os impulsos de um “encoder”


incremental, de 200 impulsos por volta, e dessa forma comandar os movimentos de um motor de
passo.

Tecnologias e Accionamento e Comando 2009/2010 61


APÊNDICE V
Para ser possível controlar uma grandeza real, em malha fechada, é necessário utilizar sensores,
actuadores e um dispositivo de comando. Historicamente estes três elementos eram mecânicos,
mais tarde passaram também a ser eléctricos, primeiro eram analógicos, depois digitais e mais
recentemente passaram a ser programáveis.
Um sistema de comando em tempo real tem de ser rápido a adquirir valores, a tomar decisões, e a
actuar sobre a grandeza física que se pretende comandar.
Neste apêndice, serão estudadas as interrupções geradas pelo µC para permitir um processamento e
uma tomada de decisão rápida.
Serão também apresentados alguns complementos à programação em assembler.

5.1 Conceitos sobre interrupções e vectores

Vectores de interrupção

Para se perceber o que é um vector de interrupção é necessário em primeiro lugar perceber o


que é uma interrupção.
A execução do programa é feita de forma sequencial, instrução a instrução, pela ordem com
que as instruções foram gravadas na memória Flash, a menos que uma de três situações ocorra:

“Goto” - Quando o programador usar uma instrução de salto que faça com que a próxima
instrução a executar não se encontre na posição de memória consecutiva, mas sim na posição
indicada pela instrução de salto.

“Call” - Quando o programador usar uma instrução que chame uma subrotina e faça o µC
saltar para o conjunto de instruções dessa subrotina, localizada algures na sua memória e
depois regresse automaticamente à sequência inicial.

“Interrupt” - A terceira situação que pode interromper uma execução sequencial é gerada pelo
próprio hardware, de forma aleatória, assíncrona e independente da instrução que esteja a ser
executada na altura pelo µC. Este tipo de interrupção permite que a execução do programa
também salte para uma nova zona do programa, execute um conjunto de instruções e depois
regresse ao ponto em que o programa estava antes da interrupção. Esta situação parece-se com
a anterior, “Call”, mas é diferente porque agora quem define o instante em que a interrupção
ocorre é o hardware. O programador apenas define as instruções que devem ser executadas
quando a interrupção ocorrer. Ao conjunto de instruções que serão executadas quando uma
interrupção deste tipo ocorrer chama-se “rotina de serviço à interrupção - RSI” . A posição de
memória onde fica guardada a localização dessa RSI é conhecida por “vector de interrupção” e
no caso do µC que vamos utilizar este vector de interrupção corresponde ao endereço 4 da
memória dos programas.

“Interrupt flags”
Neste µC, sempre que ocorre uma interrupção, seja qual for a sua causa, é executada a mesma
rotina de serviço à interrupção RSI. Compete ao nosso programa, mais exactamente à nossa
RSI, determinar qual foi a causa da interrupção e processá-la de forma adequada. Felizmente o
hardware do µC, além de gerar uma interrupção, activa uma de várias “Flags”, aquela que
corresponder ao tipo de ocorrência que gerou o “Interrupt”.

Tecnologias e Accionamento e Comando 2009/2010 62


As “Interrupt flags” são bits específicos, da memória de dados, e são activados pelo hardware
do µC sempre que ocorrer uma interrupção, por exemplo: um temporizador interno excedeu o
seu valor máximo, chegou uma nova palavra série ao µC, uma conversão analógica/digital foi
concluída, etc.

Em assembler não existem IF, FOR, WHILE, funções ou procedimentos que também
permitiriam controlar a sequência com que as instruções são executadas.

Para trabalhar com interrupções é necessário que o programa active previamente alguns bits do
tipo Interrupt Enable – IE, presentes na sua memória de dados (Figura 5.1).

Figura 5.1: Bits do tipo ”Interrupt Enable” e “Interrupt Flag”

General Interrupt Enable – GIE : Este bit tem de ser activado pelo programa, seja qual for a
interrupção que se queira autorizar e processar.
PEriferal Interrupt Enable - PEIE : Este bit tem de ser activado pelo programa, quando se quer
gerar e processar interrupções do tipo externo, por exemplo
interrupções geradas por terem sido aplicadas tensões
externas aos pinos RB0, RB4 a RB7 ou mesmo
interrupções geradas pelo conversor A/D
Timer0 Interrupt Enable – T0IE : Este bit tem de ser activado pelo programa, quando se quer
gerar e processar interrupções devido ao “estouro” do
TMR0. Lembra-se que o TMR0 pode ser incrementado
pelo relógio “clock” ou por uma tensão externa aplicada ao
pino RA4 (transição).
Interrupt Enable - INTE : Este bit tem de ser activado pelo programa, quando se quer
gerar uma interrupção sempre que for aplicada uma tensão
externa ao pino RB0/INT.
RB Interrupt Enable - RBIE : Este bit tem de ser activado pelo programa, quando se quer
gerar uma interrupção quando um dos pinos, RB7 a RB4,
variar de tensão.
Analog Digital Interrupt Enable - ADIE : Este bit tem de ser activado pelo programa, para ser
gerada uma interrupção quando uma conversão A/D
terminar.
Receiver Interrupt Enable - RCIE : Este bit tem de ser activado pelo programa, para ser gerada
uma interrupção quando chegar uma palavra série Rs232 ao
µC.
Transmit Interrupt Enable - TXIE : Este bit tem de ser activado pelo programa, para ser gerada
uma interrupção sempre que for enviada uma palavra série
Rs232, por exemplo, para o computador.

Tecnologias e Accionamento e Comando 2009/2010 63


INTCON (banco 0) PIE1 (banco 1)

PIR1 (banco 0) OPTION_REG (banco 1)

Figura 5.2: Registos necessários à configuração das interrupções

Os bits do tipo Interrupt Flag – IF são activados pelo hardware quando ocorrer uma interrupção e
são limpos pelo programa/programador. A saber:

Tecnologias e Accionamento e Comando 2009/2010 64


Timer 0 Interrupt Flag - T0IF : este bit é activado pelo hardware quando o registo TMR0
estoura, e tem de ser limpo pelo programa.
Interrupt Flag - INTF : este bit é activado pelo hardware quando é aplicada uma
tensão externa no pino RB0/INT, e tem de ser limpo pelo
programa.
RB Interrupt Flag - RBIF : este bit é activado pelo hardware quando a tensão externa
aplicada a um dos pinos RB7 a RB4 é alterada. Esta “Flag”
é limpa pelo programa quando este lê o valor do PORTB.
A/D Interrupt Flag - ADIF : este bit é activado pelo hardware quando a conversão A/D
termina. Este bit é limpo pelo programa bcf PIR1, ADIF
Receive Interrupt Flag - RCIF : este bit é activado pelo hardware quando recebe uma
palavra série Rs232. Esta “Flag” é limpa pelo programa
quando lê o registo RCREG. movfw RCREG
Transmission Interrupt Flag - TXIF: este bit é activado pelo hardware quando acaba de enviar
uma palavra série Rs232. Esta “Flag” é limpa pelo
programa quando escreve um novo valor em TXREG.
movwf TXREG

5.1.1 Exemplo - programa “Rs232Interrupt.asm”

Este programa permite activar e processar as interrupções geradas pela recepção de palavras série
Rs232. Ou seja, este programa tira partido da Rotina de Serviço à Interrupção - RSI.
O µC é configurado para gerar uma interrupção sempre que receber uma palavra série e a RSI é
gravada no endereço 0x04 e posições consecutivas. A RSI definida neste programa copia o byte
recebido em RCREG para o registo TXREG, fazendo dessa forma com que ele seja reenviado para
o equipamento emissor. A RSI começa por verificar se o bit RCIF é igual a “1”, nesse caso foi
recebida uma palavra série e os 8 bits de dados estão disponíveis no registo RCREG.
A instrução RETFIE permite terminar a RSI e a execução do programa retorna ao ponto onde
estava antes da RSI ter sido chamada.
Para activar as interrupções os bits GIE, PEIE, RCIE têm de ser iguais a “1”.
Grande parte deste programa já foi estudada no trabalho anterior, as diferenças encontram-se
escritas a negrito.

list p=p16f877A
#include <p16f877A.inc>
__CONFIG _HS_OSC & _CP_OFF & _PWRTE_OFF & _WDT_OFF & _LVP_OFF
org 0x00
goto configura

; ------ RSI - Rotina de Serviço à Interrupção


org 0x04
btfss PIR1,RCIF ; IF interrupção gerado por chegada Palavra série ?
retfie ; ELSE termina RSI
movfw RCREG ; THEN Lê o byte recebido da porta Rs232 - Rx
movwf TXREG ; reenvia o byte recebido para o equipamento remoto
movwf PORTB ; Activa as saídas RB com os bits do Byte recebido
retfie

configura

Tecnologias e Accionamento e Comando 2009/2010 65


; ------------- Configura a Porta Rs2321
banksel TRISB ; banco 1
clrf TRISB ; Activa todos os pinos RB como saída
bsf TRISC,7 ; Activa o pino RC7/RX
bsf TRISC,6 ; Activa o pino RC6/TX
bcf TXSTA,4 ; SYNC = 0 Activa comunicação assíncrona
bsf TXSTA,5 ; Activa TXEN=1
bsf TXSTA,2 ; BRGH = 1
movlw .25 ; Define o baudrate 9600
movwf SPBRG
banksel RCSTA ; Selecciona o banco 0
bsf RCSTA,7 ; SPEN Serial port enable
bsf RCSTA,4 ; CREN Continuos reception enable
;-------------------------------

; ---------- Activa a interrupção gerada pela porta Rs232


banksel PIE1 ; banco 1
bsf PIE1,RCIE ; Activa o interrupt de recepção Rs232-Rx
banksel INTCON ; banco 0
movfw RCREG ; limpa o registo onde as palavras série são recebidas pelo uC ; BANK0
movlw B'11000000' ; Habilita os interrupt GIE e os Periféricos PEIE
movwf INTCON
; ------------------------------------
main
goto main
end

5.1.2 Exemplo - programa “TMR1_Interrupt.asm”

Este programa permite activar e processar as interrupções geradas pelo “estouro” do TMR1.
O temporizador TMR1 do µC já foi utilizado num exemplo anterior, e os bits seguintes já foram
utilizados (Figura 5.3).

Figura 5.3: bits de configuração do TMR1


Neste exemplo, além dos bits anteriores, serão também inicializados 3 bits adicionais para
autorizar o circuito A/D a gerar interrupções sempre que uma conversão termine, a saber:
GIE, PEIE e TMR1IE (Figura 5.4).

Figura 5.4: bits de autorização da interrupção gerada pelo estouro do TMR1


Depois de ocorrer a interrupção, dentro da rotina de serviço à interrupção - RSI, é necessário pôr o
bit/”flag” TMR1IF a zero. Caso contrário, será gerada uma nova interrupção logo que a primeira
termine.
list p=pic16f877a
#include <p16f877a.inc>
__CONFIG _HS_OSC & _CP_OFF & _WDT_OFF & _LVP_OFF
; Start at the reset vector
org 0x00
goto iniciar

Tecnologias e Accionamento e Comando 2009/2010 66


; ----- Rotina de serviço à interrupção
org 0x04
btfss PIR1,TMR1IF ; Salta uma instrução se TMR1IF == 1
retfie ; a RSI foi chamada por outra razão que não o estouro do TMR1
; processa o estouro do Timer1
clrf TMR1H ; inicializa timer1 a zero = 0,5 seg
incf PORTB ; incementa a saída
bcf PIR1,TMR1IF ; limpa a flag de estouro do timer1
retfie ; RSI end ---------------------------------------

iniciar
banksel TRISB
clrf TRISB ; PORTB output
; ------ Configura e activa o TMR1
banksel T1CON ; banco 0
bsf T1CON,5 ; prescaler timer1 /8
bsf T1CON,4 ; prescaler "
bsf T1CON,3 ; osc enabled
bcf T1CON,1 ; internal clock
bsf T1CON,0 ; enables timer1
clrf TMR1H ; inicializa timer1 a zero

; ----- Activa interrupções


bsf INTCON, GIE ; autoriza interrupções
bsf INTCON, PEIE ; autoriza interrupções de periféricos
banksel PIE1 ; banco 1
bsf PIE1,TMR1IE ; autoriza interrupções quando TMR1 estoura
banksel PORTB ; banco 0

Ciclo
goto Ciclo
end

5.1.3 Exemplo - programa “Analog_Interrupt.asm”

Este programa permite activar e processar as interrupções geradas quando uma conversão
Analógico-Digital A/D termina e um valor binário de 10 bits, proporcional à tensão externa, está
disponível em ADRESL e ADRESH.
O circuito de conversão A/D do µC já foi utilizado num exemplo anterior, e os bits seguintes já
foram utilizados (Figura 5.5).

Figura 5.5: Bits de configuração do circuito de conversão A/D

Neste exemplo, além dos bits anteriores, serão também inicializados 3 bits adicionais para
autorizar o circuito A/D a gerar interrupções sempre que uma conversão termine, a saber:
GIE, PEIE e ADIE (Figura 5.6).

Tecnologias e Accionamento e Comando 2009/2010 67


Figura 5.6: Bits de autorização de interrupção gerada pelo circuito A/D

Depois de ocorrer a interrupção, dentro da rotina de serviço à interrupção - RSI, é necessário pôr o
bit/”flag” ADIF a zero. Caso contrário, será gerada uma nova interrupção logo que a primeira
termine.

list p=pic16f877
#include <p16f877.inc>
__CONFIG _HS_OSC & _CP_OFF & _WDT_OFF & _LVP_OFF
org 0x00
goto iniciar

; ------- Rotina de serviço à interrupção


org 0x04
btfsc ADCON0,2
retfie ; conversão incompleta, retorna...
; conversão completa
movfw ADRESH
movwf PORTB
bcf PIR1,ADIF ; limpa a flag ADIF de interrupção
bsf ADCON0, 2 ; reinicia a conversão
retfie

iniciar
banksel TRISB
clrf TRISB

; ----- Configura entrada analógica RA0=AN0


banksel ADCON1 ; banco 1
movlw B'00001110' ; b7: left b3-b0: só RA0 analógica
movwf ADCON1
banksel ADCON0 ; banco 0
movlw B'01000001' ;b7-6:Fosc/8 b5-3:seleciona AN0 b0:activa a conversão
movwf ADCON0
; ------------------------

; ------- Activar Interrupt


bsf INTCON,GIE ; autoriza interrupções
bsf INTCON,PEIE ; autoriza interrupção geradas pelos periféricos
banksel PIE1
bsf PIE1,ADIE ; autoriza interrupção gerada pela conversão A/D
; ------------------
banksel ADCON0
bsf ADCON0,2 ; inicio da conversão
Ciclo
goto Ciclo
end

Tecnologias e Accionamento e Comando 2009/2010 68


5.1.4 Exemplo - programa “RB0_Interrupt.asm”

Este programa permite activar e processar as interrupções geradas pelo pino RB0/INT. Quando a
tensão externa aplicada ao pino RB0/INT variar de 0 para 5 volt, ou vice-versa, pode ser gerada
uma interrupção. Para isso acontecer é necessário activar os bits GIE, PEIE e INTE (Figura 5.7).

Figura 5.7: bits de autorização da interrupção gerada pelo estouro do TMR1

Depois de ocorrer a interrupção, dentro da rotina de serviço à interrupção - RSI, é necessário pôr o
bit/”flag” INTF a zero. Caso contrário, será gerada uma nova interrupção logo que a primeira
termine

list p=pic16f877a
#include <p16f877a.inc>

__CONFIG _HS_OSC & _CP_OFF & _WDT_OFF & _LVP_OFF


org 0x00 ; vector de reset
goto iniciar

org 0x04 ; vector de interrupção


btfss INTCON,INTF
retfie ; a RSI foi chamada por razão que não o estouro do Timer
; processa o estouro do Timer1
incf PORTB ; activa a saída RB1incementa a saída
bcf INTCON,INTF ; limpa a flag de estouro do timer1
retfie

iniciar
banksel TRISB
clrf TRISB ; PORTB output
bsf TRISB,0 ; PORTB.RB0 input
banksel PORTB ; banco 0
; ----- Activa interrupções
bsf INTCON, GIE ; autoriza interrupções
bsf INTCON, PEIE ; autoriza interrupções de periféricos
bsf INTCON, INTE ; autoriza interrupção gerada por RB0

Ciclo
goto Ciclo
end

5.2 Assembler - Complementos

O compilador de assembler MPASM foi utilizado nos trabalhos anteriores e os programas


desenvolvidos permitiram apresentar e utilizar várias instruções, nomeadamente:
bsf, bcf, movlw, movwf, btfss, btfsc, goto, clrf,

Tecnologias e Accionamento e Comando 2009/2010 69


Neste trabalho, pretende-se entre outras coisas, aprofundar os conhecimentos sobre a programação
em assembler.

5.2.1 Directivas do compilador

As directivas são instruções para o compilador, aparecem no código, mas não são convertidas
directamente em código máquina “opcodes”. De facto, as directivas são primeiro convertidas em
várias instruções elementares de assembler e só depois são convertidas em código máquina.

Directiva “CBLOCK”
Quando o programador cria uma variável, seja em “C”, “Fortran”, “Pascal”, “Assembler” ou em
qualquer outra linguagem, o que acontece de facto é que o compilador reserva uma ou várias
posições de memória da RAM do Computador, do PLC, ou do uC, para armazenar os valores que
essa variável poderá assumir durante a execução do programa.
Em assembler podemos criar uma sequência de variáveis e simultaneamente definir os endereços
que cada uma delas ocupará na RAM, através da directiva CBLOCK.

CBLOCK 0x20
Var1 ; A variável VAR1 corresponde à posição de memória 0x20 do uC
Var2 ; A variável VAR2 corresponde à posição de memória 0x21 do Uc
Var3:2 ; A variável VAR2 corresponde às posições 0x22 e 0x23
ENDC

Movlw B’00010001’
Movwf Var1

Directiva “WHILE”
Em vez do programador repetir as instruções de cada ciclo, esta directiva leva o compilador a gerar
o código correspondente a todas as iterações do ciclo.

Tecnologias e Accionamento e Comando 2009/2010 70


Directiva “IF”
A directiva “IF” instrui o compilador para gerar o código correspondente às instruções (i) a (i+n)
se a condição for verdadeira.

IF condição
Instrução i ; se a condição for VERDADEIRA executa esta instrução
………. “
Instrução i+n ; se a condição for VERDADEIRA executa esta instrução
ELSE
Instrução j ; se a condição for FALSA executa esta instrução
……….. “
Instrução j+n ; se a condição for FALSA executa estas instruções
ENDIF

5.2.2 Bases numéricas, prefixos

Em assembler, o utilizador tem a liberdade de escrever os números em várias bases numéricas:


Decimal, Octal, Hexadecimal, Binário e ASCII, mas tem de indicar ao compilador em qual das
bases escreve um determinado valor. Para isso pode colocar um prefixo antes do número.

Binário B'00111001'
Octal O'777'
Decimal D'100' ou em alternativa .100
Hexadecimal H'9f' ou em alternativa 0x9f
Caracter ASCII A'C' ou em alternativa 'C'

Tecnologias e Accionamento e Comando 2009/2010 71


5.2.3 Operadores

$ Current/Return program counter goto $ + 3


( Left Parenthesis 1 + (d * 4)
) Right Parenthesis (Length + 1) * 256
! Item NOT (logical complement) if ! (a == b)
- Negation (2's complement) -1 * Length
~ Complement flags = ~flags
low1 Return low byte of address movlw low CTR_Table
high1 Return high byte of address movlw high CTR_Table
upper1 Return upper byte of address movlw upper CTR_Table
* Multiply a=b*c
/ Divide a=b/c
% Modulus entry_len = tot_len % 16
+ Add tot_len = entry_len * 8 + 1
- Subtract entry_len = (tot - 1) / 8
<< Left shift flags = flags << 1
>> Right shift flags = flags >> 1
>= Greater or equal if entry_idx >= num_entries
> Greater than if entry_idx > num_entries
< Less than if entry_idx < num_entries
<= Less or equal if entry_idx <= num_entries
== Equal to if entry_idx == num_entries
!= Not equal to if entry_idx != num_entries
& Bitwise AND flags = flags & ERROR_BIT
^ Bitwise exclusive OR flags = flags ^ ERROR_BIT
| Bitwise inclusive OR flags = flags | ERROR_BIT
&& Logical AND if (len == 512) && (b == c)
|| Logical OR if (len == 512) || (b == c)
= Set equal to entry_index = 0
+= Add to, set equal entry_index += 1
-= Subtract, set equal entry_index -= 1
*= Multiply, set equal entry_index *= entry_length
/= Divide, set equal entry_total /= entry_length
%= Modulus, set equal entry_index %= 8
<<= Left shift, set equal flags <<= 3
>>= Right shift, set equal flags >>= 3
&= AND, set equal flags &= ERROR_FLAG
|= Inclusive OR, set equal flags |= ERROR_FLAG
^= Exclusive OR, set equal flags ^= ERROR_FLAG
++ Increment2 i ++
-- Decrement2 i --

Tecnologias e Accionamento e Comando 2009/2010 72


Universidade de Aveiro
Departamento de Engenharia Mecânica
Tecnologias de Accionamento e Comando 2009/2010

6 PROGRAMAÇÃO em “C”

Objectivos:
Introdução à linguagem “C”
- conversão analógico-digital
- temporizadores de 1ms e 1seg
- comunicação Rs232

Material a utilizar:
Placa PICDEM 2 plus, 1 cabo Rs232.

Data de entrega:
O programa do µC deve ser enviado por correio electrónico até às 24h de 17 de Dezembro.

Desenvolva as funções em “C” com “in-line assembler” e interrupções que lhe permita controlar a
conversão analógico-digital, os temporizadores e a comunicação Rs232.

ADC_Conf();
ADC_Start();
ADC_Done();

Delay_ms();
Delay_seg();

Rs232Conf();
Rs232Tx();
Rs232Rx();

Tecnologias e Accionamento e Comando 2009/2010 73


6.1 Introdução ao C

Instalação do compilador
Vamos utilizar o compilador “Hi-TECH Universal ToolSuite” da Microchip. Para instalar o
compilador deve aceder ao sítio da Microchip:
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en542849

Da mesma forma que o “Assembler” converte um ficheiro de texto, escrito em assembler, num
ficheiro com código máquina (*.o), o compilador de “C” converte um ficheiro de texto, escrito em
“C”, num ficheiro também com código máquina (*.o).
Podem existir vários ficheiros com código máquina, alguns escritos e compilados pelo utilizador,
outros já compilados por outros programadores ou pela Microchip (*.lib). Se quiser reutilizar esse
código máquina nos seus programas tem de o juntar ao seu próprio código através do “Linker”.
Após o “linker”, obtemos um ficheiro (*.hex) com todo código máquina que é necessário enviar
para o µC, mais exactamente para a sua memória de programas.

Figura 6.1: Conversão de um ficheiro de código “C” num ficheiro com código máquina [Wilmshurst’07]

Criação de um projecto em C

Depois de instalado, este compilador pode ser utilizado a partir do MPLAB IDE. Pode criar um
novo projecto, como fazia para criar projectos em assembler, através da opção “Project Wizard”,
mas agora, em vez de seleccionar a opção “MPASM toolsuite”, passa a seleccionar a opção “HI-
TECH Universal Toolsuite” (Figura 6.2).

Tecnologias e Accionamento e Comando 2009/2010 74


Figura 6.2: Criar uma projecto em C, partir do MPLAB IDE

6.1.1 Exemplo - programa “SaídaDigital.c”

Este programa permite activar a saída digital RB2. Todos os programas em “C” têm uma função
“main”. Esta função é a primeira a ser chamada e todo o código contido entre as chavetas da
função “{ }”, será executado.
Em “C”, todas as instruções terminam com um ponto e vírgula “;”. Os comentários começam por
“//” e prolongam-se até ao final dessa linha ou os comentários são escritos entre /* */ e podem
ocupar várias linhas.

#include <htc.h>

void main(void){
TRISB = 0x00; // número Hexadecimal
PORTB = 0b00000100; // número binário
}

Para o compilador conseguir processar palavras como “TRISB” e “PORTB” é necessário incluir
previamente o ficheiro com o seu significado, por exemplo o ficheiro “# include PIC16F887.h”.
Em alternativa podemos incluir o ficheiro “htc.h”.
Como já deve calcular, as palavras TRISB e PORTB correspondem às posições de memória de
dados do µC com mesmo nome.

Tecnologias e Accionamento e Comando 2009/2010 75


Bases numéricas, prefixos

Em “C”, o utilizador tem a liberdade de escrever os números em várias bases numéricas: Decimal,
Octal, Hexadecimal, Binário e também texto em ASCII, mas tem de indicar ao compilador em qual
das bases escreve um determinado valor. Para isso pode colocar um prefixo antes do número.

Binário 0b00111001 ou 0B00111001


Decimal 100
Hexadecimal 0x9f

Caracter ASCII 'C'


String “olá”

6.1.2 Exemplo - programa “Funcao.c”

Este programa faz exactamente o mesmo que o anterior, mas permite dar um exemplo de como é
declarada e usada uma função. Neste exemplo a função tem o nome “activaRB2”.
Apesar da função “activaRB2()” ser a primeira função declarada neste exemplo, ela é chamada
depois e a partir da função principal “main()”. Neste exemplo a função não recebe nem retorna
valores “void”.
#include <htc.h>

void activaRB2(void){
TRISB = 0X00; // número Hexadecimal
PORTB = 0b00000100; // número binário
}

void main(void){
activaRB2();
}

Funções e procedimentos
Existe uma diferença entre funções e procedimentos. As duas permitem “agrupar” código,
tornando mais fácil a sua reutilização e repetição ao longo do programa, mas só as funções podem
retornar valores.

Tecnologias e Accionamento e Comando 2009/2010 76


Passagem de parâmetros por valor ou por referência

// Passagem dos valores para “i” e” j” // Passagem da referência/endereço para “k”


#include <htc.h> #include <htc.h>

int soma(int i, int j); int soma(int i, int j, int *k);


int x,y;
x=1; void main(void){
y=2; int x=1;
void main(void){ int y=2;
TRISB = 0x00; int z;
PORTB = soma(x,y); TRISB = 0x00;
while(1){} soma(x,y,&z);
} PORTB = z ;
while(1){}
}
int soma(int i, int j){
return i+j; int soma(int i, int j, int * k){
} *k= i+j;
}

6.1.3 Exemplo - programa “InLineASM.c”

Dentro de um ficheiro de código “C” é possível inserir instruções em assembler, desde que se
encontrem escritas entre as directivas #asm e #endasm. Desta forma, o compilador de “C” sabe que
deve compilar essas instruções como instruções de assembler.

#asm
Instrução em assembler 1
Instrução em assembler 2
…….
Instrução em assembler n
#endasm

O Programa seguinte permite limpar a posição 0x20 da memória de dados do µC através de uma
instrução de assembler inserida num ficheiro com código “C”.

#include <htc.h>

void main(void){
#asm
clrf 0x20
#endasm
}

Se o programador quiser escrever apenas uma instrução em assembler tem a possibilidade de usar
a função asm(“ ”). Neste caso o programa anterior poderia ser escrito da seguinte maneira:

#include <htc.h>

void main(void){
asm(“clrf 0x20”);
}

Tecnologias e Accionamento e Comando 2009/2010 77


Diferenças entre o “Hi-Tech in-line Assembler” e o “MPASM toolsuite”

Quando o compilador HI-Tech encontra a directiva “#asm”, num ficheiro com código “C”, utiliza
o seu próprio compilador de assembler e não o “MPASM toolsuite” que utilizámos nos trabalhos
anteriores. Por essa razão, o código “in-line assembler” tem algumas diferenças:

- Os comentários obedecem às regras do “C”. // ….. e /* ….. */


- As directivas de assembler não podem ser usadas em “in-line assembler”.
- A base numérica usada por defeito é a base decimal.
- Os prefixos que identificam a base numérica em que um número foi escrito usam a notação “C”.

- As etiquetas “LABEL” terminam com o símbolo “:”


- Os nomes dos registos especiais do µC, os SFR, são sempre precedidos pelo “underscore”. Por
exemplo _TRISB , _PORTB .

6.1.4 Exemplo - programa “Interrupt.c”

O µC pode gerar uma interrupção quando a tensão externa aplicada ao pino RB0 variar de 0 para
5v ou vice-versa. Para autorizar este tipo de interrupção é necessário activar três bits específicos da
memória de dados do µC, a saber: GIE, PEIE e INTE. Estes três bits são activados na função main
deste exemplo.
O nome da rotina de serviço à interrupção - RSI pode ser escolhido livremente pelo programador,
mas o seu nome tem de ser precedido pela palavra reservada “interrupt”.

#include <htc.h>

void main(void){
TRISB=0X01; // RB0 passa a ser entrada digital
INTE=1; // Autoriza a interrupção gerada por RB0/INT
INTEDG=0; // Transição high to low, do sinal RB0, activa interrupt
PEIE=1; // Autoriza interrupções de periféricos
GIE=1; // Autoriza interrupções
while(1){ // Enquanto for verdadeiro mantém ciclo
}
}

void interrupt processa(void){ // Rotina de serviço ao Interrupção


if (INTF == 1){
INTF =0; // RB0 gerou um “interrupt”, então limpa “Flag”
}
}

Dentro da RSI o programador tem de limpar o bit INTF, sob pena de quando a RSI terminar voltar
a ser imediatamente chamada mesmo sem ter ocorrido uma verdadeira interrupção.

Tecnologias e Accionamento e Comando 2009/2010 78


6.1.5 Exemplo - programa “Variáveis.c”

Este programa permite demonstrar como se declaram variáveis em “C”, como se usam algumas
instruções e operadores.

Variáveis
Em “C”, o programador tem vários tipos de variáveis à disposição, dependendo do tipo de valores
que pretender guardar pode usar variáveis do tipo “char”,”int” e “float”.
Uma variável do tipo “char” ocupa 8 bits na memória do µC. Por isso, estas variáveis podem
conter números positivos de 0 a 255 “unsigned char” ou, números negativos e positivos de -128 a
127 “char”.
Uma variável do tipo “int” ocupa 16 bits na memória do µC. Por isso pode conter números
positivos de 0 a 65535 “unsigned int” ou, números negativos e positivos de -32768 a 32767 “int”.
As variáveis do tipo ”long int “ e “float“ ocupam 32 bits em memória.
O bit mais significativo das variáveis pode ser usado para representar o sinal (-). Quando este bit
vale “1” o número é negativo. Quando as variáveis são do tipo “unsigned”, sem sinal, todos os bits,
mesmo o mais significativo é usado para representar um número positivo.

Variáveis Locais e Globais


Quando uma variável é declarada fora das funções têm um âmbito global, pois podem ser usadas e
partilhadas por várias funções e mantêm os seus valores durante toda a execução do programa
(Variável Global).

Quando uma variável é declarada dentro de uma função, tem um âmbito local, pois apenas é
reconhecida dentro dessa função e só existe enquanto a sua função estiver a ser executada
(Variável Local). Se quiser que a variável local mantenha o seu valor, entre chamadas à função
onde foi declarada, pode sempre declará-la como sendo do tipo “static”. Por exemplo: static int i;

Variáveis absolutas
Em “C” é possível associar uma variável a um registo específico do µC. O exemplo seguinte
permite associar a variável “Portvar” ao endereço de memória 0x06 do µC, que no caso do
PIC16F877 corresponde ao registo PORTB.

volatile unsigned char Portvar @ 0x06;

Tecnologias e Accionamento e Comando 2009/2010 79


Arrays e Strings
Uma matriz não é mais que um conjunto de posições de memória do µC. As matrizes podem ser
unidimensionais ”vectores” ou multidimensionais.
Uma “string” é um vector que ocupa várias posições de memória, onde cada caracter é guardado
numa posição de memória do vector e o último elemento do vector tem todos os bits a zero. Cada
caracter da “string” é codificado em binário, de acordo com a tabela ASCII, e só depois é guardado
na memória do µC.

unsigned char letra[10]; // Vector com 10 elementos: letra[0] a letra[9]


letra[0] = ‘J’; // ‘J’ = 74dec = 0x4A = 0b 01001010
letra[1] = ‘o’; // ‘o’ = 111dec = 0x6F = 0b 01101111
letra[2] = ‘s’; // ‘s’ = 115dec = 0x73 = 0b 01110011
letra[3] = ‘e’; // ‘e’ = 101dec = 0x65 = 0b 01100101
letra[4] = ‘\0’; // valor nulo = 0 = 0x00 = 0b 00000000

unsigned char nome[10][50]; // Matriz de duas dimensões

#include <htc.h>

// Variáveis globais
char cc[2][2]= {{1,2},{3,4}};
char nome[]= {'j','o','a','o'};

void main(void){
TRISB=0X00;
PORTB = cc[1][0] ; // cc[1][0]= 3 = 0b00000011
while(1){}
}

Funções ou variáveis externas


Se o seu programa, em “C”, estiver organizado em vários ficheiros de texto, pode declarar
variáveis ou funções num deles e utilizá-las noutros ficheiros, mas tem de declarar as variáveis
como sendo do tipo “global”, por isso, devem ser declaradas fora de qualquer função. Quando
quiser usar essas variáveis ou funções noutro ficheiro, deve escrever no início desse ficheiro o
nome dessas variáveis ou funções precedido da palavra “extern”.

// ficheiro “funcao.c” // ficheiro “funcaoGlobal.c”

#include <htc.h> int z;


extern int z;
extern int soma(int i, int j, int *k); int soma(int i, int j, int * k){

void main(void){ *k = i + j;
int x = 2; }
int y = 2;
TRISB = 0x00;
soma(x, y, &z);
PORTB = z;
while(1){}
}

Tecnologias e Accionamento e Comando 2009/2010 80


6.1.6 Exemplo - programa “Instruções_operadores.c”

Instruções de controlo da execução do programa

while (condição) for ( i= 0; i<10; i++) if ( i < 10 ) i = 1; s = ‘L’;


{ { { switch ( i ) { switch ( s ) {
instruções; instruções; instruções; case 1: instruções; case ‘m’:
instruções; instruções; } else { break; instruções;
} } instruções; case 2: instruções; break;
} break; case ‘f’:
default: instruções;
instruções; break;
} default:
instruções;
}

Ponteiros
Um ponteiro em “C”, corresponde a uma posição de memória, tal como uma variável. No entanto,
um ponteiro contém apenas endereços “&” de outras posições de memória, nomeadamente
endereços de posições de memória que correspondem às variáveis do nosso programa. Por isso
podemos dizer que um ponteiro aponta para uma posição de memória, para uma variável, mas de
facto contém o seu endereço.

Tecnologias e Accionamento e Comando 2009/2010 81


Universidade de Aveiro
Departamento de Engenharia Mecânica
Tecnologias de Accionamento e Comando 2009/2010

7 COMUNICAÇÃO SÉRIE SPI e I2C

Desenvolva o código necessário para que o µC possa ler o valor da temperatura adquirida pelo
sensor TC74 ou que, em alternativa possa ler os valores da memória SD. Em qualquer dos casos
envie os valores lidos para o computador, através da interface Rs232.

Tecnologias e Accionamento e Comando 2009/2010 82


7.1 Conceitos sobre SPI

O protocolo Serial Periferal Interface SPI foi proposto pela Motorola e tinha por objectivo
permitir a comunicação entre processadores da Motorola e os seus periféricos.

7.1.1 Meio de comunicação

Este protocolo permite que dois equipamentos troquem dados entre si, através de dois fios, ou
através de duas pistas de circuito impresso (Figura 7.1). O pino Serial Out, de um dispositivo, liga
ao pino Serial In do outro e vice-versa. Os sinais eléctricos enviados e recebidos são digitais, têm
uma tensão nula ou positiva. Este protocolo prevê também a existência de um terceiro condutor,
onde um sinal digital (sinal de relógio - Clock) com uma frequência conhecida, permite aos dois
dispositivos sincronizar o instante de tempo em que o emissor aplica uma tensão no condutor e o
instante de tempo em que o receptor deve amostrar esse sinal digital. Diz-se por isso que este tipo
de comunicação é síncrono.

7.1.2 Topologia

Também é possível ligar electricamente


mais que dois dispositivos aos mesmos
condutores, mas apenas dois deles
podem estar activos em simultâneo,
mantendo-se os restantes inactivos.
Nesse caso temos uma topologia física
em barramento “Bus”. Compete ao
Master activar o Slave com que quiser
comunicar activando o pino (Slave Select
- SS) respectivo.

Figura 7.1: Topologia SPI

7.1.3 Tipo de diálogo

Numa comunicação SPI, apenas um dispositivo gera o sinal de relógio e controla os instantes de
tempo em que o relógio está ligado ou desligado. Esse dispositivo assume o papel de “Master”
controlando dessa forma o fluxo de informação e o tipo de diálogo entre ambos “Master-Slave”.
O outro dispositivo é conhecido por “Slave” e apenas pode receber ou enviar dados, se, e enquanto,
o Master activar o sinal de relógio. Pode dar-se o caso do Master enviar bits nulos para o Slave,
apenas para dar ao Slave a possibilidade de enviar dados para o Master. Por cada bit enviado para
o Slave, o Slave envia outro para o Master, no mesmo instante, em sincronismo. Trata-se por isso
de um diálogo do tipo “full-duplex”.

Tecnologias e Accionamento e Comando 2009/2010 83


Figura 7.2: Comunicação SPI [Wilmshurst’07, pp.266]

7.1.4 Formato da palavra

Cada palavra SPI é composta por 8 bits [Figura 7.3]. Por cada palavra enviada pelo “Master”, o
“Slave” tem de responder com um bit de Ack.

Figura 7.3: Uma palavra SPI [Bates’06, pp 208]

7.1.5 Sinais eléctricos

Neste exemplo são transmitidas duas palavras SPI, dois bytes: “11010101” e “00101010”.
A Figura 7.4 permite visualizar as tensões dos sinais eléctricos utilizados numa comunicação SPI.
Cada divisão principal do osciloscópio corresponde a 10 µs. O período do sinal de relógio é de 4µs
(Fosc= 4Mhz a dividir por 16). Neste exemplo, quando não há transmissão de dados, a tensão do
sinal de “Clock” mantém-se positiva e igual a 5v. No entanto, enquanto não há transmissão de
dados, a tensão aplicada no pino de Clock – Clk também pode ser de 0 v, depende da configuração
previamente escolhida.

Figura 7.4: Sinais eléctricos de uma transmissão SPI – Osciloscópio [Wilmshurst’07]

Tecnologias e Accionamento e Comando 2009/2010 84


7.2 Como utilizar e configurar a interface SPI do µC

O µC dispõe de um circuito interno dedicado a comunicações série deste tipo. Tal como a Figura
7.5 ilustra, o µC dispõem de um pino Serial Data Input - SDI para recepção de dados. Um pino
Serial Data Output – SDO para envio de dados. Um pino Serial Clock - SCK para sincronizar o
envio e a recepção de dados do µC com um ou mais dispositivos externos.
Este circuito dispõe de um ShiftRegister - SR de 8 bits (SSPSR Reg). Por cada bit enviado, deste
SR para o SR do dispositivo remoto, também é enviado um bit do SR remoto para este. Por outras
palavras, enquanto o sinal de Clk estiver activo, os 16 bits trocam ciclicamente de lugar, de SR
para SR. Mas bastam apenas 8 períodos de relógio para que 8 bits troquem de SR, os 8 bits do
primeiro SR passam para o segundo e os 8 bits do segundo passam para o primeiro.

Figura 7.5: Circuito SPI do µC

Para o µC poder enviar para outros equipamentos uma palavra série SPI é necessário configurar
previamente um conjunto de bits da sua memória de dados.

Com o bit Clock Polarity - CKP = 0, o sinal de “Clock” mantém uma tensão de 0 v enquanto a
comunicação estiver inactiva “idle”. Com CKP = 1, o sinal de “Clock” mantém uma tensão de 5
volt enquanto a comunicação permanecer inactiva (Figura 7.6).
Com o bit Clock Edge - CKE = 0, cada um dos 8 bits de dados é enviado no instante em que o sinal
de “Clock” transita da tensão de inactividade (0 ou 5v) para a tensão de “Clock” activo (5 ou 0v).

Tecnologias e Accionamento e Comando 2009/2010 85


Figura 7.6: Palavra SPI (CKE=0)

Meio período depois de ter iniciado o envio de um bit, através do pino SDO, o µC faz uma
amostragem da tensão externa aplicada ao seu pino de recepção SDI. Também é possível
configurar o µC para fazer essa amostragem só quando terminar de enviar um bit no pino SDO e
não a meio. Para isso o bit Sample bit - SMP, do µC, deve ser igual a “1”.

Com o bit CKE = 1, cada bit de dados é enviado quando o sinal de “Clock” transita do nível de
tensão de activo para inactivo (idle).

Configurar o µC como SPI - Master

1 – Autorizar as interrupções fazendo os bits GIE, PEIE e SSPIE igual a 1.


2 – Os pinos SDO e SCK ficam configurados como saídas fazendo TRISC.5 e TRISC.3 = 0
3 – Fazendo o bit Clock Polarity CKP= 1, o sinal de Clock é positivo quando está inactivo.
4 – Fazendo o bit Clock Edge Selection CKE= 0, cada bit é enviado na transição do Clk para 0.
5 – Fazendo o bit Sample bit SMP = 1, o bit recebido é amostrado no final do período.
6 – Seleccionar a taxa de transferência, configurando os 4 bits SSPM3: 0
7 – Activar a interface de comunicação, fazendo o bit Serial Port Enable, SSPEN= 1
8 – Escrever no registo SSPBUF o byte para enviar.
9 – Quando o envio dos 8 bits estiver concluído o hardware activa o bit SSPIF. Nessa altura o
programa pode ler os 8 bits, que também foram recebidos em simultâneo, no registo
SSPBUF. Ou pode escrever um novo byte no registo SSPBUF para ser enviado.

Tecnologias e Accionamento e Comando 2009/2010 86


SSPSTAT
SMP:
0 – O pino de recepção SDI, é amostrado a
meio do envio de um bit no pino SDO.
1- O µC só faz a mostragem do pino de
recepção SDI, no final do período/tempo de
envio de cada bit.

CKE: 1- Cada bit é enviado pelo pino SDO, na


transição do sinal de relógio de activo para
inactivo.

7.2.1 Exemplo – programa “SPI.asm”

Este programa permite configurar a interface de comunicação SPI, do uC, e enviar dois bytes,
ciclicamente [Wilmshurst’07, pp 273].

Tecnologias e Accionamento e Comando 2009/2010 87


7.2.2 Exemplo – programa “SPI_SSPIF.asm”

O exemplo seguinte configura o µC como “Master” e envia dois bytes para o dispositivo remoto,
recebendo também dois bytes vindos do dispositivo remoto [Bates’06, pp210].
Este exemplo tira partido do bit SSPIF. Quando o hardware activa este bit significa que chegaram
8 bits de dados e podem ser lidos no registo SSPBUF. Significa também que 8 bits foram
transmitidos para o dispositivo remoto em simultâneo.

Tecnologias e Accionamento e Comando 2009/2010 88


SSPSTAT SSPCON

Tecnologias e Accionamento e Comando 2009/2010 89


7.3 Conceitos sobre I2C

O protocolo “Inter Integrated Circuit - I2C” foi proposto pela Philips Electronics para permitir a
troca de dados entre os circuitos integrados “Integrated Circuits - IC” que utilizava nos seus
equipamentos.
Actualmente, inúmeros ICs utilizam este protocolo de comunicação, nomeadamente: EEPROMs,
sensores de temperatura, LCD, µC, módulos GSM, GPS e muitos outros.

7.3.1 Meio de comunicação


Este protocolo utiliza apenas dois condutores para ligar dois ou mais dispositivos: um condutor
para transmitir um sinal de relógio “Serial Clock - SCL”, e outro condutor para enviar ou receber
dados “Serial Data - SDA” (bidireccional).

Figura 7.7: [Bates’06, pp212]

7.3.2 Topologia
Topologia em barramento.

7.3.3 Tipo de diálogo


Compete ao dispositivo que assumir o papel de “Master”:
- Gerar o sinal de relógio;
- Controlar a linha de dados, SDA, para enviar ordens e dados para os outros dispositivos
“Slaves”;
- Enviar ordens aos “Slaves” para que respondam com determinados dados. Neste último
caso, depois de fazer o pedido, o “Master“ mantém o sinal de relógio activo o tempo
necessário para que o “Slave” lhe possa responder. Durante a resposta é o “Slave” que
controla a linha de dados SDA.
- O “Slave” pode forçar o sinal de relógio a zero fazendo dessa forma que o MASTER
suspenda o envio de dados “Controlo de fluxo”.
- Cada “Slave” tem um endereço de 7 ou … bits

Tecnologias e Accionamento e Comando 2009/2010 90


7.3.4 Sinais eléctricos
Enquanto a comunicação estiver inactiva, os dois condutores, SDA e SCL, apresentam uma tensão
positiva e igual a Vdd. Ou seja, enquanto o sinal de relógio estiver desligado, a tensão a que o
condutor SCL se encontra sujeito é positiva e igual a Vdd. Quando um dispositivo quiser enviar um
bit, tem de forçar a tensão da linha SDA a zero durante um determinado período de tempo ou, em
alternativa, deixar a linha permanecer com uma tensão positiva durante esse mesmo período de
tempo.

Figura 7.8 [Wilmshurst’07, pp 276]

Na figura seguinte podemos observar no osciloscópio as tensões que são aplicadas nas linhas de
dados e de relógio durante uma comunicação I2C.
Neste exemplo, o “Master” transmite os bytes 10100100 e 00110111, e o “Slave” após a recepção
de cada sequência de 8 bits força a linha de dados a zero “ACK”, confirmando dessa forma que
está activo e que recebeu os 8 bits.

Figura 7.9: Sinais eléctricos de uma transmissão I2C (osciloscópio) [Wilmshurst’07, pp292]

Início e fim da mensagem


De acordo com as regras deste protocolo, a tensão aplicada à linha de dados, SDA, só pode ser
alterada, se, e enquanto, o sinal SCL tiver uma tensão nula, excepto no início ou no fim de uma
mensagem. Desta forma, a transição do sinal de dados na altura certa, pode identificar o início e o
fim da mensagem.
Tecnologias e Accionamento e Comando 2009/2010 91
Por outras palavras, se a tensão na linha de dados passar a zero, enquanto o sinal de relógio tiver
uma tensão positiva, identifica o início de uma mensagem “Start”.

Pelo contrário, a mudança da tensão na linha de dados SDA para 5v, enquanto o sinal de relógio
tiver uma tensão positiva, identifica que a menagem terminou “Stop”.

7.3.5 Estrutura da mensagem

Tecnologias e Accionamento e Comando 2009/2010 92


7.4 Como utilizar e configurar as interfaces SSP do µC

Tecnologias e Accionamento e Comando 2009/2010 93


Configuração da interface MSSP
Para que o µC possa comunicar com esta EEPROM, é necessário configurar a Master Sincronous Serial Port – MSSP

1 - É necessário configurar a porta MSSP para actuar como uma interface I2C- Master, para isso é necessário fazer os
bits Syncronous Serial Port Mode - SSPM3 a SSPM0, do registo SSPCON, iguais a 1000.
2- É necessário activar os pinos SCL e SDA e os circuitos internos, fazendo o bit Synchronous Serial Port Enable –
SSPEN igual a 1.
3- Configure os bits SMP=0 e CKE = 0;
4- Defina a taxa de transferência escrevendo no registo SSPADD um valor adequado, neste caso SSPADD= 24
permite uma sinal de relógio/taxa de 100Kbps.
SSPADD= Fosc/[4* BaudRate] - 1

Enviar dados/Escrever na memória do Slave


Depois de configurar a interface MSSP, pode enviar ou receber dados. Para enviar dados para o Slave deve fazer:

1- Gerar na linha de dados, SDA, uma transição de início de mensagem “Start”. Para isso deve fazer o
bit SEN do registo SSPCON2 igual a 1.
SEN=1

2- Deve enviar os 7 bits de endereço I2C do Slave “Address”, mais o 8º bit “WR”. Se o 8º bit for 0-
Write, se for 1-Read. Neste caso “0”.
SSPBUF = …
Btfss PIR1, SSPIF //confirmação local de que o envio está concluído

3- Deve esperar pelo Ack enviado pelo Slave, analisando o bit ACKSTAT do registo SSPCON2.
Btfsc SSPCON2, ACKSTAT //confirmação remota de que o Slave recebeu

4- Deve enviar os 8 bits do comando “Command”. O comando pode corresponder à posição de


memória do Slave.
SSPBUF = …
Btfss PIR1, SSPIF //confirmação local de que o envio está concluído

5- Deve esperar pelo Ack enviado pelo Slave, analisando o bit ACKSTAT do registo SSPCON2.

Tecnologias e Accionamento e Comando 2009/2010 94


Btfsc SSPCON2,ACKSTAT

6 – Deve enviar os 8 bits de dados “Data” que serão gravados na memória do Slave.
SSPBUF = …
Btfss PIR1, SSPIF //confirmação local de que o envio está concluído

7- Deve esperar pelo Ack enviado pelo Slave, analisando o bit ACKSTAT do registo SSPCON2.
Btfsc SSPCON2,ACKSTAT

8- Deve gerar na linha de dados a transição que permita identificar o fim de mensagem, para isso deve
activar o bit stoP condition ENble bit - PEN, do registo SSPCON2.
PEN= 1

Para receber/ler um byte, enviado pelo Slave, deve fazer:

1- Enviar um sinal de “Restart”


SEN=1
Btfss SSPCON2,SEN //confirmação local

2- Enviar 7 bits do endereço do Slave “Address”, mais o oitavo bit “WR”. O oitavo bit a 0 significa
uma mensagem de escrita “write”.
SSPBUF = …
Btfss PIR1, SSPIF //confirmação local de que o envio está concluído

3- Deve esperar pelo Ack enviado pelo Slave, analisando o bit ACKSTAT do registo SSPCON2.
Btfsc SSPCON2,ACKSTAT

4- Enviar o endereço da posição de memória que se quer ler e esperar pela conclusão do envio.
SSPBU= …
Btfss PIR1, SSPIF //confirmação local de que o envio está concluído

5- Deve esperar pelo Ack enviado pelo Slave, analisando o bit ACKSTAT do registo SSPCON2.
Btfsc SSPCON2,ACKSTAT

6- Enviar o RESTART e os bits de controlo e esperar pelo ACK


RSEN=1

7- Enviar o endereço do Slave e esperar pela conclusão do envio.


SSPBU= …
Btfss PIR1, SSPIF //confirmação local de que o envio está concluído

8- Deve esperar pelo Ack enviado pelo Slave, analisando o bit ACKSTAT do registo SSPCON2.
Btfsc SSPCON2,ACKSTAT

9- Mudar para o modo de recepção. Ler dados.


RCEN=1
Btfss PIR1, SSPIF //confirmação local de que o envio está concluído
Nesta altura o SSPBUF contém o valor recebido.

10- Enviar o sinal NACK


ACKDT = 1
ACKEN = 1

Tecnologias e Accionamento e Comando 2009/2010 95


11- Enviar um sinal de “Stop”
PEN = 1

7.5 Sensor de temperatura com interface I2C


O sensor TC74 é dos mais pequenos sensores de temperatura. Este possui uma interface I2C e vem
de fábrica com o endereço 1001101.
Este exemplo apresenta a estrutura das mensagens I2C que o sensor de temperatura TC74
reconhece para ser configurado e para responder com o valor de temperatura (8 bits).

Este dispositivo tem apenas duas posições de memória: uma contém o valor
da temperatura amostrada TEMP e a outra possui bits de configuração
CONFIG, mais exactamente dois bits de configuração, um deles permite
colocar o dispositivo em “Standby” e o outro bit indica se o valor da
temperatura amostrada está pronto para ser lido “DataReady”. Nesse caso, o
valor da posição de memória TEMP pode ser lido.

Memória interna do sensor TC74


7 6 5 4 3 2 1 0
0x00 TEMP
0x01 CONFIG StandBy DataRdy - - - - - -

CONFIG
Standby: 1 – inactivo DataReady 1 – ready
0 – activo 0 – not ready
TEMP

Para ler uma posição de memória do TC74, neste caso o endereço 0, é suficiente que µC envie o
endereço do TC74, mais o 8º bit - RD a “1”, para que o TC74 responda com um bit de confirmação
Ack e oito bits de dados Data.

Tecnologias e Accionamento e Comando 2009/2010 96


1- Gerar na linha de dados, SDA, uma transição de início de mensagem “Start”. Para isso deve fazer
o bit SEN do registo SSPCON2 igual a 1.
SEN=1

2- Deve enviar os 7 bits de endereço I2C do Slave “Address”, mais o 8º bit “RD”. Se o 8º bit for 0-
Write, se for 1-Read. Neste caso “1”.
SSPBUF = …
Btfss PIR1, SSPIF //confirmação local de que o envio está concluído

3- Deve esperar pelo Ack enviado pelo Slave, analisando o bit ACKSTAT do registo SSPCON2.
Btfsc SSPCON2, ACKSTAT //confirmação remota de que o Slave recebeu

4- Mudar para o modo de recepção. Ler dados.


RCEN=1
Btfss PIR1, SSPIF //confirmação local de que o envio está concluído
Nesta altura o SSPBUF contém o valor recebido.

5- Enviar o sinal NACK


ACKDT = 1
ACKEN = 1

6- Enviar um sinal de “Stop”


PEN = 1

7.5.1 Exemplo – programa “I2C_LerTemperatura.asm”


// ----- Configuração da interface MSSP
banksel _TRISC // inicializa a interface MSSP
bsf _TRISC,3 // O pino de SCL passa a estar activo
bsf _TRISC,4 // O pino DAS passa a estar activo

banksel _SSPCON
movlw 00101000B // SSPEN=1 CKP=0 (Clk inactivo=5 volt) SSPM3:0=1000 (Master I2C)
movwf _SSPCON
banksel _SSPSTAT
bsf _SSPSTAT,7 // SMP = 1 A amostragem do sinal recebido é feito no final do bit time
movlw 5
movwf _SSPADD // Baudrate : SSPADD= Fosc/[4* BaudRate] - 1= 4000000/[4*166666]-1= 5

// ----- Envio de uma mensagem, para o Slave com endereço 1001101, a pedir o valor da temperatura (1 Byte)
//1 ---- Start
banksel _SSPCON2 // write to TC74
bsf _SSPCON2,0 // SEN
btfsc _SSPCON2,0 // SEN
goto $-1

//2 ---- Slave address


movlw 10011011B // send TC74 ADDRESS 1001101 + 1(read)
banksel _SSPBUF
movwf _SSPBUF
call ssprw

Tecnologias e Accionamento e Comando 2009/2010 97


//3 ---- Espera o Ack que o Slave irá enviar
banksel _SSPCON2
btfsc _SSPCON2,6 // ACKSTAT
goto $-1

//4 ---- Recepção dos 8 bits vindos do Slave TC74


bsf _SSPCON2,3 // RCEN enable receive mode
btfsc _SSPCON2,3 // RCEN
goto $-1

banksel _SSPBUF // Read temperature


movf _SSPBUF,w
movwf _rxw

//5 ---- Envia o NotAck


banksel _SSPCON2 // send NOT-ACK
bsf _SSPCON2,5 // ACKDT

bsf _SSPCON2,4 // ACKEN


btfsc _SSPCON2,4 // ACKEN
goto $-1

//6 ---- Stop Fim de mensagem


bsf _SSPCON2,3 // PEN ;stop
btfsc _SSPCON2,3 // PEN
goto $-1

goto fim

//;------------------------ IDLE MODULE -------------------------------------


ssprw //;check for idle SSP module
movlw 0x00
banksel _SSPCON2
andwf _SSPCON2,w
sublw 0x00
btfss _STATUS,2 //Z
goto $-4
btfsc _SSPSTAT,2 // R_W
goto $-1
return

fim
// --------------------------------------------------------------------------------------

Tecnologias e Accionamento e Comando 2009/2010 98


7.6 Memória EEPROM com interface I2C

O integrado 24L256 é uma EEPROM de 32K posições de memória e com 8 bits de dados por
posição. O µC pode ler ou escrever nesta memória através de uma interface I2C. Esta memória
pode ser alimentada com tensões desde os 1,8v até 5,5 v. Se aplicar uma tensão externa de 5v ao
pino Write Protected - WR não poderá escrever novos valores na EEPROM.

O endereço I2C deste dispositivo pode ser configurado aplicando tensões positivas ou nulas aos
pinos A0, A1 e A2. Desta forma o seu endereço pode assumir valores desde 0 a 7. A EEPROM
existente na placa PICDEM2 plus disponível na bancada tem o endereço zero.

24LC256

Tecnologias e Accionamento e Comando 2009/2010 99


7.6.1 Exemplo – programa “I2C_EEPROM.asm”

Para que o uC possa comunicar com esta EEPROM, é necessário configurar a Master Sincronous Serial Port – MSSP
// ----- Configuração da interface MSSP
banksel _TRISC // inicializa a interface MSSP
bsf _TRISC,3 // O pino de SCL passa a estar activo
bsf _TRISC,4 // O pino DAS passa a estar activo

banksel _SSPCON
movlw 00101000B // SSPEN=1 CKP=0 (Clk inactivo=5 volt) SSPM3:0=1000 (Master I2C)
movwf _SSPCON
banksel _SSPSTAT
bsf _SSPSTAT,7 // SMP = 1 A amostragem do sinal recebido é feito no final do bit time
movlw 5
movwf _SSPADD // Baudrate : SSPADD= Fosc/[4* BaudRate] - 1= 4000000/[4*166666]-1= 5

Para guardar um valor, 1 byte, na EEPROM é necessário:


;---------------------------- EEPROM WRITE -------------------------------
write_eeprom
//1 ----- Start
banksel SSPCON2 //write to EEPROM
bsf SSPCON2,SEN //start bit
btfsc SSPCON2,SEN
goto $-1

// 2 ------ Endereço do Slave (EEPROM) = 1010000 + 0 (write)


movlw B'10100000' //send control byte (write)
banksel SSPBUF
movwf SSPBUF
call ssprw

//3 ------ Espera pelo Ack que o Slave (EEPROM) há-de enviar
banksel SSPCON2
btfsc SSPCON2,ACKSTAT //ack?
goto $-1

//4 ----- Envia o endereço de memória da EEPROM onde quer escrever


movlw 0x00 //send slave address HIGH byte
banksel SSPBUF
movwf SSPBUF
call ssprw

//5 ----- Espera pelo Ack que o Slave há-de enviar


banksel SSPCON2
btfsc SSPCON2,ACKSTAT //ack?
goto $-1

//4 ----- Envia o endereço de memória da EEPROM onde quer escrever


movlw 0x05 //send slave address LOW byte(0x0005)
banksel SSPBUF
movwf SSPBUF
call ssprw

Tecnologias e Accionamento e Comando 2009/2010 100


//5 ----- Espera pelo Ack que o Slave há-de enviar
banksel SSPCON2
btfsc SSPCON2,ACKSTAT //ack?
goto $-1

//6 ----- Envia o valor para guardar na EEPROM


banksel temperature
movf temperature,w //send slave DATA = temperature
movwf SSPBUF
call ssprw

//7 ----- Espera pelo Ack que o Slave há-de enviar


banksel SSPCON2
btfsc SSPCON2,ACKSTAT //ack?
goto $-1

//8 ----- Fim de mensagem


bsf SSPCON2,PEN //stop bit
btfsc SSPCON2,PEN
goto $-1

return
;------------------------ IDLE MODULE -------------------------------------
ssprw ;check for idle SSP module
movlw 0x00
banksel SSPCON2
andwf SSPCON2,w
sublw 0x00
btfss STATUS,Z
goto $-4

btfsc SSPSTAT,R_W
goto $-1
return
;---------------------------------------------------------------------------
end

Tecnologias e Accionamento e Comando 2009/2010 101