Você está na página 1de 241

UNIVERSIDADE TCNICA DE LISBOA INSTITUTO SUPERIOR TCNICO

Projecto e Implementao de um Sistema de Sensores Inteligentes Baseado na Norma IEEE 1451

Vtor Manuel Rodrigues Viegas (Licenciado)

Dissertao para obteno do Grau de Mestre em Engenharia Electrotcnica e de Computadores

Orientador: Doutora Helena Maria dos Santos Geirinhas Ramos Co-Orientador: Doutor Jos Miguel Costa Dias Pereira Presidente: Doutor Pedro Manuel Brito da Silva Giro Vogais: Doutor Jos Miguel Costa Dias Pereira Doutor Jos Manuel Matos Ribeiro da Fonseca Doutora Helena Maria dos Santos Geirinhas Ramos Julho de 2003

UNIVERSIDADE TCNICA DE LISBOA INSTITUTO SUPERIOR TCNICO

Projecto e Implementao de um Sistema de Sensores Inteligentes Baseado na Norma IEEE 1451

Vtor Manuel Rodrigues Viegas (Licenciado)

Dissertao para obteno do Grau de Mestre em Engenharia Electrotcnica e de Computadores

Orientador: Doutora Helena Maria dos Santos Geirinhas Ramos Co-Orientador: Doutor Jos Miguel Costa Dias Pereira Presidente: Doutor Pedro Manuel Brito da Silva Giro Vogais: Doutor Jos Miguel Costa Dias Pereira Doutor Jos Manuel Matos Ribeiro da Fonseca Doutora Helena Maria dos Santos Geirinhas Ramos Julho de 2003

Trabalho orientado pela Professora Doutora Helena Ramos Departamento de Engenharia Electrotcnica e de Computadores Instituto Superior Tcnico

Trabalho co-orientado pelo Professor Doutor Jos Miguel Dias Pereira Escola Superior de Tecnologia de Setbal Instituto Politcnico de Setbal

ii

Agradecimentos
Manifesto o meu agradecimento a todos os que de uma forma directa ou indirecta contriburam para a realizao deste trabalho fornecendo meios, apoio cientfico e condies para a sua concretizao. Um destaque particular para a orientadora da tese, Prof. Helena Ramos, e co-orientador, Prof. Dias Pereira, pela disponibilidade, apoio e interesse demonstrados, de forma ininterrupta, desde o incio deste trabalho. Para alm do seu apoio tcnico e profissional, realo tambm a forma como me conseguiram motivar durante todos os momentos relacionados com a execuo da presente dissertao, o que constitui para mim motivo de orgulho e de agradecimento reconhecido. Para a Escola Superior de Tecnologia de Setbal, e para os meus colegas que l trabalham, manifesto o meu reconhecimeno pela forma como sempre me incentivaram e me ofereceram todas as condies materiais e humanas para a realizao deste trabalho. Por ltimo, mas no menos importante, dedico este trabalho aos meus pais, Jos Viegas e Clarinda Rodrigues, pois sem eles nada disto teria sido possvel. A todos, o meu Muito Obrigado.

iii

iv

Resumo
Este documento descreve a implementao de um mdulo de transduo inteligente (STIM) no microcontrolador PIC16F877. O documento comea por reflectir sobre o problema que adaptar um transdutor inteligente s vrias redes de campo que proliferam no mercado. Conclui-se que uma soluo vivel para este problema a adopo do modelo IEEE 1451. O documento destaca a norma IEEE 1451.2 que define o STIM nas suas vrias vertentes: funcionalidades, memria descritiva (TEDS) e interface digital de comunicao que o liga a um processador de rede (NCAP). Para estudar a norma IEEE 1451.2 e analisar alguns aspectos relativos ao seu desempenho, foi implementado um STIM no microcontrolador PIC16F877. Para interagir com o prottipo de STIM, foi ainda necessrio implementar uma interface de STIM em LabVIEW. A interface de STIM revelou-se uma ferramenta til para ensaiar o prottipo a partir do PC. O documento acaba com a descrio dos ensaios a que foram sujeitos o prottipo de STIM e a sua interface para PC. Os ensaios incluem a caracterizao do canal de digitalizao do STIM e a verificao simultnea dos seus canais de entrada e de sada. Palavras Chave Norma IEEE 1451, STIM, NCAP, TEDS, sensor inteligente, instrumento virtual

vi

Abstract
This document describes the implementation of a Smart Transducer Interface Module (STIM) on a general-purpose microcontroller PIC16F877. The document begins with a reflection about smart transducers and the problem associated with their connection to all kind of field networks existing today. A solution is presented: the IEEE 1451 standard. The document focus on the IEEE 1451.2 clause that defines the STIM, which includes the transducers, the non-volatile memory called Transducer Electronic Data Sheet (TEDS) and the Transducer Independent Interface (TII), that enables communication between the STIM and the Network Capable Application Processor (NCAP). To study the IEEE 1451.2 clause and to analyse its performance, a STIM was implemented on the general-purpose and low-cost microcontroller PIC16F877. To interact with the STIM prototype, a STIM driver for PC was developed and implemented in LabVIEW. The STIM driver revealed itself to be a useful tool to test and debug the STIM prototype. Finally, the document reports the tests conducted on the STIM prototype to check its performance and the suitability of the STIM driver implemented in LabVIEW. The tests include the characterization of the digitizing channel of the STIM and simultaneous verification of STIMs input and output channels. Key Words IEEE 1451 standard, STIM, NCAP, TEDS, smart sensor, virtual instrument

vii

viii

ndice
Agradecimentos _______________________________________________________iii Resumo ______________________________________________________________ v Abstract_____________________________________________________________ vii ndice _______________________________________________________________ ix Nota Introdutria ______________________________________________________ xi Objectivos e Organizao do Trabalho ____________________________________xiii Captulo 1. Interface Universal para Transdutores Inteligentes _________________ 1 1.1. Modelo IEEE 1451 _______________________________________________ 2 1.1.1. Objectivo____________________________________________________ 2 1.1.2. Histria _____________________________________________________ 3 1.1.3. Norma IEEE 1451.1 ___________________________________________ 5 1.1.4. Norma IEEE 1451.2 ___________________________________________ 8 1.1.5. Norma IEEE P1451.3 _________________________________________ 11 1.1.6. Norma IEEE P1451.4 _________________________________________ 14 1.2. Tendncias Futuras _____________________________________________ 18 Captulo 2. Mdulo de Transduo Inteligente _____________________________ 21 2.1. Arquitectura do STIM___________________________________________ 2.1.1. Funcionalidades do STIM______________________________________ 2.1.2. Memria Descritiva do STIM___________________________________ 2.1.3. Interface de Comunicao Digital entre o STIM e o NCAP ___________ 21 22 26 29

2.2. Microcontrolador PIC16F877_____________________________________ 35 2.3. Circuito do STIM_______________________________________________ 37 2.4. Programa do STIM _____________________________________________ 2.4.1. Mapa de Memria ____________________________________________ 2.4.2. Programa Principal ___________________________________________ 2.4.3. Funo de Leitura Read _____________________________________ 2.4.4. Funo de Escrita Write ____________________________________ 2.4.5. Funo de Disparo Trigger _________________________________ 2.4.6. Funo de Actualizao do Estado UpdateStatus ______________ 2.4.7. Funo de Inicializao Init _________________________________ 41 42 44 49 51 53 56 57

2.5. Concluses ____________________________________________________ 58

ix

Captulo 3. Interface de STIM___________________________________________ 61 3.1. Implementao da TII ___________________________________________ 62 3.1.1. Circuito da TII ______________________________________________ 62 3.1.2. Programa da TII _____________________________________________ 64 3.2. Biblioteca STIM Driver__________________________________________ 72 3.3. Concluses ____________________________________________________ 76 Captulo 4. Demonstrao de Resultados __________________________________ 79 4.1. Ensaio A Ritmo de Aquisio ___________________________________ 79 4.2. Ensaio B Ritmo de Actuao ____________________________________ 83 4.3. Ensaio C Conformidade da TII __________________________________ 86 4.4. Ensaio D Robustez da Comunicao entre o STIM e o NCAP________ 103 4.5. Ensaio E Caracterizao do Canal de Digitalizao do STIM ________ 107 4.6. Ensaio F Ligao em Malha____________________________________ 114 4.7. Concluses ___________________________________________________ 119 Captulo 5. Concluses Gerais e Perspectivas de Trabalho Futuro ____________ 121 Anexo A. Programa do STIM __________________________________________ 127 Anexo B. Biblioteca Dinmica TII.dll ___________________________________ 153 Anexo C. Biblioteca STIM Driver, Manual do Programador_________________ 161 C.1. Tutorial _____________________________________________________ 161 C.2. Exemplo de Aplicao__________________________________________ 162 C.3. Documentao de Ajuda________________________________________ 172 Anexo D. Ensaio A___________________________________________________ 189 Anexo E. Ensaio B___________________________________________________ 193 Anexo F. Ensaio D___________________________________________________ 197 Anexo G. Ensaio E___________________________________________________ 203 Anexo H. Ensaio F __________________________________________________ 211 Bibliografia ________________________________________________________ 215 Lista de Figuras _____________________________________________________ 217 Lista de Tabelas _____________________________________________________ 219 Lista de Siglas e Acrnimos____________________________________________ 221

Nota Introdutria
Embora o texto evite sempre que possvel a utilizao de termos estrangeiros, achou-se conveniente manter os seguintes acrnimos: NCAP (Network Capable Application Processor) STIM (Smart Transducer Interface Module) TEDS (Transducer Electronic Data Sheet) TII (Transducer Independent Interface) SPI (Serial Peripheral Interface). Esta opo justifica-se pea dificuldade em obter tradues fiis de alguns termos e tambm para evitar eventuais confuses entre a nomenclatura utilizada no texto e a utilizada nas normas IEEE 1451.

xi

xii

Objectivos e Organizao do Trabalho


Apesar de existirem cada vez mais e melhores transdutores inteligentes, acompanhados de mais e melhores redes de campo, parece cada vez mais difcil seleccionar o melhor de ambos e construir um bom sistema distribudo de medida e controlo. A pulverizao do mercado com produtos e protocolos de comunicao proprietrios, dificulta a integrao de equipamentos de diferentes marcas e conduz o cliente para solues dependentes, pouco flexveis e normalmente mais caras. Este trabalho debrua-se sobre este problema e apresenta uma proposta de resoluo: o modelo IEEE 1451. Para exemplificar a aplicabilidade do modelo, o trabalho foi projectado com dois grandes objectivos: 1. 2. Implementar um mdulo de transduo inteligente (STIM), totalmente compatvel com a norma IEEE 1451.2, num microcontrolador no dedicado e de baixo custo. Implementar uma interface de STIM para PC com integrao em LabVIEW.

A dissertao estende-se por cinco captulos com a seguinte organizao de contedos: O captulo 1 apresenta o modelo IEEE 1451 nas suas vrias vertentes: objectivos, histria, descrio das normas aprovadas, previso das normas em fase de desenvolvimento e tendncias futuras. O captulo 2 foca a norma 1451.2 e descreve a implementao de um prottipo de STIM no microcontrolador PIC16F877. O captulo 3 descreve a implementao de uma interface de STIM para PC em ambiente Windows. A implementao foi feita em LabVIEW e o resultado foi uma ferramenta til para ensaiar STIMs. O captulo 4 descreve os ensaios a que foram sujeitos o prottipo de STIM e a interface de STIM para PC. So apresentados resultados experimentais e feita uma anlise crtica ao desempenho do conjunto. O captulo 5 apresenta as concluses globais do trabalho e aponta desenvolvimentos futuros. No que toca aos aspectos formais do texto, convm esclarecer alguns pontos:

xiii

O captulo X est primariamente dividido em seces numeradas na forma X.X e secundariamente divido em subseces numeradas na forma X.X.X. As referncias bibliogrficas encontram-se numeradas de acordo com a sua ordem de ocorrncia no texto. As figuras, tabelas e expresses encontram-se numeradas sequencialmente sem que a numerao seja interompida entre captulos. As expresses so identificadas atravs de parntesis curvos, enquanto que as referncias bibliogrficas so destacadas por parntesis rectos. Os termos referentes a entidades de software so escritos com letra Courier New de tamanho 11.

xiv

1
Interface Universal para Transdutores Inteligentes

Captulo

O transdutor um dispositivo que recebe energia de uma dada natureza (p.ex. mecnica) e a transforma noutra espcie de energia (p.ex. elctrica). O transdutor funciona portanto como um conversor de energia entre diferentes domnios fsicos. Tipicamente, o transdutor colocado na fronteira de um sistema, quer para transmitir estmulos ao mundo exterior, quer para receb-los, como ilustra a figura 1. O transdutor diz-se de entrada se o sistema for sensvel energia por ele libertada, ou diz-se de sada se o sistema o excitar. Na prtica, transdutores de entrada e de sada so simplesmente chamados de sensores e actuadores, respectivamente. Esta a terminologia adoptada por [1] e qual este texto tambm adere. Transdutores Energia Energia

Actuador

Sensor

Sistema

Figura 1. Os transdutores como veculos de energia entre o sistema e o mundo exterior.

Sensores e actuadores so utilizados no dia a dia numa vasta gama de aplicaes: sistemas de manufactura, controlo de processos, indstria automvel, aeronutica, biomedicina e electrodomsticos so s alguns exemplos. O desenvolvimento da microelectrnica generalizou o uso do microcontrolador como complemento do transdutor. O microcontrolador confere ao transdutor outras funcionalidades que no s a converso de energia. O microcontrolador pode executar programas de correco, calibrao, diagnstico e identificao do transdutor. Pode tambm ligar-se em rede com outros sistemas digitais e partilhar com eles a informao do transdutor. O transdutor e o microcontrolador podem ser integrados num nico dispositivo compacto, a que se d o nome de transdutor inteligente. Actualmente, os fabricantes competem por disponibilizar transdutores cada vez mais inteligentes, mais baratos, compatveis com o maior nmero de protocolos de rede e auxiliados pelas melhores ferramentas de software. Esta progressiva digitalizao dos sistemas de medida e controlo vantajosa porque reduz a cablagem analgica e facilita a instalao, manuteno e expanso do prprio sistema. No entanto, o mercado de transdutores inteligentes padece de um grave problema. A proliferao de inmeros protocolos de rede cada um com as suas vantagens e desvantagens dificulta a integrao de produtos de diferentes fabricantes e canaliza o mercado para solues proprietrias, normalmente mais caras e menos flexveis. A soluo deste problema passa por adoptar uma interface universal para transdutores inteligentes, horizontal a todos os protocolos de rede, e que em ltima anlise permita a integrao automtica de qualquer transdutor em qualquer rede. neste sentido que surgem as normas IEEE 1451 [2-4].

1.1. Modelo IEEE 1451


1.1.1. Objectivo O modelo IEEE 1451 no prope mais um protocolo de rede. Em vez disso, ele define um conjunto de interfaces normalizadas de hardware e software no sentido de separar o projecto dos transdutores da escolha das redes de comunicao. A provar esta independncia est o facto do modelo no impr quaisquer restries aos aspectos construtivos dos transdutores, nem aos aspectos protocolares das redes. Ao separar as duas entidades transdutores e redes o modelo permite que o fabricante de transdutores se 2

concentre no dispositivo de transduo, sem ter de se preocupar em adapt-lo s muitas redes existentes. Isso contribuir para a melhoria da qualidade dos transdutores e para a reduo do seu preo [5-6]. O objectivo ltimo do modelo IEEE 1451 permitir o funcionamento imediato de qualquer transdutor em qualquer rede.

1.1.2. Histria Em Filadlfia, no ms de Setembro de 1993, as instituies National Institute of Standards and Technology (NIST) e Institute of Electrical and Electronic Engineers (IEEE) promoveram uma reunio para debater tecnologias de transdutores inteligentes. Nessa reunio foi sentida a necessidade de criar uma interface comum de comunicao para transdutores inteligentes, para o que foram constitudos quatro grupos de trabalho cobrindo os diversos aspectos dessa interface: 1. O grupo de trabalho P1451.11 foi criado para definir a arquitectura do processador de rede, em ingls Network Capable Application Processor (NCAP). O processador de rede faz a ponte entre o transdutor inteligente e uma qualquer rede de comunicao. 2. O grupo de trabalho P1451.2 foi constitudo para definir um modelo de referncia para o mdulo de transduo inteligente, em ingls Smart Transducer Interface Module (STIM). O modelo descreve as funcionalidades do transdutor, a sua interface digital de comunicao com o processador de rede e a sua memria descritiva, conhecida em ingls por Transducer Electronic Data Sheet (TEDS). 3. 4. Ao grupo de trabalho P1451.3 foi atribuda a tarefa de definir uma interface de comunicao digital para sistemas distribudos de transdutores inteligentes. Do grupo de trabalho P1451.4 espera-se a definio de uma interface de comunicao mista para transdutores com sada analgica.

A letra P significa Projecto de norma.

Do ponto de vista cronolgco, os trabalhos evoluram da seguinte forma: 31 de Maro de 1993: ideia de criar uma interface de comunicao para transdutores inteligentes. 31 de Maro e 1 de Abril de 1994: primeira conferncia promovida pelo NIST e IEEE para normalizar a interface. 19 de Setembro de 1994: primeira demonstrao de um TEDS na feira Sensors Expo de Cleveland e criao dos grupos de trabalho P1451.1 e P1451.2. 18 e 19 de Maro de 1995: apresentao da ideia de STIM e de NCAP na feira Sensors Expo de Boston, tambm marcada pela demonstrao de sensores plug & play 2. 14 de Setembro de 1995: quarta reunio na feira Sensors Expo de Chicago. 15 a 17 de Novembro de 1995: demonstrao de um modelo de programao orientado por objectos para representar um transdutor inteligente genrico (norma P1451.1), Gaithersburg. 21 de Junho de 1996: primeira reunio para discutir a norma P1451.3, Gaithersburg. 30 de Agosto de 1996: a verso provisria 2.01 da norma P1451.2 d entrada no IEEE para ser analisada. Setembro de 1996: criao dos grupos de trabalho P1451.3 e P1451.4. 28 de Fevereiro de 1997: a verso provisria 1.83 da norma P1451.1 d entrada no IEEE para ser analisada. 26 de Setembro de 1997: o IEEE adopta a norma IEEE Std 1451.2-1997. 28 de Setembro de 1999: o IEEE adopta a norma IEEE Std 1451.1-1999. Actualmente: os grupos de trabalho P1451.3 e P1451.4 esto desenvolvendo as respectivas verses provisrias. At ao momento apenas as normas 1451.1 e 1451.2 foram aprovadas e esto disponveis ao pblico no stio do IEEE, http://standards.ieee.org.

Termo ingls para dispositivos que se instalam e se configuram automaticamente.

1.1.3. Norma IEEE 1451.1 A norma IEEE 1451.1 Network Capable Application Processor (NCAP) Information Model [2] define um modelo orientado por objectos para representar qualquer transdutor inteligente ligado em rede. O modelo, representado na figura 2, deve ser implementado num processador o processador de rede possuidor de pelo menos dois portos de comunicao: um que serve a rede e outro que serve o transdutor. O processador de rede intercepta as chamadas da rede, encaminha-as para o transdutor e retorna os resultados. Compete-lhe tambm dialogar localmente com o transdutor, responder aos seus pedidos de interrupo e notificar a rede de qualquer mudana significativa do seu estado.

Figura 2. Transdutor inteligente ligado em rede segundo o modelo IEEE 1451.

O processador de rede faz portanto a ponte entre o transdutor inteligente e a rede, cabendo-lhe exportar as funcionalidades do transdutor e os servios de rede, ao mesmo tempo que oculta os protocolos de comunicao e os pormenores de implementao. O processador de rede constitudo por quatro grandes blocos que se passam a explicar:

Sistema Operativo O sistema operativo gere e abstrai o hardware do processador de rede, servindo de base para o desenvolvimento de aplicaes concorrentes. O sistema operativo providencia um ambiente de execuo multi-tarefa independente do processador, assegurando servios bsicos como sejam a gesto de memria, o tratamento de excepes e a gesto de tarefas. A gesto de tarefas inclui o agendamento e a execuo das tarefas concorrentes, bem como mecanismos de comunicao e sincronizao entre elas. Biblioteca de Classes Os blocos de funes previstos na norma 1451.1 constituem os tijolos com os quais o programador pode construir uma aplicao de medida e controlo, destinada a ser executada pelo processador de rede. Os blocos esto reunidos numa biblioteca de classes, organizada hierarquicamente segundo um modelo orientado por objectos capaz de descrever qualquer transdutor inteligente e a rede a que est ligado. Bloco de Interface com o Transdutor O bloco de interface com o transdutor assegura a comunicao entre o processador de rede e o transdutor. Compete-lhe auto-detectar o transdutor e disponibilizar mtodos genricos para ler, escrever e disparar o transdutor. Se o transdutor for um STIM (norma 1451.2), o bloco denominado simplesmente interface de STIM, em ingls STIM driver. Bloco de Interface com a Rede O bloco de interface com a rede trata de todas as transaces entre o processador de rede e a prpria rede, qualquer que ela seja. A interaco entre o NCAP e a rede assenta no paradigma de chamada remota de mtodos, em ingls Remote Procedure Call (RPC), permitindo a um cliente remoto, de forma absolutamente transparente, instanciar uma classe do NCAP e utilizar os seus atributos, mtodos e eventos como se o objecto residisse no prprio cliente. Desta forma, o conceito de servio remoto transposto para os transdutores.

Independentemente do protocolo de rede ou dos processadores envolvidos, um cliente remoto pode contactar um NCAP (servidor) para: Adquirir informao (p.ex. amostras digitalizadas). Transmitir informao (p.ex. actuaes para uma electrovlvula). Desencadear uma aco (p.ex. reinicializar um canal do STIM). Ser notificado de um evento (p.ex. quando ocorrer um alarme).

assim possvel estabelecer um ambiente de colaborao em rede [7], fundamental para sistemas distribudos de medida e controlo, como ilustra a figura 3. Diferentes cenrios de colaborao podem ser concebidos: No cenrio 1, a aplicao que corre no NCAP 1 realiza o controlo local dos sensores e actuadores do STIM 1 (p.ex. o sensor adquire a temperatura de um banho e o actuador excita a caldeira para manter essa temperatura constante). No cenrio 2, o NCAP 2 reporta leituras de sensores para a estao de trabalho (p.ex. as leituras de vrios sensores de presso colocados ao longo de uma conduta). No cenrio 3, a estao de trabalho faz uma actuao remota (p.ex. o cenrio 2 reportou uma leitura de presso excessiva e, em resposta, o programa de alarmes da estao de trabalho activa uma sada do STIM3). No cenrio 4, os NCAPs 2 e 3 fazem uma malha de controlo em rede (p.ex. o NCAP2 adquire e controla a temperatura da sala de estar servindo-se do NCAP3 para actuar a caldeira de aquecimento situada na cave).

Figura 3. Exemplo de sistema distribudo de medida e controlo baseado no modelo IEEE 1451.

1.1.4. Norma IEEE 1451.2 A norma IEEE 1451.2 Transducer to Microprocessor Communication Protocols and Transducer Electronic Data Sheet (TEDS) Formats [3] define a arquitectura do mdulo de transduo inteligente (STIM), e a ligao deste ao processador de rede, como ilustra a figura 4.

Figura 4. Diagrama funcional do STIM.

O mdulo de transduo inteligente responsvel pela aquisio, condicionamento e digitalizao de sinal. A ele ligam todos os sensores e actuadores do sistema, digitais ou analgicos, responsveis pela troca de sinais com o exterior. Os sinais analgicos devem ser devidamente condicionados e convertidos para digital. Nestas reas, a norma 1451.2 no impe quaisquer restries, tendo o fabricante liberdade total para escolher sensores, actuadores e condicionadores de sinal. Onde a norma 1451.2 incide na interaco entre o mdulo de transduo inteligente e o processador de rede. Essa interaco regulamentada a dois nveis: 1. A norma define as funcionalidades do STIM e o modo como elas ficam acessveis ao NCAP. Segundo a norma, e sob um ponto de vista funcional, o NCAP acede ao STIM como se de uma extenso de memria se tratasse: todas as funes do STIM so invocadas atravs de um endereo de funo e so encaminhadas para um sensor

ou actuador atravs de um endereo de canal. Conceptualmente, um canal representa um transdutor do STIM. O canal 0 tem a particularidade de representar todo o STIM servindo para difundir e armazenar informao comum a todos os canais. 2. A norma define tambm a interface de comunicao digital entre o STIM e o NCAP, denominada interface independente do transdutor, em ingls Transducer Independent Interface (TII). Desta forma, o fabricante do STIM pode abstrair-se da rede (tratada pelo NCAP) e orientar o seu desenvolvimento apenas para a interface normalizada. Esta ltima do tipo bit srie sncrono, baseada na interface SPI (Serial Peripheral Interface). Outra rea de interveno da norma 1451.2 a definio de uma memria descritiva do STIM, indissocivel a ele prprio e que o descreve completamente, e cuja designao original em ingls Transducer Electronic Data Sheet (TEDS). O TEDS fundamental para a adio de novos transdutores ao sistema: quando um novo STIM se liga ao NCAP, o seu TEDS imediatamente lido de modo que o NCAP e a rede ficam automaticamente conhecedores das suas caractersticas, podendo depois interagir com ele de forma absolutamente correcta. Neste processo de configurao automtica no h qualquer interveno humana, facto que poupa tempo, evita erros e mantm o sistema permanente actualizado. A norma 1451.2 prev oito estruturas TEDS que devero ser implementadas em memria no voltil, das quais duas so obrigatrias e seis so opcionais. Distinguem-se estruturas em formato de texto e outras em formato binrio. Algumas das estruturas tm direitos de leitura e de escrita, outras s podem ser lidas. Segue-se uma breve descrio de cada uma delas: Meta TEDS (estrutura obrigatria, formato binrio, direito s de leitura) O meta TEDS uma estrutura de memria que contm as caractersticas gerais do STIM, tais como: identificador nico, limites de tempo globais, nmero de canais implementados e velocidade mxima de comunicao com o NCAP.

TEDS de Canal3 (estrutura obrigatria, formato binrio, direito s de leitura) O TEDS de canal uma estrutura de memria que contm as caractersticas particulares de cada canal do STIM, tais como: tipo de canal, unidades fsicas, valores mximo e mnimo, restries temporais e exactido. Existe um TEDS de canal para cada canal do STIM, excepto para o canal 0 que descrito pelo Meta TEDS. TEDS de Calibrao4 (estrutura opcional, formato binrio, direitos de leitura e de escrita) No caso de algum canal do STIM necessitar de correco por software, ser-lhe- associado um TEDS de calibrao contendo os coeficientes da equao correctiva. Alm disso, o TEDS de calibrao disponibiliza informao relativa data da ltima calibrao e ao perodo de calibrao. Meta TEDS de Identificao5 (estrutura opcional, formato de texto, direito s de leitura) O meta TEDS de identificao um estrutura de memria que identifica detalhadamente o STIM. Esto previstos campos de texto descrevendo o nome do fabricante, modelo, nmero de srie, cdigos de reviso e descrio geral do produto. TEDS de Identificao de Canal6 (estrutura opcional, formato de texto, direito s de leitura) Estrutura TEDS idntica anterior mas repetida para cada canal do STIM (excepto para o canal 0).

3 4 5 6

Channel TEDS, na designao original em ingls. Calibration TEDS, na designao original em ingls. Meta Identification TEDS, na designao original em ingls. Channel Identification TEDS, na designao original em ingls.

10

TEDS de Identificao de Calibrao7 (estrutura opcional, formato de texto, direitos de leitura e de escrita) Toda a informao relevante ao processo de calibrao do STIM, no prevista no TEDS de calibrao, est disponvel nesta estrutura de memria. TEDS do Utilizador8 (estrutura opcional, formato de texto, direitos de leitura e de escrita) Estrutura de memria onde reside toda a informao livre que o utilizador desejar incluir no STIM (p.ex. o nmero de telefone da manuteno). TEDS para Extenso9 Estrutura de memria opcional, com formato e direitos indefinidos, reservada para extenses futuras da norma 1451.2.

1.1.5. Norma IEEE P1451.3 A norma IEEE P1451.3, ainda em fase de desenvolvimento, prope uma interface normalizada para sistemas de transdutores distribudos multi-ponto. A norma prope-se definir estruturas de memria TEDS, protocolos de identificao e sincronizao de canais e funes de escrita e de leitura do transdutor. Tal como anteriormente, as questes de aquisio, condicionamento e converso de sinal no devero ser objecto de normalizao. A interface proposta, ilustrada na figura 5, une num barramento comum o processador de rede e vrios mdulos de transduo inteligente, re-baptizados de Transducer Bus Interface Module (TBIM). O barramento constitudo por uma simples linha de transmisso (par de fios), usada para alimentar os transdutores e assegurar a comunicao entre estes e o processador de rede. A linha controlada por um mestre integrado no processador de rede, podendo suportar vrios mdulos de transduo inteligente com larguras de banda muito variadas, desde algumas amostras/s at centenas de kamostras/s. A grande versatilidade em

7 8 9

Calibration Identification TEDS, na designao original em ingls. End Users Application TEDS, na designao original em ingls. Generic Extension TEDS, na designao original em ingls.

11

termos de velocidades e tempos de resposta um dos maiores desafios da norma e um dos motivos do atraso da sua publicao.

Figura 5. Interface P1451.3 (note-se o paralelismo entre TBIM e STIM).

Cada TBIM pode suportar at cinco canais de comunicao multiplexados em frequncia sobre a linha de transmisso. A multiplexagem em frequncia permite que alimentao e comunicao coexistam na mesma linha. A tabela 1 apresenta uma breve descrio de cada um dos canais de comunicao.

Canal de Comunicao Sincronizao Disparo Rede

Descrio Canal utilizado para sincronizar aces em vrios TBIMs (p.ex. um sinal de relgio). Canal dedicado para disparar um ou vrios TBIMs. Trata-se de um canal de banda estreita utilizado durante a inicializao do sistema para identificar os TBIMs e apurar as suas capacidades de comunicao. Neste canal realizam-se as transaces de controlo dos TBIMs (p.ex. ler estruturas de estado, escrever mscaras de interrupo e enviar comandos). Canal dedicado para realizar transferncias de dados a alta velocidade entre o NCAP e um TBIM.
Tabela 1. Canais de comunicao previstos na norma P1451.3.

Controlo Dados

Dos cinco canais de comunicao, apenas os canais de rede e de controlo so obrigatrios. Se um TBIM implementar apenas os canais obrigatrios, ele diz-se de nvel 0. Nesse caso, os canais de controlo, de dados, de sincronizao e de disparo partilham o mesmo canal, ou seja, a mesma banda de frequncias. Obviamente que esta configurao se destina a sistemas mais simples, mais baratos e com menor largura de banda. Se o canal de dados for 12

independente, o TBIM ganhar largura de banda e subir um nvel de complexidade, passando a ser de nvel 1. Da mesma forma, se podem obter TBIMs de nvel 2 e 3 se os canais de sincronizao e de disparo forem tornados independentes, respectivamente. O objectivo que todos os TBIMs de nvel igual ou inferior ao do mestre de barramento possam coexistir na linha. A figura 6 apresenta a interface P1451.3 com mais detalhe.

Figura 6. Diagrama funcional da interface P1451.3.

As estruturas de memria TEDS propostas pela norma P1451.3 so uma variante das anteriormente apresentadas para a norma 1451.2. Esto previstas duas estruturas de memria obrigatrias, em formato binrio, denominadas meta TEDS de mdulo10 e TEDS especfico do transdutor11: a primeira contm as caractersticas gerais do TBIM e a segunda
10 11

Module Meta TEDS, na designao original em ingls. Transducer Specific TEDS, na designao original em ingls.

13

descreve as caractersticas particulares de um canal do TBIM. Cada TBIM contm um meta TEDS de mdulo e vrios TEDS especfico do transdutor, um para cada canal de transduo ( semelhana do meta TEDS e do TEDS de canal previstos na norma 1451.2). As restantes estruturas de memria TEDS so opcionais e similares s da norma 1451.2, prevendo-se a introduo de duas novidades: um TEDS de funo de transferncia12 que descreve a resposta em frequncia do transdutor, e um TEDS de filtragem13 contendo os coeficientes de um filtro digital para obter uma resposta em frequncia desejada.

1.1.6. Norma IEEE P1451.4 A norma P1451.4 prope uma interface de comunicao normalizada para transdutores analgicos [8]. O objectivo compatibilizar os transdutores j existentes no mercado (a maioria deles com interface analgica em tenso ou corrente) com o modelo IEEE 1451. Assegurar esta compatibilidade fundamental para o sucesso do modelo. A ideia consiste em sobrepor ou adicionar interface analgica do transdutor, uma interface digital que aceda a uma memria TEDS e permita mecanismos de auto-identificao e auto-calibrao do transdutor. Da resulta uma interface de modo misto, em ingls Mixed Mode Interface (MMI), ilustrada na figura 7.

Figura 7. Transdutor analgico com interface mista.

12 13

Transfer Function TEDS, na designao original em ingls. Digital Filter TEDS, na designao original em ingls.

14

Se a interface digital for sobreposta interface analgica, as duas multiplexadas no tempo, a interface de modo misto diz-se de classe 1. Por outro lado, se a interface digital for adicionada com linhas prprias, em paralelo com a interface analgica, a interface de modo misto diz-se de classe 2. A figura 8 ilustra uma interface de modo misto de classe 1 para um sensor analgico alimentado em tenso. Em modo digital, o dodo D1 polarizado inversamente e D2 conduz, sendo ento possvel aceder memria TEDS do sensor e reconhecer automaticamente as suas caractersticas; em modo analgico, o dodo D1 conduz e D2 corta, o amplificador alimentado e o sensor funciona da forma tradicional com sada em tenso analgica.

Figura 8. Exemplo de interface P1451.4 de classe 1 para um transdutor analgico alimentado com tenso.

15

A figura 9 exemplifica uma interface de modo misto de classe 2 para um transdutor analgico 4 20 mA. Neste caso, a interface digital est sempre operacional e o NCAP pode aceder memria TEDS do transdutor sempre que desejar.

Figura 9. Exemplo de interface P1451.4 de classe 2 para um transdutor analgico 4 20 mA.

No que se refere interface digital, ela constituda por dois fios e permite a ligao multiponto de vrios transdutores. O barramento controlado por um mestre integrado no NCAP, como ilustra a figura 10. A interface digital utiliza a tecnologia 1-Wire da Maxim14. Trata-se de um protocolo de comunicao do tipo mestre/escravo, suportado numa nica linha com lgica positiva, e baseado em largura de impulso. Sobre a linha, multiplexados no tempo, circulam endereos, dados e palavras de controlo. Todos os escravos pendurados na linha possuem um endereo nico. Todas as transaces de dados so encabeadas pelo endereo do escravo (transdutor) com o qual o mestre (NCAP) pretende dialogar. A partir da, todos os escravos no endereados retiram-se da transaco. O NCAP d incio transaco baixando a linha a 0 durante um perodo de tempo pr-definido. A transaco continua com o NCAP transmitindo 0s e 1s atravs de impulsos respectivamente mais largos ou mais estreitos, limitados por um perodo de bit. Para ler dados, o NCAP inicia cada perodo de bit com um curto impulso a 0, ao que o transdutor responde com 0 prolongando o impulso, ou com 1 subindo de imediato a linha. Dado que a linha repousa a +5 V e no tem perodos longos sem tenso, ela pode alimentar os transdutores. A tecnologia 1-Wire actual permite dbitos binrios at 140 kbit/s.

14

Para mais informaes consultar www.maxim-ic.com/1-Wire.cfm.

16

Figura 10. A interface digital estende-se facilmente para vrios transdutores atravs de um cabo coaxial ou par de condutores entranados.

As estruturas de memria TEDS propostas pela norma P1451.4 so um subconjunto das estruturas contempladas na norma 1451.2. Esto previstos campos para identificao do fabricante, modelo, nmero de srie, gama de medida, incerteza, coeficientes de calibrao, entre outros. A tabela 2 apresenta um exemplo.

TEDS Bsico

TEDS Adicional (os campos variam consoante o tipo de transdutor)

Identificao do fabricante Modelo Verso Nmero de srie Data de calibrao Sensibilidade Gama fsica de medida Gama de sada Coeficiente de temperatura Direco sensvel (x, y, z) Localizao Data da prxima calibrao

43 (Acme Accelerometer Company) 7115 B X001891 29 de Janeiro de 2000 0.1 V/g 50 g 5 V -0.48 %/C X Disco 3 29 de Janeiro de 2003

TEDS do Utilizador

Tabela 2. Estrutura TEDS de um acelermetro compatvel com a norma P1451.4.

17

Espera-se que a norma P1451.4 venha a ter sucesso de implementao por trs grandes motivos: 1. 2. 3. compatvel com os transdutores analgicos que proliferam actualmente na indstria. A sua integrao em transdutores j existentes simples (basta inserir a memria TEDS e a interface digital no cabo que liga ao transdutor). Baseia-se em electrnica econmica e j disponvel comercialmente.

1.2. Tendncias Futuras


At ao momento apenas as normas IEEE 1451.1 e 1451.2 foram aprovadas. No entanto, a sua penetrao no mercado tem sido reduzida por duas grandes razes: 1. A disponibilidade comercial de NCAPs ainda muito reduzida (refira-se o exemplo da Hewlett Packard que at 1999 disponibilizou um NCAP para a Ethernet e posteriormente descontinuou o produto). Enquanto no houver no mercado NCAPs para as redes comuns e a preos competitivos, muito dificilmente o modelo IEEE 1451 ter a difuso pretendida. 2. As normas aprovadas so de difcil integrao nos sistemas actuais de medida e controlo. Espera-se para breve a aprovao da norma P1451.4, que de forma simples e econmica, far a ponte entre os sistemas actuais e o modelo IEEE 1451. Se a norma P1451.4 for bem aceite, a indstria adoptar gradualmente o novo modelo (quer em sistemas novos, quer em sistemas convertidos) e talvez isso sirva de catalisador para desbloquear a questo dos NCAPs. Uma nota positiva deve ser dada norma 1451.2, em particular para a sua definio de TEDS, muito bem aceite pela comunidade instrumentista. Passados seis anos da sua aprovao, a mais antiga das normas est prestes a ser revista. Os principais pedidos de reviso so trs [9]:

18

Simplificao Funcional A actual norma 1451.2 enriquece o mdulo de transduo inteligente (STIM) com um enorme leque de funcionalidades, muitas das quais so desnecessrias para a grande maioria das aplicaes. Uma reduo cuidada das funcionalidades conduziria a STIMs mais simples, menos onerosos e com maior aceitao no mercado. Por outro lado, a generalizao dos STIMs traria mais e melhores ferramentas de desenvolvimento, facilitando a produo de novos STIMs e realimentando positivamente a sua popularidade. Um exemplo de ferramenta de desenvolvimento o circuito integrado ADCu812 da Analog Devices que oferece todo o hardware necessrio para a implementao de um STIM. Outro exemplo de ferramenta de desenvolvimento, citado em [10], um programa que recebe todos os parmetros TEDS e gera automaticamente o cdigo do STIM para o circuito integrado ADCu812. Simplificao da Interface Independente do Transdutor A TII uma variante enriquecida da interface SPI: s linhas de comunicao juntam-se linhas de alimentao, de disparo, de interrupo, e outras, num total de dez. O elevado nmero de linhas dificulta a cablagem entre o STIM e o NCAP, havendo o desejo de tornar a interface puramente srie. Esto em estudo duas opes: 1. Reduzir a TII interface SPI na qual se baseia. Este arranjo implica cinco linhas: duas linhas de dados (DIN e DOUT), uma linha de relgio (DCLK) e duas linhas de alimentao. 2. Reduzir a TII a uma interface RS 232 simples. Este arranjo implica apenas trs linhas: duas linhas de dados (TX e RX) e uma linha de massa (COMMON), podendo o STIM ser alimentado a partir das linhas de dados. Esta opo, embora mais limitada em termos de velocidade de comunicao, requer menos linhas e tem a vantagem de tornar o STIM conectvel a qualquer dispositivo que possua uma interface RS 232, no necessariamente um NCAP. A nvel protocolar, h quem defenda que a comunicao entre o STIM e o NCAP deva ser suportada num protocolo standard (p.ex. Modbus ou Profibus). Esta alterao teria a vantagem de tornar o STIM conectvel a qualquer dispositivo que implemente de origem esse protocolo, no necessariamente um NCAP.

19

Introduo de Novas Funcionalidades H presses no sentido da nova norma incluir novas funcionalidades, tais como: direitos de acesso, carimbos de tempo e relatrios de dados. Mais recentemente, em Setembro de 2002, foi formalmente constitudo o grupo de trabalho IEEE P1451.5 com o objectivo de normalizar uma interface sem fios para transdutores. Espera-se que o novo grupo de trabalho defina funcionalidades, estruturas TEDS e protocolos de comunicao com o transdutor especialmente adaptados ao canal de radiofrequncia. A norma P1451.5 no pretende limitar a electrnica de transduo, condicionamento e digitalizao de sinal, nem to pouco interferir no nvel fsico da interface. Pretende-se sim que a interface sem fios seja aberta e possa integrar as vantagens das vrias tecnologias wireless actuais, entre as quais se destaca a tecnologia Bluetooth.

20

2
Mdulo de Transduo Inteligente

Captulo

Este captulo descreve a implementao de um mdulo de transduo inteligente (STIM) no microcontrolador PIC16F877 da Microchip. O captulo comea por apresentar com detalhe a norma IEEE 1451.2 na qual se baseia o prottipo de STIM. A apresentao cobre as trs principais reas da norma: funcionalidades do STIM, a sua memria descritiva (TEDS) e a interface de comunicao digital que o liga ao processador de rede (NCAP). Em segundo lugar, feita uma descrio do microcontrolador PIC16F877: so apresentadas as suas caractersticas mais importantes e justificada a sua escolha para este trabalho. O captulo continua com uma seco dedicada ao circuito elctrico do STIM onde se descreve o esquema elctrico do prottipo e apresentado um projecto de circuito impresso. O captulo acaba com a descrio detalhada do programa do STIM.

2.1. Arquitectura do STIM


A arquitectura do STIM definida pela norma IEEE 1451.2 em trs grandes reas, nomeadamente: 1. 2. 3. Funcionalidades do STIM (captulo 4 de [3]). Memria descritiva do STIM (captulo 5 de [3]). Interface de comunicao digital entre o STIM e o NCAP (captulo 6 de [3]).

Segue-se a descrio detalhada de cada uma destas reas para melhor se compreender o funcionamento interno do STIM e a sua interaco com o NCAP.

21

2.1.1. Funcionalidades do STIM O STIM a unidade funcional que contacta directamente com os transdutores. A cada transdutor associada uma estrutura de dados onde mantida informao relativa ao seu funcionamento. O transdutor e a sua estrutura de dados constituem um canal do STIM. A estrutura de dados mnima de um canal inclui espao de memria para armazenar as amostras adquiridas pelo transdutor e posteriormente digitalizadas, dois registos de estado com 16 bits (um standard e outro auxiliar), e ainda duas mscaras de interrupo tambm com 16 bits (uma standard e outra auxiliar). Isso mesmo ilustrado na figura 11.

Figura 11. Estrutura de dados de um canal do STIM.

Os bits de estado assinalam determinadas condies de funcionamento do canal. Apenas seis bits de estado so obrigatrios, todos os outros so opcionais e no caso de no serem utilizados devem tomar o valor 0. Os bits de estado obrigatrios pertencem todos ao registo de estado standard e so os seguintes:

22

S0, Bit de Interrupo 15 Activado quando o STIM envia um pedido de interrupo para o NCAP. S1, Bit de Reconhecimento de Disparo 16 Activado aps o canal ter recebido uma ordem de disparo. S2, Bit de Inicializao 17 Activado aps o canal ter sido (re)inicializado. S3, Bit de Comando Invlido 18 Este bit exclusivo do canal 0 e activado quando o STIM recebe dados invlidos provenientes do NCAP. S4, Bit de Estado Auxiliar 19 Activado quando pelo menos um dos bits do registo de estado auxiliar toma o valor 1. S8, Bit Operacional 20 Activo enquanto o canal estiver em condies de operar. As mscaras de interrupo so E-ligadas bit a bit com os registos de estado: se o bit de mscara tomar o valor 0, ele impede que o bit de estado se propague para jusante e origine um pedido de interrupo ao NCAP. Desta forma, as mscaras de interrupo determinam as condies que levam o STIM a interromper o NCAP, como ilustra a figura 11. O STIM pode conter at 255 canais, sendo o canal 0 um canal virtual que representa o STIM como um todo. A norma distingue seis tipos de canais consoante os seus mecanismos de disparo e de leitura ou de escrita de dados:

15 16 17 18 19 20

Service Request Bit, na designao original em ingls. Trigger Acknowledged Bit, na designao original em ingls. Has Been Reset Bit, na designao original em ingls. STIM Invalid Command Bit, na designao original em ingls. Auxiliary Status Available Bit, na designao original em ingls. Operational Bit, na designao original em ingls.

23

Sensor Simples 21 O sensor simples adquire uma amostra de uma grandeza fsica e retorna imediatamente o seu valor digitalizado. A amostra adquirida aps o canal receber uma ordem de disparo. Actuador Simples 22 O actuador simples altera o estado de uma sada de acordo com o valor digital que lhe enviado. A alterao do estado ocorre aps o canal receber uma ordem de disparo. Sensor com Memria 23 Quando disparado, o sensor com memria retorna as amostras guardadas na memria e inicia imediatamente um novo conjunto de aquisies, as quais sero armazenadas na memria inicialmente libertada. Sensor Contnuo 24 O sensor contnuo aquire amostras continuamente e guarda-as numa memria circular. Quando disparado, o canal retorna um nmero pr-definido de amostras adquiridas aps a ordem de disparo. Sensor Contnuo com Memria 25 O sensor contnuo com memria idntico ao sensor contnuo, com a diferena de retornar um nmero pr-definido de amostras adquiridas antes da ordem de disparo. Sensor de Eventos26 O sensor de eventos serve para sincronizar uma tarefa do STIM com a ocorrncia de um determinado evento. O evento pode ser um flanco de um sinal digital ou a passagem de um sinal analgico por um valor de limiar. Depois de disparado, o sensor de eventos fica em modo de espera e s reconhece o disparo quando ocorre o evento a que sensvel.

21 22 23 24 25 26

Sensor, na designao original em ingls. Actuator, na desigao original em ingls. Buffered Sensor, na designao original em ingls. Data Sequence Sensor, na designao original em ingls. Buffered Data Sequence Sensor, na designao original em ingls. Event Sequence Sensor, na designao original em ingls.

24

Em termos funcionais, o NCAP acede ao STIM como se de uma extenso de memria se tratasse. Todas as funcionalidades do STIM so invocadas atravs de um endereo de funo e so encaminhadas para um canal atravs de um endereo de canal. Ambos os endereos possuem um byte, pelo que possvel invocar 256 funes do STIM para 256 canais distintos. As funes com endereo entre 0 e 127 implicam escrita de dados no canal (funes de escrita), ao passo que as funes com endereo entre 128 e 255 retornam dados do canal (funes de leitura). Os canais com endereos 1 a 255 correspondem a um sensor ou actuador, enquanto que o canal 0 tem a particularidade de representar globalmente o STIM servindo para difundir e armazenar informao comum a todos os canais. Das 256 funes possveis, apenas 13 so obrigatrias; as restantes funes esto reservadas para aplicaes futuras ou so de implementao opcional por parte do fabricante. A tabela 3 apresenta as funes obrigatrias e os respectivos endereos.

(Endereo) Funo Funes de Escrita


(0) Write Actuator (1) Write Control Command (3) Write Triggered Channel Address (5) Write Standard Interrupt Mask (6) Write Auxiliary Interrupt Mask (128) Read Sensor (130) Read Standard Status

Descrio Define novos dados de actuao. Envia um comando para um canal. Define o endereo do canal sob disparo. Define a mscara de interrupo standard de um canal. Define a mscara de interrupo auxiliar de um canal. Retorna novas amostras de um sensor. Retorna o registo de estado standard de um canal. Retorna o endereo do canal sob disparo. Retorna o registo de estado auxiliar de um canal. Retorna a mscara de interrupo standard de um canal. Retorna a mscara de interrupo auxiliar de um canal. Retorna a verso do STIM. Retorna o Meta TEDS (canal 0) ou o TEDS de Canal.

Funes de Leitura

(131) Read Triggered Channel Address (132) Read Auxiliary Status (133) Read Standard Interrupt Mask (134) Read Auxiliary Interrupt Mask (135) Read STIM Version (160) Read TEDS

Tabela 3. Funes de implementao obrigatria em qualquer prottipo de STIM.

Os comandos que correspondentes funo Write Control Command so codificados em dois bytes, pelo que possvel enviar 65536 comandos distintos para cada canal do STIM. Mas de todos os comandos, somente dois so absolutamente obrigatrios e cinco 25

so obrigatrios apenas para determinados tipos de canais. A tabela 4 apresenta os comandos obrigatrios e os respectivos cdigos.

(Cdigo) Comando
(0) No operation (1) Reset (5) Enable event sequence sensor (a) (6) Disable event sequence sensor (a) (7) Set event sequence sensor to the configuration mode (a) (9) Enable data sequence or buffered data sequence sensors (b) (10) Disable data sequence or buffered data sequence sensors (b)

Descrio Retira o canal de servio. O canal deixa de estar operacional. Reinicializa o canal. Activa o sensor de eventos O sensor de eventos desactivado, deixando de esperar por eventos. O sensor de eventos entra em modo de configurao. Activa o sensor contnuo (com ou sem memria). O sensor contnuo (com ou sem memria) desactivado, isto , pra de adquirir amostras.

Tabela 4. Comandos de implementao obrigatria: a) apenas para os canais do tipo sensor de eventos; b) apenas para os canais do tipo sensor contnuo com ou sem memria.

2.1.2. Memria Descritiva do STIM A memria descritiva do STIM uma memria no voltil onde so armazenados todos os parmetros descritivos do STIM. A memria, conhecida abreviadamente por TEDS, indissocivel do STIM e fundamental para a realizao de transdutores plug and play. A memria TEDS divide-se em oito estruturas, j apresentadas na subseco 1.1.4. As estruturas so constitudas por vrios campos de dados e cada campo caracterizado pelo nome e tipo de dado. No espao que se segue dada uma ateno especial s estruturas meta TEDS e TEDS de canal devido ao facto de serem as nicas estruturas de implementao obrigatria. No que toca estrutura meta TEDS, ela contm informao sobre o canal 0 do STIM, ou por outras palavras, ela descreve globalmente o STIM. A informao reparte-se por 29 campos de dados representados na tabela 5 (a descrio pormenorizada dos campos pode ser consultada na bibliografia anexa [3]). Dado o elevado nmero de campos, achou-se conveniente manter as nomenclaturas originais em ingls.

26

Campo

Tipo de Dado

TEDS version constant related data sub-block

Conjunto de campos que identificam a norma que serve de modelo memria TEDS (actualmente, a verso 1 da norma IEEE 1451.2).
1 2 3 Meta TEDS Length IEEE 1451 Standards Family Working Group Number TEDS Version Number U8 27 U8 U8

Identification related data sub-block

Campo que identifica univocamente o STIM. A unicidade do identificador garantida combinando as coordenadas de fabrico do STIM (latitude e longitude) com a sua data de fabrico (nmero de segundos desde o incio do ano de fabrico).
4 Globally Unique Identifier String
28

Data structure related data sub-block

Conjunto de campos que descrevem as funcionalidades opcionais do STIM, bem como o nmero de canais implementados e as caractersticas gerais destes.
5 6 7 8 9 10 11 12 CHANNEL_ZERO Industry Calibration TEDS Extension Key CHANNEL_ZERO Industry Nonvolatile Data Fields Extension Key CHANNEL_ZERO Industry TEDS Extension Key CHANNEL_ZERO End-Users Application-Specific TEDS Key Number of Implemented Channels Worst-Case Channel Data Model Length Worst-Case Channel Data Repetitions CHANNEL_ZERO Writable TEDS Length U8 U8 U8 U8 U8 U8 U16 U32

Timing related data sub-block

Conjunto de campos que descrevem as restries temporais do canal 0 do STIM.


13 14 15 16 17 18 19 20 21 22 23 Worst-Case Channel Update Time (Twu) Global Write Setup Time (Tgws) Global Read Setup Time (Tgrs) Worst-Case Channel Sampling Period (Twsp) Worst-Case Channel Warm-Up Time Command Responde Time STIM Handshake Timing (Ths) End-Of-Frame Detection Latency (Tlat) TEDS Hold-Off Time (Tth) Operational Hold-Off Time (Toh) Maximum Data Rate F32 29 F32 F32 F32 F32 F32 F32 F32 F32 F32 U32

27 28 29

O termo UX significa nmero inteiro sem sinal com X bits. Termo ingls para descrever uma cadeia de caracteres. O termo FX significa nmero de vrgula flutuante com X bits.

27

Campo

Tipo de Dado

Channel grouping related data sub-block

Conjunto de campos que descrevem agrupamentos de canais correlacionados. Por exemplo, o canal de um sensor de temperatura e o canal de um sensor de pH podem formar um agrupamento porque a medida de pH depende da temparatura.
24 25 26 27 28 Channel Groupings Data Sub-Block Length Number of Channel Groupings=G Group Type Number of Group Members=N Member Channel Numbers List=M(N) U16 U8 U8 U8 vector de U8

Os campos 26-28 repetem-se G vezes.

Data integrity data sub-block

Campo que a soma em complemento para um de todos os bytes precedentes da estrutura TEDS. til para detectar erros aps a leitura da estrutura.
29 Checksum for Meta TEDS Tabela 5. Estrutura meta TEDS. U16

Por outro lado, o TEDS de canal contm informao especfica sobre um determinado canal do STIM que no o canal 0 repartida por 30 campos de dados representados na tabela 6 (a descrio pormenorizada dos campos pode ser consultada em [3]). semelhana da tabela 5, e pelos mesmos motivos, achou-se conveniente manter as nomenclaturas originais em ingls.

Campo

Tipo de Dado

Data structure related data sub-block

Conjunto de campos que descrevem as funcionalidades opcionais do canal.


1 2 3 4 5 6 7 Channel TEDS Length Calibration Key Channel Industry Calibration TEDS Extension Key Channel Industry Nonvolatile Data Fields Extension Key Channel Industry TEDS Extension Key Channel End-Users Application-Specific TEDS Key Channel Writable TEDS Length U32 U8 U8 U8 U8 U8 U32

Transducer related data sub-block

Conjunto de campos que descrevem as caractersticas gerais do transdutor do canal.


8 9 10 11 12 Channel Type Key Physical Units Lower Range Limit Upper Range Limit Worst-Case Uncertainty U8 Sring F32 F32 F32

28

#
13 Self-Test Key

Campo

Tipo de Dado
U8

Data converter related data sub-block

Conjunto de campos que descrevem a forma como so guardadas as amostras digitalizadas do transdutor.
14 15 16 17 18 19 20 Channel Data Model Channel Data Model Length Channel Model Significant Bits Channel Data Repetitions Series Origin Series Increment Series Units U8 U8 U16 U16 F32 F32 String

Timing related data sub-block

Conjunto de campos que descrevem as restries temporais do canal.


21 22 23 24 25 26 27 28 Channel Update Time (Tu) Channel Write Setup Time (Tws) Channel Read Setup Time (Trs) Channel Sampling Period (Tsp) Channel Warm-Up Time Channel Aggregated Hold-Off Time (Tch) Timing Correction Trigger Accuracy F32 F32 F32 F32 F32 F32 F32 F32

Event sequence options field

Campo que diz se o canal tem associado um sensor de eventos ou no.


29 Event Sequence Options U8

Data integrity data sub-block

Campo que a soma em complemento para um de todos os bytes precedentes da estrutura TEDS. til para detectar erros aps a leitura da estrutura.
30 Checksum for Channel TEDS Tabela 6. Estrutura TEDS de canal. U16

2.1.3. Interface de Comunicao Digital entre o STIM e o NCAP A comunicao entre o STIM e o NCAP realizada atravs da Interface Independente do Transdutor (TII). Trata-se de uma interface de comunicao aberta, digital, do tipo bit srie sncrono, baseada na interface SPI. Alm das linhas de fluxo e sincronizao de dados (DCLK, DIN e DOUT), foram adicionadas linhas de alimentao, de disparo, de interrupo, e outras num total de dez. Todas as linhas tomam valores de tenso entre 0 e +5 V, com a particularidade daquelas cujo nome comea pela letra N terem lgica negativa (activadas a 0 V). A tabela 7 descreve sumariamente cada uma das linhas da interface.

29

Linha DIN DOUT DCLK NIOE NTRIG NACK NINT NSDET POWER COMMON

Actuada por NCAP STIM NCAP NCAP NCAP STIM STIM STIM NCAP NCAP

Descrio Linha de dados do NCAP para o STIM. Linha de dados do STIM para o NCAP. Relgio activo ao flanco ascendente para sincronizar os bits de dados. Delimita uma trama de dados. A trama de dados tem lugar enquanto esta linha est activa. Linha actuada pelo NCAP para disparar o STIM. Linha de confirmao. Atravs desta linha o STIM reconhece as iniciativas do NCAP. Linha usada pelo STIM para interromper o NCAP. Linha usada pelo NCAP para detectar a presena de um STIM. Alimentao de +5 V para o STIM, limitada a 75 mA. Se necessrio, a electrnica de aquisio e condicionamento de sinal do STIM pode ser alimentada por uma fonte externa.
Tabela 7. Linhas da TII.

A comunicao entre o STIM e o NCAP do tipo mestre/escravo. O mestre o NCAP: ele que dispara o STIM e d incio a todas as transaces de dados. O escravo o STIM: cabe-lhe responder s iniciativas do NCAP e activar a linha de interrupo (NINT) sempre que necessitar de um servio do NCAP. A comunicao entre o STIM e o NCAP feita atravs de disparos e de tramas de dados. A velocidade de comunicao pode variar entre o ritmo mnimo de 6 kbit/s e um ritmo mximo que depende do STIM e cujo valor est disponvel no seu meta TEDS. Qualquer trama de dados encabeada por dois bytes dedicados: o primeiro byte contm o endereo da funo que contextualiza os dados e o segundo byte contm o endereo do canal a quem se destinam os dados. Seguem-se os bytes de dados, em nmero arbitrrio, mas sempre ordenados do mais significativo para o menos significativo. A trama de dados delimitada pela linha NIOE e todos os bytes lidos ou escritos pelo STIM so confirmados pela comutao da linha NACK. Em rigor, toda e qualquer trama de dados constituda por sete etapas (ver figura 12):

30

A) B) C) D) E)

O NCAP activa a linha NIOE para sinalizar o incio de uma nova trama. O STIM reconhece o incio da trama activando a linha NACK. O STIM comuta a linha NACK depois de ler com sucesso o endereo de funo. O STIM comuta a linha NACK depois de ler com sucesso o endereo de canal. O NCAP e o STIM trocam bytes de dados, comeando no mais significativo e terminando no menos significativo. Todos os bytes so sincronizados pela linha DCLK, actuada pelo NCAP, e so confirmados pela linha NACK, actuada pelo STIM.

F) G)

O NCAP desactiva a linha NIOE quando a trama chega ao fim. O STIM desactiva a linha NACK.
A B G N par F

NIOE NACK DCLK

Funo DIN DOUT C

Canal

Byte 1

Byte N

Funo de Escrita Funo de Leitura

Figura 12. Diagrama temporal de uma trama de dados.

Por outro lado, o disparo constitudo apenas por quatro etapas (ver figura 13): A) B) C) D) O NCAP desencadeia o disparo activando a linha de disparo NTRIG. O STIM reconhece o disparo activando a linha NACK. O NCAP desactiva a linha NTRIG. O STIM desactiva a linha NACK.

NIOE A NTRIG B NACK D C

Figura 13. Diagrama temporal de um disparo.

31

As tramas de dados transportam informao relativa s variveis internas do STIM. Os disparos por sua vez sincronizam o contedo das variveis internas do STIM com os valores fsicos dos transdutores. Utilizando disparos e funes de escrita ou de leitura, o NCAP pode realizar quatro transaces distintas com o STIM. A sequncia de aces que distingue cada uma das transaces apresentada na tabela 8.

Transaco Leitura de variveis internas do STIM Leitura de um Sensor Escrita de variveis internas do STIM Escrita num Actuador

Sequncia de Aces

Tabela 8. Transaces entre o STIM e o NCAP.

O dilogo entre o STIM e o NCAP ainda pautado por restries temporais. O termo temporal aplica-se aos intervalos de tempo entre transies das linhas da TII. As restries temporais podem ser de dois tipos: Latncias Esperas mnimas que o NCAP tem obrigatoriamente de cumprir para que o dilogo com o STIM tenha sucesso. Alarmes Esperas mximas a que o NCAP tem de estar atento e que no caso de serem ultrapassadas podem significar problemas na comunicao com o STIM. A tabela 9 apresenta as latncias e os alarmes da TII:

32

<Tipo> Restrio Temporal <Latncia> Tempo de Silncio, Tlat 30 Tempo mnimo entre duas tramas de dados consecutivas. O cumprimento desta latncia garante que o STIM distingue o final de uma trama e o incio da seguinte.
NIOE Tlat (min)

<Latncia> Tempo de Preparao de Escrita, Tws 31 Tempo mnimo entre o final da trama de dados e o incio do disparo subsequente. Durante este tempo, o STIM prepara os valores de actuao (acabados de receber do NCAP) para serem escritos no actuador. <Alarme> Tempo de Actualizao, Tu 32 Tempo mximo que o STIM tem para reconhecer um disparo. <Latncia> Tempo de Preparao de Leitura, Trs 33 Tempo mnimo entre o reconhecimento do disparo e o incio da trama de dados subsequente. Durante este tempo, o STIM prepara as amostras digitalizadas para serem lidas pelo NCAP.

NIOE NTRIG NACK Tws Tu Trs (min)(max) (min)

30 31 32 33

End-Of-Frame Detection Latency, na designao original em ingls. Write Setup Time, na designao original em ingls. Update Time, na designao original em ingls. Read Setup Time, na designao original em ingls.

33

<Tipo> Restrio Temporal <Latncia> Perodo de Amostragem, Tsp 34 Tempo mnimo entre disparos consecutivos.
NTRIG Tsp (min)

<Alarme> Tempo de Confirmao, Th 35 Tempo mximo dentro do qual o STIM deve comutar a linha NACK como reconhecimento da iniciativa do NCAP.
DCLK NACK 1 byte Th(max)

<Alarme> Tempo de Confirmao Final, Ths 36 Tempo mximo que o STIM tem para desactivar a linha NACK no final de uma trama de dados.
NIOE NACK Ths (max)

Tabela 9. Latncias e alarmes da TII.

Conhecida em detalhe a norma IEEE 1451.2, altura de estudar o microcontrolador PIC16F877 e justificar a sua escolha para implementar o prottipo de STIM.

34 35 36

Sample Period, na designao original em ingls. Hold Time, na designao original em ingls. Handshake Time, na designao original em ingls.

34

2.2. Microcontrolador PIC16F877


O microcontrolador PIC16F877 a unidade que executa o programa do STIM. Trata-se de um microcontrolador distribudo pela empresa Microchip, includo na gama de processadores de uso geral e de baixo custo. Depois de se ter estudado a sua documentao [11], fez-se um resumo das suas principais caractersticas: 1. Processador de 8 bits baseado numa arquitectura RISC (Reduced Instruction Set Computers) com apenas 35 instrues. Todas as instrues so executadas num nico ciclo de mquina, excepto as instrues de salto que requerem dois ciclos. 2. Frequncia mxima de relgio de 20 MHz. No entanto, esta frequncia dividida internamente por quatro. Quer isto dizer que um ciclo de mquina equivale a quatro ciclos de relgio, podendo o microcontrolador atingir a velocidade mxima de execuo de 5 Minstrues/s, o que equivale a 200 ns/instruo. 3. 4. 5. 6. Memria de programa no voltil com capacidade para 8 kinstrues. Memria voltil (RAM) com capacidade para 368 bytes. Capacidade para servir interrupes. Esto disponveis 14 fontes de interrupo, incluindo uma interrupo externa. Trs temporizadores. Os temporizadores 0 e 2 so de 8 bits, ao passo que o temporizador 1 de 16 bits com capacidade de captura e comparao do registo de contagem. 7. 8. 9. 10. Conversor analgico/digital integrado. O conversor tem uma resoluo nominal de 10 bits e pode servir at 8 entradas analgicas multiplexadas no tempo. Interface SPI integrada. Capacidade de programao e depurao do programa sem necesidade de remover o microcontrolador do circuito. Baixo consumo (< 1 mA) e baixo preo (< 10 ).

35

Entre as caractersticas citadas, destacam-se cinco que justificaram a escolha do microcontrolador PIC16F877 para implementar o mdulo de transduo inteligente: 1. 2. A velocidade de execuo do microcontrolador (200 ns/instruo) permite a realizao expedita do programa do STIM. A capacidade da memria de programa (8 kinstrues) suficiente para armazenar o programa do STIM e eventualmente algumas estruturas TEDS com direito s de leitura (p.ex. meta TEDS e TEDS de canal). 3. 4. 5. O conversor Analgico/Digital (A/D) pode ser utilizado para digitalizar os sinais analgicos provenientes de sensores. A interface SPI adequada para implementar a TII. Trata-se de um microcontrolador barato, de uso geral e apetrechado com boas ferramentas de desenvolvimento. No se trata de uma escolha indita: j em [12] se descreve a implementao de um STIM com dois canais no microcontrolador PIC16C62A, acompanhado da memria no voltil 93C86. Mas a escolha do microcontrolador PIC16F877 inovadora porque permite: 1. 2. Implementar o STIM num nico circuito integrado. Estender o STIM a 12 canais: oito sensores simples analgicos (um para cada entrada do conversor A/D) e quatro actuadores simples digitais. Escolhido o microcontrolador do STIM, h que pensar num circuito que sirva de base ao prottipo: disso que trata a prxima seco.

36

2.3. Circuito do STIM


O circuito do STIM constitudo pelo microcontrolador PIC16F877 e por alguns componentes de apoio, como ilustra a figura 14. Propositadamente, o circuito no inclui nenhuma electrnica de condicionamento de sinal porque se entendeu que o prottipo deveria ser inteiramente genrico, no dedicado a nenhum tipo de transdutor em particular. Desta forma, o prottipo poder funcionar como base de desenvolvimento para STIMs dedicados, bastando adicionar a electrnica dedicada numa placa parte. Em relao ao microcontrolador PIC16F877, utilizaram-se os pinos de entrada/sada correspondentes s funes de interesse, deixando-se os outros livres para aplicaes futuras. A seleco dos pinos documentada na tabela 10. Relativamente aos componentes de apoio, eles so essencialmente passivos e auxiliam o microcontrolador em seis pontos: 1. 2. 3. As resistncias R1 e R2 e o boto de presso SW1 permitem reinicializar manualmente o microcontrolador. Os condensadores C1 e C2 e o cristal X1 asseguram uma frequncia de relgio de 20 MHz para o microcontrolador. O circuito integrado U2 funciona como buffer entre os portos de sada do microcontrolador e as sadas digitais do STIM. A sua funo proteger os portos do microcontrolador e garantir maior capacidade de corrente para as sadas digitais. 4. 5. 6. Os LEDs D1 a D4 permitem visualizar o estado das sadas digitais do STIM. J1 o conector da interface TII que liga o STIM ao NCAP. Atravs do conector J2 possvel re-programar o microcontrolador sem o retirar do circuito.

37

Vdd

Vdd

R1 47 kOhm

32 11

VDD VDD

OSC2/CLKOUT RA0/AN0 RA1/AN1 RA2/AN2/VREFRA3/AN3/VREF+ RA4/TOCKI RA5/AN4/SS RBO/INT RB1 RB2 RB3 RB4 RB5 RB6 RB7

14 2 3 4 5 6 7 33 34 35 36 37 38 39 40 Vdd 15 16 17 18 23 24 25 26 19 20 21 22 27 28 29 30 8 9 10 U2 SN74AS1034A 12 10 8 6 4 2 14

Entradas Analgicas CHANNEL CHANNEL CHANNEL CHANNEL CHANNEL CHANNEL CHANNEL CHANNEL J2 6 5 4 3 2 1 J1 SCK DIN DOUT NTRIG NIOE NINT NACK POWER NSDET COMMON 1 2 3 4 5 6 7 8 9 Ficha DB9 Macho Metlico (TII) Ficha RJ11 (Programao) 1 2 3 4 5 6 7 8

R2 470 Ohm

2 SW1 (Reset) 1

X1 20 MHz C1 27 pF C2 27 pF

1 13

MCLR/Vpp OSC1/CLKIN

RCO/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL RC4/SDI/SDA RC5/SDO RC6/TX/CK RC7/RX/DT RD0/PSP0 RD1/PSP1 RD2/PSP2 RD3/PSP3 RD4/PSP4 RD5/PSP5 RD6/PSP6 RD7/PSP7 RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7 U1 PIC16F877

Vdd

31 12

Nota: os pinos de U1 esto numerados de acordo com o encapsulamento DIP.

Vss Vss

13 11 9 5 3 1

Sadas Digitais CHANNEL 9 CHANNEL 10 CHANNEL 11 CHANNEL 12

R6 4 * 1 kOhm

R5

R4

R3 Vdd

1 MCLR PGD 40 2 AN0 PGC 39 38 3 AN1 4 AN2 37 5 AN3 PGM 36 6 35 7 AN4 34 8 AN5 33 9 AN6 VDD 32 10 AN7 VSS 31 11 VDD RD7 30 12 VSS RD6 29 13 CLKIN RD5 28 14 CLKOUT RD4 27 15 RX 26 16 TX 25 17 SDO 24 18 SCK SDI 23 19 RD0 RD3 22 20 RD1 RD2 21

D1

D2

D3

D4

Mapa de pinos do PIC16F877 (encapsulamento DIP): ! Entradas analgicas ! Sadas digitais ! Interface TII ! Programao do microprocessador ! Alimentao e relgio ! Pinos livres para aplicaes futuras

Lista de Material: 1 microcontrolador PIC16F877 + base 1 tampo digital SN74AS1034 4 LED 4 resistncia 1 k / 0.25 W 1 resistncia 47 k / 0.25 W 1 resistncia 470 / 0.25 W 2 condensador 27 pF 1 cristal de 20 MHz 1 boto de presso 1 conector RJ11 1 conector DB9 macho com armao metlica barras de terminais, cabos de ligao e afins

Figura 14. Circuito do STIM.

38

Pino # 1 2 3 4 5 7 8 9 10 11, 32 12, 31 13 14 18 19 20 21 22 23 24 27 28 29 30 36 39 40 6 15, 16, 17 25, 26 33, 34, 35 37, 38

Funo MCLR AN0 AN1 AN2 AN3 AN4 AN5 AN6 AN7 VDD VSS CLKIN CLKOUT SCK RD0 RD1 RD2 RD3 SDI SDO RD4 RD5 RD6 RD7 PGM PGC PGD

Descrio Reinicializao do microcontrolador activa a 0 V. Entrada analgica para sensor, canal 1 do STIM. Entrada analgica para sensor, canal 2 do STIM. Entrada analgica para sensor, canal 3 do STIM. Entrada analgica para sensor, canal 4 do STIM. Entrada analgica para sensor, canal 5 do STIM. Entrada analgica para sensor, canal 6 do STIM. Entrada analgica para sensor, canal 7 do STIM. Entrada analgica para sensor, canal 8 do STIM. Alimentao positiva +5 V. Massa. Relgio do microcontrolador Linha DCLK da TII. Linha NIOE da TII. Linha NACK da TII. Linha NTRIG da TII. Linha NINT da TII. Linha DIN da TII. Linha DOUT da TII. Sada digital para actuador, canal 9 do STIM. Sada digital para actuador, canal 10 do STIM. Sada digital para actuador, canal 11 do STIM. Sada digital para actuador, canal 12 do STIM. Estes pinos, em conjunto com o pino 1, permitem programar o microcontrolador sem necessidade de o retirar do circuito.

Pinos livres para aplicaes futuras.

Tabela 10. Utilizao dos pinos do microcontrolador PIC16F877 (encapsulamento DIP).

39

A figura 15 apresenta o desenho da placa de circuito impresso do prottipo. Optou-se por uma placa de face simples porque o circuito do STIM no complexo. O conector J1 do tipo DB9 macho, com armao obrigatoriamente metlica para a ligar a linha COMMOM (desta forma a armao funcionar como o dcimo pino do conector). O conector J2 do tipo RJ11 e as entradas e sadas do prottipo so feitas atravs de barras de terminais com parafusos. A placa utiliza um microcontrolador com encapsulamento PLCC por ser mais compacto.

Figura 15. Placa de circuito impresso do prottipo de STIM: em cima a vista dos componentes, em baixo a vista das pistas.

Definido o circuito do STIM e apresentada uma proposta de circuito impresso, esto criadas as condies para desenvolver e ensaiar o programa do STIM.

40

2.4. Programa do STIM


O programa do STIM tem por objectivo dotar o mdulo de transduo inteligente de funcionalidades que vo alm da simples transduo de energia. Estas funcionalidades suplementares constituem a inteligncia do mdulo e a sua implementao regulada pela norma IEEE 1451.2. Quando se pretende construir um prottipo de STIM, a parte do programa quase sempre a mais complexa, a mais morosa e a mais interessante tambm. Por estas razes, o desenvolvimento do programa deve ser feito num ambiente produtivo e apetrechado com boas ferramentas de depurao de erros. No presente caso, o programa foi desenvolvido em linguagem C utilizando o compilador PICC37, integrado no ambiente de trabalho MPLAB-ICD38. A listagem do programa pode ser consultada no anexo A. A verso actual do programa do STIM implementa todas as funcionalidades obrigatrias da norma IEEE 1451.2, nomeadamente: 1. 2. 3. As funes de escrita e de leitura do STIM apresentadas na tabela 3. Os comandos de canal apresentados na tabela 4. As estruturas meta TEDS e TEDS de canal, j descritas na subseco 2.1.2.

Verses futuras do programa podero ser enriquecidas com funcionalidades opcionais. De referir ainda que o programa foi desenvolvido para 12 canais 8 sensores simples analgicos + 4 actuadores simples digitais mas facilmente extensvel para um nmero diferente de canais (desde que sejam dos mesmos tipos). As pginas que se seguem descrevem o programa do STIM numa perspectiva do geral para o pormenor: comea-se por explicar a utilizao da memria do microcontrolador; segue-se a apresentao do programa principal, e, por ltimo, feita a descrio de cada uma das sub-rotinas.

37

Compilador de C para microprocessadores da famlia PIC, distribudo pela empresa HI-TECH. Para mais informaes consultar www.htsoft.com. Ambiente integrado de desenvolvimento de software para microprocessadores da famlia PIC. Para mais informaes consultar www.microchip.com.

38

41

2.4.1. Mapa de Memria As variveis do programa so guardadas na memria voltil do microcontrolador, dividida em quatro bancos de 128 bytes como ilustra a figura 16. As posies de memria a sombreado esto reservadas para os registos internos do microcontrolador. Os espaos em branco disponveis no banco 0 (endereos 20h a 7Fh) e banco 1 (endereos C0h a Efh) foram deixados livres para o compilador gerir a pilha (stack) e todas as variveis no explicitamente localizadas (as declaradas sem o sufixo @). 00h 32 bytes ... 1Fh 20h 32 bytes 80h 16 bytes ... 9Fh A0h channel0 ... 8 bytes A7h A8h buffers ... 24 bytes BFh C0h 48 bytes ... EFh F0h 16 bytes ... FFh banco 1 100h ... 10Fh 110h 180h 16 bytes ... 18Fh 190h

channels ... 96 bytes

pool ... 96 bytes

96 bytes

...

16 bytes banco 2

7Fh banco 0

16Fh 170h ... 17Fh

1EFh 1F0h 16 bytes ... 1FFh banco 3

Figura 16. Mapa de memria do STIM. Os espaos a preto esto reservados para registos internos do microcontrolador, os espaos a branco so geridos pelo compilador e os espaos a cinzento correspondem a variveis explicitamente localizadas.

No banco 1 foram explicitamente localizadas duas variveis: Varivel channel0 (endereos A0h a A7h) Esta varivel constitui a estrutura de dados do canal 0. A estrutura de dados de um canal engloba os dois registos de estado - standard e auxiliar - e os dois registos para mascarar interrupes - standard e auxiliar.

42

Varivel buffers (endereos A8h a BFh) Vector de 12 variveis onde so guardados os ltimos dados adquiridos ou actuados pelos 12 canais do STIM. O isimo canal tem correspondncia com buffers[i-1],
i=1,2,...12.

No banco 2, nos endereos 110h a 16Fh, reside explicitamente a varivel channels. Trata-se de um vector que contm as estruturas de dados dos canais 1 a 12. O isimo canal tem correspondncia com channels[i-1], i=1,2,...12. No banco 3, nos endereos 190h a 1EFh, reside explicitamente a varivel pool. Esta varivel funciona como rea de transferncia, na medida em que utilizada para armazenar temporariamente todos os bytes que transitam entre o STIM e o NCAP. A memria de programa foi aproveitada para armazenar as estruturas TEDS do STIM. Decidiu-se implementar apenas as estruturas obrigatrias, nomeadamente a estrutura meta TEDS e 12 estruturas TEDS de canal, uma para cada canal do STIM. Sendo estruturas que s podem ser lidas, elas podem ser alojadas na memria de programa sem problemas utilizando a seguinte declarao:
static const unsigned char META_TEDS[76]= { //bytes dos campos que constituem a estrutura TEDS 0x00, 0x00, 0x00, 0x48, //META TEDS length ... //outros campos... 0xD0, 0xE3 //Checksum };

O facto da memria de programa ser a nica estrutura de memria do microcontrolador capaz de albergar dados acima de 1 kbyte, faz dela a nica soluo para armazenar estruturas TEDS. Se as estruturas TEDS tiverem direitos de escrita, recomenda-se a sua implementao numa memria no voltil exterior ao PIC16F877.

43

2.4.2. Programa Principal O programa principal, identificado pela etiqueta main, est implementado como uma mquina de estados. A mquina consiste num ciclo infinito, dentro do qual a varivel de estado state vai tomando diferentes valores, cada valor correspondendo a um estado, de acordo com o seguinte conjunto de intrues:
for(;;){ switch(state){ case 0: ... state = next state; break; case 1: ... state = next state; break; ... case n: ... state = next state; break; } asm("clrwdt"); } //ciclo infinito //verifica a varivel de estado //estado 0 //processa o estado 0 //salta para o prximo estado //estado 1 //processa o estado 1 //prximo estado

//estado n

//refresca o co de guarda

A evoluo da mquina de estados ditada pelo fluxograma da figura 17. As funes


UpdateStatus, Trigger, Read

e Write sero explicadas em detalhe mais frente. Mas

para j, til dar algumas explicaes preliminares: 1. 2. 3. A funo UpdateStatus actualiza os registos de estado de todos os canais, bem como a linha de interrupo NINT. A funo Trigger processa os disparos dos sensores e actuadores. A funo Read responsvel por transferir variveis internas do STIM para o NCAP. A funo avalia o endereo de funo (varivel functionCode) e o endereo do canal (varivel channelNumber) para determinar quais so as variveis alvo de leitura e transfere-as para a rea de transferncia. 4. A funo Write avalia o endereo de funo (varivel functionCode) e o endereo do canal (varivel channelNumber) para calcular o nmero de bytes a escrever (varivel bytesToWrite). A funo verifica ainda se o nmero de bytes recebidos do NCAP est coerente com o nmero de bytes a escrever (n==bytesToWrite?). S no caso da verificao ser afirmativa que a funo transfere os dados da rea de transferncia para as variveis internas do STIM.

44

0 Inicializaes UpdateStatus

1 Espera...

NTRIG activada

15 Trigger

NIOE activada 2 Activa NACK.

3 Espera... byte recebido 4 Guarda endereo de funo. Desactiva NACK.

NIOE desactivada

14

5 Espera... byte recebido 11 Transmite byte. Comuta NACK. n++ Read retorna 0 6 Guarda endereo de canal.

NIOE desactivada

14

7 Comuta NACK.

9 Guarda byte. n++

byte transmitido 12 Espera... NIOE desactivada 13 Desactiva NACK. n==bytesToRead? trama incompleta 14 Desactiva NACK. Reinicializa SPI. Bit de Comando Invlido = 1 trama incompleta Read retorna 1 8 Espera... byte recebido

NIOE desactivada 10 Desactiva NACK. Write trama completa 0 0

trama completa 0

Funo de Leitura

Funo de Escrita

Figura 17. Programa principal do STIM.

45

Basicamente, a mquina de estados assegura a comunicao entre o STIM e o NCAP. Do lado do STIM, as linhas de dados da interface TII (DCLK, DIN e DOUT) so tratadas pelo mdulo SPI que equipa o microcontrolador. De acordo com a bibliografia anexa [11], o mdulo SPI do PIC16F877 engloba circuitos autnomos que transparentemente tratam da transmisso e recepo srie de bytes, ritmada por um relgio externo (modo escravo) ou interno (modo mestre). No presente caso, o mdulo SPI foi programado em modo escravo, sendo o NCAP o responsvel pelo relgio que sincroniza os bits. O mdulo SPI inclui ainda o bit de sinalizao SSPIF, til para controlar a transmisso e a recepo dos bytes: se o bit comutar de '0' para '1' sinal que o byte colocado no registo de transmisso j foi transmitido, ou que um novo byte chegou ao registo de recepo do mdulo. Esclarecido o mecanismo de emiso e recepo de bytes, esto criadas as condies para analisar cada um dos estados da mquina: Estado 0 No estado 0 so feitas as inicializaes de todas as variveis internas do STIM e invocada a funo UpdateStatus para actualizar o seu estado. Estado 1 Trata-se de um estado de espera. Se a linha NIOE for activada, sinal de que o NCAP est a iniciar uma nova trama de dados, ao que o STIM reage avanando para o estado 2. Por outro lado, se a linha NTRIG for activada, o STIM avana para o estado 15 onde ser tratado o disparo gerado pelo NCAP. Estado 2 O STIM informa o NCAP de que est pronto para uma nova trama de dados activando a linha NACK. Estado 3 Estado de espera. Se a linha NIOE for desactivada, isso significa que o NCAP abortou a trama de dados e o STIM evolui para o estado 14. Pelo contrrio, se o NCAP transmitir com sucesso o primeiro byte da trama, o bit SSPIF assume o valor '1' e o STIM evolui para o estado 3.

46

Estado 4 O STIM reinicializa o bit SSPIF a '0' e recolhe o endereo de funo (o byte que encabea todas as tramas de dados). Antes de evoluir para o estado 5, o STIM desactiva a linha NACK como reconhecimento da recepo do byte. Estado 5 Estado de espera idntico ao estado 3. Estado 6 O STIM reinicializa o bit SSPIF a '0' e recolhe o endereo de canal (o segundo byte da trama de dados). Se o endereo de funo for maior ou igual a 128 trata-se de uma operao de escrita e o STIM evolui para o estado 7. Caso contrrio, prepara-se a operao de leitura invocando a funo Read: se esta tiver sucesso (retorno = 0) o STIM avana para o estado 11; caso contrrio, salta para o estado 14. Estado 7 Est-se em plena operao de escrita no STIM. Neste estado, o STIM comuta a linha NACK como reconhecimento de um novo byte recebido e avana para o estado 8. Estado 8 Estado de espera. Se a linha NIOE for desactivada, isso quer dizer que o NCAP encerrou a trama de dados e o STIM segue para o estado 10. Se o STIM receber um novo byte avana para o estado 9. Estado 9 O STIM reinicializa o bit SSPIF a '0' e recolhe o byte recebido para a varivel pool. O contador de bytes recebidos (varivel n) incrementado e o STIM regressa ao estado 7. Estado 10 A trama de dados foi encerrada pelo NCAP. Como reconhecimento do fim da trama, o STIM desactiva a linha NACK. A operao de escrita consumada pela funo Write: se esta tiver sucesso (retorno = 0) o STIM regressa ao estado inicial pronto para nova trama de dados; caso contrrio, o STIM evolui para o estado 14.

47

Os estados 7, 8, 9 e 10 tratam da transferncia de dados do NCAP para o STIM. Nesta transferncia, a varivel pool fundamental: os bytes de dados so a retidos at confirmao de que a trama est completa, s depois so transferidos para o destino final. Este mecanismo de armazenamento temporrio previne que as variveis internas do STIM sejam corrompidas por tramas incompletas, abortadas subitamente pelo NCAP. Estado 11 Est-se em plena operao de leitura do STIM. Neste estado o STIM reinicializa o bit SSPIF a '0' e transfere mais um byte da varivel pool para o NCAP. O contador de bytes transmitidos (varivel n) incrementado e a linha NACK comutada para sinalizar a transmisso. O STIM evolui para o estado 12. Estado 12 Estado de espera. Se a linha NIOE for desactivada, isso quer dizer que o NCAP encerrou a trama de dados e o STIM segue para o estado 13. Caso contrrio, confirmada a transmisso do byte anterior, o STIM regressa ao estado 11 para transmitir um novo byte. Estado 13 A trama de dados foi encerrada pelo NCAP. Como reconhecimento do fim da trama, o STIM desactiva a linha NACK. Se o nmero de bytes transmitidos for coerente com o nmero previsto a priori (n==bytesToRead?), isso quer dizer que o NCAP recebeu a trama de dados completa e o STIM regressa ao estado inicial pronto para nova trama; caso contrrio, a trama foi abortada pelo NCAP e o STIM segue para o estado 14. Os estados 11,12 e 13 tratam da transferncia de dados do STIM para o NCAP. Estado 14 Este estado s invocado se tiverem sido detectadas inconsistncias na trama de dados. Nesse caso, o STIM toma trs medidas cautelares: 1) desactiva a linha NACK para encerrar a trama defeituosa, 2) reinicializa o mdulo SPI para eliminar algum byte residual e 3) activa o bit de comando invlido. O STIM regressa depois ao estado inicial pronto para uma nova trama de dados.

48

Descrito o programa principal, convm agora analisar com mais detalhe as funes Read,
Write, Trigger

e UpdateStatus que completam o programa do STIM. As prximas

subseces so dedicadas a cada uma destas funes.

2.4.3. Funo de Leitura Read A funo Read prepara todas as leituras de dados do STIM para o NCAP. A preparao da leitura consiste no clculo do nmero de bytes a ler (varivel bytesToRead) e na passagem do endereo base dos dados para o programa principal. A, os estados 11 e 12 encarregam-se de incrementar o referido endereo e de transferir o correspondente byte para o NCAP, num processo que se repete at o nmero de bytes transferidos atingir o valor pr-calculado. Na passagem dos dados por endereo distinguem-se duas situaes: 1. As constantes residentes na memria de programa do STIM (p.ex. estruturas TEDS) possuem alinhamento ascendente39, bastando passar o seu endereo para a varivel
ptr2FLASH

do programa principal.

2.

Pelo contrrio, as variveis residentes na memria voltil do STIM esto partida desalinhadas porque possuem alinhamento descendente40. Para garantir a coerncia de alinhamentos, elas so previamente copiadas para a rea de transferncia (varivel
pool),

e durante a cpia, o seu alinhamento corrigido para ascendente. Aps a

correco, o programa principal recebe o endereo da varivel pool. Cada operao de leitura identificada pelo endereo de funo que encabea a trama de dados, o qual guardado na varivel functionCode. O programa do STIM implementa as oito operaes de leitura obrigatrias (j apresentadas na tabela 3):

39

No alinhamento ascendente, os bytes de maior peso residem nos endereos de memria mais baixos, ao passo que os bytes de menor peso residem nos endereos de memria mais altos. Em ingls, este alinhamento conhecido por big endian. No alinhamento descendente, o peso dos bytes desce medida que os endereos de memria diminuem (ao contrrio do alinhamento ascendente). Em ingls, este alinhamento conhecido por little endian.

40

49

Operao de Leitura com Endereo 128 Read Sensor Trata-se de uma operao prevista para todos os sensores (canais 1 a 8) e para o canal 0. O objectivo transferir para o NCAP a amostra recm-adquirida e guardada na memria do canal. No caso da leitura incidir sobre um canal individual, a memria do canal (varivel buffers[i-1], i=1,2,...8) copiada para a rea de transferncia e a varivel
bytesToRead

toma o valor 2. No caso da leitura inicidir sobre o canal 0, so copiadas as toma o valor 82.

memrias de todos os canais (todo o contedo da varivel buffers) e a varivel


bytesToRead

Operao de Leitura com Endereo 130 Read Standard Status Trata-se de uma operao prevista para todos os canais com o objectivo e ler o respectivo registo de estado standard. O registo copiado para a rea de transferncia e a varivel
bytesToRead

toma o valor 2. Aps a leitura, todos os bits de estado so reinicializados a

'0' excepto o bit operacional e o bit de estado auxiliar. Operao de Leitura com Endereo 131 Read Triggered Channel Address Trata-se de uma operao reservada para o canal 0 com o objectivo de ler o endereo do canal sob disparo. O endereo, mantido na varivel target, copiado para a rea de transferncia e a varivel bytesToRead toma o valor 1. Operao de Leitura com Endereo 132 Read Auxiliary Status Trata-se de uma operao prevista para todos os canais com o objectivo e ler o respectivo registo de estado auxiliar. O registo copiado para a rea de transferncia e a varivel
bytesToRead

toma o valor 2. Aps a leitura, todos os bits auxiliares de estado so

reinicializados a '0'. Operao de Leitura com Endereo 133 Read Standard Interrupt Mask Trata-se de uma operao prevista para todos os canais com o objectivo de ler o contedo da respectiva mscara de interrupo standard. O registo copiado para a rea de transferncia e a varivel bytesToRead toma o valor 2.

50

Operao de Leitura com Endereo 134 Read Auxiliary Interrupt Mask Trata-se de uma operao prevista para todos os canais com o objectivo de ler o contedo da respectiva mscara de interrupo auxiliar. O registo copiado para a rea de transferncia e a varivel bytesToRead toma o valor 2. Operao de Leitura com Endereo 135 Read STIM Version Trata-se de uma operao reservada para o canal 0 com o objectivo de ler a verso do STIM. A verso reside na memria de programa na forma de uma constante com o nome
STIM_VERSION.

A leitura consiste simplesmente em passar o endereo de STIM_VERSION

para a varivel ptr2FLASH e atriuir o valor sizeof(STIM_VERSION) varivel


bytesToRead.

Operao de Leitura com Endereo 160 Read TEDS Trata-se de uma operao prevista para todos os canais. O objectivo transferir para o NCAP a estrutura TEDS do canal. No caso da leitura incidir sobre um canal individual, o endereo da estrutura TEDS de canal (varivel CHANNELi_TEDS, i=1,2,...12) passado para a varivel ptr2FLASH. No caso da leitura inicidir sobre o canal 0, passado o endereo da estrutura meta TEDS. Em ambos os casos, a varivel bytesToRead recebe o nmero de bytes da estrutura TEDS em questo. De notar que a funo Read retorna erro para todas as operaes de leitura no implementadas ou cujos endereos de canal no sejam consistentes com a prpria operao. O retorno Read=1 significa o insucesso da operao de leitura e implicar a transio do estado 6 para o estado 14 no programa principal do STIM (figura 17).

2.4.4. Funo de Escrita Write A funo Write realiza todas as operaes de escrita no STIM. As operaes de escrita desenrolam-se em duas fases: na primeira fase, o NCAP transmite bytes que o programa principal do STIM vai armazenando na rea de transferncia; na segunda fase, finda a trama de dados, a funo Write verifica se a trama est completa e procede transferncia definitiva dos dados para as variveis internas do STIM. Este mecanismo bietpico impede que tramas abortadas corrompam o STIM. A integridade da trama de dados verificada comparando o nmero de bytes chegados rea de transferncia (varivel n) com o

51

nmero esperado de bytes (varivel bytesToWrite): se as duas variveis forem diferentes sinal de que o NCAP desistiu da trama, facto que implica o fim imediato da funo
Write

com retorno 1.

O programa do STIM implementa as cinco operaes de escrita obrigatrias (recorde-se a tabela 3): Operao de Escrita com Endereo 0 Write Actuator Trata-se de uma operao prevista para todos os actuadores (canais 9 a 12) e para o canal 0. O objectivo escrever novos valores de actuao nas memrias dos canais visados. Estes novos valores sero as prximas sadas assim que ocorrer um disparo do canal. Os bytes de dados so copiados da rea de transferncia para a memria do canal. Se a escrita incidir sobre um canal individual espera-se bytesToWrite=2. Se a escrita for global, endereada ao canal 0, espera-se bytesToWrite=42. Operao de Escrita com Endereo 1 Write Control Command Trata-se de uma operao prevista para todos os canais com o intuito de os controlar atravs de comandos codificados em 2 bytes. O nmero expectvel de bytes portanto
bytesToWrite=2.

Devem ser distinguidas duas situaes:

Comandos globais endereados ao canal 0 O comando global 0 STIM no operation visa marcar todos os canais do STIM como no operacionais, o que na prtica passa por atribuir o valor '0' ao bit operacional de todos eles. O comando global 1 faz a reinicializao do STIM, o que na prtica consiste em reinicializar os registos de estado e as memrias de todos os canais do STIM. Comandos individuais endereados aos canais 1 a 12 O comando 0 Channel no operation atribui o valor '0' ao bit operacional do canal, marcando-o como no operacional. O comando 1 faz a reinicializao do canal, o que na prtica consiste em reinicializar os seus registos de estado e a sua memria.

52

Operao de Escrita com Endereo 3 Write Triggered Channel Address Trata-se de uma operao reservada para o canal 0 com o objectivo de definir o endereo do canal sob disparo. O STIM espera apenas 1 byte, o qual copiado da rea de transferncia para a varivel target. Operao de Escrita com Endereo 5 Write Standard Interrupt Mask Trata-se de uma operao prevista para todos os canais com o propsito de definir o contedo da mscara de interrupes standard. A mscara ocupa 2 bytes, o que implica
bytesToWrite=2.

A mscara copiada da rea de transferncia para o registo de mscara

standard do canal. Operao de Escrita com Endereo 6 Write Auxiliary Interrupt Mask Trata-se de uma operao prevista para todos os canais com o propsito de definir o contedo da mscara de interrupes auxiliar. A mscara ocupa 2 bytes, o que implica
bytesToWrite=2.

A mscara copiada da rea de transferncia para o registo de mscara

auxiliar do canal. De notar que a funo Write retorna erro para todas as operaes de escrita no implementadas ou cujos endereos de canal no sejam consistentes com a prpria operao. O retorno Write=1 significa o insucesso da operao de escrita e implicar a transio do estado 10 para o estado 14 no programa principal do STIM (figura 17).

2.4.5. Funo de Disparo Trigger A funo Trigger processa os disparos dos sensores e actuadores do STIM. O endereo do canal sob disparo est registado na varivel target. Para sensores simples, a funo
Trigger

implementa a mquina de estados ilustrada na figura 18. A mquina tem o

seguinte comportamento: Estado 0 Tratando-se do disparo de uma entrada analgica, o STIM comea por seleccionar a respectiva entrada do ADC e espera um tempo de aquisio (Tacq) de aproximadamente 20 s para que o condensador de reteno atinja o mesmo potencial que o sinal analgico (o valor de 20 s est documentado em [11]). 53

0 Enderea o ADC. Espera 20 s.

1 Inicia a converso A/D e espera pela sua concluso.

NTRIG activa? sim 2 Activa NACK.

no

Disparo abortado, retorna sem fazer nada.

3 Guarda a amostra na memria do canal disparado.

4 Bit de Reconhecimento de Disparo = 1.

NTRIG activa? no 5 Desactiva NACK.

sim

Figura 18. Disparo de um sensor simples.

Estado 1 D-se incio converso analgica/digital e espera-se pela sua concluso. A converso estar concluda quando o bit ADGO do microcontrolador regressar a '0'. Consumada a converso, o STIM examina a linha NTRIG: se esta tiver sido desactivada sinal que o NCAP abortou o disparo e a funo Trigger retorna imediatamente; caso contrrio, o STIM avana para o estado 2. Estado 2 O STIM reconhece o disparo activando a linha NACK. Estado 3 A amostra digitalizada transferida para a memria do canal disparado. 54

Estado 4 activado o bit de reconhecimento de disparo correspondente ao canal disparado. Estado 5 Depois do NCAP desactivar a linha NTRIG, o STIM encerra o disparo desactivando a linha NACK. Por outro lado, o disparo de um actuador simples passa por transferir a informao contida na memria do canal para a respectiva sada. Com esse objectivo, a funo Trigger implementa a mquina de estados ilustrada na figura 19.

0 Actua a sada digital.

1 Activa NACK.

2 Bit de Reconhecimento de Disparo = 1.

NTRIG activa? no 3 Desactiva NACK.

sim

Figura 19. Disparo de um actuador simples.

A mquina constituda por apenas quatro estados cuja descrio a seguinte: Estado 0 Se o contedo da memria do canal for nulo, a sada assume o valor digital '0', caso contrrio assume o valor digital '1'.

55

Estado 1 O STIM reconhece o disparo activando a linha NACK. Nesta mquina optou-se por no verificar a hiptese de disparo abortado porque o estado 0 to breve que no justifica novo exame linha NTRIG. Estados 2 e 3 Idnticos aos estados 4 e 5 da figura 18. O disparo global (correspondente ao canal 0) cobre todos os canais: primeiro executada a mquina da figura 18 para todos os sensores; depois executada a mquina da figura 19 para todos os actuadores. Por ltimo activado o bit de reconhecimento de disparo do canal 0.

2.4.6. Funo de Actualizao do Estado UpdateStatus A funo UpdateStatus actualiza todos os bits de estado que carecem de ateno contnua. Esto nestas condies os bits de interrupo de todos os canais, a prpria linha de interrupo NINT, bem como o bit operacional do canal 0. Para cada canal, a funo processa o respectivo bit de interrupo segundo o esquema ilustrado na figura 11: bit de interrupo de um canal = (registo de estado standard AND registo de mscara standard AND FFFEh) OR (registo de estado auxiliar AND registo de mscara auxiliar). S depois de se conhecer os bits de interrupo de todos os canais, possvel calcular o estado da linha de interrupo: NINT = NOR dos bits de interrupo de todos os canais.

56

Finalmente, a funo calcula o bit operacional do canal 0. O STIM s est operacional se todos os canais implementados estiverem operacionais: bit operacional do canal 0 = AND dos bits operacionais de todos os canais implementados.

2.4.7. Funo de Inicializao Init A funo Init chamada apenas uma vez no arranque do programa do STIM. O seu papel inicializar todos os componentes do STIM, nomeadamente: Portos Por motivos de segurana e poupana de energia, todos os portos do microcontrolador so inicialmente configurados como entradas, excepto (recorde-se a figura 14): RD1 que excita a linha NACK; RD3 que excita a linha NINT; RD4 a RD7 utilizados como sadas digitais; RC5 que excita a linha DOUT; TII Todas as linhas da TII excitadas pelo STIM devem estar inicialmente desactivadas. A funo Init desactiva explicitamente as linhas NINT e NACK atribuindo-lhes o valor '1'. Conversor Analgico/Digital O ADC do microcontrolador programado para 8 entradas analgicas utilizando as tenses de alimentao Vdd e Vss como tenses de referncia positiva e negativa, respectivamente. Alm disso, os resultados das converses so justificados direita. Variveis Internas do STIM Todas as variveis internas do STIM so inicializadas a 0, excepto: Mscaras de interrupo As mscaras de interrupo de todos os canais tomam o valor inicial FFFFh.

57

Registos de estado Uma vez que todos os canais esto a ser inicializados, o bit de inicializao toma o valor inicial 1. Por outro lado, todos os canais so marcados como operacionais at prova em contrrio, logo, o valor inicial do bit operacional 1. Co de Guarda 41 O STIM possui co de guarda para ultrapassar situaes de bloqueio. O limite de tempo do co de guarda programado para 300 ms, aproximadamente. Em funcionamento normal, o co de guarda nunca invocado porque refrescado entre os estados do programa principal atravs da instruo asm("clrwdt"). Se por qualquer anomalia, o programa bloquear e no refrescar o co de guarda, o microcontrolador automaticamente reinicializado e o programa recomea do incio.

2.5. Concluses
Do que foi exposto neste captulo possvel retirar as seguintes concluses: 1. 2. possvel implementar um STIM com 12 canais num nico circuito integrado de uso geral e de baixo custo como o microcontrolador PIC16F877. As variveis de programa so guardadas na memria voltil do microcontrolador, ao passo que as estruturas TEDS com direitos s de leitura so guardadas na memria de programa. 3. O programa do STIM fecha-se em trs ciclos cuja execuo controlada pelo NCAP: 1) o ciclo de disparo realiza a troca de dados entre os transdutores e o STIM; 2) o ciclo de leitura transfere informao do STIM para o NCAP (endereos de funo 128, 130 a 135 e 160); 3) o ciclo de escrita transfere informao do NCAP para o STIM (endereos de funo 0, 1, 3, 5 e 6).

41

Em ingls, watchdog.

58

No

Sim Leitura do STIM

Nova Mensagem do NCAP?

Sim Escrita no STIM

Sim

Disparo do STIM NCAP NCAP

Transdutores

Figura 20. Viso geral do programa do STIM.

4.

As operaes de escrita desenrolam-se em duas fases: numa primeira fase, os bytes que chegam do NCAP so temporariamente armazenados na varivel pool; numa segunda fase, verifica-se a integridade da informao recebida, e s no caso dela estar correcta, transferida para variveis internas do STIM. Este mecanismo bietpico impede a corrupo do STIM por tramas de dados defeituosas.

5.

O programa do STIM no utiliza interrupes. Isto porque a utilizao de interrupes no implica inevitavelmente um aumento de desempenho, mas implica quase sempre um aumento de complexidade.

59

60

3
Interface de STIM
anterior. Por outro lado, a implementao em LabVIEW justifica-se por duas razes: 1. 2. utilizada.

Captulo

Este captulo descreve a implementao em LabVIEW de uma interface de STIM para PC com ambiente Windows. Recordando o que foi escrito na subseco 1.1.3, a interface de STIM o bloco constituinte do processador de rede (NCAP) que leva a cabo todas as transacs com o mdulo de transduo inteligente (STIM). A construo de raz de uma interface de STIM foi necessria para ensaiar o prottipo de STIM descrito no captulo

O LabVIEW uma ferramenta de programao muito produtiva e cada vez mais A estrutura hierrquica do LabVIEW facilita a criao de instrumentos virtuais e encoraja a organizao destes em bibliotecas. Um instrumento virtual, em ingls Virtual Instrument (VI), funciona como uma funo que recebe argumentos e retorna resultados, mas com a particularidade de ser representada graficamente por um cone. Os VIs agrupados em bibliotecas tm a vantagem de poderem ser re-utilizados em qualquer aplicao de LabVIEW com a facilidade de um clique. Surgiu ento a ideia de criar uma biblioteca a biblioteca STIM driver que integrasse todas as funes da interface de STIM, sendo cada funo representada por um cone como ilustra figura 21.

A biblioteca STIM driver, ao concentrar e encapsular todas as funes da interface de STIM, facilita a manuteno das aplicaes: a qualquer momento e de uma forma simples, podero ser adicionados novos VIs biblioteca, ou alterados os j existentes, sem ser necessrio reconstruir todas as aplicaes que a ela recorram. A biblioteca STIM driver pode ser vista como a ponte para todas as aplicaes que pretendam comunicar com um STIM.

61

Figura 21. Funes da biblioteca STIM driver criada em LabVIEW.

Actualmente, a biblioteca STIM driver inclui apenas as funes de implementao obrigatria previstas na norma IEEE 1451.2 e apresentadas na tabela 3. Verses futuras da biblioteca podero ser enriquecidas com funces opcionais. As prximas seces descrevem a arquitectura da biblioteca STIM driver e os detalhes da sua implementao.

3.1. Implementao da TII


Para que o STIM e o NCAP comuniquem atravs da interface independente do transdutor (TII), necessrio que esta seja implementada em ambos. No captulo 2 foi explicada a implementao da TII no lado do STIM; explica-se agora a implementao da TII no lado do NCAP.

3.1.1. Circuito da TII A interface de STIM utiliza a porta paralela do PC como TII. Esta opo justifica-se pelas seguintes razes: 1. 2. 3. A porta paralela a nica interface original do PC que possui linhas em nmero suficiente para funcionar como TII. A porta paralela capaz de cumprir todos os requisitos temporais e elctricos da TII. A porta paralela equipa todos os PCs em geral, de baixo custo e beneficia de documentao abundante42.

42

Excelente documentao pode ser encontrada em [13], pginas 927 a 941.

62

O registo de dados da porta paralela usado como sada: ele que define o estado das linhas que excitam o STIM; ao invs, o registo de estado usado para ler os sinais provenientes do STIM. Dada a baixa capacidade da porta em fornecer corrente (no mais que 1 mA por linha), desaconselha-se o seu uso para alimentar o STIM. Em alternativa, deve utilizar-se uma fonte de alimentao externa de +5 V referenciada linha COMMON. A figura 22 e a tabela 11 descrevem a utilizao da porta paralela como porto da TII.

Linha da TII DIN DOUT DCLK NIOE NACK NTRIG NINT NSDET POWER COMMON

Actuada por NCAP STIM NCAP NCAP STIM NCAP STIM STIM NCAP NCAP

Porta Paralela Ficha Registo <bit> Centronics Dados <7> Pino 9 Estado <3> Pino 15 Dados <6> Pino 8 Dados <5> Pino 7 Estado <4> Pino 13 Dados <4> Pino 6 Estado <5> Pino 12 Estado <6> Pino 10 Pino 18
Tabela 11. Tabela de ligaes da TII.

Cor Vermelho Laranja Castanho Azul Amarelo Cinzento Violeta Preto Branco Verde

PIC16F877 SDI (pino 23) SDO (pino 24) SCK (pino 18) RD0 (pino 19) RD1 (pino 20) RD2 (pino 21) RD3 (pino 22)

Figura 22. Esquema de ligaes da TII.

63

3.1.2. Programa da TII As funes que actuam sobre a porta paralela com o objectivo desta concretizar a TII foram compiladas numa biblioteca de carregamento dinmico, em ingls Dynamic Link Library (DLL). A biblioteca dinmica, denominada tii.dll, foi desenvolvida em C e foi verificada no sistema operativo Windows 98. No anexo B pode consultar a listagem da
tii.dll, seguindo-se uma breve descrio das funes que a compem:

Funo de Espera Wait Esta funo executa esperas com uma preciso de microsegundos em ambiente Windows. A base de tempo das esperas o temporizador 2 do PC, acedido atravs da primitiva
QueryPerformanceCounter

(primitiva pertencente WIN32 API a interface de

programao do sistema operativo Windows). O temporizador incrementado com uma frequncia fixa de 1.193180 MHz, independente do PC. A funo converte o tempo de espera em contagens do temporizador e espera que as contagens expirem. As esperas servem para temporizar os bits em trnsito na TII. Funo de Escrita de Byte WriteByte Esta funo serializa bytes atravs da porta paralela comeando pelo bit mais significativo. A serializao de um bit feita em duas etapas: Primeira etapa (preparao do bit) O bit colocado na linha DIN com a linha de relgio DCLK a '0'. Assim fica durante meio perodo de relgio.
//LPT: endereo base da porta paralela //byte dddddddd: byte de dados //DIN, DCLK, NIOE, NTRIG = d001 //escrita no registo de dados da porta paralela _outp(LPT, byte & 0x80 | 0x10); Wait(bitHalfPeriod); //espera meio perodo de relgio

Segunda etapa (despacho do bit) A linha de relgio DCLK transita de '0' para '1' para sincronizar o bit. Aps a transio, as linhas mantm-se inalteradas durante a segunda metade do perodo de relgio.
//DIN, DCLK, NIOE, NTRIG = d101 _outp(LPT, byte & 0x80 | 0x50); //subida de DLCK para gatilhar o bit de dados Wait(bitHalfPeriod); //segunda metade do perodo de relgio

64

Estas etapas repetem-se oito vezes para os oito bits. As esperas de meio perodo de relgio so levadas a cabo pela funo Wait. O valor da espera passado como argumento, sendo assim possvel variar a velocidade da comunicao.

DIN DCLK Perodo de relgio (varivel) Figura 23. Diagrama temporal da funo WriteByte.

Funo de Leitura de Byte ReadByte Esta funo l os bits que chegam em srie do STIM, a comear pelo bit mais significativo. Os bits recebidos tm de ser deslocados segundo o seu peso para reconstruir o byte de dados. A recepo de um bit feita em duas etapas: Primeira etapa (preparao do bit) A linha de relgio DCLK colocada a '0' e assim mantida durante meio perodo de relgio. Durante esse lapso de tempo o STIM coloca o bit de dados na linha DOUT. Segunda etapa (despacho do bit) A linha de relgio DCLK transita de '0' para '1' para sincronizar o bit. O bit lido no registo de estado da porta paralela, deslocado na proporo do seu peso e guardado. A linha DCLK permanece a '1' durante a segunda metade do perodo de relgio. Estas etapas repetem-se oito vezes para os oito bits. Funo de Escrita de Trama WriteFrame Esta funo transmite uma trama de bytes para o STIM. Os bytes so transmitidos individualmente atravs da funo WriteByte. A transmisso da trama compreende cinco etapas:

65

Primeira etapa (cumprimento do tempo de silncio, Tlat) Antes de iniciar uma nova trama de dados, o NCAP tem de cumprir um tempo mnimo de espera entre tramas consecutivas, denominado tempo de silncio Tlat (tabela 9, subseco 2.1.3). Esta latncia implementada pelo seguinte ciclo:
//Tempo de Silncio em ms dt = latency * 1000; //GetTickCount: funo que retorna o relgio do sistema em ms //*NIOE_Negated: instante da ltima subida da linha NIOE em ms //o ciclo s acaba aps o Tempo de Silncio... do {} while(GetTickCount() - *NIOE_Negated < dt);

Segunda etapa (transmisso do endereo de funo) O NCAP d incio trama de dados activando a linha NIOE e esperando que o STIM active a linha NACK como reconhecimento. Ultrapassado este dilogo inicial, o NCAP transmite o primeiro byte da trama contendo o endereo de funo:
//function: endereo de funo //bitHalfPeriod: espera de meio perodo de relgio WriteByte(LPT, function, bitHalfPeriod);

Terceira etapa (transmisso do endereo de canal) O NCAP espera que o STIM comute a linha NACK como reconhecimento do endereo de funo. De seguida, transmite o segundo byte da trama contendo o endereo de canal:
//channel: endereo de canal WriteByte(LPT, channel, bitHalfPeriod);

Quarta etapa (transmisso dos bytes de dados) A transmisso dos bytes de dados desenrola-se em ciclo. Em cada iterao, o NCAP espera que o STIM comute a linha NACK em reconhecimento do byte anterior, para imediatamente transmitir o byte seguinte:
for (i=0; i < bytesToWrite; i++){ //espera pela comutao da linha NACK ... //data: vector de bytes a transmitir WriteByte(LPT, data[i], bitHalfPeriod); }

//transmite byte seguinte

Quinta etapa (encerramento da trama) Para encerrar a trama de dados o NCAP desactiva a linha NIOE e espera que o STIM desactive a linha NACK.

66

Funo de Leitura de Trama ReadFrame Esta funo l uma trama de bytes do STIM. A leitura dos sucessivos bytes que chegam feita pela funo ReadByte. A leitura de uma trama desenrola-se em cinco etapas: Primeira etapa (cumprimento do tempo de silncio, Tlat) Idntica primeira etapa da funo WriteFrame. Segunda etapa (transmisso do endereo de funo) Idntica segunda etapa da funo WriteFrame. Terceira etapa (transmisso do endereo de canal) Idntica terceira etapa da funo WriteFrame. Quarta etapa (leitura dos bytes de dados) A leitura dos bytes de dados desenrola-se em ciclo: em cada iterao, depois do STIM comutar a linha NACK como sinal de novo byte disponvel, o NCAP l-o de imediato:
for (i=0; i < bytesToRead; i++){ //espera pela comutao da linha NACK ... //data: vector que acolhe os bytes recebidos data[i] = ReadByte(LPT, bitHalfPeriod); //l novo byte }

Quinta etapa (encerramento da trama) Idntica quinta etapa da funo WriteFrame. De referir que todas as confirmaes do STIM tm limites mximos de tempo, referidos como alarmes na subseco 2.1.3. Se houver uma falha de comunicao entre o STIM e o NCAP que faa expirar um alarme, as funes WriteFrame e ReadFrame retornam erro. Os erros so diferenciados consoante o alarme violado como apresenta a tabela 12:

Retorno 0 1 2

Erro Nenhum Tempo de confirmao (Th) expirado. Tempo de confirmao final (Ths) expirado.

Tabela 12. Erros reportados pelas funes WriteFrame e ReadFrame.

67

Resta dizer que as funes ReadFrame e WriteFrame registam o instante em que a linha NIOE desactivada marcando o fim da trama. Este instante a referncia temporal das latncias tempo de silncio (Tlat) e tempo de preparao de escrita (Tws). Funo de Disparo Trigger Esta funo provoca o disparo do STIM. O disparo desenrola-se em trs etapas: Primeira etapa (cumprimento do perodo de amostragem, Tsp) Antes de um novo disparo, o NCAP tem de cumprir um tempo mnimo de espera entre disparos consecutivos, denominado perodo de amostragem Tsp (tabela 9, subseco 2.1.3). O cdigo para cumprir esta latncia o seguinte:
//perodo de amostragem em ms dt = samplePeriod * 1000; //*NTRIG_Asserted: instante da ltima descida da linha NTRIG em ms //o ciclo s acaba aps o perodo de amostragem... do {} while(GetTickCount() - *NTRIG_Asserted < dt);

Segunda etapa (ordem de disparo) O NCAP ordena o disparo activando a linha NTRIG e espera que o STIM active a linha NACK como reconhecimento. Terceira etapa (encerramento de disparo) O NCAP desactiva a linha NTRIG e espera que o STIM desactive a linha NACK. Todas as confirmaes do STIM tm limites mximos de tempo (alarmes), aps os quais a funo Trigger retorna os erros representados na tabela 13:

Retorno 0 2 3

Erro Nenhum Tempo de confirmao final (Ths) expirado. Tempo de actualizao (Tu) expirado.
Tabela 13. Erros reportados pela funo Trigger.

De referir ainda que a funo Trigger regista os instantes em que as linhas NTRIG e NACK so activadas. Estes instantes so as referncias temporais das latncias perodo de amostragem (Tsp) e tempo de preparao de leitura (Trs), respectivamente.

68

Funo de Escrita num Actuador WriteActuator Esta funo escreve novos valores nas sadas actuadoras do STIM. A actualizao dos actuadores e o subsequente disparo decorre em trs etapas: Primeira etapa (escrita dos novos valores de actuao) Os novos valores de actuao so escritos pela funo WriteFrame:
//endereo de funo = 0 de acordo com a tabela 3 //triggeredChannel: endereo do canal em actualizao //data: vector de bytes contendo os valores de actuao //bytesToWrite: nmero de bytes a transmitir para o STIM //latency, holdTime e handshakeTime: latncias a cumprir //NIOE_Negated: referncia temporal para o tempo de silncio //baudRate: velocidade da comunicao (valor nominal) WriteFrame(LPT, 0, triggeredChannel, data, bytesToWrite, latency, holdTime, handshakeTime, NIOE_Negated, baudRate);

Segunda etapa (cumprimento do tempo de preparao de escrita, Tws) O NCAP tem de cumprir um tempo mnimo de espera entre a escrita dos novos valores de actuao e o seu disparo. O cumprimento desta latncia, conhecida por tempo de preparao de escrita Tws (tabela 9, subseco 2.1.3), faz-se invocando a funo Wait:
Wait(writeSetupTime);

Terceira etapa (disparo) Os novos valores de actuao so finalmente enviados para as sadas atravs da funo Trigger:
//samplePeriod, updateTime e handshakeTime: latncias a cumprir //NTRIG_Asserted: referncia temporal para o perodo de amostragem //NACK_Asserted: referncia temporal para o tempo de preparao de leitura Trigger(LPT, samplePeriod, updateTime, handshakeTime, NTRIG_Asserted, NACK_Asserted);

Funo de Leitura de um Sensor ReadSensor Esta funo adquire novas amostras do STIM. A aquisio implica o disparo e a leitura dos sensores, aces levadas a cabo por esta ordem e que se prolongam por trs etapas: Primeira etapa (disparo) O STIM disparado para adquirir novas amostras dos sensores. O disparo idntico ao da funo WriteActuator.

69

Segunda etapa (cumprimento do tempo de preparao de leitura, Trs) O NCAP tem de esperar que o STIM processe as novas amostras e as disponibilize para leitura. Esta espera obrigatria, conhecida por tempo de preparao de leitura Trs (tabela 9, subseco 2.1.3) cumprida pela funo Wait:
Wait(readSetupTime);

Terceira etapa (leitura das novas amostras) As novas amostras so lidas pela funo ReadFrame:
//endereo de funo = 128 de acordo com a tabela 3 //triggeredChannel: endereo do canal recm-disparado //data: vector de bytes preenchido com as novas amostras //bytesToRead: nmero de bytes a ler do STIM //latency, holdTime e handshakeTime: latncias a cumprir //NIOE_Negated: referncia temporal para o tempo de silncio //baudRate: velocidade da comunicao (valor nominal) ReadFrame(LPT, 128, triggeredChannel, data, bytesToRead, latency, holdTime, handshakeTime, NIOE_Negated, baudRate);

Os retornos das funes WriteActuator e ReadSensor so a reunio dos cdigos constantes nas tabelas 12 e 13. Funo de Leitura de Estruturas TEDS ReadTEDS Esta funo l estruturas TEDS do STIM. Dado que o tamanho da estrutura no conhecido a priori, o processo de leitura um pouco mais complexo, repartido em sete etapas: Primeira etapa (cumprimento do tempo de silncio, Tlat) Idntica primeira etapa da funo WriteFrame. Segunda etapa (transmisso do endereo de funo) Idntica segunda etapa da funo WriteFrame. Terceira etapa (transmisso do endereo de canal) Idntica terceira etapa da funo WriteFrame. Quarta etapa (leitura do nmero de bytes da estrutura TEDS) Como se pode confirmar na subseco 2.1.2, todas as estruturas TEDS so encabeadas pelo campo length que contm o tamanho da estrutura em bytes. O

70

campo length compreende 4 bytes que tm de ser lidos e ponderados para formar um nmero inteiro de 32 bits sem sinal:
for (i=0; i < 4; i++){ //espera pela comutao da linha NACK ... //calcula o tamanho da estrutura TEDS length += ReadByte(LPT, bitHalfPeriod) * pow(256, 3-i); }

S depois do campo length ser interpretado que se sabe o nmero de bytes a ler. Quinta etapa (leitura da restante estrutura TEDS) Leitura de bytes em ciclo, semelhana da quarta etapa da funo ReadFrame. Sexta etapa (deteco de erros) Concluda a leitura da estrutura TEDS, calculada a soma em complemento para um de todos os bytes lidos (tambm conhecida por soma de erro). Se a soma calculada diferir do campo checksum includo na prpria estrutura, sinal que ocorreram erros na leitura, situao assinalada com retorno 3. Stima etapa (encerramento da trama) Idntica quinta etapa da funo WriteFrame. Durante a sua execuo, a funo ReadTEDS est atenta aos alarmes de tempo e a eventuais inconsistncias dos bytes lidos. Deste processo de vigilncia podem resultar os erros patentes na tabela 14:

Retorno 0 1 2 3

Erro Nenhum Tempo de confirmao (Th) expirado. Tempo de confirmao final (Ths) expirado. Soma de erro inconsistente (sinnimo de erros na leitura da estrutura TEDS).
Tabela 14. Erros reportados pela funo ReadTEDS.

71

3.2. Biblioteca STIM Driver


A biblioteca STIM driver foi realizada em LabVIEW verso 6.1. No anexo C est reunida a documentao dos VIs que integram a biblioteca, incluindo um tutorial de utilizao e uma aplicao modelo. Trata-se de funes de nvel intermdio que se situam entre a aplicao em LabVIEW e a biblioteca dinmica (DLL). Com esta arquitectura, os pormenores de baixo nvel (os referentes interface TII) so tratados pela DLL, ao mesmo tempo que so ocultados pela biblioteca STIM driver. Desta forma, aumenta-se a produtividade do programador de LabVIEW que fica livre para criar aplicaes de alto nvel. As pginas que se seguem so dedicadas descrio de duas funes exemplares da biblioteca STIM driver. Para simplificar o texto, ser usada a abreviatura DLL como sinnimo da biblioteca dinmica tii.dll.

Atravs desta funo, o NCAP pode enviar ordens de comando a um canal do STIM. Os comandos, j apresentados na tabela 4, so codificados em dois bytes e so transmitidos para o STIM atravs da funo WriteFrame, como ilustra a figura 24.

Figura 24. Extracto da funo WriteControlCommand.vi.

A chamada DLL feita pela funo Call Library Function Node com os argumentos de entrada descritos na tabela 15:

72

Argumento
LPT

Descrio

Endereo da porta paralela. function=1 Endereo da funo Write Control Command (tabela 3). channel Endereo do canal a que se destina o comando. data Dados a transmitir para o STIM (vector de 2 bytes contendo o comando). Uma das primeiras aces do NCAP aps latency Tempo de silncio (Tlat) detectar o STIM ler a sua estrutura meta holdTime Tempo de confirmao (Th) TEDS atravs da funo ReadTEDS.vi. Acabada a leitura, o NCAP fica na posse handshakeTime Tempo de confirmao final (Ths) de todas as restries temporais do STIM Dbito binrio (nominal) e guarda-as na varivel global baudRate entre o STIM e o NCAP. para posterior utilizao. Varivel global onde registado o instante em que a linha NIOE desactivada. NIOE_Negated Este instante a referncia temporal das latncias tempo de silncio (Tlat) e tempo de preparao de escrita (Tws).
Tabela 15. Argumentos da funo WriteFrame.

As restantes funes de escrita no STIM resumem-se chamada da funo WriteFrame, tal como feita na figura 24, mas com os argumentos correspondentes funo em causa (a nica excepo a funo WriteActuator.vi que chama directamente a funo
WriteActuator

da DLL).

Esta funo retorna o registo de estado standard de um canal do STIM. O referido registo ocupa dois bytes e lido atravs da funo ReadFrame, como ilustra a figura 25.

Figura 25. Extracto da funo ReadStandardStatus.vi.

73

A chamada DLL feita pela funo Call Library Function Node com os argumentos de entrada descritos na tabela 16:

Argumento
LPT

Descrio

Endereo da porta paralela. function=130 Endereo da funo Read Standard Status (tabela 3). channel Endereo do canal que est a ser lido. Dados lidos do STIM data (vector preenchido com os 2 bytes do registo standard do canal). Uma das primeiras aces do NCAP aps latency Tempo de silncio (Tlat) detectar o STIM ler a sua estrutura meta holdTime Tempo de confirmao (Th) TEDS atravs da funo ReadTEDS.vi. Acabada a leitura, o NCAP fica na posse handshakeTime Tempo de confirmao final (Ths) de todas as restries temporais do STIM Dbito binrio (nominal) e guarda-as na varivel global baudRate entre o STIM e o NCAP. para posterior utilizao. Varivel global onde registado o instante em que a linha NIOE desactivada. NIOE_Negated Este instante a referncia temporal das latncias tempo de silncio (Tlat) e tempo de preparao de escrita (Tws).
Tabela 16. Argumentos da funo ReadFrame.

As restantes funes de leitura do STIM resumem-se chamada da funo ReadFrame, tal como feita na figura 25, mas com os parmetros correspondentes funo em causa (as nicas excepes so as funes ReadSensor.vi e ReadTEDS.vi que chamam directamente as suas funes homnimas da DLL). A biblioteca STIM driver composta por mais funes de escrita e de leitura como ilustra a figura 21, mas a sua descrio redundante. Isto porque todas elas, semelhana das funes WriteControlCommand.vi e ReadStandardStatus.vi, no passam de conchas 43 que cobrem as funes da DLL no sentido de lhes dar uma interface amigvel em LabVIEW. A biblioteca STIM driver contm um conjunto de variveis que, por terem um significado comum a todas as funes, foram tornadas globais. Este mecanismo facilita a partilha de

43

Em ingls, shells.

74

dados entre funes e evita conexes adicionais entre os diferentes VIs. A tabela 17 apresenta a lista das variveis globais e faz a descrio de cada uma delas.

Endereo da porta paralela. Endereo do canal sob disparo. Instante em que a linha NIOE foi pela ltima vez desactivada. Este instante marca o fim da ltima trama e a referncia temporal para as latncias tempo de silncio (Tlat) e tempo de preparao de escrita (Tws). Instante em que a linha NTRIG foi pela ltima vez activada. Este instante marca o incio do ltimo disparo e a referncia temporal para a latncia perodo de amostragem (Tsp). Instante em que a linha NACK foi pela ltima vez activada. Este instante marca o reconhecimento do disparo e a referncia temporal para a latncia tempo de preparao de leitura (Trs). A funo ReadTEDS.vi armazena nesta varivel a estrutura meta TEDS do STIM. Ficam aqui registadas todas as caractersticas gerais do STIM (as correspondentes ao canal 0). A funo ReadTEDS.vi armazena nesta varivel as estruturas TEDS de canal de todos os canais implementados no STIM. Ficam aqui registadas as caractersticas particulares de todos os canais do STIM (excepto o canal 0).
Tabela 17. Variveis globais da biblioteca STIM driver.

Os erros retornados pelas funes da biblioteca STIM driver devem-se a violaes de alarmes temporais e a inconsistncias de dados, como mostra a tabela 18. Os erros foram codificados a partir do cdigo 5000 44, devendo ser interceptados e tratados com a funo
ErrorHandler.vi

includa na biblioteca STIM driver.

A biblioteca STIM driver inclui ainda a funo SRQ.vi, cujo objectivo vigiar45 a linha de interrupo NINT. A vigilncia consiste simplesmente em ler o bit 5 do registo de estado da porta paralela (recorde-se a figura 22). Desta forma, o NCAP pode detectar pedidos de servio provenientes do STIM, em ingls Service ReQuests (SRQs), e trat-los adequadamente com cdigo dedicado.

44 45

Na zona dos user codes de acordo com [14]. Em ingls, pooling.

75

Retorno 0 5001 5002 5003 5004

Erro Nenhum Tempo de confirmao (Th) expirado. Tempo de confirmao final (Ths) expirado. Tempo de Actualizao (Tu) expirado. Endereo do canal sob disparo inconsistente.

Descrio Os alarmes da comunicao entre o STIM e o NCAP foram ultrapassados, facto que indicia quebra de ligao. O retorno da funo
ReadTriggeredChannelAddress.vi

diferente do valor registado na varivel global . A funo ReadTEDS.vi detectou erros na estrutura TEDS lida.

5005

Soma de erro inconsistente.

Tabela 18. Erros reportados pelas funes da biblioteca STIM driver.

3.3. Concluses
Do que foi exposto neste captulo possvel retirar as seguintes concluses: 1. A biblioteca STIM driver o conjunto mnimo de funes que implementa uma interface de STIM em LabVIEW. A interface de STIM o bloco constituinte do NCAP que interage com o STIM. 2. A biblioteca STIM driver utiliza a porta paralela do PC como interface independente do transdutor (TII). O registo de dados da porta excita as linhas com destino ao STIM, enquanto que o registo de estado utilizado para ler as linhas provenientes do STIM. A porta paralela est preparada para variar a velocidade de comunicao entre o STIM e o NCAP. 3. A interface de STIM constituda por duas camadas de programa. A camada de baixo nvel, desenvolvida em C e compilada numa DLL, trata dos acessos porta paralela. A camada de alto nvel foi desenvolvida em LabVIEW e deu origem biblioteca STIM driver: o seu objectivo ocultar os acessos TII e libertar o programador para criar aplicaes de alto nvel em LabVIEW. A figura 26 ilustra a estrutura hierrquica da interface de STIM. 4. A biblioteca STIM driver, ao transportar o STIM para dentro de um ambiente de desenvolvimento to poderoso como o LabVIEW, alarga extraordinariamente a capacidade de processamento, edio e apresentao de dados. De realar tambm que a biblioteca STIM driver constitui uma ferramenta til para ensaiar STIMs em fase de

76

desenvolvimento, tendo sido esse o principal motivo da sua criao no mbito deste trabalho.

Figura 26. Estrutura da interface de STIM para LabVIEW.

77

78

4
Demonstrao de Resultados
quantitativamente o desempenho do conjunto nas seguintes vertentes: 1. 2. 3. 4. Ritmos de aquisio e de actuao. rede (NCAP). Qualidade do canal de digitalizao do mdulo de transduo inteligente . Fiabilidade geral do conjunto e conformidade com o modelo IEEE 1451.

Captulo

Este captulo descreve os ensaios a que foram sujeitos o mdulo de transduo inteligente (STIM) e a interface de STIM para PC (biblioteca STIM driver). O objectivo avaliar

Robustez da comunicao entre o mdulo de transduo inteligente e o processador de

Para o efeito, foram realizados seis ensaios experimentais identificados de A a F.

4.1. Ensaio A Ritmo de Aquisio


O ensaio A tem por objectivo avaliar o ritmo de aquisio do STIM em funo da velocidade de comunicao entre o STIM e o NCAP. Ideia O ensaio consistir em simular o NCAP no PC atravs de um programa que dar ordens ao STIM para adquirir um nmero exacto de amostras. Contabilizando o tempo de execuo do programa possvel determinar o ritmo de aquisio: (1) " Ritmo de Aquisio" = " Nmero de Amostras Adquiridas" "Tempo de Execuo"

[amostras / s].

79

Sero feitos ensaios com vrias velocidades de comunicao entre o STIM e o NCAP para ver em como isso afecta o ritmo de aquisio. Em todos os ensaios, as latncias da TII sero anuladas e a carga computacional no PC ser reduzida ao mnimo indispensvel: nestas condies, o ritmo de aquisio aproximar-se- do mximo possvel. Material Computador Pentium III, 450 MHz, 96 Mbytes de RAM, com sistema operativo Windows 98. No computador ser executado o programa que simula o NCAP. Prottipo de STIM com frequncia de relgio igual a 4 MHz, o que equivale a 1 s/instruo. Cabo TII blindado com comprimento inferior a 2 m. Outros cabos de ligao e afins.

Esquema de Ligaes

Figura 27. Esquema do ensaio A.

Programas No computador foi implementado o programa que simula o NCAP. Trata-se de um programa desenvolvido em LabVIEW que utiliza a biblioteca STIM driver para comunicar com o STIM. Como argumentos de entrada, o programa recebe a velocidade de comunicao entre o STIM e o NCAP, bem como o endereo do canal a disparar. Como resposta, o programa retorna o tempo que demorou a executar um ciclo de aquisio de 10 000 amostras, os valores das amostras de 10 bits, e ainda o estado da comunicao com o STIM. A listagem do programa apresentada no anexo D e auto-explicativa. Em jeito de resumo, pode dizer-se que o programa realiza as seguintes tarefas pela seguinte ordem: 1. 2. Anula as latncias da TII para maximizar o ritmo de aquisio. Enderea o canal a disparar (funo WriteTriggeredChannelAddress). 80

3. 4.

Executa um ciclo de 10 000 aquisies (funo ReadSensor). Calcula a durao temporal das aquisies (funo TickCount).

O STIM executa o programa descrito no captulo 2. Procedimentos Experimentais Os procedimentos experimentais obedeceram seguinte metodologia: 1. 2. 3. 4. 5. 6. Foi montado o esquema da figura 27. Deu-se incio execuo autnoma do STIM. Foram encerrados todos os programas em execuo no PC. O programa do NCAP foi lanado e esperou-se pela sua concluso. Foram registadas as indicaes do programa do NCAP, em particular a durao temporal das 10 000 aquisies e eventuais erros na comunicao entre o STIM e o NCAP. Repetiram-se os pontos (4) e (5) para diferentes velocidades de comunicao entre o STIM e o NCAP. Observaes As indicaes do programa do NCAP esto patentes na tabela 19 e na figura 28. Durante os procedimentos experimentais no foi detectada qualquer falha de comunicao entre o STIM e o NCAP. Concluses Dos resultados obtidos possvel retirar as seguintes concluses: 1. 2. Como seria de esperar, o ritmo de aquisio sobe com o aumento da velocidade de comunicao entre o STIM e o NCAP. A subida tem um comportamento quase linear para velocidades de comunicao baixas e tende a saturar para velocidades mais elevadas. Este facto evidencia uma carga computacional fixa, independente da comunicao entre o STIM e o NCAP, que condiciona o ritmo de aquisio de forma dominante para velocidades de comunicao elevadas. 3. O STIM suporta ritmos de aquisio de pelo menos 160 amostras/s.

81

Ensaio 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

Dbito Binrio Nominal STIM/NCAP [kbit/s] 6 7 8 9 10 12 14 17 20 25 30 40 50 60 70 80 90 100

Durao do Ensaio [ms] 111986 103578 97894 94661 89852 85301 81333 78672 75744 72939 70549 67651 65407 64932 64920 64881 63587 62357

Ritmo de Aquisio [amostras/s] 89 97 102 106 111 117 123 127 132 137 142 148 153 154 154 154 157 160

Tabela 19. Resultados do ensaio A.

Ritmo de Aquisio
170 160 150 Amostras/s 140 130 120 110 100 90 80 0 20000 40000 60000 80000 100000 Dbito Binrio Nominal [bit/s]

Figura 28. Ritmo de aquisio em funo da velocidade de comunicao entre o STIM e o NCAP.

82

4.2. Ensaio B Ritmo de Actuao


O ensaio B tem por objectivo avaliar o ritmo de actuao do STIM em funo da velocidade de comunicao entre o STIM e o NCAP. Ideia O ensaio consistir em simular o NCAP no PC atravs de um programa que dar ordens ao STIM para efectuar um nmero exacto de actuaes. Contabilizando o tempo de execuo do programa possvel determinar o ritmo de actuao: (2) " Ritmo de Actuao" = " Nmero de Actuaes" "Tempo de Execuo"

[actuaes / s].

Sero feitos ensaios com vrias velocidades de comunicao entre o STIM e o NCAP para ver em como isso afecta o ritmo de actuao. Em todos os ensaios, as latncias da TII sero anuladas e a carga computacional no PC ser reduzida ao mnimo indispensvel: nestas condies, o ritmo de actuao aproximar-se- do mximo possvel. Material Computador Pentium III, 450 MHz, 96 Mbytes de RAM, com sistema operativo Windows 98. No computador ser executado o programa que simula o NCAP. Prottipo de STIM com frequncia de relgio igual a 4 MHz, o que equivale a 1 s/instruo. Cabo TII blindado com comprimento inferior a 2 m. Outros cabos de ligao e afins.

Esquema de Ligaes

Figura 29. Esquema do ensaio B.

83

Programas No computador foi implementado o programa que simula o NCAP. Trata-se de um programa desenvolvido em LabVIEW que utiliza a biblioteca STIM driver para comunicar com o STIM. Como argumentos de entrada, o programa recebe a velocidade de comunicao entre o STIM e o NCAP, bem como o endereo do canal a disparar. Como resposta, o programa retorna o tempo que demorou a executar um ciclo de 10 000 actuaes, e ainda o estado da comunicao com o STIM. A listagem do programa apresentada no anexo E e auto-explicativa. Em jeito de resumo, pode dizer-se que o programa realiza as seguintes tarefas pela seguinte ordem: 1. 2. 3. 4. Anula as latncias da TII para maximizar o ritmo de actuao. Enderea o canal a disparar (funo WriteTriggeredChannelAddress). Executa um ciclo de 10 000 actuaes (funo WriteActuator). Calcula a durao temporal das actuaes (funo TickCount).

O STIM executa o programa descrito no captulo 2. Procedimentos Experimentais Os procedimentos experimentais obedeceram seguinte metodologia: 1. 2. 3. 4. 5. 6. Foi montado o esquema da figura 29. Deu-se incio execuo autnoma do STIM. Foram encerrados todos os programas em execuo no PC. O programa do NCAP foi lanado e esperou-se pela sua concluso. Foram registadas as indicaes do programa do NCAP, em particular a durao temporal das 10 000 actuaes e eventuais erros na comunicao entre o STIM e o NCAP. Repetiram-se os pontos (4) e (5) para diferentes velocidades de comunicao entre o STIM e o NCAP. Observaes As indicaes do programa do NCAP esto patentes da tabela 20 e na figura 30. Durante os procedimentos experimentais no foi detectada qualquer falha de comunicao entre o STIM e o NCAP.

84

Ensaio 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

Dbito Binrio Nominal STIM/NCAP [kbit/s] 6 7 8 9 10 12 14 17 20 25 30 40 50 60 70 80 90 100

Durao do Ensaio [ms] 94286 88026 83948 81671 78162 74669 71551 69679 67292 64867 63302 61087 59292 58824 58825 58810 58061 57150

Ritmo de Actuao [actuaes/s] 106 114 119 122 128 134 140 144 149 154 158 164 169 170 170 170 172 175

Tabela 20. Resultados do ensaio B.

Ritmo de Actuao
180 170 160 Actuaes/s 150 140 130 120 110 100 0 20000 40000 60000 80000 100000 Dbito Binrio Nominal [bit/s]

Figura 30. Ritmo de actuao em funo da velocidade de comunicao entre o STIM e o NCAP.

85

Concluses Dos resultados obtidos possvel retirar as seguintes concluses: 1. 2. Como seria de esperar, o ritmo de actuao sobe com o aumento da velocidade de comunicao entre o STIM e o NCAP. Tal como no ensaio anterior a subida no linear, o que evidencia uma carga computacional fixa, independente da comunicao entre o STIM e o NCAP, que condiciona o ritmo de actuao de forma dominante para velocidades de comunicao elevadas. 3. O STIM suporta ritmos de actuao de pelo menos 175 amostras/s. Este valor superior ao ritmo de aquisio porque, no ensaio A, o STIM e o NCAP trocam tramas de quatro bytes (endereos de funo e de canal + dois bytes de dados contendo a amostra digitalizada), ao passo que uma actuao exige apenas trs bytes (endereos de funo e de canal + um byte de dados contendo o valor de actuao 0 ou no 0).

4.3. Ensaio C Conformidade da TII


O ensaio C tem por objectivo avaliar a conformidade da interface independente do transdutor (TII) com a norma IEEE 1451.2. Para tal, os sinais da interface sero recolhidos por um osciloscpio e as oscilografias sero comparadas com os diagramas temporais da norma. Ideia O ensaio consistir em registar os sinais mais importantes da TII durante os ensaios A e B. Os sinais a observar sero: NIOE, NTRIG, NACK e DCLK. Como instrumento de observao recorrer-se- a um osciloscpio digital com 4 canais. As oscilografias recolhidas sero analisadas detalhadamente para averiguar a sua conformidade com as especificaes temporais da norma IEEE 1451.2 (captulo 6 de [3]).

86

Material Computador Pentium III, 450 MHz, 96 Mbytes de RAM, com sistema operativo Windows 98. No computador ser executado o programa que simula o NCAP. Prottipo de STIM com frequncia de relgio igual a 4 MHz, o que equivale a 1 s/instruo. Cabo TII blindado com comprimento inferior a 2 m. Osciloscpio digital de quatro canais YOKOGAWA DL1200a. Outros cabos de ligao e afins.

Esquema de Ligaes

Figura 31. Esquema do ensaio C.

Programas Este ensaio utiliza os programas dos ensaios A e B, tanto a nvel do STIM, como a nvel do PC que simula o NCAP.

87

Procedimentos Experimentais Os procedimentos experimentais obedeceram seguinte metodologia: 1. 2. Foi montado o esquema da figura 31. Repetiu-se o ensaio A para uma velocidade de comunicao de 6 kbit/s entre o STIM e o NCAP. Enquanto o STIM e o NCAP comunicavam registaram-se as oscilografias ilustradas nas figuras 32 a 35. 3. Repetiu-se o ensaio B para uma velocidade de comunicao de 6 kbit/s entre o STIM e o NCAP. Enquanto o STIM e NCAP comunicavam registaram-se as oscilografias das figuras 36 a 38. 4. Para ensaiar as temporizaes da TII repetiram-se os ensaios A e B a 6 kbit/s, mas alterando as latncias da interface, uma de cada vez, conforme a tabela 21.

Ensaio A

Perodo de amostragem (Tsp) Tempo de preparao de leitura (Trs) Tempo de silncio (Tlat) Tempo de preparao de escrita (Tws)

40 ms 0 0 0 Figura 39

0 40 ms 0 0

0 0 40 ms 0

0 0 0 40 ms Figura 42

Latncias

Ensaio B

Figura Figura 40 41 Oscilografias

Tabela 21. Alterao das latncias da TII e respectivas oscilografias.

5.

Por ltimo, repetiu-se o ensaio A para uma velocidade de comunicao de 100 kbit/s entre o STIM e o NCAP. Enquanto o STIM e NCAP comunicavam registaram-se as oscilografias das figuras 43 e 44.

88

Observaes As oscilografias observadas encontram-se expostas nas figuras 32 a 44. Em todas elas, os canais 1, 2, 3 e 4 do osciloscpio referem-se aos sinais NIOE, NTRIG, NACK e DCLK, respectivamente. De referir ainda que durante os ensaios nunca foi detectada qualquer falha de comunicao entre o STIM e o NCAP. As figuras 32 a 35 ilustram o dilogo entre o STIM e o NCAP durante o ensaio A executado a 6 kbit/s. Em todas elas, de realar o facto das linhas NIOE e NTRIG nunca estarem simultaneamente activas a 0 V, porque, segundo a norma, no permitido trocar dados com o STIM e dispar-lo ao mesmo tempo. Por outro lado, as figuras dizem respeito a aquisies, logo, em todas elas, o disparo antecede a trama de dados. Na figura 32 so de destacar os seguintes pontos: a) b) c) Disparo do STIM. Perodo de amostragem ligeiramente superior a 10 ms. Troca de bits entre o STIM e o NCAP ao ritmo de 6 kbit/s.

Figura 32. Ensaio A a 6 kbit/s (sensibilidade horizontal = 5 ms/div, sensibilidade vertical = 5 V/div para todos os canais).

89

Na figura 33 possvel analisar alguns pontos com mais detalhe: d) e) f) g) Tempo que o STIM demora a digitalizar uma nova amostra e a actualizar o seu estado interno. Reconhecimento do disparo por parte do STIM. O STIM e o NCAP trocam tramas de quatro bytes, facto que obriga a linha NACK a comutar seis vezes. O mesmo que (e) mas com maior abertura porque o NCAP demorou mais tempo a subir a linha NTRIG.

Figura 33. Ensaio A a 6 kbit/s (sensibilidade horizontal = 2 ms/div, sensibilidade vertical = 5 V/div para todos os canais).

90

A figura 34 foca uma tama de dados entre o STIM e o NCAP: h) i) j) A linha NACK activada a 0 V dando incio ao primeiro byte da trama. A linha NACK desactivada no fim da trama de dados. Demora por parte do STIM em iniciar a trama de dados.

Figura 34. Ensaio A a 6 kbit/s (sensibilidade horizontal = 1 ms/div, sensibilidade vertical = 5 V/div para todos os canais).

91

Por ltimo, a figura 35 ilustra em pormenor o ltimo byte da trama de dados: k) l) m) A linha NACK comutou para 0 V como reconhecimento do ltimo byte da trama mas tem de regressar a +5 V porque a trama de dados terminou. Perodo de relgio prximo de 167 s, o que equivale a 6 kbit/s. Flancos dos oito bits que constituem o ltimo byte da trama.

Figura 35. Ensaio A a 6 kbit/s (sensibilidade horizontal = 200 s/div, sensibilidade vertical = 5 V/div para todos os canais).

92

As figuras 36 a 38 ilustram o dilogo entre o STIM e o NCAP durante o ensaio B executado a 6 kbit/s. As figuras dizem respeito a actuaes, logo, em todas elas, o disparo subsequente trama de dados. Na figura 36 so de destacar os seguintes pontos: a) b) c) Disparo do STIM. Perodo de actuao inferior a 10 ms. Troca de bits entre o STIM e o NCAP ao ritmo de 6 kbit/s.

Figura 36. Ensaio B a 6 kbit/s (sensibilidade horizontal = 5 ms/div, sensibilidade vertical = 5 V/div para todos os canais).

93

A figura 37 permite analisar alguns pontos com mais detalhe: d) e) f) Tempo que o STIM demora a fazer a actuao e a reconhecer o disparo. Reconhecimento do disparo por parte do STIM. O STIM e o NCAP trocam tramas de trs bytes, facto que obriga a linha NACK a comutar quatro vezes.

Figura 37. Ensaio B a 6 kbit/s (sensibilidade horizontal = 2 ms/div, sensibilidade vertical = 5 V/div para todos os canais).

94

Por ltimo, a figura 38 ilustra em pormenor o ltimo byte da trama de dados: g) h) Perodo de relgio prximo de 167 s, o que equivale a 6 kbit/s. Flancos dos oito bits que constituem o ltimo byte da trama.

Figura 38. Ensaio B a 6 kbit/s (sensibilidade horizontal = 200 s/div, sensibilidade vertical = 5 V/div para todos os canais).

95

Para ensaiar as temporizaes realizadas pela biblioteca STIM driver decidiu-se repetir os ensaios A e B a 6 kbit/s, mas alterando as latncias da TII, uma de cada vez, conforme a tabela 21. Recorde-se que a biblioteca STIM driver est dependente dos servios do sistema operativo, facto que dificulta a realizao de temporizaes com elevada exactido. A latncia perodo de amostragem (Tsp) determina a espera obrigatria entre disparos consecutivos. A figura 39 confirma essa espera para Tsp = 40 ms.

Figura 39. Disparos espaados de Tsp = 40 ms (sensibilidade horizontal = 10 ms/div, sensibilidade vertical = 5 V/div para todos os canais).

96

A latncia tempo de preparao de leitura (Trs) determina a espera obrigatria entre o reconhecimento do disparo e a trama de dados subsequente. A figura 40 confirma essa espera para Trs = 40 ms.

Figura 40. Entre o disparo e a trama de dados seguinte verifica-se Trs = 40 ms (sensibilidade horizontal = 10 ms/div, sensibilidade vertical = 5 V/div para todos os canais).

97

A latncia tempo de silncio (Tlat) determina um perodo de silncio obrigatrio entre duas tramas de dados consecutivas. A figura 41 confirma esse silncio para Tlat = 40 ms.

Figura 41. Tramas espaadas de Tlat = 40 ms (sensibilidade horizontal = 10 ms/div, sensibilidade vertical = 5 V/div para todos os canais).

98

A latncia tempo de preparao de escrita (Tws) determina a espera obrigatria entre a trama de dados e o disparo subsequente. A figura 42 confirma essa espera para Tws = 40 ms.

Figura 42. Actuaes pautadas por Tws = 40 ms (sensibilidade horizontal = 10 ms/div, sensibilidade vertical = 5 V/div para todos os canais).

99

Finalmente, para avaliar a agilidade da TII decidiu-se repetir o ensaio A para uma velocidade de comunicao (nominal) de 100 kbit/s. As figuras 43 e 44 apresentam o dilogo entre o STIM e o NCAP nessas condies. Em relao figura 43, so de destacar os seguintes pontos: a) b) A trama de quatro bytes demora agora 1 ms a ser transaccionada, em vez dos 6 ms verificados na figura 32. O perodo de amostragem baixou para 6 ms.

Figura 43. Ensaio A a 100 kbit/s (sensibilidade horizontal = 1 ms/div, sensibilidade vertical = 5 V/div para todos os canais).

100

A figura 44 apresenta a linha de relgio DCLK em pormenor: c) Perodo de relgio prximo de 20 s, o que equivale a 50 kbit/s, mas longe dos 100 kbit/s nominais.

Figura 44. Ensaio A a 100 kbit/s (sensibilidade horizontal = 10 s/div, sensibilidade vertical = 5 V/div para todos os canais).

101

Concluses Dos resultados obtidos possvel retirar as seguintes concluses: 1. Todas as oscilografias esto conformes com a norma IEEE 1451.2, o que demonstra a correcta implementao da interface independente do transdutor, tanto no prottipo de STIM, como na biblioteca STIM driver. 2. Os pontos notveis (e) e (g) da figura 33 demonstram o comportamento aleatrio das temporizaes do NCAP. que estando a correr em PC com sistema operativo Windows 98, o NCAP no domina os recursos da mquina, tendo de se sujeitar aos servios do sistema operativo que por natureza no tm um comportamento temporal determinstico. Mas dado que o NCAP o mestre da comunicao com o STIM, este comportamento aleatrio no compromete a integridade da TII, apenas atrasa a resposta do NCAP. Ao STIM restar esperar at que o NCAP, quando puder, comute a prxima linha do protocolo, e da a comunicao prosseguir sem perturbao. 3. 4. As figuras 39 a 42 demonstram o correcto funcionamento das temporizaes realizadas pela biblioteca STIM driver. As figuras 43 e 44 mostram que possvel variar a velocidade de comunicao entre o STIM e o NCAP. No entanto, verifica-se que a velocidade no atinge o valor nominal de 100 kbit/s, ficando-se pelos 50 kbit/s. Isto deve-se ao facto da biblioteca STIM driver no conseguir realizar temporizaes com resoluo superior a 10 s. 5. A figura 43 mostra que embora a durao da trama de dados tenha baixado para 1 ms, o STIM tem uma carga computacional fixa que o ocupa durante o resto do perodo de amostragem (os restantes 5 ms). Esta carga computacional impede que o ritmo de aquisio aumente na mesma proporo que a velocidade de comunicao, como j foi referido na concluso (2) do ensaio A. O mesmo raciocnio se pode aplicar ao ritmo de actuao, nomeadamente concluso (2) do ensaio B.

102

4.4. Ensaio D Robustez da Comunicao entre o STIM e o NCAP


O ensaio D tem por objectivo quantificar a taxa de erros da comunicao entre o STIM e o NCAP. Este um parmetro importante para avaliar a robustez do prottipo de STIM e da biblioteca STIM driver. Ideia O ensaio D consistir em fazer o eco de um padro de bits: se o padro regressado ao NCAP no coincidir com o valor enviado, sinal que ocorreu (pelo menos) um erro na comunicao. Repetindo o eco muitas vezes possvel que ocorram erros em nmero suficiente para calcular a sua probabilidade de ocorrncia. Na prtica, o NCAP enviar para o STIM um endereo de funo e um endereo de canal, os quais sero ecoados pelo STIM de volta ao NCAP. Os endereos de funo e de canal sero constantes e o processo ser repetido cerca de 10 milhes de vezes. Material Computador Pentium III, 450 MHz, 96 Mbytes de RAM, com sistema operativo Windows 98. No computador ser executado o programa que simula o NCAP. Prottipo de STIM com frequncia de relgio igual a 4 MHz, o que equivale a 1 s/instruo. Cabo TII blindado com comprimento inferior a 2 m. Outros cabos de ligao e afins.

103

Esquema de Ligaes

Figura 45. Esquema do ensaio D.

Programas No computador foi implementado o programa que simula o NCAP e cuja listagem est disponvel no anexo F. Trata-se de um programa desenvolvido em LabVIEW que utiliza a biblioteca STIM driver para comunicar com o STIM. Como argumentos de entrada, o programa recebe apenas a velocidade de comunicao entre o STIM e o NCAP. Como resposta, o programa retorna os ecos do endereo de funo e do endereo de canal, bem como o estado da comunicao e o nmero de erros acumulados. O programa contacta o STIM para este realizar a funo com endereo 144 no canal com endereo 5. A funo 144 foi escolhida por no ser obrigatria (recorde-se a tabela 3), estando portanto disponvel para efeitos de ensaio. O canal 5 foi escolhido por possuir um endereo com 0s e 1s alternados, o que facilita a ocorrncia de erros devido comutao intensiva das linhas de dados da TII. O STIM ecoa os endereos de funo e de canal: se os ecos regressados ao NCAP forem diferentes dos valores originais, registado um erro. No STIM houve apenas que implementar a funo 144 para ecoar os endereos de funo e de canal:
//leituras do STIM int Read(){ ... switch(functionCode){ ... //funo de eco para efeitos de ensaio case 144: pool[0]=functionCode; //eco do endereo de funo pool[1]=channelNumber; //eco do endereo de canal bytesToRead=2; //no. de bytes a enviar para o NCAP break; ... }

104

Procedimentos Experimentais Os procedimentos experimentais obedeceram seguinte metodologia: 1. 2. 3. 4. Foi montado o esquema da figura 45. Deu-se incio execuo autnoma do STIM. Foram encerrados todos os programas em execuo no PC. O programa do NCAP foi lanado a 100 kbit/s (valor nominal) e esperou-se pela sua concluso. A velocidade de comunicao foi maximizada para aumentar a probabilidade de erro e assim se analisar o pior caso. 5. Esperou-se pela concluso dos 10 milhes de ecos (o que demorou cerca de dez horas) e registaram-se as indicaes do NCAP. Observaes O programa do NCAP indicou 0 erros em 10 milhes de tramas de dados. Decidiu-se ento repetir o ensaio D mas com uma variante: depois do programa do NCAP estar em execuo, lanaram-se vrios programas no PC para averiguar o seu impacto na comunicao entre o STIM e o NCAP. Observou-se que a comunicao s era afectada quando os programas terceiros exigiam muitos recursos do PC, sobretudo quando acediam intensamente ao disco rgido. Durante esses acessos, foi usual o programa do NCAP indicar ecos defeituosos. No entanto, os erros cessavam quando os acessos ao disco rgido terminavam, altura em que a comunicao se recompunha e continuava sem problemas. Concluses Dos resultados obtidos possvel retirar as seguintes concluses: 1. Quando o programa do NCAP corre sem concorrncia no PC, a comunicao entre o STIM e o NCAP mostra-se muito robusta, com taxa de erro de trama menor que 1/10 milhes = 10-7. Como cada trama constituda por 32 bits, estima-se que a taxa de erro de bit seja inferior a 1/(3210 milhes) = 3.12510-9. 2. Os erros causados pelo lanamento de programas no PC, concorrentes com o programa do NCAP, tm a seguinte explicao:

105

i. ii.

Suponha-se que o NCAP est a consultar o temporizador 2 para fiscalizar um dos alarmes temporais da comunicao com o STIM. Nessa altura, o sistema operativo interrompe o NCAP e d ordem de execuo a um programa terceiro que acede ao disco rgido (algo que demora sempre alguns milisegundos). Entretanto o temporizador 2 continua a contar...

iii.

Quando o NCAP, por ordem do sistema operativo, retoma a execuo e consulta de novo o temporizador 2, apercebe-se de que j passaram alguns milisegundos desde a ltima consulta. Incorrectamente, o NCAP no se apercebe que esse lapso de tempo se deveu interrupo do sistema operativo; ao invs, o NCAP interpreta esse lapso de tempo como sendo uma falta de resposta do STIM, o que falso, pois h muito que o STIM comutou a linha NACK.

iv.

Se o lapso de tempo for superior ao valor de alarme, o NCAP considera que o STIM abdicou da comunicao e aborta a trama desactivando a linha NIOE. bvio que depois da trama abortada, o STIM no ecoa o cdigo de funo nem o endereo da canal, facto que origina um erro.

Este problema pode ser facilmente resolvido atribuindo valores mais elevados aos alarmes temporais (algumas centenas de milisegundos). de realar que esta situao, a nica de aparente falha, no se fica a dever ao STIM, o que refora a sua robustez. 3. A surgirem erros na comunicao, o STIM no se perde, tendo a capacidade de recuperar a comunicao com o NCAP.

106

4.5. Ensaio E Caracterizao do Canal de Digitalizao do STIM


Este ensaio pretende avaliar a qualidade do canal de digitalizao do STIM em termos do nmero efectivo de bits (nef) e relao sinal/rudo e distoro, em ingls SIgnal-to-Noise And Distortion ratio (SINAD). Ideia A caracterizao do canal de digitalizao ser feita pelo mtodo da adaptao de sinusides46. Este mtodo foi escolhido em detrimento de outros pelos seguintes motivos: 1. 2. O mtodo esttico no foi utilizado por ser bastante mais moroso que todos os outros mtodos de ensaio. O mtodo do histograma no foi utilizado por duas razes principais: por um lado, um mtodo que requer um elevado nmero de amostras, facto que tornaria o ensaio bastante moroso perante o relativamente baixo ritmo de aquisio do STIM; por outro lado, o NCAP baseado na bibloteca STIM driver no garante temporizaes determinsticas (como j foi explicado na concluso (2) do ensaio C), facto que impossibilita um perodo de amostragem constante e coerente47, o que impede a excitao de todos os cdigos do ADC com a mesma probabilidade e contribui negativamente para a exactido do histograma. 3. O mtodo da transformada discreta de Fourier, em ingls Discrete Fourier Transform (DFT), foi tambm posto de parte porque necessita igualmente de um perodo de amostragem constante. 4. O mtodo da adaptao de sinusides no exige um perodo de amostragem constante ou coerente (apenas recomendado). A exactido do mtodo no condicionada mesmo que as amostras tenham um perodo de amostragem aleatrio, desde que estatisticamente sejam em nmero suficiente para excitar todos os cdigos do ADC. De acordo com [15] e [16], um nmero de amostras superior a 2n

46 47

Para conhecer em pormenor este e os outros mtodos de caracaterizao de ADCs, aconselha-se a consulta de [15] e [16]. O perodo de amostragem coerente aquele que garante a excitao de cdigos distintos em ciclos sucessivos da sinuside que excita o ADC.

107

condio necessria para que as amostras tenham uma distribuio de fase uniforme e sejam vlidas para o algoritmo de adaptao. Material Computador Pentium III, 450 MHz, 96 Mbytes de RAM, com sistema operativo Windows 98. No computador ser executado o programa que simula o NCAP. Prottipo de STIM com frequncia de relgio igual a 4 MHz, o que equivale a 1 s/instruo. Cabo TII blindado com comprimento inferior a 2 m. Gerador sinusoidal com distoro harmnica inferior a -60 dB (precisamente o melhor valor possvel para o ADC de 10 bits que equipa o STIM). No presente caso foi utilizado o gerador Sony-Tektronix AFG310 caracterizado por uma distoro harmnica de -70 dB, valor que torna desprezvel o erro por ele introduzido no ensaio. Para mais informaes consulte o anexo G. Outros cabos de ligao e afins.

Esquema de Ligaes

Figura 46. Esquema do ensaio E.

Programas No computador foram implementados dois programas que simulam o NCAP e cujas listagens esto disponveis no anexo G. O programa intitulado Acquisition.vi trata da aquisio das amostras. Cada amostra vem acompanhada do perodo de tempo que a precedeu, sendo possvel, por acumulao, reconstruir o vector dos tempos correspondente ao vector das amostras. Ambos os vectores so guardados em ficheiro para posteriormente serem processados.

108

Um segundo programa, intitulado Processing.vi, recupera os vectores guardados em ficheiro e aplica-lhes um algoritmo de adaptao de sinusides de acordo com [15]. Utilizou-se um algoritmo de quatro parmetros que em caso de convergncia retorna a sinuside que melhor se adapta s amostras segundo o critrio dos mnimos quadrados. A diferena entre as amostras e a sinuside adaptada constitui o rudo introduzido pelo canal de digitalizao, a partir do qual se calcula o nmero efectivo de bits e a SINAD de acordo com as seguintes expresses: ref nef = n log 2 r efi nef : n: ref : refi :

(3)

Nmero efectivo de bits. Nmero de bits do ADC. Valor eficaz do rudo introduzido pelo canal de digitalizao. Valor eficaz do rudo introduzido por um ADC ideal com n bits (para n 8, tem-se refi = Q / 12 onde Q o intervalo de quantificao do conversor ideal). A/ 2 , onde A a amplitude da sinuside de estmulo. ref

(4)

SINAD =

O programa original do STIM (descrito no captulo 2) teve de ser alterado para calcular o intervalo de tempo entre amostras. Para medir tempo, utilizou-se a funcionalidade de captura do temporizador 1 do microcontrolador PIC16F877. A exactido da medida igual resoluo do temporizador, ou seja, cerca de 1 s (coincidente com o perodo de instruo). A captura foi programada para ocorrer no flanco ascendente do pino 17 (CCP1):
void Init(){ ... T1CON=0b00000001; CCP1CON=0b00000101; ... } //inicializaes do STIM //temporizador 1 incrementado em cada us //captura em cada flanco ascendente do pino CCP1

Depois, em cada disparo, basta activar a linha CCP1 para desencadear o mecanismo interno de captura, sendo necessrio reinicializar o temporizador 1 e rearmar a linha CCP1 para medir o perodo de amostragem seguinte. A captura feita aps o tempo de reteno do ADC ( 20 s) e coincide exactamente com o incio da converso A/D, pelo que o

109

erro de abertura desprezvel. Considera-se igualmente desprezvel o tempo que demora a reinicializar o temporizador 1.
int Trigger(){ //aquisio de uma nova amostra ... switch(target){ ... //entradas analgicas case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: ... //reteno do sinal analgico = 20 us RC2=1; //captura do temporizador 1 no flanco ascendente TMR1L=0; //reinicializao do temporizador 1 TMR1H=0; ... //converso A/D RC2=0; //rearme do pino CCP1 break; ... }

Por ltimo, o STIM envia para o NCAP, no s a amostra, mas tambm a respectiva marca de tempo guardada nos registos de captura CCPR1H e CCPR1L:
//leituras do STIM int Read(){ ... switch(functionCode){ ... //funo read sensor case 128: switch(channelNumber){ ... //entradas analgicas case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: //envia a amostra para o NCAP pool[0]=buffers[channelNumber-1]>>8; pool[1]=buffers[channelNumber-1]; //a marca de tempo est nos registos de captura //envia-os tambm para o NCAP pool[2]=CCPR1H; pool[3]=CCPR1L; bytesToRead=4; break; ... }

Graficamente, a medio de tempo pode ser descrita pelo fluxograma da figura 47. A reinicializao do temporizador 1 ocorre aps 216 contagens de 1 s, ou seja, ele conseguir medir perodos de amostragem at 65.5 ms, a que corresponde um ritmo de aquisio de 17 amostras/s. Dado que o programa Acquisition.vi dispara o STIM acima das 100 amostras/s, nunca haver o problema do temporizador 1 dar a volta e corromper a medida de tempo.

110

Disparo ? sim

no

Espera tempo de reteno ( 20s).

Captura o temporizador 1. (CCP1 = 1)

Reinicializa o temporizador 1. (TMR1L = TMR1H = 0) Rearme do mecanismo de captura Realiza a converso A/D.

Desactiva a linha CCP1. (CCP1 = 0)

Envia para o NCAP o intervalo de tempo capturado nos registos CCPR1L e CCP1RH.

Figura 47. Medio do intervalo de tempo entre amostras.

Procedimentos Experimentais Os procedimentos experimentais obedeceram seguinte metodologia: 1. 2. Foi montado o esquema da figura 46. O gerador de sinais foi ajustado manualmente para fornecer uma sinuside com amplitude = 2.4 V, frequncia = 0.2 Hz e offset = 2.5 V. Cumprindo as recomendaes expressas em [15] e [16], os valores de amplitude e de offset permitem a excitao do ADC em quase toda a sua gama dinmica (entre 0 e 5 V), ao passo que o valor da frequncia um compromisso entre dos critrios: i. Por um lado, o valor da frequncia deve ser elevado ao ponto de permitir a aquisio de vrios perodos da sinuside para facilitar a convergncia do algoritmo de adaptao, em especial do parmetro frequncia. ii. Por outro lado, a frequncia da sinuside no pode ser demasiado elevada sob pena do erro associado marca de tempo originar um erro de amplitude que 111

corrompa o ensaio. No presente caso, o erro associado marca de tempo aproximadamente igual resoluo do temporizador 1 (cerca de 1 s) e dele resulta um erro de amplitude dado por:

(5)

" Erro de Amplitude" " Erro da Marca de Tempo(= 10 6 )" ! " Erro de Amplitude" 1.508 10 5 f

dvi (t ) dt max

onde vi (t ) = 2.5 + 2.4 sen(2f t ) [V ] representa a sinuside de estmulo. Para que o erro de amplitude no afecte o ensaio, o seu valor ter de ser muito inferior a 1 lsb, ou seja: (6) 1.508 10 5 f << 5 2 10 f << 324 [Hz ]

Conclui-se portanto que a sinuside de frequncia igual a 0.2 Hz est de acordo com a condio (6), sendo assim possvel desprezar o erro de amplitude causado pela incerteza da marca de tempo. 5. 6. 7. Deu-se incio execuo autnoma do STIM. Foram encerrados todos os programas em execuo no PC. Executou-se o programa Acquisition.vi para 8192 amostras. As amostras e as respectivas marcas de tempo foram guardadas em ficheiro. Durante a execuo do programa, o STIM e o NCAP comunicaram a uma velocidade de 6 kbit/s. 8. 9. Executou-se o programa Processing.vi para tratar os dados guardados em ficheiro de modo a calcular o nmero efectivo de bits e a SINAD. Repetiram-se os pontos (5) e (6) uma dezena de vezes.

Observaes A tabela 22 resume os resultados de todos os ensaios e a figura 48 mostra, para um ensaio em particular, a diferena entre as amostras adquiridas e a sinuside adaptada. de referir que em todos os ensaios o algoritmo de adaptao de sinusides no teve problemas em convergir.

112

Ensaio 1 2 3 4 5 6 7 8 9 10 Mdia

nef [bits] 8.87 8.81 8.78 8.89 8.87 8.90 8.93 8.93 8.86 8.80 8.9

SINAD [dB] 54.88 54.49 54.30 54.92 54.85 55.06 55.19 55.23 54.81 54.45 54.8

Tabela 22. Resultados do ensaio E.

Figura 48. Rudo introduzido pelo canal de digitalizao para 8192 amostras.

Concluses Dos resultados obtidos possvel retirar as seguintes concluses: 1. 2. O canal de digitalizao do STIM possui 8.9 bits efectivos em regime quase estacionrio. O erro de quantificao do STIM deve ser corrigido para 2-8.9 = 0.21 %.

113

4.6. Ensaio F Ligao em Malha


O ensaio F tem por objectivo averiguar o funcionamento simultneo das entradas e sadas do STIM. Ideia A ideia utilizar as sadas digitais do STIM para excitar um Conversor Digital/Analgico (DAC), cuja sada ser reinjectada no STIM, digitalizada, e lida de volta para o NCAP. Forma-se assim uma malha que de forma simples e expedita permite fazer um ensaio bastante completo das funcionalidades do STIM. Material Computador Pentium III, 450 MHz, 96 Mbytes de RAM, com sistema operativo Windows 98. No computador ser executado o programa que simula o NCAP. Prottipo de STIM com frequncia de relgio igual a 4 MHz, o que equivale a 1 s/instruo. Cabo TII blindado com comprimento inferior a 2 m. Outros cabos de ligao e afins. 1 contador de 12 bits (74HC4040) 1 DAC de 12 bits (MAX507) 1 condensador electroltico 10 F/50 V 1 condensador 100 nF/50 V 1 resistncia 10 /0.25 W 12 resistncia 1 k/0.25 W 12 LED 1 placa de ensaio

114

Esquema de Ligaes

Contador

DAC

Figura 49. Circuito do ensaio F.

115

No incio do ensaio, o canal 11 do STIM reinicializa o contador (U1). A partir da, o contador sucessivamente incrementado pelo canal 10 do STIM com o objectivo de produzir uma sequncia binria crescente. Por sua vez, o DAC (U2) transforma a sequncia binria numa sequncia de tenses analgicas entre 0 e 5 V, com incrementos de amplitude igual a 1 lsb = 5 V / 212. Finalmente, o sinal analgico digitalizado e as amostras so enviadas para o NCAP. Os LEDs so teis para visualizar a contagem binria e confirmar que ela se desenrola correctamente. Outros pormenores do circuito podem ser facilmente esclarecidos consultando os catlogos dos dois circuitos integrados. A escolha de um DAC de 12 bits, com uma resoluo quatro vezes superior dos 10 bits do ADC, garante a excitao de todos os nveis de quantificao do STIM. Programas No computador foi implementado o programa que simula o NCAP. Trata-se de um programa desenvolvido em LabVIEW que utiliza a biblioteca STIM driver para comunicar com o STIM. A listagem do programa apresentada no anexo H e auto-explicativa. Em jeito de resumo, o programa realiza as seguintes tarefas pela seguinte ordem: 1. 2. 3. D um impulso positivo no canal 11 do STIM para inicializar o contador a zero. Executa um ciclo com 212 iteraes. Em cada iterao adquirida a sada do DAC e dado um novo impulso no canal 10 para fazer avanar a tenso analgica. Calcula o histograma das 4096 amostras e guarda-as em ficheiro.

O STIM executa o programa descrito no captulo 2. Procedimentos Experimentais Os procedimentos experimentais obedeceram seguinte metodologia: 1. 2. 3. 4. 5. Foi montado o circuito da figura 49. Deu-se incio execuo autnoma do STIM. Foram encerrados todos os programas em execuo no PC. Executou-se o programa do NCAP a 6 kbit/s e registaram-se todas as suas indicaes. As 4096 amostras foram guardadas em ficheiro. Repetiu-se o ponto (4) uma dezena de vezes.

116

Observaes Os dados resultantes dos 10 ensaios revelaram grande repetitibilidade. O circuito funcionou bem, com os LEDs a indicarem uma contagem binria correcta e sem saltos. Nestas condies, e dado que a resoluo de DAC quatro vezes superior do ADC, seria de esperar que o histograma apresentasse, em mdia, quatro ocorrncias para cada cdigo do ADC. No entanto, os histogramas recolhidos contrariam essa expectativa: todos eles apresentam cdigos mpares omissos. A figura 50 apresenta o extracto de um histograma onde esse facto evidente.

Figura 50. Histograma obtido no ensaio F.

O aspecto irregular dos histogramas e a existncia repetitiva de cdigos mpares omissos foram razes suficientes para levantar a seguinte questo: ser que a caracterstica de transferncia do ADC apresenta um erro sistemtico que afecta sobretudo os cdigos mpares? Para responder a esta questo decidiu-se caracterizar o ADC atravs do mtodo esttico numa regio da sua escala. Para tal, foram criadas as seguintes condies: 1. 2. Foi refeito o esquema do ensaio A (figura 27). O NCAP voltou a ser simulado pelo programa do ensaio A, alterado para adquirir 8192 amostras.

117

3.

O STIM foi excitado por uma fonte de tenso contnua, varivel e de elevada exactido. Para o efeito utilizou-se o calibrador Wavetek 9100 cujas especificaes se incluem no anexo H.

Antes de se iniciar o ensaio esttico, ligou-se a entrada do ADC massa e mediu-se o desvio padro do rudo: o valor registado foi de 1.42 mV eficazes. Com este nvel de rudo, e trabalhando com vectores de 8192 amostras, garante-se, de acordo com [16], que a incerteza do ensaio inferior a 6% 1.42 mV = 85.2 V 0.02 lsb, com um grau de confiana de 99.98%. De seguida, realizou-se manualmente o ensaio e obteve-se a caracterstica de transferncia ilustrada na figura 51.

Figura 51. Excerto da caracterstica de transferncia do ADC do STIM.

Concluses Dos resultados obtidos possvel retirar as seguintes concluses: 1. 2. No se notam quaisquer anomalias no funcionamento das sadas digitais do STIM. Verifica-se a ausncia de muitos cdigos mpares do ADC. Fazendo uma observao mais atenta das figuras 50 e 51 possvel reconhecer um padro para os cdigos omissos. O padro o seguinte: s existem os cdigos mpares acabados em 001 118

(esto nestas condies os cdigos 683 e 691 da figura 51 e todos os cdigos assinalados a preto na figura 50); todos os outros cdigos mpares esto omissos ou tm uma probabilidade de ocorrncia muito inferior a 2-10 (o valor nominal). Trata-se portanto de um erro sistemtico do ADC que lhe retira exactido e contribui para os 8.9 bits efectivos calculados no ensaio E.

4.7. Concluses
Do que foi exposto neste captulo possvel retirar as seguintes concluses: 1. 2. 3. 4. Nos ensaios efectuados no foi detectada qualquer anomalia no funcionamento do STIM e da biblioteca STIM driver. A comunicao entre o STIM e o NCAP revelou-se muito robusta com taxas de erro de bit da ordem de 10-9 ou inferior. A surgirem erros na comunicao, o STIM tem a capacidade de recuperar a comunicao com o NCAP. O NCAP baseado na biblioteca STIM driver responde aos estmulos do STIM aps um tempo que no determinstico. Mas dado que o NCAP o mestre da comunicao com o STIM, este comportamento aleatrio no compromete a comunicao entre ambos, apenas atrasa a resposta do NCAP. 5. Estando o STIM a correr com uma velocidade de 1 s/instruo, foram alcanados ritmos de aquisio e actuao de 160 amostras/s e 175 actuaes/s, respectivamente. 6. O canal de digitalizao do STIM possui 8.9 bits efectivos, valor inferior aos 10 bits nominais. Alm disso, o canal sofre de um erro sistemtico que se traduz na ausncia de todos os cdigos mpares no acabados em 001, ou seja, cerca de dos cdigos mpares no existem ou tm uma probabilidade de ocorrncia muito baixa.

119

120

5
Concluses Gerais e Perspectivas de Trabalho Futuro
ideias para dar continuidade futura ao trabalho realizado. O Problema

Captulo

Este captulo comea por recuar ao ponto de partida do trabalho recordando que a norma IEEE 1451.2 uma soluo vivel para o problema da integrao de transdutores inteligentes em redes de campo. So igualmente recordados os objectivos iniciais do trabalho e so tiradas concluses quanto sua concretizao. Finalmente, so apresentadas

O mercado de transdutores inteligentes padece actualmente de um grave problema: a proliferao de inmeros protocolos de rede dificulta a integrao de transdutores de diferentes fabricantes e canaliza o cliente para solues proprietrias, normalmente mais caras e menos flexveis. A soluo para este problema passa por adoptar uma interface universal e aberta para transdutores inteligentes que permita o funcionamento imediato de qualquer transdutor em qualquer rede de campo. Este o objectivo do modelo IEEE 1451. Proposta de Resoluo: Norma IEEE 1451.2 Entre as vrias normas do modelo IEEE 1451, este trabalho destaca a norma IEEE 1451.2 que define o mdulo de transduo inteligente (STIM) e a forma como ele interage com o processador de rede (NCAP). Segundo a norma, o STIM o responsvel pelo condicionamento e digitalizao de sinal e a ele ligam todos os sensores e actuadores do sistema. O STIM s pode participar numa rede de transdutores inteligentes atravs de um NCAP. O NCAP faz a ponte entre o STIM e uma qualquer rede de campo, cabendo-lhe exportar as funcionalidades do transdutor e os servios de rede, ao mesmo tempo que oculta os protocolos de comunicao e os pormenores de implementao.

121

Objectivos Iniciais do Trabalho Para exemplificar a aplicabilidade do modelo IEEE 1451, e em particular da norma IEEE 1451.2, o trabalho foi projectado com dois grandes objectivos: 1. 2. Implementar um STIM totalmente compatvel com a norma 1451.2 num microcontrolador no dedicado e de baixo custo. Implementar uma interface de STIM para PC com integrao em LabVIEW.

Concluses Gerais Ponderando o trabalho realizado (descrito nos captulos 2, 3 e 4) e tendo como referncia os objectivos iniciais do trabalho, tiram-se duas grandes concluses: 1. de facto possvel implementar um STIM totalmente compatvel com a norma IEEE 1451.2 num nico circuito integrado no dedicado e de baixo custo. Isto mesmo ficou demonstrado no captulo 2 onde se apresentou o hardware e o software de um prottipo de STIM com 12 canais (8 sensores simples analgicos + 4 actuadores simples digitais). Para confirmar a conformidade do prottipo com a norma e para avaliar o seu desempenho, procedeu-se sua caracterizao experimental como foi descrito no captulo 4. Os resultados obtidos foram resumidamente os seguintes: i. O prottipo de STIM mostrou-se totalmente compatvel com a norma 1451.2 respondendo conforme o esperado a todas as funcionalidades e apresentando diagramas temporais da TII sem falhas. ii. Estando o prottipo a correr com uma velocidade de 1 s/instruo, foram alcanados ritmos de aquisio e actuao de 160 amostras/s e 175 actuaes/s, respectivamente. Se a velocidade de execuo aumentar quatro vezes, para o limite mximo de 250 ns/instruo, natural que os ritmos de aquisio e actuao venham a aumentar substancialmente. iii. O canal de digitalizao do prottipo possui 8.9 bits efectivos, valor inferior aos 10 bits nominais. Adicionalmente, o canal sofre de um erro sistemtico que se traduz na ausncia de dos cdigos mpares.

122

iv.

A TII revelou-se muito robusta com uma taxa de erro de bit inferior a 10-9. Alm disso, caso surjam erros na comunicao, o prottipo capaz de recuperar a comunicao com o NCAP.

A realizao do prottipo de STIM num simples PIC16F877 mostra que a norma IEEE 1451.2 fcil de implementar, robusta e econmica na medida em que dispensa tecnologia dedicada ou especialmente complexa. 2. Como ficou demonstrado no captulo 3, possvel implementar uma interface de STIM num PC com sistema operativo Windows 9X. O nvel fsico da interface foi suportado na porta paralela do PC, programada directamente ao nvel dos seus registos (o registo de dados para transmitir bits para o STIM e o registo de estado para ler bits provenientes do STIM). As funes de acesso porta paralela foram organizadas de forma hirrquica e foram compiladas numa biblioteca dinmica (DLL), constituindo um pacote de software reutilizvel em qualquer ambiente de programao. No presente caso, a DLL foi reutilizada em LabVIEW e sobre ela foi construdo um conjunto de instrumentos virtuais a que foi dado o nome de biblioteca STIM driver com o objectivo de implementar amigavelmente todas as funes de acesso ao STIM. Ao transportar o STIM para dentro do LabVIEW, a biblioteca STIM driver alarga extraordinariamente as possibilidades de processamento, armazenamento e apresentao de dados, ao mesmo tempo que constitui uma ferramenta til para ensaiar prottipos de STIM em fase de desenvolvimento, como alis ficou demonstrado no captulo 4. Uma caracterstica interessante da biblioteca STIM driver, justificada pela sua implementao sobre Windows, o facto dela responder aos estmulos do STIM aps um tempo que no determinstico. Mas dado que o NCAP o mestre da comunicao com o STIM, este comportamento aleatrio no compromete a comunicao entre ambos, apenas atrasa a resposta do NCAP baseado na biblioteca STIM driver.

123

Perspectivas de Trabalho Futuro A finalizar este trabalho conveniente project-lo para o futuro apresentando um conjunto de ideias que ajudaro a complement-lo. Grande parte destas ideias foram nascendo no decurso do trabalho realizado, mas infelizmente no puderam ser includas na presente tese, quer por no haver disponibilidade temporal, quer por extrapolarem os objectivos iniciais. Apontam-se seis ideias de desenvolvimento: 1. Customizar o prottipo de STIM para um conjunto concreto de transdutores. O trabalho a desenvolver englobaria as seguintes reas: 1) caracterizar experimentalmente cada um dos transdutores com vista definio dos respectivos TEDS de canal; 2) construir um meta TEDS que reunisse as caractersticas gerais do STIM; 3) desenvolver electrnica dedicada para condicionar os sinais de entrada e de sada do STIM. Como exemplo, sugere-se a utilizao do prottipo de STIM para construir um sensor inteligente de pH associado a um sensor de temperatura. Os dois canais formariam um agrupamento porque o pH depende da temperatura, sendo interessante incluir no STIM a equao de Nerst que corrige o pH em funo da temperatura. 2. Estender as funcionalidades do prottipo de STIM a trs nveis: 1) ao nvel das funcionalidades o prottipo poderia ser enriquecido com funes de escrita e de leitura que vo para alm das obrigatrias enunciadas na tabela 3; 2) ao nvel da sua memria descritiva o prottipo poderia acolher novas estruturas TEDS que melhorariam a sua configurao automtica em rede; 3) ao nvel dos transdutores o prottipo poderia ser revisto no sentido de suportar outros tipos de canais alm de sensores e actuadores simples (p.ex. seria interessante implementar um sensor de eventos associado a um sensor contnuo com memria, podendo o conjunto funcionar como digitalizador com disparo programvel). 3. Transferir o nvel fsico da interface de STIM da porta paralela do PC para um circuito dedicado acessvel via RS 232. O referido circuito poderia basear-se num microcontrolador da famlia PIC programado para encaminhar os dados entre o STIM e o PC: de um lado comunicaria com o PC atravs da porta srie; do outro lado comunicaria com o STIM atravs de uma interface SPI auxiliada por algumas linhas digitais emulando a TII. Este arranjo teria duas grandes vantagens: 1) permitiria temporizaes muito mais exactas dos bits da TII; 2) facilitaria a programao do PC dispensando a biblioteca dinmica tii.dll e substituindo-a

124

por uma das muitas bibliotecas de acesso porta srie disponveis gratuitamente para qualquer linguagem de programao e para qualquer sistema operativo (no necessariamente Windows). Como desvantagens, antev-se um pequeno atraso em todas as transaces entre o STIM e o PC (sobretudo nos disparos), e um limite mximo na velocidade de comunicao entre ambos determinado pela interface RS 232. 4. Utilizar a interface de STIM descrita no captulo 3 para implementar um NCAP completo em LabVIEW. A palavra completo refere-se a uma total conformidade com a norma IEEE 1451.1. 5. Implementar um NCAP compatvel com a norma IEEE 1451.1 numa plataforma dedicada de hardware e software. Sugere-se a plataforma TINI48 disponibilizada pela empresa Dallas Semiconductor. Trata-se de uma plataforma de baixo custo baseada num microcontrolador da famlia 8051, para o qual foi desenvolvido um sistema operativo de tempo real, uma mquina virtual JAVA e uma interface de programao JAVA compatvel com o standard JDK 1.1.8. 6. Implementar um NCAP expandido que pudesse acolher vrios STIMs interligados num barramento CAN (Controller Area Network). Esta ideia seria uma variante da norma IEEE P1451.3 e obrigaria redefinio da TII para o barramento CAN.

48

Para mais informaes consultar www.maxim-ic.com/TINIplatform.cfm.

125

126

A
Anexo

Programa do STIM
///////////////////////////////////////////////////////////////////////////////////////// // // Implementao de um STIM num PIC16F877 // // Ficheiro stim.c // Vtor Viegas, Dezembro de 2002 // // Ferramentas de desenvolvimento: // Compilador Hi-Tech PIC C V7.85 // MPLAB 5.11.00 // ///////////////////////////////////////////////////////////////////////////////////////// #include "stim.h" //======================================================================================= // Inicializao do STIM. //======================================================================================= void Init() { unsigned int i,j; //contadores //watchdog com timeout de 300 ms (aprox.) OPTION=0xfc; //portos TRISA=0b00111111; TRISB=0b11111111; TRISC=0b11011110; TRISD=0b00000101; TRISE=0b00000111;

//porto //porto //porto //porto //porto

A B C D E

s s s s s

entradas entradas entradas excepto RC<5,0> entradas excepto RD<7,6,5,4,3,1> entradas

//pisca 3 vezes RC0 em sinal de reset e para gastar tempo... for (i=0;i<3;i++){ for (j=0;j<40000;j++){ RC0=1; asm("clrwdt"); } for (j=0;j<40000;j++){ RC0=0; asm("clrwdt"); } } //inicializa NACK=1 e NINT=1 RD1=1; RD3=1; //interface SPI em modo escravo, CKE=0, CKP=1 e pino SS desligado SSPSTAT=0; SSPCON=0b00110101; //ADC com 8 entradas analgicas, right justified ADCON1=0b10000000; //inicializa estruturas de dados dos canais e respectivos buffers

127

for (i=0;i<12;i++){ channels[i].status=0x0104; channels[i].auxStatus=0; channels[i].mask=0xffff; channels[i].auxMask=0; buffers[i]=0; } //canal 0 channel0.status=0x0104; channel0.auxStatus=0; channel0.mask=0xffff; channel0.auxMask=0; //variveis functionCode=0; channelNumber=0; target=0; state=0; n=0; bytesToWrite=0; bytesToRead=0; return; }

//canal operacional | has been reset //registo auxiliar de estado no implementado: =0 sempre! //mscaras inicializadas a '1' //mscaras auxiliares inicializadas a '0'

//idem

//======================================================================================= // Transfere dados do STIM para a rea de transferncia. // Calcula bytesToRead para cada functionCode e channelNumber. //======================================================================================= int Read() { unsigned int i; switch(functionCode) { //----------------------------------------------------------------------------------//read sensor data //funo prevista para os sensores (canais 1 a 8) case 128: switch (channelNumber) { case 0: //leitura de todos os sensores for (i=0;i<8;i++){ pool[2*i] = buffers[i]>>8; //parte alta pool[2*i+1]= buffers[i]; //parte baixa } bytesToRead=16; //bytesToRead=16 break; case 1: case 2: case 3: case 4: //leitura do isimo sensor case 5: case 6: case 7: case 8: pool[0]=buffers[channelNumber-1]>>8; pool[1]=buffers[channelNumber-1]; bytesToRead=2; break; default: return 1; //canal inconsistente: retorna erro! } break; //----------------------------------------------------------------------------------//read standart status //funo prevista para todos os canais case 130: switch (channelNumber){ case 0: //leitura do estado do STIM pool[0]=channel0.status>>8; pool[1]=channel0.status; //todos os bits de estado devem ser inibidos aps a leitura excepto // STIM operational bit e STIM auxiliary status available bit channel0.status=channel0.status & 0x0110; bytesToRead=2; break; case 1: case 2: case 3: case 4: //leitura do estado do isimo canal case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12:

128

pool[0]=channels[channelNumber-1].status>>8; pool[1]=channels[channelNumber-1].status; channels[channelNumber-1].status=channels[channelNumber-1].status & 0x0110; bytesToRead=2; break; default: return 1; //canal inconsistente: retorna erro! } break; //----------------------------------------------------------------------------------//read triggered channel address //funo prevista apenas para o canal 0 case 131: if (channelNumber==0) pool[0]=target; else return 1; //canal inconsistente: retorna erro! bytesToRead=1; break; //----------------------------------------------------------------------------------//read auxiliary status //funo prevista para todos os canais //idem funo 130 case 132: switch (channelNumber){ case 0: pool[0]=channel0.auxStatus>>8; pool[1]=channel0.auxStatus; //todos os bits do registo auxiliar de estado devem ser inibidos aps a leitura channel0.auxStatus=0; bytesToRead=2; break; case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: pool[0]=channels[channelNumber-1].auxStatus>>8; pool[1]=channels[channelNumber-1].auxStatus; channels[channelNumber-1].auxStatus=0; bytesToRead=2; break; default: return 1; //canal inconsistente: retorna erro! } break; //----------------------------------------------------------------------------------//read standart interrupt mask //funo prevista para todos os canais case 133: switch (channelNumber){ case 0: //leitura da mscara do canal 0 pool[0]=channel0.mask>>8; pool[1]=channel0.mask; bytesToRead=2; break; case 1: case 2: case 3: case 4: //leitura da mscara do isimo canal case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: pool[0]=channels[channelNumber-1].mask>>8; pool[1]=channels[channelNumber-1].mask; bytesToRead=2; break; default: return 1; //canal inconsistente: retorna erro! } break; //----------------------------------------------------------------------------------//read auxiliary interrupt mask //funo prevista para todos os canais //idem funo 133 case 134: switch (channelNumber){ case 0: pool[0]=channel0.auxMask>>8; pool[1]=channel0.auxMask; bytesToRead=2;

129

break; case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: pool[0]=channels[channelNumber-1].auxMask>>8; pool[1]=channels[channelNumber-1].auxMask; bytesToRead=2; break; default: return 1; //canal inconsistente: retorna erro! } break; //----------------------------------------------------------------------------------//read STIM version //funo prevista apenas para o canal 0 case 135: if (channelNumber==0) ptr2FLASH=STIM_VERSION; else return 1; //canal inconsistente: retorna erro! bytesToRead=sizeof(STIM_VERSION); break; //----------------------------------------------------------------------------------//read TEDS //funo prevista para todos os canais case 160: switch (channelNumber){ case 0: ptr2FLASH=META_TEDS; //leitura do META TEDS bytesToRead=sizeof(META_TEDS); break; case 1: ptr2FLASH=CHANNEL1_TEDS; //leitura do CHANNEL TEDS, canal 1 bytesToRead=sizeof(CHANNEL1_TEDS); break; case 2: ptr2FLASH=CHANNEL2_TEDS; //idem, canal 2 bytesToRead=sizeof(CHANNEL2_TEDS); break; case 3: ptr2FLASH=CHANNEL3_TEDS; //idem, canal 3 bytesToRead=sizeof(CHANNEL3_TEDS); break; case 4: ptr2FLASH=CHANNEL4_TEDS; //idem, canal 4 bytesToRead=sizeof(CHANNEL1_TEDS); break; case 5: ptr2FLASH=CHANNEL5_TEDS; //idem, canal 5 bytesToRead=sizeof(CHANNEL5_TEDS); break; case 6: ptr2FLASH=CHANNEL6_TEDS; //idem, canal 6 bytesToRead=sizeof(CHANNEL6_TEDS); break; case 7: ptr2FLASH=CHANNEL7_TEDS; //idem, canal 7 bytesToRead=sizeof(CHANNEL7_TEDS); break; case 8: ptr2FLASH=CHANNEL8_TEDS; //idem, canal 8 bytesToRead=sizeof(CHANNEL8_TEDS); break; case 9: ptr2FLASH=CHANNEL9_TEDS; //idem, canal 9 bytesToRead=sizeof(CHANNEL9_TEDS); break; case 10: ptr2FLASH=CHANNEL10_TEDS; //idem, canal 10 bytesToRead=sizeof(CHANNEL10_TEDS); break; case 11: ptr2FLASH=CHANNEL11_TEDS; //idem, canal 11 bytesToRead=sizeof(CHANNEL11_TEDS); break; case 12: ptr2FLASH=CHANNEL12_TEDS; //idem, canal 12

130

bytesToRead=sizeof(CHANNEL12_TEDS); break; default: return 1; //canal inconsistente: retorna erro! } break; case 161: case 192: case 193: case 224: default: return 1; } return 0; }

//funo no implementada: retorna erro!

//======================================================================================= // Calcula bytesToWrite para cada functionCode e channelNumber. // Testa integridade da trama recebida (n==bytesToWrite? return 0 : return 1). // Transfere dados da rea de transferncia para o STIM. //======================================================================================= int Write() { unsigned short i,command; switch(functionCode) { //----------------------------------------------------------------------------------//write actuator data //funo prevista para os actuadores (canais 9 a 12) case 0: switch (channelNumber){ case 0: //escrita de todos os actuadores if (n!=4) return 1; //bytesToWrite=4 for (i=0;i<4;i++) buffers[i+8]=pool[i]; break; case 9: case 10: case 11: case 12: //escrita do actuador 9 a 12 if (n!=1) return 1; //bytesToWrite=1 buffers[channelNumber-1]=pool[0]; break; default: return 1; //canal inconsistente: retorna erro! } break; //----------------------------------------------------------------------------------//write control command //funo prevista para todos os canais case 1: if (n!=2) return 1; //bytesToWrite=2 command = 256 * pool[0] + pool[1]; //comando recebido switch (channelNumber){ case 0: //commando global switch (command){ case 0: //marca todos os canais como no operacionais for (i=0;i<12;i++) channels[i].status=channels[i].status & 0xfeff; break; case 1: //reset do STIM consiste em reinicializar apenas o buffer e o estado de todos os canais //activa os bits de Channel has been reset e STIM has been reset for (i=0;i<12;i++){ channels[i].status=0x0104; channels[i].auxStatus=0; buffers[i]=0; } channel0.status=0x0104; channel0.auxStatus=0; break; default: return 1; //comando no implementado: retorna erro! } break;

131

case 1: case 2: case 3: case 4: //comando de canal case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: switch (command){ case 0: //marca o canal como no operacional channels[channelNumber-1].status=channels[channelNumber-1].status & 0xfeff; break; case 1: //o reset do canal consiste em reinicializar apenas o buffer e o estado //activa o bit de Channel has been reset channels[channelNumber-1].status=0x0104; channels[channelNumber-1].auxStatus=0; buffers[channelNumber-1]=0; break; default: return 1; //comando no implementado: retorna erro! } break; default: return 1; //canal inconsistente: retorna erro! } break; //----------------------------------------------------------------------------------//write triggered channel address //funo prevista para o canal 0 case 3: if (n!=1) return 1; //bytesToWrite=1 if (channelNumber==0) target=pool[0]; else return 1; //canal inconsistente: retorna erro! break; //----------------------------------------------------------------------------------//write standart interrupt mask //funo prevista para todos os canais case 5: if (n!=2) return 1; //bytesToWrite=2 switch (channelNumber){ case 0: //mscara do canal 0 channel0.mask= 256 * pool[0] + pool[1]; break; case 1: case 2: case 3: case 4: //mscara do isimo canal case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: channels[channelNumber-1].mask= 256 * pool[0] + pool[1]; break; default: return 1; //canal inconsistente: retorna erro! } break; //----------------------------------------------------------------------------------//write auxiliary interrupt mask //funo prevista para todos os canais //idem funo 5 case 6: if (n!=2) return 1; switch (channelNumber){ case 0: channel0.auxMask= 256 * pool[0] + pool[1]; break; case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: channels[channelNumber-1].auxMask= 256 * pool[0] + pool[1]; break; default: return 1; //canal inconsistente: retorna erro! } break; case 64: case 65: case 96: default: return 1;

//funo no implementada: retorna erro!

132

} return 0; }

//======================================================================================= // Trata trigger. //======================================================================================= int Trigger() { unsigned char tmpH[8]; unsigned char tmpL[8]; unsigned char i,j; switch (target) { //----------------------------------------------------------------------------------//trigger global case 0: for (i=0;i<8;i++){ //varre todas as entradas analgicas ADCON0=((i & 0b00000111) << 3) | 0b10000001; //isimo canal do ADC //espera o tempo de aquisio Tacq (17 ciclos * 6 instrues >= 20 us) for(j=0;j<170;j++); ADGO=1; //inicia a converso A/D do {} while (ADGO==1); //espera pela sua concluso... tmpH[i]=ADRESH; //armazenamento temporrio dos dados tmpL[i]=ADRESL; } if (RD2==1) return 0; //falso trigger: sai sem fazer nada! RD1=0; //activa NACK for(i=0;i<8;i++) buffers[i] = 256 * tmpH[i] + tmpL[i]; //carrega buffers buffers[8] ==0? RD4=0 : RD4=1; //varre todos os actuadores buffers[9] ==0? RD5=0 : RD5=1; buffers[10]==0? RD6=0 : RD6=1; buffers[11]==0? RD7=0 : RD7=1; for (i=0;i<12;i++) //activa todos os trigger acknowledged bits channels[i].status=channels[i].status | 0x0002; channel0.status=channel0.status | 0x0002; do {} while (RD2==0); //espera pela inibio de NTRIG... RD1=1; //inibe NACK (fim de trigger) break;

//----------------------------------------------------------------------------------//trigger individual dos sensores (canais 1 a 8) case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: ADCON0=(((target-1) & 0b00000111) << 3) | 0b10000001; //enderea o ADC for(j=0;j<17;j++); //espera Tacq ADGO=1; //inicia a converso A/D do {} while (ADGO==1); //espera pela sua concluso... if (RD2==1) return 0; //falso trigger: sai sem fazer nada! RD1=0; //activa NACK buffers[target-1]= 256 * ADRESH + ADRESL; //carrega buffer //activa trigger acknowledged bit channels[target-1].status=channels[target-1].status | 0x0002; do {} while (RD2==0); //espera pela inibio de NTRIG... RD1=1; //inibe NACK (fim de trigger) break; //----------------------------------------------------------------------------------//trigger individual dos actuadores (canais 9 a 12) case 9: buffers[8]==0? RD4=0 : RD4=1; //actuao RD1=0; //activa NACK channels[8].status=channels[8].status | 0x0002; //activa trigger acknowledged bit do {} while(RD2==0); //espera pela inibio de NTRIG... RD1=1; //inibe NACK (fim de trigger) break; case 10: //idem buffers[9]==0? RD5=0 : RD5=1; RD1=0; channels[9].status=channels[9].status | 0x0002; do {} while(RD2==0); RD1=1;

133

break; case 11: //idem buffers[10]==0? RD6=0 : RD6=1; RD1=0; channels[10].status=channels[10].status | 0x0002; do {} while(RD2==0); RD1=1; break; case 12: //idem buffers[11]==0? RD7=0 : RD7=1; RD1=0; channels[11].status=channels[11].status | 0x0002; do {} while(RD2==0); RD1=1; break; default: break; } return 0; } //canal no implementado: no faz nada!

//======================================================================================= // Actualiza todos os bits de estado que carecem de ateno contnua. //======================================================================================= int UpdateStatus() { unsigned char i; unsigned short aux; //bit de SRQ de todos os canais //canais 1 a 12 for (i=0;i<12;i++){ if ((((channels[i].status & channels[i].mask) & 0xfffe) | (channels[i].auxStatus & channels[i].auxMask)) == 0) channels[i].status=channels[i].status & 0xfffe; //SRQ=0; else channels[i].status=channels[i].status | 0x0001; //SRQ=1; } //canal 0 if ((((channel0.status & channel0.mask) & 0xfffe) | (channel0.auxStatus & channel0.auxMask)) == 0) channel0.status=channel0.status & 0xfffe; //SRQ=0; else channel0.status=channel0.status | 0x0001; //SRQ=1; //linha de interrupo NINT = OR dos SRQs de todos os canais aux=0x0000; for (i=0;i<12;i++) aux = channels[i].status | aux; aux = channel0.status | aux; aux = aux & 0x0001; if (aux==0) RD3=1; //NINT inibida else RD3=0; //NINT activada //bit de STIM operacional = AND de todos os channel operational bits aux=0x0100; for (i=0;i<12;i++) aux = channels[i].status & aux; if (aux==0) channel0.status = channel0.status & 0xfeff; //STIM operational bit=0 else channel0.status = channel0.status | 0x0100; //STIM operational bit=1 return 0; }

//**************************************************************************************** main() { Init(); //inicializao do STIM for(;;) //ciclo infinito {

134

switch (state) { //-------------------------------------------------------------------------------//inicializaes case 0: n=0; //limpa contador SSPIF=0; //limpa SSP SSPBUF=0; UpdateStatus(); //actualiza estado do STIM state=1; break; //-------------------------------------------------------------------------------//espera pela descida de NIOE case 1: if (RD0==0) state=2; //NIOE activa if (RD2==0) state=15; //trigger break; //-------------------------------------------------------------------------------//comuta NACK case 2: RD1=0; //NACK=0 state=3; break; //-------------------------------------------------------------------------------//espera pelo endereo de funo case 3: if (RD0==1) state=14; //trama abortada if (SSPIF==1) state=4; //byte recebido break; //-------------------------------------------------------------------------------//guarda functionCode e comuta NACK case 4: SSPIF=0; functionCode=SSPBUF; //cdigo de funo RD1=1; //NACK=1 state=5; break; //-------------------------------------------------------------------------------//espera pelo endereo de canal case 5: if (RD0==1) state=14; //trama abortada if (SSPIF==1) state=6; //byte recebido break; //-------------------------------------------------------------------------------//guarda channelNumber case 6: SSPIF=0; channelNumber=SSPBUF; //endereo de canal if (functionCode>=128) if (Read()==1) state=14; //operao de leitura invlida else state=11; //operao de leitura vlida else state=7; //operao de escrita break; //-------------------------------------------------------------------------------//comuta NACK case 7: PORTD = (~PORTD & 0x02) | (PORTD & 0xFD); state=8; break; //-------------------------------------------------------------------------------//espera por recepo de byte case 8: if (RD0==1) state=10; //fim de trama if (SSPIF==1) state=9; //byte recebido break; //-------------------------------------------------------------------------------//guarda byte

135

case 9: SSPIF=0; //garante que no so guardados mais bytes que os devidos if (n < bytesToWrite) pool[n++]=SSPBUF; state=7; break; //-------------------------------------------------------------------------------//inibe NACK, verifica se a trama est completa e transfere dados pool -> STIM case 10: RD1=1; //NACK=1 if (Write()==1) state=14; //trama abortada else state=0; //trama recebida OK break; //-------------------------------------------------------------------------------//envia byte e comuta NACK case 11: SSPIF=0; if (n < bytesToRead){ //garante que no so lidos mais bytes que os devidos switch (functionCode){ case 135: case 160: //acessos FLASH para leituras de constantes em memria de programa SSPBUF=ptr2FLASH[n++]; break; default: //acessos pool para leituras de variveis em RAM SSPBUF=pool[n++]; break; } } PORTD=(~PORTD & 0x02) | (PORTD & 0xFD); state=12; break; //-------------------------------------------------------------------------------//espera pelo envio do byte case 12: if (RD0==1) state=13; //fim de trama if (SSPIF==1) state=11; //byte enviado break; //-------------------------------------------------------------------------------//inibe NACK e verifica se a trama est completa case 13: RD1=1; //NACK=1 if (n==bytesToRead) state=0; //trama enviada OK else state=14; //trama abortada break; //-------------------------------------------------------------------------------//trama abortadainibe NACK e case 14: RD1=1; //inibe NACK SSPEN=0; //reinicializa a interface SPI SSPCON=0b00110101; SSPBUF=0; SSPEN=1; channel0.status = channel0.status | 0x0008; //activa STIM invalid command bit state=0; break; //-------------------------------------------------------------------------------//trigger case 15: Trigger(); state=0; break; default: break; } asm("clrwdt"); } }

//clear do watchdog aps cada estado

136

///////////////////////////////////////////////////////////////////////////////////////// // // Implementao de um STIM num PIC16F877 // // Ficheiro stim.h // // Vtor Viegas // Dezembro de 2002 // // Ferramentas de desenvolvimento: // Compilador Hi-Tech PIC C V7.85 // MPLAB 5.11.00 // /////////////////////////////////////////////////////////////////////////////////////////

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include

<pic.h> <stdio.h> <string.h> "teds0000.h" "teds1001.h" "teds1002.h" "teds1003.h" "teds1004.h" "teds1005.h" "teds1006.h" "teds1007.h" "teds1008.h" "teds1009.h" "teds1010.h" "teds1011.h" "teds1012.h"

//META TEDS //CHANNEL TEDS //CHANNEL TEDS //CHANNEL TEDS //CHANNEL TEDS //CHANNEL TEDS //CHANNEL TEDS //CHANNEL TEDS //CHANNEL TEDS //CHANNEL TEDS //CHANNEL TEDS //CHANNEL TEDS //CHANNEL TEDS

do do do do do do do do do do do do

canal canal canal canal canal canal canal canal canal canal canal canal

1 2 3 4 5 6 7 8 9 10 11 12

#define N_CHANNELS #define POOL_DIM #define TRUE #define FALSE

12 96 1 0

const far unsigned char STIM_VERSION[10] = { 0x06, 0x00, 0x00, 0x00, //length 0x00, 0x00, 0x00, 0x00, //version code 0xF9, 0xFF //checksum };

//======================================================================================= // Definio de tipos. //======================================================================================= struct channel //estrutura de dados de um canal { unsigned short status; //standart status unsigned short auxStatus; //auxiliary status unsigned short mask; //standart interrupt mask unsigned short auxMask; //auxiliary interrupt mask }

//======================================================================================= // Variveis explcitas. //======================================================================================= bank1 struct channel channel0 @ 0x00a0; //estrutura de dados do canal 0 (global) bank2 struct channel channels[N_CHANNELS] @ 0x0110; //estruturas de dados dos canais bank1 unsigned short buffers[N_CHANNELS] @ 0x00a8; //buffers dos canais bank3 unsigned char pool[POOL_DIM] @ 0x0190; //rea de transferncia

//======================================================================================= // Variveis geridas pelo compilador. //======================================================================================= unsigned char functionCode; //endereo funcional unsigned char channelNumber; //endereo de canal unsigned char target; //triggered channel address unsigned char state; //estado unsigned int n; //contador

137

unsigned int bytesToWrite; unsigned int bytesToRead; const far unsigned char *ptr2FLASH;

//nmero de bytes a escrever //nmero de bytes a ler //ponteiro para a memria de programa

//======================================================================================= // Prottipos. //======================================================================================= void Init(void); int Read(void); int Write(void); int Trigger(void); int UpdateStatus(void);

138

///////////////////////////////////////////////////////////////////////////////////////// // // Implementao de um STIM num PIC16F877 // // Ficheiro teds0000.h // // Vtor Viegas // Dezembro de 2002 // // Ferramentas de desenvolvimento: // Compilador Hi-Tech PIC C V7.85 // MPLAB 5.11.00 // /////////////////////////////////////////////////////////////////////////////////////////

//======================================================================================= // META TEDS //======================================================================================= static const unsigned char META_TEDS[76]= { 0x0, 0x0, 0x0, 0x48, //Meta TEDS length 0x2, //IEEE 1451 standarts family working group number 0x1, //TEDS version number //Globally unique identifier 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xC, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3C, 0x23, 0xD7, 0xA, 0x38, 0xD1, 0xB7, 0x17, 0x38, 0xD1, 0xB7, 0x17, 0x3B, 0xA3, 0xD7, 0xA, 0x40, 0xA0, 0x0, 0x0, 0x3C, 0x23, 0xD7, 0xA, 0x3C, 0x23, 0xD7, 0xA, 0x38, 0xD1, 0xB7, 0x17, 0x3C, 0x23, 0xD7, 0xA, 0x3C, 0x23, 0xD7, 0xA, 0x0, 0x1, 0x86, 0xA0, 0x0, 0x0, 0xD0, 0xE3 }; //CHANNEL_ZERO industry calibration TEDS extension key //CHANNEL_ZERO industry nonvolatile data fields extension key //CHANNEL_ZERO industry TEDS extension key //CHANNEL_ZERO end user's application specific TEDS key //Number of implemented channels //Worst case channel data model length //Worst case channel data repetitions //CHANNEL_ZERO writable TEDS length //Worst case channel update time (Twu) [s] //Global write setup time (Tgws) [s] //Global read setup time (Tgrs) [s] //Worst case channel sampling period (Twsp) [s] //Worst case channel warm up time [s] //Command response time [s] //STIM handshake time (Ths) [s] //End of frame detection latency (Tlat) [s] //TEDS hold off time (Tth) [s] //Operational hold off time (Toh) [s] //Maximum data rate [bit/s] //Channel groupings data sub-block length //Checksum

139

///////////////////////////////////////////////////////////////////////////////////////// // // Implementao de um STIM num PIC16F877 // // Ficheiro teds1001.h // // Vtor Viegas // Dezembro de 2002 // // Ferramentas de desenvolvimento: // Compilador Hi-Tech PIC C V7.85 // MPLAB 5.11.00 // /////////////////////////////////////////////////////////////////////////////////////////

//======================================================================================= // Channel TEDS (Canal 1, sensor analgico simples). //======================================================================================= static const unsigned char CHANNEL1_TEDS[96]= { 0x0, 0x0, 0x0, 0x5C, //Channel TEDS length 0x0, //Calibration key 0x0, //Channel industry calibration TEDS extension key 0x0, //Channel industry nonvolatile data fields extension key 0x0, //Channel industry TEDS extension key 0x0, //Channel end user's application specific TEDS key 0x0, 0x0, 0x0, 0x0, //Channel writable TEDS length 0x0, //Channel type key //Physical units 0x4, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x0, 0x0, 0x0, 0x0, 0x44, 0x7F, 0xC0, 0x0, 0x3B, 0x3, 0x12, 0x6F, 0x0, 0x0, 0x2, 0x0, 0xA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, //Lower range limit //Upper range limit //Worst case uncertainty //Self test key //Channel data model //Channel data model length //Channel model significant bits //Channel data repetitions //Series origin //Series increment

//Series units 0x4, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x3C, 0x23, 0xD7, 0xA, 0x38, 0xD1, 0xB7, 0x17, 0x38, 0xD1, 0xB7, 0x17, 0x38, 0xD1, 0xB7, 0x17, 0x40, 0xA0, 0x0, 0x0, 0x3C, 0x23, 0xD7, 0xA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xEB, 0x68 }; //Channel update time (Tu) [s] //Channel write setup time (Tws) [s] //Channel read setup time (Trs) [s] //Channel sampling period (Tsp) [s] //Channel warm up time [s] //Channel aggregated hold off time (Tch) [s] //Timing correction //Trigger accuracy //Event sequence options //Checksum

140

///////////////////////////////////////////////////////////////////////////////////////// // // Implementao de um STIM num PIC16F877 // // Ficheiro teds1002.h // // Vtor Viegas // Dezembro de 2002 // // Ferramentas de desenvolvimento: // Compilador Hi-Tech PIC C V7.85 // MPLAB 5.11.00 // /////////////////////////////////////////////////////////////////////////////////////////

//======================================================================================= // Channel TEDS (Canal 2, sensor analgico simples). //======================================================================================= static const unsigned char CHANNEL2_TEDS[96+1]= { 0x0, 0x0, 0x0, 0x5C, //Channel TEDS length 0x0, //Calibration key 0x0, //Channel industry calibration TEDS extension key 0x0, //Channel industry nonvolatile data fields extension key 0x0, //Channel industry TEDS extension key 0x0, //Channel end user's application specific TEDS key 0x0, 0x0, 0x0, 0x0, //Channel writable TEDS length 0x0, //Channel type key //Physical units 0x4, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x0, 0x0, 0x0, 0x0, 0x44, 0x7F, 0xC0, 0x0, 0x3B, 0x3, 0x12, 0x6F, 0x0, 0x0, 0x2, 0x0, 0xA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, //Lower range limit //Upper range limit //Worst case uncertainty //Self test key //Channel data model //Channel data model length //Channel model significant bits //Channel data repetitions //Series origin //Series increment

//Series units 0x4, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x3C, 0x23, 0xD7, 0xA, 0x38, 0xD1, 0xB7, 0x17, 0x38, 0xD1, 0xB7, 0x17, 0x38, 0xD1, 0xB7, 0x17, 0x40, 0xA0, 0x0, 0x0, 0x3C, 0x23, 0xD7, 0xA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xEB, 0x68 }; //Channel update time (Tu) [s] //Channel write setup time (Tws) [s] //Channel read setup time (Trs) [s] //Channel sampling period (Tsp) [s] //Channel warm up time [s] //Channel aggregated hold off time (Tch) [s] //Timing correction //Trigger accuracy //Event sequence options //Checksum

141

///////////////////////////////////////////////////////////////////////////////////////// // // Implementao de um STIM num PIC16F877 // // Ficheiro teds1003.h // // Vtor Viegas // Dezembro de 2002 // // Ferramentas de desenvolvimento: // Compilador Hi-Tech PIC C V7.85 // MPLAB 5.11.00 // /////////////////////////////////////////////////////////////////////////////////////////

//======================================================================================= // Channel TEDS (Canal 3, sensor analgico simples). //======================================================================================= static const unsigned char CHANNEL3_TEDS[96]= { 0x0, 0x0, 0x0, 0x5C, //Channel TEDS length 0x0, //Calibration key 0x0, //Channel industry calibration TEDS extension key 0x0, //Channel industry nonvolatile data fields extension key 0x0, //Channel industry TEDS extension key 0x0, //Channel end user's application specific TEDS key 0x0, 0x0, 0x0, 0x0, //Channel writable TEDS length 0x0, //Channel type key //Physical units 0x4, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x0, 0x0, 0x0, 0x0, 0x44, 0x7F, 0xC0, 0x0, 0x3B, 0x3, 0x12, 0x6F, 0x0, 0x0, 0x2, 0x0, 0xA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, //Lower range limit //Upper range limit //Worst case uncertainty //Self test key //Channel data model //Channel data model length //Channel model significant bits //Channel data repetitions //Series origin //Series increment

//Series units 0x4, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x3C, 0x23, 0xD7, 0xA, 0x38, 0xD1, 0xB7, 0x17, 0x38, 0xD1, 0xB7, 0x17, 0x38, 0xD1, 0xB7, 0x17, 0x40, 0xA0, 0x0, 0x0, 0x3C, 0x23, 0xD7, 0xA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xEB, 0x68 }; //Channel update time (Tu) [s] //Channel write setup time (Tws) [s] //Channel read setup time (Trs) [s] //Channel sampling period (Tsp) [s] //Channel warm up time [s] //Channel aggregated hold off time (Tch) [s] //Timing correction //Trigger accuracy //Event sequence options //Checksum

142

///////////////////////////////////////////////////////////////////////////////////////// // // Implementao de um STIM num PIC16F877 // // Ficheiro teds1004.h // // Vtor Viegas // Dezembro de 2002 // // Ferramentas de desenvolvimento: // Compilador Hi-Tech PIC C V7.85 // MPLAB 5.11.00 // /////////////////////////////////////////////////////////////////////////////////////////

//======================================================================================= // Channel TEDS (Canal 4, sensor analgico simples). //======================================================================================= static const unsigned char CHANNEL4_TEDS[96]= { 0x0, 0x0, 0x0, 0x5C, //Channel TEDS length 0x0, //Calibration key 0x0, //Channel industry calibration TEDS extension key 0x0, //Channel industry nonvolatile data fields extension key 0x0, //Channel industry TEDS extension key 0x0, //Channel end user's application specific TEDS key 0x0, 0x0, 0x0, 0x0, //Channel writable TEDS length 0x0, //Channel type key //Physical units 0x4, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x0, 0x0, 0x0, 0x0, 0x44, 0x7F, 0xC0, 0x0, 0x3B, 0x3, 0x12, 0x6F, 0x0, 0x0, 0x2, 0x0, 0xA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, //Lower range limit //Upper range limit //Worst case uncertainty //Self test key //Channel data model //Channel data model length //Channel model significant bits //Channel data repetitions //Series origin //Series increment

//Series units 0x4, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x3C, 0x23, 0xD7, 0xA, 0x38, 0xD1, 0xB7, 0x17, 0x38, 0xD1, 0xB7, 0x17, 0x38, 0xD1, 0xB7, 0x17, 0x40, 0xA0, 0x0, 0x0, 0x3C, 0x23, 0xD7, 0xA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xEB, 0x68 }; //Channel update time (Tu) [s] //Channel write setup time (Tws) [s] //Channel read setup time (Trs) [s] //Channel sampling period (Tsp) [s] //Channel warm up time [s] //Channel aggregated hold off time (Tch) [s] //Timing correction //Trigger accuracy //Event sequence options //Checksum

143

///////////////////////////////////////////////////////////////////////////////////////// // // Implementao de um STIM num PIC16F877 // // Ficheiro teds1005.h // // Vtor Viegas // Dezembro de 2002 // // Ferramentas de desenvolvimento: // Compilador Hi-Tech PIC C V7.85 // MPLAB 5.11.00 // /////////////////////////////////////////////////////////////////////////////////////////

//======================================================================================= // Channel TEDS (Canal 5, sensor analgico simples). //======================================================================================= static const unsigned char CHANNEL5_TEDS[96]= { 0x0, 0x0, 0x0, 0x5C, //Channel TEDS length 0x0, //Calibration key 0x0, //Channel industry calibration TEDS extension key 0x0, //Channel industry nonvolatile data fields extension key 0x0, //Channel industry TEDS extension key 0x0, //Channel end user's application specific TEDS key 0x0, 0x0, 0x0, 0x0, //Channel writable TEDS length 0x0, //Channel type key //Physical units 0x4, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x0, 0x0, 0x0, 0x0, 0x44, 0x7F, 0xC0, 0x0, 0x3B, 0x3, 0x12, 0x6F, 0x0, 0x0, 0x2, 0x0, 0xA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, //Lower range limit //Upper range limit //Worst case uncertainty //Self test key //Channel data model //Channel data model length //Channel model significant bits //Channel data repetitions //Series origin //Series increment

//Series units 0x4, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x3C, 0x23, 0xD7, 0xA, 0x38, 0xD1, 0xB7, 0x17, 0x38, 0xD1, 0xB7, 0x17, 0x38, 0xD1, 0xB7, 0x17, 0x40, 0xA0, 0x0, 0x0, 0x3C, 0x23, 0xD7, 0xA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xEB, 0x68 }; //Channel update time (Tu) [s] //Channel write setup time (Tws) [s] //Channel read setup time (Trs) [s] //Channel sampling period (Tsp) [s] //Channel warm up time [s] //Channel aggregated hold off time (Tch) [s] //Timing correction //Trigger accuracy //Event sequence options //Checksum

144

///////////////////////////////////////////////////////////////////////////////////////// // // Implementao de um STIM num PIC16F877 // // Ficheiro teds1006.h // // Vtor Viegas // Dezembro de 2002 // // Ferramentas de desenvolvimento: // Compilador Hi-Tech PIC C V7.85 // MPLAB 5.11.00 // /////////////////////////////////////////////////////////////////////////////////////////

//======================================================================================= // Channel TEDS (Canal 6, sensor analgico simples). //======================================================================================= static const unsigned char CHANNEL6_TEDS[96]= { 0x0, 0x0, 0x0, 0x5C, //Channel TEDS length 0x0, //Calibration key 0x0, //Channel industry calibration TEDS extension key 0x0, //Channel industry nonvolatile data fields extension key 0x0, //Channel industry TEDS extension key 0x0, //Channel end user's application specific TEDS key 0x0, 0x0, 0x0, 0x0, //Channel writable TEDS length 0x0, //Channel type key //Physical units 0x4, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x0, 0x0, 0x0, 0x0, 0x44, 0x7F, 0xC0, 0x0, 0x3B, 0x3, 0x12, 0x6F, 0x0, 0x0, 0x2, 0x0, 0xA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, //Lower range limit //Upper range limit //Worst case uncertainty //Self test key //Channel data model //Channel data model length //Channel model significant bits //Channel data repetitions //Series origin //Series increment

//Series units 0x4, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x3C, 0x23, 0xD7, 0xA, 0x38, 0xD1, 0xB7, 0x17, 0x38, 0xD1, 0xB7, 0x17, 0x38, 0xD1, 0xB7, 0x17, 0x40, 0xA0, 0x0, 0x0, 0x3C, 0x23, 0xD7, 0xA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xEB, 0x68 }; //Channel update time (Tu) [s] //Channel write setup time (Tws) [s] //Channel read setup time (Trs) [s] //Channel sampling period (Tsp) [s] //Channel warm up time [s] //Channel aggregated hold off time (Tch) [s] //Timing correction //Trigger accuracy //Event sequence options //Checksum

145

///////////////////////////////////////////////////////////////////////////////////////// // // Implementao de um STIM num PIC16F877 // // Ficheiro teds1007.h // // Vtor Viegas // Dezembro de 2002 // // Ferramentas de desenvolvimento: // Compilador Hi-Tech PIC C V7.85 // MPLAB 5.11.00 // /////////////////////////////////////////////////////////////////////////////////////////

//======================================================================================= // Channel TEDS (Canal 7, sensor analgico simples). //======================================================================================= static const unsigned char CHANNEL7_TEDS[96]= { 0x0, 0x0, 0x0, 0x5C, //Channel TEDS length 0x0, //Calibration key 0x0, //Channel industry calibration TEDS extension key 0x0, //Channel industry nonvolatile data fields extension key 0x0, //Channel industry TEDS extension key 0x0, //Channel end user's application specific TEDS key 0x0, 0x0, 0x0, 0x0, //Channel writable TEDS length 0x0, //Channel type key //Physical units 0x4, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x0, 0x0, 0x0, 0x0, 0x44, 0x7F, 0xC0, 0x0, 0x3B, 0x3, 0x12, 0x6F, 0x0, 0x0, 0x2, 0x0, 0xA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, //Lower range limit //Upper range limit //Worst case uncertainty //Self test key //Channel data model //Channel data model length //Channel model significant bits //Channel data repetitions //Series origin //Series increment

//Series units 0x4, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x3C, 0x23, 0xD7, 0xA, 0x38, 0xD1, 0xB7, 0x17, 0x38, 0xD1, 0xB7, 0x17, 0x38, 0xD1, 0xB7, 0x17, 0x40, 0xA0, 0x0, 0x0, 0x3C, 0x23, 0xD7, 0xA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xEB, 0x68 }; //Channel update time (Tu) [s] //Channel write setup time (Tws) [s] //Channel read setup time (Trs) [s] //Channel sampling period (Tsp) [s] //Channel warm up time [s] //Channel aggregated hold off time (Tch) [s] //Timing correction //Trigger accuracy //Event sequence options //Checksum

146

///////////////////////////////////////////////////////////////////////////////////////// // // Implementao de um STIM num PIC16F877 // // Ficheiro teds1008.h // // Vtor Viegas // Dezembro de 2002 // // Ferramentas de desenvolvimento: // Compilador Hi-Tech PIC C V7.85 // MPLAB 5.11.00 // /////////////////////////////////////////////////////////////////////////////////////////

//======================================================================================= // Channel TEDS (Canal 8, sensor analgico simples). //======================================================================================= static const unsigned char CHANNEL8_TEDS[96]= { 0x0, 0x0, 0x0, 0x5C, //Channel TEDS length 0x0, //Calibration key 0x0, //Channel industry calibration TEDS extension key 0x0, //Channel industry nonvolatile data fields extension key 0x0, //Channel industry TEDS extension key 0x0, //Channel end user's application specific TEDS key 0x0, 0x0, 0x0, 0x0, //Channel writable TEDS length 0x0, //Channel type key //Physical units 0x4, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x0, 0x0, 0x0, 0x0, 0x44, 0x7F, 0xC0, 0x0, 0x3B, 0x3, 0x12, 0x6F, 0x0, 0x0, 0x2, 0x0, 0xA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, //Lower range limit //Upper range limit //Worst case uncertainty //Self test key //Channel data model //Channel data model length //Channel model significant bits //Channel data repetitions //Series origin //Series increment

//Series units 0x4, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x3C, 0x23, 0xD7, 0xA, 0x38, 0xD1, 0xB7, 0x17, 0x38, 0xD1, 0xB7, 0x17, 0x38, 0xD1, 0xB7, 0x17, 0x40, 0xA0, 0x0, 0x0, 0x3C, 0x23, 0xD7, 0xA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xEB, 0x68 }; //Channel update time (Tu) [s] //Channel write setup time (Tws) [s] //Channel read setup time (Trs) [s] //Channel sampling period (Tsp) [s] //Channel warm up time [s] //Channel aggregated hold off time (Tch) [s] //Timing correction //Trigger accuracy //Event sequence options //Checksum

147

///////////////////////////////////////////////////////////////////////////////////////// // // Implementao de um STIM num PIC16F877 // // Ficheiro teds1009.h // // Vtor Viegas // Dezembro de 2002 // // Ferramentas de desenvolvimento: // Compilador Hi-Tech PIC C V7.85 // MPLAB 5.11.00 // /////////////////////////////////////////////////////////////////////////////////////////

//======================================================================================= // Channel TEDS (Canal 9, actuador digital). //======================================================================================= static const unsigned char CHANNEL9_TEDS[96]= { 0x0, 0x0, 0x0, 0x5C, //Channel TEDS length 0x0, //Calibration key 0x0, //Channel industry calibration TEDS extension key 0x0, //Channel industry nonvolatile data fields extension key 0x0, //Channel industry TEDS extension key 0x0, //Channel end user's application specific TEDS key 0x0, 0x0, 0x0, 0x0, //Channel writable TEDS length 0x1, //Channel type key //Physical units 0x4, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x0, 0x0, 0x0, 0x0, 0x3F, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, //Lower range limit //Upper range limit //Worst case uncertainty //Self test key //Channel data model //Channel data model length //Channel model significant bits //Channel data repetitions //Series origin //Series increment

//Series units 0x4, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x3C, 0x23, 0xD7, 0xA, 0x38, 0xD1, 0xB7, 0x17, 0x38, 0xD1, 0xB7, 0x17, 0x3B, 0xA3, 0xD7, 0xA, 0x40, 0xA0, 0x0, 0x0, 0x3C, 0x23, 0xD7, 0xA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xCD, 0xD4 }; //Channel update time (Tu) [s] //Channel write setup time (Tws) [s] //Channel read setup time (Trs) [s] //Channel sampling period (Tsp) [s] //Channel warm up time [s] //Channel aggregated hold off time (Tch) [s] //Timing correction //Trigger accuracy //Event sequence options //Checksum

148

///////////////////////////////////////////////////////////////////////////////////////// // // Implementao de um STIM num PIC16F877 // // Ficheiro teds1010.h // // Vtor Viegas // Dezembro de 2002 // // Ferramentas de desenvolvimento: // Compilador Hi-Tech PIC C V7.85 // MPLAB 5.11.00 // /////////////////////////////////////////////////////////////////////////////////////////

//======================================================================================= // Channel TEDS (Canal 10, actuador digital). //======================================================================================= static const unsigned char CHANNEL10_TEDS[96]= { 0x0, 0x0, 0x0, 0x5C, //Channel TEDS length 0x0, //Calibration key 0x0, //Channel industry calibration TEDS extension key 0x0, //Channel industry nonvolatile data fields extension key 0x0, //Channel industry TEDS extension key 0x0, //Channel end user's application specific TEDS key 0x0, 0x0, 0x0, 0x0, //Channel writable TEDS length 0x1, //Channel type key //Physical units 0x4, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x0, 0x0, 0x0, 0x0, 0x3F, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, //Lower range limit //Upper range limit //Worst case uncertainty //Self test key //Channel data model //Channel data model length //Channel model significant bits //Channel data repetitions //Series origin //Series increment

//Series units 0x4, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x3C, 0x23, 0xD7, 0xA, 0x38, 0xD1, 0xB7, 0x17, 0x38, 0xD1, 0xB7, 0x17, 0x3B, 0xA3, 0xD7, 0xA, 0x40, 0xA0, 0x0, 0x0, 0x3C, 0x23, 0xD7, 0xA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xCD, 0xD4 }; //Channel update time (Tu) [s] //Channel write setup time (Tws) [s] //Channel read setup time (Trs) [s] //Channel sampling period (Tsp) [s] //Channel warm up time [s] //Channel aggregated hold off time (Tch) [s] //Timing correction //Trigger accuracy //Event sequence options //Checksum

149

///////////////////////////////////////////////////////////////////////////////////////// // // Implementao de um STIM num PIC16F877 // // Ficheiro teds1011.h // // Vtor Viegas // Dezembro de 2002 // // Ferramentas de desenvolvimento: // Compilador Hi-Tech PIC C V7.85 // MPLAB 5.11.00 // /////////////////////////////////////////////////////////////////////////////////////////

//======================================================================================= // Channel TEDS (Canal 11, actuador digital). //======================================================================================= static const unsigned char CHANNEL11_TEDS[96]= { 0x0, 0x0, 0x0, 0x5C, //Channel TEDS length 0x0, //Calibration key 0x0, //Channel industry calibration TEDS extension key 0x0, //Channel industry nonvolatile data fields extension key 0x0, //Channel industry TEDS extension key 0x0, //Channel end user's application specific TEDS key 0x0, 0x0, 0x0, 0x0, //Channel writable TEDS length 0x1, //Channel type key //Physical units 0x4, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x0, 0x0, 0x0, 0x0, 0x3F, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, //Lower range limit //Upper range limit //Worst case uncertainty //Self test key //Channel data model //Channel data model length //Channel model significant bits //Channel data repetitions //Series origin //Series increment

//Series units 0x4, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x3C, 0x23, 0xD7, 0xA, 0x38, 0xD1, 0xB7, 0x17, 0x38, 0xD1, 0xB7, 0x17, 0x3B, 0xA3, 0xD7, 0xA, 0x40, 0xA0, 0x0, 0x0, 0x3C, 0x23, 0xD7, 0xA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xCD, 0xD4 }; //Channel update time (Tu) [s] //Channel write setup time (Tws) [s] //Channel read setup time (Trs) [s] //Channel sampling period (Tsp) [s] //Channel warm up time [s] //Channel aggregated hold off time (Tch) [s] //Timing correction //Trigger accuracy //Event sequence options //Checksum

150

///////////////////////////////////////////////////////////////////////////////////////// // // Implementao de um STIM num PIC16F877 // // Ficheiro teds1012.h // // Vtor Viegas // Dezembro de 2002 // // Ferramentas de desenvolvimento: // Compilador Hi-Tech PIC C V7.85 // MPLAB 5.11.00 // /////////////////////////////////////////////////////////////////////////////////////////

//======================================================================================= // Channel TEDS (Canal 12, actuador digital). //======================================================================================= static const unsigned char CHANNEL12_TEDS[96]= { 0x0, 0x0, 0x0, 0x5C, //Channel TEDS length 0x0, //Calibration key 0x0, //Channel industry calibration TEDS extension key 0x0, //Channel industry nonvolatile data fields extension key 0x0, //Channel industry TEDS extension key 0x0, //Channel end user's application specific TEDS key 0x0, 0x0, 0x0, 0x0, //Channel writable TEDS length 0x1, //Channel type key //Physical units 0x4, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x0, 0x0, 0x0, 0x0, 0x3F, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, //Lower range limit //Upper range limit //Worst case uncertainty //Self test key //Channel data model //Channel data model length //Channel model significant bits //Channel data repetitions //Series origin //Series increment

//Series units 0x4, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x3C, 0x23, 0xD7, 0xA, 0x38, 0xD1, 0xB7, 0x17, 0x38, 0xD1, 0xB7, 0x17, 0x3B, 0xA3, 0xD7, 0xA, 0x40, 0xA0, 0x0, 0x0, 0x3C, 0x23, 0xD7, 0xA, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xCD, 0xD4 }; //Channel update time (Tu) [s] //Channel write setup time (Tws) [s] //Channel read setup time (Trs) [s] //Channel sampling period (Tsp) [s] //Channel warm up time [s] //Channel aggregated hold off time (Tch) [s] //Timing correction //Trigger accuracy //Event sequence options //Checksum

151

152

B
Anexo

Biblioteca Dinmica TII.dll


//============================================================================== // // Ficheiro: "tii.c" // ltima reviso: Agosto/2002 // Autor: VViegas // Notas: // Biblioteca que implementa funes bsicas de comunicao atravs da TII // (Transducer Independent Interface). Com esta biblioteca, o PC pode simular // um NCAP comunicando com o STIM atravs da porta paralela. // // Mapa do porto LPT (porto de dados): // DIN ---- bit 7 // DCLK ---- bit 6 // NIOE ---- bit 5 // NTRIG ---- bit 4 // // Mapa do porto LPT+1 (porto de estado): // NSDET ---- bit 6 // NINT ---- bit 5 // NACK ---- bit 4 // DOUT ---- bit 3 // //============================================================================== #include <conio.h> #include <windows.h> #include <winbase.h> #include <stdlib.h> #include <math.h> #ifdef WIN32 # define DLLEXPORT __declspec(dllexport) #else # define DLLEXPORT #endif //============================================================================== // Temporizador com resoluo de us (implementado atravs do contador 2). //============================================================================== void Wait(float s) { LARGE_INTEGER aux; //varivel auxiliar LARGE_INTEGER t0; //referncia temporal LARGE_INTEGER dt; //lapso de tempo QueryPerformanceCounter(&t0); QueryPerformanceFrequency(&aux); dt.QuadPart = s * aux.QuadPart; do QueryPerformanceCounter(&aux); while (aux.QuadPart - t0.QuadPart < dt.QuadPart); //espera... //tempos relativos a t0! return; } //captura a origem dos tempos //captura a frequncia do contador //converte s -> contagens

//==============================================================================

153

// Funo que implementa o ponto 6.3.3 da norma IEEE 1451.2. //============================================================================== void WriteByte(unsigned short LPT, unsigned char byte, float bitHalfPeriod) { int i; for(i=0;i<8;i++) { _outp(LPT, byte & 0x80 | 0x10); Wait(bitHalfPeriod); _outp(LPT, byte & 0x80 | 0x50); Wait(bitHalfPeriod); byte = byte << 1; } return; }

//prepara bit de //DCLK=0 durante //subida de DCLK //DCLK=1 durante //bit seguinte

dados: DIN,DCLK,NIOE,NTRIG = d001 1/2 perodo para gatilhar bit de dados 1/2 perodo

//============================================================================== // Funo que implementa o ponto 6.3.4 da norma IEEE 1451.2. //============================================================================== unsigned char ReadByte(unsigned short LPT, float bitHalfPeriod) { int i; unsigned short c; for(i=0;i<8;i++) { _outp(LPT, 0x10); //prepara bit de dados: DIN,DCLK,NIOE,NTRIG=0001 Wait(bitHalfPeriod); //DCLK=0 durante 1/2 perodo _outp(LPT, 0x50); //subida de DCLK para gatilhar bit de dados c = ((_inp(LPT+1) & 0x08) >> 3) | (c & 0xfe); //c<0> = bit de dados Wait(bitHalfPeriod); //DCLK=1 durante 1/2 perodo c = c << 1; //bit seguinte } c = c >> 1; //anula um shift em excesso return (unsigned char)c; }

//============================================================================== // Funo que implementa o ponto 6.3.6 da norma IEEE 1451.2. //============================================================================== DLLEXPORT int WriteFrame(unsigned short LPT, //endereo base da porta paralela unsigned char function, //endereo de funo unsigned char channel, //endereo de canal unsigned char *data, //array de dados unsigned int bytesToWrite, //no. de bytes a escrever float latency, //latency, tlat float holdTime, //hold time, th float handshakeTime, //handshake time, ths unsigned int *NIOE_Negated, //registo do instante da subida de NIOE unsigned int baudRate) //baud rate { unsigned char NACK; unsigned int t0, dt; float bitHalfPeriod = (float)1/(2*baudRate); unsigned int i; //onde guardado o estado da linha NACK //esperas //1/2 perodo de bit

/*cumpre tlat*/ /*NIOE_Negated a referncia temporal de tlat*/ dt = latency * 1000; do {} while (GetTickCount() - *NIOE_Negated < dt); /*inicia a trama de dados descendo NIOE: DIN,DCLK,NIOE,NTRIG=0101*/ _outp(LPT, 0x50); /*escreve function code*/ t0 = GetTickCount(); dt = holdTime * 1000; do if (GetTickCount() - t0 > dt) { _outp(LPT, 0x70); return 1;

//linhas em repouso: DIN,DCLK,NIOE,NTRIG=0111 //sada por timeout: 1 = hold time excedido

154

} while ((_inp(LPT+1) & 0x10) != 0); WriteByte(LPT, function, bitHalfPeriod); /*escreve channel address*/ t0 = GetTickCount(); do if (GetTickCount() - t0 > dt) { _outp(LPT, 0x70); return 1; } while ((_inp(LPT+1) & 0x10) == 0); WriteByte(LPT, channel, bitHalfPeriod); NACK = 0x10; /*escreve array de dados*/ for(i=0; i < bytesToWrite; i++) { t0 = GetTickCount(); do if (GetTickCount() - t0 > dt) { _outp(LPT, 0x70); return 1; } while ((_inp(LPT+1) & 0x10) == NACK); NACK = _inp(LPT+1) & 0x10; WriteByte(LPT, data[i], bitHalfPeriod); }

//espera pela descida de NACK dentro de th //escreve byte

//espera pela subida de NACK dentro de th //NACK est certamente em cima

//espera pela comutao da linha NACK dentro de th //guarda o estado da linha NACK //escreve isimo byte

/*finaliza a trama de dados subindo NIOE: DIN,DCLK,NIOE,NTRIG=0111*/ _outp(LPT, 0x70); /*regista o instante da subida de NIOE*/ *NIOE_Negated = GetTickCount(); /*espera pela subida final de NACK...*/ dt = handshakeTime * 1000; //valida handshake time do //sada por timeout: 2 = handshake time excedido if (GetTickCount() - *NIOE_Negated > dt) return 2; while ((_inp(LPT+1) & 0x10) == 0); return 0; } //sada sem problemas

//============================================================================== // Funo que implementa o ponto 6.3.5 da norma IEEE 1451.2. //============================================================================== DLLEXPORT int ReadFrame (unsigned short LPT, //endereo base da porta paralela unsigned char function, //endereo de funo unsigned char channel, //endereo de canal unsigned char *data, //array de dados unsigned int bytesToRead, //no. de bytes a ler float latency, //latency, tlat float holdTime, //hold time, th float handshakeTime, //handshake time, ths unsigned int *NIOE_Negated, //registo do instante da subida de NIOE unsigned int baudRate) //baud rate { unsigned char NACK; //onde guardado o estado da linha NACK unsigned int t0, dt; //esperas float bitHalfPeriod = (float)1/(2*baudRate); //1/2 perodo de bit unsigned int i;

/*cumpre tlat*/ /*NIOE_Negated a referncia temporal de tlat*/ dt = latency * 1000; do {} while (GetTickCount() - *NIOE_Negated < dt); /*inicia a trama de dados descendo NIOE: DIN,DCLK,NIOE,NTRIG=0101*/ _outp(LPT, 0x50); /*escreve function code*/

155

t0 = GetTickCount(); dt = holdTime * 1000; do if (GetTickCount() - t0 > dt) { _outp(LPT, 0x70); return 1; } while ((_inp(LPT+1) & 0x10) != 0); WriteByte(LPT, function, bitHalfPeriod); /*escreve channel address*/ t0 = GetTickCount(); do if (GetTickCount() - t0 > dt) { _outp(LPT, 0x70); return 1; } while ((_inp(LPT+1) & 0x10) == 0); WriteByte(LPT, channel, bitHalfPeriod); NACK = 0x10; /*constroi array de bytes lidos*/ for(i=0; i < bytesToRead; i++) { t0 = GetTickCount(); do if (GetTickCount() - t0 > dt) { _outp(LPT, 0x70); return 1; } while ((_inp(LPT+1) & 0x10) == NACK); NACK = _inp(LPT+1) & 0x10; data[i] = ReadByte(LPT, bitHalfPeriod); }

//linhas em repouso: DIN,DCLK,NIOE,NTRIG=0111 //sada por timeout: 1 = hold time excedido //espera pela descida de NACK dentro de th //escreve byte

//espera pela subida de NACK dentro de th //NACK est certamente em cima

//espera pela comutao de NACK dentro de th //guarda o estado da linha NACK //l isimo byte

/*finaliza a trama de dados subindo NIOE: DIN,DCLK,NIOE,NTRIG=0111*/ _outp(LPT, 0x70); /*regista o instante da subida de NIOE*/ *NIOE_Negated = GetTickCount(); /*espera pela subida final de NACK dentro de ths*/ dt = handshakeTime * 1000; do //sada por timeout: 2 = handshake time excedido if (GetTickCount() - *NIOE_Negated > dt) return 2; while ((_inp(LPT+1) & 0x10) == 0); return 0; } //sada sem problemas

//============================================================================== // Funo que implementa o ponto 6.3.1 da norma IEEE 1451.2. //============================================================================== int Trigger (unsigned short LPT, //endereo base da porta paralela float samplePeriod, //sample period, tsp float updateTime, //update time, tu float handshakeTime, //handshake time, ths unsigned int *NTRIG_Asserted, //registo do instante de descida de NTRIG unsigned int *NACK_Asserted) //registo do instante de descida de NACK { unsigned int t0, dt;

/*cumpre tsp*/ /*NTRIG_Asserted a referncia temporal de tsp*/ dt = samplePeriod * 1000; do {} while (GetTickCount() - *NTRIG_Asserted < dt); /*activa a linha NTRIG*/ _outp(LPT, 0x60); /*regista o instante da descida de NTRIG*/

156

*NTRIG_Asserted = GetTickCount(); /*espera pela descida de NACK dentro de tu*/ dt = updateTime * 1000; do if (GetTickCount() - *NTRIG_Asserted > dt) { _outp(LPT, 0x70); //linhas em repouso: DIN,DCLK,NIOE,NTRIG=0111 return 3; //sada por timeout: 3 = update time excedido } while ((_inp(LPT+1) & 0x10) != 0); /*regista o instante da descida de NACK*/ *NACK_Asserted = GetTickCount(); /*sobe NTRIG (fim de trigger)*/ _outp(LPT, 0x70); /*espera pela subida final de NACK dentro de ths*/ t0 = GetTickCount(); dt = handshakeTime * 1000; do if (GetTickCount() - t0 > dt) { _outp(LPT, 0x70); //linhas em repouso: DIN,DCLK,NIOE,NTRIG=0111 return 2; //sada por timeout: 2 = handshake time excedido } while ((_inp(LPT+1) & 0x10) == 0); return 0; } //sada sem problemas

//============================================================================== // Funo que implementa o conjunto WriteFrame + Trigger. //============================================================================== DLLEXPORT int WriteActuator (unsigned short LPT, //endereo base da porta paralela unsigned char triggeredChannel, //endereo do canal sob disparo unsigned char *data, //array de dados unsigned int bytesToWrite, //no. de bytes a escrever float latency, //latency, tlat float samplePeriod, //sample period, tsp float updateTime, //update time, tu float writeSetupTime, //write setup time, tws float holdTime, //hold time, th float handshakeTime, //handshake time, ths unsigned int *NTRIG_Asserted, //registo do instante da descida de NTRIG unsigned int *NACK_Asserted, //registo do instante da descida de NACK unsigned int *NIOE_Negated, //registo do instante da subida de NIOE unsigned int baudRate) //baud rate { int aux;

/*WriteFrame*/ aux = WriteFrame(LPT, 0, triggeredChannel, data, bytesToWrite, latency, holdTime, handshakeTime, NIOE_Negated, baudRate); if (aux == 0) { /*WriteFrame realizada com sucesso*/ /*cumpre tws*/ Wait(writeSetupTime); /*Trigger*/ return Trigger(LPT, samplePeriod, updateTime, handshakeTime, NTRIG_Asserted, NACK_Asserted); } else { /*retorna o erro de WriteFrame*/ return aux; } }

//============================================================================== // Funo que implementa o conjunto Trigger + ReadFrame. //==============================================================================

157

DLLEXPORT int ReadSensor (unsigned short LPT, unsigned char triggeredChannel, unsigned char *data, unsigned int bytesToRead, float latency, float samplePeriod, float updateTime, float readSetupTime, float holdTime, float handshakeTime, unsigned int *NTRIG_Asserted, unsigned int *NACK_Asserted, unsigned int *NIOE_Negated, unsigned int baudRate) { int aux;

//endereo base da porta paralela //endereo do canal sob disparo //array de dados //no. de bytes a ler //latency, tlat //sample period, tsp //update time, tu //read setup time, trs //hold time, th //handshake time, ths //registo do instante da descida de NTRIG //registo do instante da descida de NACK //registo do instante da subida de NIOE //baud rate

/*Trigger*/ aux = Trigger(LPT, samplePeriod, updateTime, handshakeTime, NTRIG_Asserted, NACK_Asserted); if (aux == 0) { /*Trigger realizado com sucesso*/ /*cumpre trs*/ Wait(readSetupTime); /*ReadFrame*/ return ReadFrame(LPT, 128, triggeredChannel, data, bytesToRead, latency, holdTime, handshakeTime, NIOE_Negated, baudRate); } else { /*retorna o erro de Trigger*/ return aux; } }

//============================================================================== // Funo que l estruturas de TEDS. //============================================================================== DLLEXPORT int ReadTEDS (unsigned short LPT, //endereo base da porta paralela unsigned char function, //endereo de funo unsigned char channel, //endereo de canal unsigned char *data, //array de dados float latency, //latency, tlat float holdTime, //hold time, th float handshakeTime, //handshake time, ths unsigned int *NIOE_Negated, //registo do instante da subida de NIOE unsigned int baudRate) //baud rate { unsigned char NACK; //onde guardado o estado da linha NACK unsigned int t0, dt; //esperas float bitHalfPeriod = (float)1/(2*baudRate); //1/2 perodo de bit unsigned int i; unsigned long length=0; //TEDS length unsigned short checksum=0; //checksum original lido do STIM unsigned short checksumCalc=0; //checksum calculado

/*cumpre tlat*/ /*NIOE_Negated a referncia temporal de tlat*/ dt = latency * 1000; do {} while (GetTickCount() - *NIOE_Negated < dt); /*inicia a trama de dados descendo NIOE: DIN,DCLK,NIOE,NTRIG=0101*/ _outp(LPT, 0x50); /*escreve function code*/ t0 = GetTickCount(); dt = holdTime * 1000; do if (GetTickCount() - t0 > dt) { _outp(LPT, 0x70); return 1; }

//linhas em repouso: DIN,DCLK,NIOE,NTRIG=0111 //sada por timeout: 1 = hold time excedido

158

while ((_inp(LPT+1) & 0x10) != 0); WriteByte(LPT, function, bitHalfPeriod); /*escreve channel address*/ t0 = GetTickCount(); do if (GetTickCount() - t0 > dt) { _outp(LPT, 0x70); return 1; } while ((_inp(LPT+1) & 0x10) == 0); WriteByte(LPT, channel, bitHalfPeriod); NACK = 0x10; /*extrai o no. de bytes da estrutura TEDS*/ for(i=0; i < 4; i++) { t0 = GetTickCount(); do if (GetTickCount() - t0 > dt) { _outp(LPT, 0x70); return 1; } while ((_inp(LPT+1) & 0x10) == NACK); NACK = _inp(LPT+1) & 0x10; data[i] = ReadByte(LPT, bitHalfPeriod); length += data[i] * pow(256,3-i); } /*l a restante estrutura TEDS*/ for(i=4; i < length+4; i++) { t0 = GetTickCount(); do if (GetTickCount() - t0 > dt) { _outp(LPT, 0x70); return 1; } while ((_inp(LPT+1) & 0x10) == NACK); NACK = _inp(LPT+1) & 0x10; data[i] = ReadByte(LPT, bitHalfPeriod); }

//espera pela descida de NACK dentro de th //escreve byte

//espera pela subida de NACK dentro de th //NACK est certamente em cima

//length sempre do tipo U32L (4 bytes)

//espera pela comutao de NACK dentro de th //guarda o estado da linha NACK //calcula length

//espera pela comutao de NACK dentro de th //guarda o estado da linha NACK //l isimo byte

/*finaliza a trama de dados subindo NIOE: DIN,DCLK,NIOE,NTRIG=0111*/ _outp(LPT, 0x70); /*regista o instante da subida de NIOE*/ *NIOE_Negated = GetTickCount(); /*espera pela subida final de NACK dentro de ths*/ dt = handshakeTime * 1000; do //sada por timeout: 2 = handshake time excedido if (GetTickCount() - *NIOE_Negated > dt) return 2; while ((_inp(LPT+1) & 0x10) == 0); /*calcula checksum e compara-o com lido */ for(i=0; i < length+2; i++) checksumCalc += data[i]; checksumCalc = ~checksumCalc; checksum = data[length+2] * 256 + data[length+3]; if (checksumCalc != checksum) return 3; return 0; }

//soma de data excepto o campo de checksum //complemento para 1 //extrai o checksum original //sada por inconsistncia dos checksums: 3

//sada sem problemas

159

160

C
Anexo

Biblioteca STIM Driver, Manual do Programador


Este anexo constitui um guia rpido para quem deseja utilizar a biblioteca STIM driver para comunicar com um STIM atravs da porta paralela do PC. O guia encontra-se dividido em trs seces: em primeiro lugar, apresentado um tutorial que descreve sumariamente todos os passos necessrios para utilizar a biblioteca numa aplicao em LabVIEW; em segundo lugar, apresentado um exemplo prtico de aplicao; e finalmente listada a documentao de ajuda de todos os instrumentos virtuais (VIs) que compem a biblioteca.

C.1. Tutorial
A biblioteca STIM driver constituda por dois ficheiros: o ficheiro STIM driver.llb que rene os instrumentos virtuais da biblioteca, e o ficheiro tii.dll que contm o cdigo compilado de acesso porta paralela. A biblioteca deve funcionar em qualquer computador com sistema operativo Windows 9X e em qualquer verso do LabVIEW 5.0 ou superior. A verso actual da biblioteca no funciona em ambientes NT ou XP porque esses ambientes no permitem acessos directos aos registos da porta paralela (para esses sistemas operativos ser necessrio refazer o ficheiro tii.dll). Os procedimentos necessrios para utilizar a biblioteca STIM driver numa aplicao em LabVIEW so os seguintes: 1. 2. Prepare todo o hardware necessrio para interligar o STIM e o PC de acordo com o esquema de ligaes da figura 22. Copie os ficheiros
STIM driver.llb, tii.dll, STIM driver.hlp, STIM driver.cnt e NCAP.vi para a pasta c:\STIM.

161

3. 4.

Abra uma sesso de LabVIEW e inicie uma nova aplicao. Para aceder aos instrumentos virtuais da biblioteca, abra a palete de funes do LabVIEW e seleccione Select a VI.... Na caixa de dilogo procure o ficheiro
STIM driver.llb e, dentro deste, seleccione o instrumento virtual *.vi que

deseja. Arraste o cone e inclua-o na sua aplicao. 5. Para consultar a documentao de ajuda do instrumento virtual active o seu menu pendente (com o boto direito do rato) e seleccione o item Help. Antes de trocar dados com o STIM, a aplicao em LabVIEW deve antes de mais conhec-lo. Este conhecimento prvio faz-se atravs da funo ReadTEDS.vi que importa todos os parmetros caractersticos do STIM armazenados nas estruturas meta TEDS e TEDS de canal. A estrutura meta TEDS copiada para a varivel global , e todos os TEDS de canal so alojados na varivel global . A informao armazenada nestas variveis utilizada posteriormente por todas as funes da biblioteca que comunicam com o STIM. Assim sendo, e para que as variveis globais sejam correctamente inicializadas, a funo ReadTEDS.vi deve ser invocada antes de qualquer funo de leitura ou de escrita.

C.2. Exemplo de Aplicao


Para demonstrar as capacidades da biblioteca STIM driver, foi construda uma aplicao em LabVIEW, intitulada NCAP.vi, que comunica com o prottipo de STIM. A aplicao possui as seguintes funcionalidades: 1. 2. 3. 4. 5. 6. 7. Deteco automtica do STIM quando este ligado TII. Acesso individual a todos os canais do STIM (canais 0 a 12). Apresentao dos valores adquiridos pelos sensores do STIM (canais 1 a 8). Possibilidade de alterar o estado dos actuadores digitais do STIM (canais 9 a 12). Apresentao dos registos de estado standard e auxiliar de todos os canais do STIM. Possibilidade de alterar as mscaras de interrupo standard e auxiliar de todos os canais do STIM. Possibilidade de re-inicializar qualquer canal do STIM.

162

Apesar da listagem da aplicao ser auto-explicativa, convm esclarecer alguns pontos: A funo SDET.vi vigia a linha NSDET para detectar se o STIM est ligado TII. A funo ReadTEDS.vi a primeira a ser invocada aps a deteco do STIM. O resto da aplicao consiste num ciclo onde se realizam sequencialmente as seguintes aces: i. Actualizao dos sensores e actuadores do STIM (funes
WriteTriggeredChannelAddress.vi, ReadSensor.vi e WriteActuator.vi)

ii. iii.

Envio de comandos (funo WriteControlCommand.vi). Actualizao das mscaras de interrupo (funes


WriteStandardInterruptMask.vi e WriteAuxiliaryInterruptMask.vi).

iv.

Leitura das mscaras de interrupo actualizadas (funes


ReadStandardInterruptMask.vi e ReadAuxiliaryInterruptMask.vi).

v.

Leitura dos registos de estado (funes


ReadStandardStatus.vi e ReadAuxiliaryStatus.vi).

Segue-se a listagem da aplicao modelo NCAP.vi.

163

NCAP.VI

Connector Pane

Front Panel

164

Block Diagram

165

166

167

168

169

170

171

C.3. Documentao de Ajuda


ErrorHandler.vi Determines whether an IEEE 1451 error has occurred. If an error has occurred, this VI presents a description of the error.

Connector Pane

Controls and Indicators error array in error array in describes one or more error conditions occurring before this function executes. error in error array in describes one or more error conditions occurring before this function executes. status The status boolean is either TRUE (X) for an error, or FALSE (checkmark) for no error or a warning. code The code numeric identifies the error or warning. source The source string describes the origin of the error or warning. type of dialog (no dialog) type of dialog determines what type of dialog box to display, if any. error description error description describes one or more IEEE 1451 errors occurring before this function executes. error? The error? boolean is either TRUE for an error, or FALSE for no error. code The code numeric identifies the error. source The source string describes the origin of the error. message The messagestring describes the error.

172

ReadAuxiliaryInterruptMask.vi Returns the auxiliary interrupt mask register of a channel (see IEEE standard 1451.2, paragraphs 4.9). Connector Pane

Controls and Indicators channel Address of the channel to write. error in (not an error) The error in cluster can accept error information wired from VIs previously called. Use this information to decide if any functionality should be bypassed in the event of errors from other VIs. status The status boolean is either TRUE (X) for an error, or FALSE (checkmark) for no error or a warning. code The code numeric identifies the error or warning. source The source string describes the origin of the error or warning. auxiliary interrupt mask Auxiliary interrupt mask register.

Auxiliary interrupt mask bit. error out The error out cluster passes error or warning information out of a VI to be used by other VIs. status The status boolean is either TRUE (X) for an error, or FALSE (checkmark) for no error or a warning. code The code input identifies the error or warning. source The source string describes the origin of the error or warning.

173

ReadAuxiliaryStatus.vi Returns the auxiliary status register of a channel. Attention: some of the status bits are cleared after read (see IEEE standard 1451.2, paragraphs 4.8.2). Connector Pane

Controls and Indicators channel Address of the channel to read. error in (not an error) The error in cluster can accept error information wired from VIs previously called. Use this information to decide if any functionality should be bypassed in the event of errors from other VIs. status The status boolean is either TRUE (X) for an error, or FALSE (checkmark) for no error or a warning. code The code numeric identifies the error or warning. source The source string describes the origin of the error or warning. auxiliary status Auxiliary status register.

Auxiliary status bit. error out The error out cluster passes error or warning information out of a VI to be used by other VIs. status The status boolean is either TRUE (X) for an error, or FALSE (checkmark) for no error or a warning. code The code input identifies the error or warning. source The source string describes the origin of the error or warning.

174

ReadSensor.vi Triggers the triggered channel and returns its buffer with new data. The programmer shall ensure that the triggered channel corresponds to a sensor. Connector Pane

Controls and Indicators bytes to read Number of bytes to read from the triggered channel. error in (not an error) The error in cluster can accept error information wired from VIs previously called. Use this information to decide if any functionality should be bypassed in the event of errors from other VIs. status The status boolean is either TRUE (X) for an error, or FALSE (checkmark) for no error or a warning. code The code numeric identifies the error or warning. source The source string describes the origin of the error or warning. data Data buffer returned by the triggered channel.

ith data byte received (MSB first). error out The error out cluster passes error or warning information out of a VI to be used by other VIs. status The status boolean is either TRUE (X) for an error, or FALSE (checkmark) for no error or a warning. code The code input identifies the error or warning. source The source string describes the origin of the error or warning.

175

ReadStandardInterruptMask.vi Returns the standard interrupt mask register of a channel (see IEEE standard 1451.2, paragraphs 4.9). Connector Pane

Controls and Indicators channel Address of the channel to read. error in (not an error) The error in cluster can accept error information wired from VIs previously called. Use this information to decide if any functionality should be bypassed in the event of errors from other VIs. status The status boolean is either TRUE (X) for an error, or FALSE (checkmark) for no error or a warning. code The code numeric identifies the error or warning. source The source string describes the origin of the error or warning. standard interrupt mask Standard interrupt mask register.

Standard interrupt mask bit. error out The error out cluster passes error or warning information out of a VI to be used by other VIs. status The status boolean is either TRUE (X) for an error, or FALSE (checkmark) for no error or a warning. code The code input identifies the error or warning. source The source string describes the origin of the error or warning.

176

ReadStandardStatus.vi Returns the standard status register of a channel. Attention: some of the status bits are cleared after read (see IEEE standard 1451.2, paragraphs 4.8.1). Connector Pane

Controls and Indicators channel Address of the channel to read. error in (not an error) The error in cluster can accept error information wired from VIs previously called. Use this information to decide if any functionality should be bypassed in the event of errors from other VIs. status The status boolean is either TRUE (X) for an error, or FALSE (checkmark) for no error or a warning. code The code numeric identifies the error or warning. source The source string describes the origin of the error or warning. standard status Standard status register.

Standard status bit. error out The error out cluster passes error or warning information out of a VI to be used by other VIs. status The status boolean is either TRUE (X) for an error, or FALSE (checkmark) for no error or a warning. code The code input identifies the error or warning. source The source string describes the origin of the error or warning.

177

ReadTEDS.vi Reads Meta TEDS and all Channel TEDS implemented in the STIM. The information is stored in global variables (Globals.gbl), being accessible to all VIs of the library. Use this function to initialize the global variables. Important: this function should be the first one to be called in any program using the STIM driver library. If you call another VI before, it might not work because it uses global variables that are not yet initialized. Connector Pane

Controls and Indicators error in (not an error) The error in cluster can accept error information wired from VIs previously called. Use this information to decide if any functionality should be bypassed in the event of errors from other VIs. status The status boolean is either TRUE (X) for an error, or FALSE (checkmark) for no error or a warning. code The code numeric identifies the error or warning. source The source string describes the origin of the error or warning. error out The error out cluster passes error or warning information out of a VI to be used by other VIs. status The status boolean is either TRUE (X) for an error, or FALSE (checkmark) for no error or a warning. code The code input identifies the error or warning. source The source string describes the origin of the error or warning.

178

ReadTriggeredChannelAddress.vi Returns the address of the triggered channel. Connector Pane

Controls and Indicators error in (not an error) The error in cluster can accept error information wired from VIs previously called. Use this information to decide if any functionality should be bypassed in the event of errors from other VIs. status The status boolean is either TRUE (X) for an error, or FALSE (checkmark) for no error or a warning. code The code numeric identifies the error or warning. source The source string describes the origin of the error or warning. triggered channel address Address of the triggered channel. error out The error out cluster passes error or warning information out of a VI to be used by other VIs. status The status boolean is either TRUE (X) for an error, or FALSE (checkmark) for no error or a warning. code The code input identifies the error or warning. source The source string describes the origin of the error or warning.

179

ReadVersion.vi Returns the STIM version (see IEEE standard 1451.2, paragraphs 4.13). Connector Pane

Controls and Indicators error in (not an error) The error in cluster can accept error information wired from VIs previously called. Use this information to decide if any functionality should be bypassed in the event of errors from other VIs. status The status boolean is either TRUE (X) for an error, or FALSE (checkmark) for no error or a warning. code The code numeric identifies the error or warning. source The source string describes the origin of the error or warning. STIM version STIM version code. error out The error out cluster passes error or warning information out of a VI to be used by other VIs. status The status boolean is either TRUE (X) for an error, or FALSE (checkmark) for no error or a warning. code The code input identifies the error or warning. source The source string describes the origin of the error or warning.

180

SDET.vi Polls the NSDET line searching for a STIM connected. Connector Pane

Controls and Indicators error in (not an error) The error in cluster can accept error information wired from VIs previously called. Use this information to decide if any functionality should be bypassed in the event of errors from other VIs. status The status boolean is either TRUE (X) for an error, or FALSE (checkmark) for no error or a warning. code The code numeric identifies the error or warning. source The source string describes the origin of the error or warning. SDET? Boolean that is either TRUE if NSDET is asserted, or FALSE if NSDET is negated (no STIM connected). error out The error out cluster passes error or warning information out of a VI to be used by other VIs. status The status boolean is either TRUE (X) for an error, or FALSE (checkmark) for no error or a warning. code The code input identifies the error or warning. source The source string describes the origin of the error or warning.

181

SRQ.vi Polls the NINT line searching for service requests from de STIM. Connector Pane

Controls and Indicators error in (not an error) The error in cluster can accept error information wired from VIs previously called. Use this information to decide if any functionality should be bypassed in the event of errors from other VIs. status The status boolean is either TRUE (X) for an error, or FALSE (checkmark) for no error or a warning. code The code numeric identifies the error or warning. source The source string describes the origin of the error or warning. SRQ? Boolean that is either TRUE if NINT is asserted, or FALSE if NINT is negated. error out The error out cluster passes error or warning information out of a VI to be used by other VIs. status The status boolean is either TRUE (X) for an error, or FALSE (checkmark) for no error or a warning. code The code input identifies the error or warning. source The source string describes the origin of the error or warning.

182

WriteActuator.vi Writes new data to the triggered channel. The programmer shall ensure that the triggered channel corresponds to an actuator. Connector Pane

Controls and Indicators data Data buffer to be sended to the actuator.

ith data byte to send (MSB first). error in (not an error) The error in cluster can accept error information wired from VIs previously called. Use this information to decide if any functionality should be bypassed in the event of errors from other VIs. status The status boolean is either TRUE (X) for an error, or FALSE (checkmark) for no error or a warning. code The code numeric identifies the error or warning. source The source string describes the origin of the error or warning. error out The error out cluster passes error or warning information out of a VI to be used by other VIs. status The status boolean is either TRUE (X) for an error, or FALSE (checkmark) for no error or a warning. code The code input identifies the error or warning. source The source string describes the origin of the error or warning.

183

WriteAuxiliaryInterruptMask.vi Writes the auxiliary interrupt mask register of a channel (see IEEE standard 1451.2, paragraphs 4.9). Connector Pane

Controls and Indicators channel Address of the channel to write. auxiliary interrupt mask Mask pattern to write. Mask bit. error in (not an error) The error in cluster can accept error information wired from VIs previously called. Use this information to decide if any functionality should be bypassed in the event of errors from other VIs. status The status boolean is either TRUE (X) for an error, or FALSE (checkmark) for no error or a warning. code The code numeric identifies the error or warning. source The source string describes the origin of the error or warning. error out The error out cluster passes error or warning information out of a VI to be used by other VIs. status The status boolean is either TRUE (X) for an error, or FALSE (checkmark) for no error or a warning. code The code input identifies the error or warning. source The source string describes the origin of the error or warning.

184

WriteControlCommand.vi Sends a control command to a channel. Connector Pane

Controls and Indicators control command Code of the control command (see IEEE standard 1451.2, paragraphs 4.7). channel Address of the channel to control. error in (not an error) The error in cluster can accept error information wired from VIs previously called. Use this information to decide if any functionality should be bypassed in the event of errors from other VIs. status The status boolean is either TRUE (X) for an error, or FALSE (checkmark) for no error or a warning. code The code numeric identifies the error or warning. source The source string describes the origin of the error or warning. error out The error out cluster passes error or warning information out of a VI to be used by other VIs. status The status boolean is either TRUE (X) for an error, or FALSE (checkmark) for no error or a warning. code The code input identifies the error or warning. source The source string describes the origin of the error or warning.

185

WriteStandardInterruptMask.vi Writes the standard interrupt mask register of a channel (see IEEE standard 1451.2, paragraphs 4.9). Connector Pane

Controls and Indicators channel Address of the channel to write. standard interrupt mask Mask pattern to write.

Mask bit. error in (not an error) The error in cluster can accept error information wired from VIs previously called. Use this information to decide if any functionality should be bypassed in the event of errors from other VIs. status The status boolean is either TRUE (X) for an error, or FALSE (checkmark) for no error or a warning. code The code numeric identifies the error or warning. source The source string describes the origin of the error or warning. error out The error out cluster passes error or warning information out of a VI to be used by other VIs. status The status boolean is either TRUE (X) for an error, or FALSE (checkmark) for no error or a warning. code The code input identifies the error or warning. source The source string describes the origin of the error or warning.

186

WriteTriggeredChannelAddress.vi Defines the triggered channel. Connector Pane

Controls and Indicators triggered channel address Address of the new triggered channel. error in (not an error) The error in cluster can accept error information wired from VIs previously called. Use this information to decide if any functionality should be bypassed in the event of errors from other VIs. status The status boolean is either TRUE (X) for an error, or FALSE (checkmark) for no error or a warning. code The code numeric identifies the error or warning. source The source string describes the origin of the error or warning. error out The error out cluster passes error or warning information out of a VI to be used by other VIs. status The status boolean is either TRUE (X) for an error, or FALSE (checkmark) for no error or a warning. code The code input identifies the error or warning. source The source string describes the origin of the error or warning.

187

188

D
Anexo

Ensaio A
SamplingRate.vi

Connector Pane

Front Panel

189

Block Diagram

190

191

192

E
Anexo

Ensaio B
ActuationRate.vi

Connector Pane

Front Panel

193

Block Diagram

194

195

196

F
Anexo

Ensaio D
ErrorRate.vi

Connector Pane

Front Panel

197

Block Diagram

198

199

200

201

202

G
Anexo

Ensaio E
Acquisition.VI

Connector Pane

Front Panel

203

Block Diagram

204

205

Processing.vi

Connector Pane

Front Panel

206

Block Diagram

207

208

209

210

H
Anexo

Ensaio F
Loop.vi

Connector Pane

Front Panel

211

Block Diagram

212

9100 Product Specifications


Wavetek-Datron (Fluke) 9100 Universal Multifunction Calibration System 9100 Performance Characteristics Form Factor DC Volts Minimum Range DC Volts Maximum Range DC Volts Maximum Resolution DC Volts Basic 1 yr accuracy AC Volts Minimum Range AC Volts Maximum Range AC Volts Minimum Frequency AC Volts Maximum Frequency AC Volts Maximum Resolution AC Volts Basic 1 Year Accuracy DC Current Minimum Range DC Current Maximum Range DC Current Maximum Resolution DC Current Basic 1 yr accuracy AC Current Minimum Range AC Current Maximum Range AC Current Maximum Resolution AC Current Basic 1 Year Accuracy Resistance Minimum Range Resistance Maximum Range Resistance Maximum Resolution Resistance Basic 1 yr accuracy Minimum Frequency Maximum Frequency Frequency Accuracy 9100 Measurements/Features Calibrates over 15 categories Semi/Fully-Automated Modes Variable capacitance to 40 mF Conductance to 2.5 milliSiemen Sine,Sq,Tri,Impulse,Trap wavef Var amp pulses to 10MHz Pulse widths to 2 seconds Duty cycles 0.05-99.95% Use PCMCIA cards 9100 Programmability/Connectivity User Interface Ports to Peripheral Devices 9100 Calibration Calibration Period Proprietary IEEE488 1yr Benchtop 0V 1050 V 1 uV 0.004 % 0 mV 1050 V 10 Hz 100 kHz 1 uV 0.025 % 0 nA 20 A 1 nA 0.010 % 0 uA 20 A 1 nA 0.045 % 0 Ohm 400 MOhm 100 uOhm 0.010 % 0.5 Hz 10 MHz 0.01 %

213

214

Bibliografia
[1] Ramn Pallas-Arenry, John G. Webster, Sensors and Signal Conditioning, John Wiley & Sons, EUA, 1991 [2] IEEE Std 1451.1, "IEEE Standard for a Smart Transducer Interface for Sensors and Actuators - Network Capable Application Processor (NCAP) Information Model", IEEE Inc., Nova Iorque, EUA, 2000. [3] IEEE Std 1451.2, "IEEE Standard for a Smart Transducer Interface for Sensors and Actuators - Transducer to Microprocessor Communication Protocols and Transducer Electronic Data Sheet (TEDS) Formats", IEEE Inc., Nova Iorque, EUA, 1998. [4] Stio da Internet, patrocinado pelo NIST, com informao vria cerca do modelo IEEE 1451: www.motion.aptd.nist.gov. [5] Kang Lee, A Synopsis of the IEEE P1451 Standards for Smart Transducer Communication, Sensors Expo, Baltimore, EUA, Maio de 1999. [6] Robert N. Johnson, Building Plug-and-Play Networked Smart Transducers, Sensors Magazine, Outubro de 1997. [7] Kang Lee, IEEE 1451: A Standard in Support of Smart Transducer Networking, IEEE Instrumentation and Measurement Technology Conference, Baltimore, EUA, Maio de 2000. [8] Plug and Play Sensors Automating Setup of Measurement and Automation Systems, artigo annimo na directoria NI Developer Zone\Development Library\Sensors\General do stio da National Instruments Inc. na Internet: www.ni.com.

215

[9]

Robert N. Johnson, Proposed Enhancement to the IEEE 1451.2 Standard for Smart Transducers, Sensors Magazine, Setembro de 2001.

[10] L. Cmara, O. Ruiz, J. Samitier, Complete IEEE 1451 Node, STIM and NCAP Implemented for a CAN Network, IEEE Instrumentation and Measurement Technology Conference, Baltimore, EUA, Maio de 2000. [11] PIC16F87X Data Sheet, Microchip Technology Inc., 1999. [12] Richard Fischer, Jeff Burch, The PICmicro MCU as an IEEE 1451.2 Compatible Smart Transducer Interface Module (STIM), Application Note AN214, Microhip Technology Inc., Julho de 2000. [13] Hans-Peter Messmer, "The Indispensable PC Hardware Book", 3th edition, Addison-Wesley, England, 1997. [14] LabVIEW Help, National Instruments Inc., Part Number 370117A-01,

Julho de 2000. [15] IEEE Std 1057, "IEEE Standard for Digitizing Waveform Recorders", IEEE Inc., Nova Iorque, EUA, 1994. [16] Antnio Cruz Serra, Sistemas de Medida, Captulo 7, Associao de Estudantes do Instituto Superior Tcnico, 2 edio, Lisboa, 1999 .

216

Lista de Figuras
Figura 1. Os transdutores como veculos de energia entre o sistema e o mundo exterior. ...................................1 Figura 2. Transdutor inteligente ligado em rede segundo o modelo IEEE 1451. ..................................................5 Figura 3. Exemplo de sistema distribudo de medida e controlo baseado no modelo IEEE 1451.....................7 Figura 4. Diagrama funcional do STIM..........................................................................................................................8 Figura 5. Interface P1451.3 (note-se o paralelismo entre TBIM e STIM)..............................................................12 Figura 6. Diagrama funcional da interface P1451.3....................................................................................................13 Figura 7. Transdutor analgico com interface mista. .................................................................................................14 Figura 8. Exemplo de interface P1451.4 de classe 1 para um transdutor analgico alimentado com tenso. .15 Figura 9. Exemplo de interface P1451.4 de classe 2 para um transdutor analgico 4 20 mA.........................16 Figura 10. A interface digital estende-se facilmente para vrios transdutores atravs de um cabo coaxial ou par de condutores entranados. ............................................................................................................................17 Figura 11. Estrutura de dados de um canal do STIM. ................................................................................................22 Figura 12. Diagrama temporal de uma trama de dados..............................................................................................31 Figura 13. Diagrama temporal de um disparo..............................................................................................................31 Figura 14. Circuito do STIM. ..........................................................................................................................................38 Figura 15. Placa de circuito impresso do prottipo de STIM: em cima a vista dos componentes, em baixo a vista das pistas. .........................................................................................................................................................40 Figura 16. Mapa de memria do STIM. Os espaos a preto esto reservados para registos internos do microcontrolador, os espaos a branco so geridos pelo compilador e os espaos a cinzento correspondem a variveis explicitamente localizadas........................................................................................42 Figura 17. Programa principal do STIM. ......................................................................................................................45 Figura 18. Disparo de um sensor simples.....................................................................................................................54 Figura 19. Disparo de um actuador simples. ................................................................................................................55 Figura 20. Viso geral do programa do STIM. ............................................................................................................59 Figura 21. Funes da biblioteca STIM driver criada em LabVIEW. .....................................................................62 Figura 22. Esquema de ligaes da TII.........................................................................................................................63 Figura 23. Diagrama temporal da funo WriteByte. ........................................................................................65 Figura 24. Extracto da funo WriteControlCommand.vi. .......................................................................72 Figura 25. Extracto da funo ReadStandardStatus.vi. ..........................................................................73 Figura 26. Estrutura da interface de STIM para LabVIEW......................................................................................77 Figura 27. Esquema do ensaio A. ..................................................................................................................................80 Figura 28. Ritmo de aquisio em funo da velocidade de comunicao entre o STIM e o NCAP. ..............82 Figura 29. Esquema do ensaio B....................................................................................................................................83 Figura 30. Ritmo de actuao em funo da velocidade de comunicao entre o STIM e o NCAP. ...............85 Figura 31. Esquema do ensaio C. ...................................................................................................................................87 Figura 32. Ensaio A a 6 kbit/s (sensibilidade horizontal = 5 ms/div, sensibilidade vertical = 5 V/div para todos os canais)........................................................................................................................................................89

217

Figura 33. Ensaio A a 6 kbit/s (sensibilidade horizontal = 2 ms/div, sensibilidade vertical = 5 V/div para todos os canais)........................................................................................................................................................90 Figura 34. Ensaio A a 6 kbit/s (sensibilidade horizontal = 1 ms/div, sensibilidade vertical = 5 V/div para todos os canais)........................................................................................................................................................91 Figura 35. Ensaio A a 6 kbit/s (sensibilidade horizontal = 200 s/div, sensibilidade vertical = 5 V/div para todos os canais)........................................................................................................................................................92 Figura 36. Ensaio B a 6 kbit/s (sensibilidade horizontal = 5 ms/div, sensibilidade vertical = 5 V/div para todos os canais)........................................................................................................................................................93 Figura 37. Ensaio B a 6 kbit/s (sensibilidade horizontal = 2 ms/div, sensibilidade vertical = 5 V/div para todos os canais)........................................................................................................................................................94 Figura 38. Ensaio B a 6 kbit/s (sensibilidade horizontal = 200 s/div, sensibilidade vertical = 5 V/div para todos os canais)........................................................................................................................................................95 Figura 39. Disparos espaados de Tsp = 40 ms (sensibilidade horizontal = 10 ms/div, sensibilidade vertical = 5 V/div para todos os canais). ..........................................................................................................................96 Figura 40. Entre o disparo e a trama de dados seguinte verifica-se Trs = 40 ms (sensibilidade horizontal = 10 ms/div, sensibilidade vertical = 5 V/div para todos os canais).................................................................97 Figura 41. Tramas espaadas de Tlat = 40 ms (sensibilidade horizontal = 10 ms/div, sensibilidade vertical = 5 V/div para todos os canais)................................................................................................................................98 Figura 42. Actuaes pautadas por Tws = 40 ms (sensibilidade horizontal = 10 ms/div, sensibilidade vertical = 5 V/div para todos os canais). ............................................................................................................99 Figura 43. Ensaio A a 100 kbit/s (sensibilidade horizontal = 1 ms/div, sensibilidade vertical = 5 V/div para todos os canais)......................................................................................................................................................100 Figura 44. Ensaio A a 100 kbit/s (sensibilidade horizontal = 10 s/div, sensibilidade vertical = 5 V/div para todos os canais)......................................................................................................................................................101 Figura 45. Esquema do ensaio D. ................................................................................................................................104 Figura 46. Esquema do ensaio E..................................................................................................................................108 Figura 47. Medio do intervalo de tempo entre amostras. ....................................................................................111 Figura 48. Rudo introduzido pelo canal de digitalizao para 8192 amostras. ...................................................113 Figura 49. Circuito do ensaio F. ...................................................................................................................................115 Figura 50. Histograma obtido no ensaio F.................................................................................................................117 Figura 51. Excerto da caracterstica de transferncia do ADC do STIM..............................................................118

218

Lista de Tabelas
Tabela 1. Canais de comunicao previstos na norma P1451.3................................................................................12 Tabela 2. Estrutura TEDS de um acelermetro compatvel com a norma P1451.4. ...........................................17 Tabela 3. Funes de implementao obrigatria em qualquer prottipo de STIM. ...........................................25 Tabela 4. Comandos de implementao obrigatria: a) apenas para os canais do tipo sensor de eventos; b) apenas para os canais do tipo sensor contnuo com ou sem memria. .........................................................26 Tabela 5. Estrutura meta TEDS.....................................................................................................................................28 Tabela 6. Estrutura TEDS de canal...............................................................................................................................29 Tabela 7. Linhas da TII....................................................................................................................................................30 Tabela 8. Transaces entre o STIM e o NCAP.........................................................................................................32 Tabela 9. Latncias e alarmes da TII. ............................................................................................................................34 Tabela 10. Utilizao dos pinos do microcontrolador PIC16F877 (encapsulamento DIP). ...............................39 Tabela 11. Tabela de ligaes da TII..............................................................................................................................63 Tabela 12. Erros reportados pelas funes WriteFrame e ReadFrame................................................................67 Tabela 13. Erros reportados pela funo Trigger. ...................................................................................................68 Tabela 14. Erros reportados pela funo ReadTEDS..................................................................................................71 Tabela 15. Argumentos da funo WriteFrame.........................................................................................................73 Tabela 16. Argumentos da funo ReadFrame. ..........................................................................................................74 Tabela 17. Variveis globais da biblioteca STIM driver. ............................................................................................75 Tabela 18. Erros reportados pelas funes da biblioteca STIM driver. ..................................................................76 Tabela 19. Resultados do ensaio A. ...............................................................................................................................82 Tabela 20. Resultados do ensaio B. ...............................................................................................................................85 Tabela 21. Alterao das latncias da TII e respectivas oscilografias. .....................................................................88 Tabela 22. Resultados do ensaio E. .............................................................................................................................113

219

220

Lista de Siglas e Acrnimos


ADC API DAC DFT DLL IEEE LED NCAP p.ex. PC RAM SINAD SPI SRQ STIM TEDS TII UART VI Analog to Digital Converter Application Program Interface Digital to Analog Converter Discrete Fourier Transform Dynamic Link Library Institute of Electrical and Electronics Engineers Light Emitter Diode Network Capable Application Processor por exemplo Personal Computer Random Access Memory Signal-to-Noise and Distortion Ratio Serial Peripheral Interface Service Request Smart Transducer Interface Module Transducer Electronic Data Sheet Transducer Independent Interface Universal Asynchronous Receiver Transmitter Virtual Instrument

221

222

Mem Martins, Abril de 2003

223

Você também pode gostar