101
Tecnologia de Accionamento e Comando 2009/2010, Trabalho Nº 1 1 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

Apontamentos teoricos e praticos de TAC_2009_2010V7

Embed Size (px)

Citation preview

Page 1: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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

Page 2: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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.

Page 3: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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

Page 4: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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.

Page 5: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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.7: Registo de Configuração

Figura 1.6:Memória de programa

Page 6: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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

Page 7: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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

Page 8: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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.

Page 9: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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

P16F628A

Reguladores de tensão

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

Page 10: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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.

Page 11: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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

list p=p16f628A #include <p16f628A.inc> __CONFIG _INTRC_OSC_CLKOUT & _CP_OFF & _PWRTE_OFF & _WDT_OFF & _LVP_OFF & _MCLRE_ON org 0x00 goto iniciar iniciar banksel TRISB bcf TRISB,0 banksel PORTB main bsf PORTB,0 goto main end

As opções de configuração “__CONFIG” permitem que o programa gerado, quando for transferido para o µC , configure os recursos internos do µC .

Por exemplo:

A opção _INTRC_OSC_CLKOUT configura o µC para usar um sinal de relógio interno. No caso do PIC16F628A, esse relógio tem 4 Mhz e dispensa a utilização externa de cristais ou circuitos RC.

A opção _CP_OFF configura o µC para proteger o código nele gravado, não permitindo uma leitura posterior. Mas permite novas gravações de novos programas na sua memória interna (Flash).

A opção _WDT_OFF configura o µC para desligar o seu watchdog interno. Se o WDT estivesse ligado o programa gravado no µC tinha de periodicamente pôr a zero uma posição de memória específica do µC caso contrário o µC reiniciava-se sozinho.

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:

Page 12: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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.

Page 13: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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

Page 14: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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 #include <p16f628A.inc> __CONFIG _HS_OSC & _CP_OFF & _PWRTE_OFF & _WDT_OFF & _LVP_OFF & _MCLRE_ON #define led PORTB,0 #define botao PORTA,1 org 0x00 goto iniciar iniciar banksel TRISB ; Selecção do banco 1 bsf TRISA,1 ; RA1 input 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 main BTFSC botao ; Testa o bit RA1. IF RA1 <> 0 goto ligasaida ; THEN goto ligasaida goto desligasaida ; ELSE goto desligasaida ligasaida bsf led ; RB0=1 goto main desligasaida bcf led ; RB0=0 goto main end

A opção _HS_OSC:

configura o µC para usar um cristal externo. Neste caso um cristal de 20Mhz.

#define:

Btfsc:

Movlw

Movwf

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

Page 15: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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.

Page 16: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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

Page 17: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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

V K Ф

Rotações por minuto Tensão aplicada ao motor (Volt) 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 = K I Ф

T K I Ф

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

Page 18: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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

Page 19: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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.

Page 20: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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.

Page 21: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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]

Page 22: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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

Page 23: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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.

Page 24: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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

Page 25: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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

BANKSEL ADCON0 BSF ADCON0,7 BCF ADCON0,6 BCF ADCON0,5 BCF ADCON0,4 BCF ADCON0,3 BSF ADCON0,0

BANKSEL ADCON1 BCF ADCON1,7 BSF ADCON1,3 BSF ADCON1,2 BSF ADCON1,1 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

Figura 2.14: Entrada analógica

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 end

Page 26: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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).

Page 27: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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 “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 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.

OPTION (Banco 1)

INTCON (Banco 1, 2)

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).

Page 28: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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

Page 29: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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 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 para dividir o sinal de “clock” ou o sinal externo por 2,4 ou 8.

T1CON (Banco 0)

PIR1 (Banco 0)

Monte os componentes

Figura 2.17: Componentes da montagem 1

Page 30: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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

Page 31: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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

Page 32: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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.

Page 33: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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

EntradaAnalogPWM.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 ; 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 movlw 0x00 movwf TMR1H BSF PORTB,2 T1_espera btfss PIR1,TMR1IF goto T1_espera bcf PIR1,TMR1IF ; limpa a flag ; Fim PWM goto Ciclo end

Figura 2.21: Saída PWM controlada por uma entrada analógica

Page 34: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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]

Page 35: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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

Page 36: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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

[Iovine’00]

Page 37: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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.

Page 38: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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

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 ; PORTB output bcf ADCON1,7 ; O resultado da conversão fica em ADRESH, apenas 2 bits da conversão fica 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 /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 ; ------ GERA um periodo PWM ; TMR1= 0xFD70 até 0xFFFF demora 0,01seg movlw 0xFF movwf TMR1H movfw ADRESH ;TMR1 = 0xFF + ADRESH movwf TMR1L bsf PORTB,2 ; liga a saída de 0 a 2 ms T0_espera btfss PIR1,TMR1IF goto T0_espera bcf PIR1,TMR1IF ; limpa a flag movlw 0xB3 movwf TMR1L movlw 0xF7 movwf TMR1H ; Desliga a saída 17ms bcf PORTB,2 T1_espera btfss PIR1,TMR1IF goto T1_espera bcf PIR1,TMR1IF ; limpa a flag ; Fim PWM goto Ciclo end

Figura 2.23: Controlo servo motor por PWM

Page 39: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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

Page 40: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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

Page 41: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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]

Page 42: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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]

Page 43: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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]

Page 44: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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]

Page 45: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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

Page 46: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

3.2 Exemplo - programa “StepMotor.asm”

list p=pic16f877 #include <p16f877.inc> local tempo __CONFIG _HS_OSC & _CP_OFF & _WDT_OFF & _LVP_OFF ORG 0X00 goto iniciar iniciar banksel TRISB clrf TRISB ; PORTB output ;bcf ADCON1,7 ; O resultado da conversão fica em ;ADRESH, apenas 2 bits da ;conversão fica em ADRESL ;bsf ADCON1,3 ; AN0 ;bsf ADCON1,2 ; " ;bsf ADCON1,1 ; " ;bcf ADCON1,0 ; " movlw B'00001110' movwf ADCON1 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 Movlw B'10000001' movwf ADCON0 ;bsf T1CON,5 ; prescaler timer1 ;bsf T1CON,4 ; prescaler " ;bsf T1CON,3 ; osc enabled ;bcf T1CON,1 ; internal clock ;bsf T1CON,0 ; enables timer1 movlw B'00111001' movwf T1CON Ciclo ; ----- Conversão A/D bsf ADCON0,2 ; inicio da conversão Conv_espera btfsc ADCON0,2 GOTO Conv_espera ; conversão completa, ; valor guardado em ADRESH movfw ADRESH movwf tempo

clrf PORTB bsf PORTB,0 ; Activa RB0 clrf TMR1L movf tempo movwf TMR1H T1_espera ; Espera 0 a 1 seg btfss PIR1,TMR1IF goto T1_espera bcf PIR1,TMR1IF clrf PORTB bsf PORTB,1 ; Activa RB1 clrf TMR1L movf tempo movwf TMR1H T2_espera ; Espera 0 a 1 seg Btfss PIR1,TMR1IF GOTO T2_espera BCF PIR1,TMR1IF clrf PORTB bsf PORTB,2 ; Activa RB2 clrf TMR1L movf w tempo movwf TMR1H T3_espera ; Espera 0 a 1 seg btfss PIR1,TMR1IF goto T3_espera bcf PIR1,TMR1IF clrf PORTB bsf PORTB,3 ; Activa RB3 clrf TMR1L movf tempo movwf TMR1H T4_espera ; Espera 0 a 1 seg btfss PIR1,TMR1IF goto T4_espera bcf PIR1,TMR1IF goto Ciclo end

Page 47: Apontamentos teoricos e praticos de TAC_2009_2010V7

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

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.

Page 48: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 48

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.

Page 49: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 49

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.

.25 Modo de teste

.24 TxClk (sinal de relógio do sinal emitido pelo recurso A

.23 DSRD - data signal rate detector

.22 RI - ring indicator (Indicação de toque)

.21 SQD - sinal quality detector (Detecção de qualidade do sinal)

.20 DTR - data terminal ready (Terminal pronto a receber)

.19 RTS secundário

.18 Ciclo fechado - local

.17 Rx-Clock (sinal de relógio do sinal recebido)

.16 Rx secundário

.15 Tx-Clock (sinal de relógio do sinal emitido pelo modem A)

.14 Tx secundário

.13 CTS secundário

.12 CD secundário

.11 Reservado para testes

.10 Reservado para testes

.9 Reservado para testes

.8 CD - carrier detection (detecção de portadora)

.7 Terra (0 V)

.6 DSR - DCE set ready (DCE pronto para enviar)

.5 CTS - clear to send (Pode enviar dados)

.4 RTS - request to send (Pedido de envio de dados)

.3 Rx: Recepção de dados

.2 Tx: Envio de dados

.1 Massa

Rede telefónica

RecursoA

ModemA

ModemB

EIA-232D/V.24 EIA-232D/V.24

RecursoB

.25

.24

.23

.22

.21

.20

.19

.18

.17

.16

.15

.14

.13

.12

.11

.10

. 9

. 8

. 7

. 6

. 5

. 4

. 3

. 2

. 1

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.

Page 50: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 50

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.

Page 51: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 51

O tipo de sinais eléctricos aplicados a cada um dos pinos Tx e Rx destas fichas encontram-se regulados pela norma V.28.

“01101101”+V

-V+V

-VRx

Tx

Blindagem do cabo

Neutro

0 1 1 0 1 1 0 1

b0 bn “0” > +3 Volts

“1” < -3 Volts 0 Volts

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 transferência

Distâ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”.

Page 52: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 52

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 é adicionado automaticamente pelo emissor e é analisado pelo receptor.

Figura 4.4: Palavra série (osciloscópio)

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).

Page 53: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 53

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.

Page 54: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 54

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

Page 55: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 55

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

Page 56: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 56

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

Page 57: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 57

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

Page 58: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 58

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

Page 59: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 59

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

Page 60: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 60

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.

Page 61: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 61

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.

Page 62: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 62

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”.

Page 63: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 63

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.

Page 64: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 64

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:

Page 65: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 65

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

Page 66: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 66

; ------------- 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

Page 67: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 67

; ----- 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).

Page 68: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 68

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

Page 69: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 69

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,

Page 70: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 70

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.

Page 71: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 71

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'

Page 72: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 72

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 --

Page 73: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 73

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();

Page 74: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 74

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).

Page 75: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 75

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.

Page 76: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 76

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.

Page 77: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 77

Passagem de parâmetros por valor ou por referência // Passagem dos valores para “i” e” j” #include <htc.h> int soma(int i, int j); int x,y; x=1; y=2; void main(void) TRISB = 0x00; PORTB = soma(x,y); while(1) int soma(int i, int j) return i+j;

// Passagem da referência/endereço para “k” #include <htc.h> int soma(int i, int j, int *k); void main(void) int x=1; int y=2; int z; TRISB = 0x00; soma(x,y,&z); PORTB = z ; while(1) 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”);

Page 78: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 78

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.

Page 79: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 79

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;

Page 80: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 80

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” #include <htc.h> extern int z; extern int soma(int i, int j, int *k); void main(void) int x = 2; int y = 2; TRISB = 0x00; soma(x, y, &z); PORTB = z; while(1)

// ficheiro “funcaoGlobal.c” int z; int soma(int i, int j, int * k) *k = i + j;

Page 81: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 81

6.1.6 Exemplo - programa “Instruções_operadores.c” Instruções de controlo da execução do programa while (condição) instruções; instruções;

for ( i= 0; i<10; i++) instruções; instruções;

if ( i < 10 ) instruções; else instruções;

i = 1; switch ( i ) case 1: instruções; break; case 2: instruções; break; default: instruções;

s = ‘L’; switch ( s ) case ‘m’: instruções; break; case ‘f’: 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.

Page 82: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 82

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.

Page 83: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 83

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”.

Page 84: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 84

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]

Page 85: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 85

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).

Page 86: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 86

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.

Page 87: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 87

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].

Page 88: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 88

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.

Page 89: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 89

SSPSTAT SSPCON

Page 90: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 90

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

Page 91: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 91

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.

Page 92: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 92

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

Page 93: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 93

7.4 Como utilizar e configurar as interfaces SSP do µC

Page 94: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 94

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.

Page 95: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 95

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

Page 96: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 96

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 0 – activo

DataReady 1 – ready 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.

Page 97: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 97

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

Page 98: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 98

//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 // --------------------------------------------------------------------------------------

Page 99: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 99

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

Page 100: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 100

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

Page 101: Apontamentos teoricos e praticos de TAC_2009_2010V7

Tecnologias e Accionamento e Comando 2009/2010 101

//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