<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Eletronica.org</title>
	<atom:link href="http://www3.eletronica.org/feed" rel="self" type="application/rss+xml" />
	<link>http://www3.eletronica.org</link>
	<description>Eletrônica para hobbystas, estudantes e profissionais</description>
	<lastBuildDate>Wed, 22 Feb 2012 17:18:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Simulação baseada em software livre de um sistema robótico fuzzy</title>
		<link>http://www3.eletronica.org/artigos/simulacao-baseada-em-software-livre-de-um-sistema-robotico-fuzzy</link>
		<comments>http://www3.eletronica.org/artigos/simulacao-baseada-em-software-livre-de-um-sistema-robotico-fuzzy#comments</comments>
		<pubDate>Mon, 20 Feb 2012 20:43:28 +0000</pubDate>
		<dc:creator>Administrador Eletronica.org</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[fuzzy]]></category>
		<category><![CDATA[robótica]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=352</guid>
		<description><![CDATA[Resumo Sistemas robóticos podem ser compreendidos como sistemas concebidos de liberdade de movimentos para realizarem tarefas de forma autônoma, suas aplicações estendem-se por um amplo espectro de áreas, tais como: automação industrial; medicina; exploração espacial e outros. O presente artigo utiliza ferramentas de software livre para simular um sistema de navegação nebuloso para um agente ...]]></description>
			<content:encoded><![CDATA[<h1 style="text-align: left;">Resumo</h1>
<p>Sistemas robóticos podem ser compreendidos como sistemas concebidos de liberdade de movimentos para realizarem tarefas de forma autônoma, suas aplicações estendem-se por um amplo espectro de áreas, tais como: automação industrial; medicina; exploração espacial e outros. O presente artigo utiliza ferramentas de software livre para simular um sistema de navegação nebuloso para um agente robótico. O software Simbad, em conjunto com a biblioteca jFuzzyLogic, foram aplicados para realizar esta simulação, cujos resultados demonstram que o agente robótico é capaz de percorrer o trajeto proposto, ao mesmo tempo em que desvia dos obstáculos.</p>
<p>Palavras-chave: robótica móvel, lógica nebulosa, software livre</p>
<h1>1. Introdução</h1>
<p>O emprego de robôs para a realização de diversas tarefas tem sido cada vez mais comum, facilitando, dessa forma, o desempenho de inúmeras atividades, inclusive as mais perigosas, nas quais seria inviável ou impossível a realização delas pelo homem. Algumas vantagens proporcionadas pela utilização de robôs são: aumento de produtividade na indústria; maior precisão e velocidade na fabricação e montagem dos produtos e afastamento da mão de obra humana dos locais inóspitos. Dessa maneira, o incentivo ao desenvolvimento da robótica torna-se cada vez mais crucial para a melhoria da qualidade de vida e desenvolvimento da sociedade.</p>
<p>Sistemas robóticos podem ser compreendidos como sistemas concebidos de liberdade de movimentos para realizarem tarefas com certo nível de autonomia de decisão, suas aplicações estendem-se por um amplo espectro de áreas, como: automação industrial (FILHO et al., 2010); medicina (PREISING et al., 1991); exploração espacial (HIRZING et al., 1994) e outros.</p>
<p>O avanço da robótica também é percebido no ramo educacional, onde diversos robôs têm sido empregados para o ensino, para o provimento da multidisciplinaridade e interdisciplinaridade, fornecimento de conhecimento tecnológico e principalmente para disseminar conceitos da mecânica, eletrônica, engenharia e computação (SOLIS et al., 2009). Dessa forma, a utilização de robôs autônomos proporciona inúmeras vantagens e possui grande empregabilidade em inúmeras áreas de atuação.</p>
<p>A utilização de softwares livres, da mesma maneira, tem se mostrado cada vez mais notória em iniciativas governamentais e privadas. As vantagens oriundas desses softwares vão além do custo econômico, a possibilidade de modificar o código-fonte do software fornece uma grande liberdade e flexibilidade para os sistemas computacionais (STALLMAN, 1999). As características existentes no software livre contribuem para elaboração de ferramentas de simulação de sistemas robóticos, auxiliando na resolução de diversos problemas nessa área.</p>
<p>O objetivo deste artigo é realizar a simulação de um sistema de navegação robótica através da utilização de softwares livres. Para isso, foi utilizado o simulador Simbad (HUGUES e BREDECHE, 2006) escrito em Java, o mesmo fornece um ambiente de simulação contendo um ou mais robôs, que podem ser equipados com câmeras e sensores e um cenário contendo obstáculos e vários outros recursos adicionais. Foi utilizado também um pacote, o jFuzzyLogic (CINGOLANI, 2011), para implementar o paradigma reativo para o desvio de obstáculos através da utilização da lógica fuzzy, proporcionando ao sistema uma metodologia para representar a percepção baseada em ações. Estas duas ferramentas de software livre foram aplicadas para realizar essa simulação, cujos resultados demonstram que o agente robótico é capaz de percorrer a sequência de coordenadas especificadas, ao mesmo tempo em que desvia dos obstáculos do ambiente.</p>
<p>O restante do trabalho está dividido em seis seções. A seção 2 traz conceitos de robótica móvel e as dificuldades existentes na navegação robótica. A seção 3 do artigo discorre sobre a lógica fuzzy. A seção 4 detalha as ferramentas utilizadas na simulação. A seção 5 mostra como foi implementado o sistema robótico. A seção 6 exibe os resultados da simulação. Finalmente, a última seção mostra as considerações finais obtidas com a conclusão desse trabalho.</p>
<h1>2. Robótica Móvel</h1>
<p>A robótica móvel engloba todos aqueles dispositivos automatizados capazes de se locomoverem em um determinado ambiente. A movimentação pode ser controlada através da intervenção humana, onde temos o uso de controle remoto, por exemplo, ou através de inteligência computacional, onde os robôs podem tomar decisões sobre a rota a ser seguida através da leitura do ambiente. Existe uma grande variedade de ferramentas para a locomoção de robôs, cada uma atendendo a características específicas do ambiente. Por exemplo, robôs podem atuar em solos rochosos ou arenosos, em ambientes aquáticos ou até mesmo em céu aberto. Cada ambiente requer equipamento e controles especiais para atenderem suas especificidades.</p>
<p>Os paradigmas da robótica móvel são mostrados na Figura 1. A escolha de qual paradigma empregado no projeto depende da necessidade e da complexidade da tarefa a ser executada.</p>
<p>&nbsp;</p>
<p style="text-align: center;"><a href="http://www3.eletronica.org/wp-content/uploads/2012/02/fig1.png"><img class="alignnone size-full wp-image-357" title="fig1" src="http://www3.eletronica.org/wp-content/uploads/2012/02/fig1.png" alt="" width="580" height="381" /></a></p>
<p style="text-align: center;">Figura 1 &#8211; Paradigmas na robótica: (i) hierárquico, (ii) reativo, (iii) híbrido (SIMÕES et al., 2006).</p>
<p style="text-align: left;">Para projetos mais complexos, nos quais o ambiente apresenta uma grande quantidade de informações, o paradigma hierárquico é mais adequado porque o robô pode tomar decisões baseadas no grau de dificuldade obtida, permitindo um domínio maior da situação. Por sua vez, o paradigma reativo procura diminuir a complexidade gerada pelo paradigma hierárquico, pois com o decorrer dos anos a etapa de planejamento se tornou demasiadamente complexa. Com o intuito de mesclar as vantagens dos dois paradigmas apresentados, surge o paradigma híbrido. Assim, uma tarefa pode ser decomposta em sub-tarefas para que o robô possa escolher qual a ação mais adequada para executá-las (SIMÕES et al., 2006).</p>
<p>A navegação robótica torna-se um obstáculo encontrado no desenvolvimento da robótica móvel. Inúmeros fatores podem torná-la mais complicada uma vez que é necessária a leitura e a interpretação do ambiente para que as decisões sejam tomadas, visando permitir ações rápidas que evitem colisões e garantindo que a trajetória seja percorrida com sucesso (FRACASSO et al., 2005).</p>
<p>A percepção territorial realizada pelo robô pode ser feita através de diversos métodos, dependendo do terreno onde o mesmo se encontra. Pode-se utilizar sonares em ambientes em que a informação é pouca ou nenhuma (OTTONI et al., 2003) ou o rastreamento pode ser feito através da visão (MOTTA et al., 2008). As informações captadas passam por um estágio de processamento, onde muitas vezes são filtradas para que sejam interpretadas com maior precisão. A partir daí, os resultados obtidos pela etapa de processamento são usados para realizar a ação do robô, onde os comandos são enviados para os atuadores.</p>
<p>Estudos têm buscado diminuir várias dificuldades encontradas na navegação de um robô (BATISTA et al., 2010). Nosso trabalho tem como objetivo realizar uma simulação de um sistema robótico móvel e nebuloso, o qual será descrito nas seções seguintes, utilizando ferramentas de software livre.</p>
<h1>3. Lógica Fuzzy</h1>
<p>A lógica fuzzy ou lógica nebulosa é uma forma de realizar a interface entre processos inerentemente analógicos, que se movem através de uma faixa contínua de valores, para o universo digital, onde os valores são definidos como discretos. Foi inicialmente proposta por Lotfi A. Zadeh (PERRY, 1995) na Universidade da Califórnia em Berkeley em um artigo datado de 1965.</p>
<p>As implementações da lógica nebulosa permitem que estados indeterminados possam ser tratados por dispositivos de controle. Desse modo, é possível avaliar conceitos não quantificáveis. A lógica fuzzy deve ser vista mais como uma área de pesquisa sobre tratamento da incerteza, ou uma família de modelos matemáticos dedicados ao tratamento da incerteza, do que uma lógica propriamente dita. A lógica nebulosa normalmente está associada ao uso da teoria de conjuntos fuzzy.</p>
<p>A lógica fuzzy pode ser empregada no ramo industrial, possibilitando automatizar diversas tarefas. Tal fato pode encorajar a utilização da lógica fuzzy na robótica móvel, possibilitando desta forma a navegação robótica de uma maneira mais simplificada. Alguns trabalhos que seguem tal linha de pesquisa podem ser encontrados em Joshi e Zaveri (2009) e Raguraman et. al (2009), por exemplo. A lógica fuzzy também pode ser aplicada em outras funcionalidades existentes no robô.</p>
<p>Em um sistema de controle fuzzy, possuímos variáveis de entrada que representam os valores que podem ser obtidos através de sensores. Tais valores podem ser categorizados em faixas: muito longe, longe, normal, perto, muito perto. Esses estados são conhecidos como estados fuzzy e não possuem um limiar definido de um para outro. As variáveis de entrada podem pertencer a vários estados com diferentes níveis de pertinência. A Figura 2 apresenta um exemplo de funções de pertinência de uma variável fuzzy.</p>
<p style="text-align: center;"><a href="http://www3.eletronica.org/wp-content/uploads/2012/02/fig2.png"><img class="alignnone size-full wp-image-358" title="fig2" src="http://www3.eletronica.org/wp-content/uploads/2012/02/fig2.png" alt="" width="447" height="189" /></a></p>
<p style="text-align: center;">Figura 2 &#8211; Note que a um dado instante, a distância será um grau de pertinência com respeito a dois conjuntos fuzzy: 0.3 Muito Longe e 0.7 Longe, 0.4 Normal e 0.6 Perto, assim por diante.</p>
<p>Os valores de entrada, conhecidos como crisp, são convertidos para valores fuzzy em um processo conhecido como “fuzzificação”, utilizando as funções de pertinência dos termos fuzzy de entrada. O grau de participação de uma grandeza de entrada é dado em função dos termos primários definidos como o “Universo do Discurso” de entrada. Assim, cada valor de entrada tem um grau de pertinência para cada termo primário definido. A arquitetura fuzzy pode ser observada na Figura 3.</p>
<p>Dados “mapeamentos” das variáveis de entrada para as funções de pertinência e valores verdade, um micro-controlador pode então tomar decisões sobre a ação a ser executada baseada em um conjunto de regras, da forma:</p>
<p>“Se a distância frontal é muito perto e a velocidade é muito rápida então gire acentuadamente à esquerda”</p>
<p>É possível perceber que, neste exemplo, a variável de saída é também definida como um conjunto fuzzy que pode assumir os valores como “acentuadamente à esquerda”, “levemente à direita” e assim por diante. Existe uma ampla gama de funções que podem ser utilizadas, como: NÃO-fuzzy, E-fuzzy e OU-fuzzy.</p>
<p style="text-align: center;"><a href="http://www3.eletronica.org/wp-content/uploads/2012/02/fig3.gif"><img class="alignnone size-full wp-image-359" title="fig3" src="http://www3.eletronica.org/wp-content/uploads/2012/02/fig3.gif" alt="" width="598" height="201" /></a></p>
<p style="text-align: center;">Figura 3 &#8211; Arquitetura de um controlador fuzzy.</p>
<p>Os valores obtidos por todas as regras de inferência que foram acionadas são “defuzzificados” para valores exatos por meio de um dentre vários métodos possíveis. Por exemplo, o método do centróide retorna o centro de massa do resultado como valor exato. Por sua vez, o método da altura retorna o maior valor. A Figura 4 apresenta um exemplo de um sistema de inferência nebuloso que utiliza o método do centróide para realizar a defuzzificação.</p>
<p style="text-align: center;"> <a href="http://www3.eletronica.org/wp-content/uploads/2012/02/fig4.gif"><img class="alignnone size-full wp-image-360" title="fig4" src="http://www3.eletronica.org/wp-content/uploads/2012/02/fig4.gif" alt="" width="478" height="275" /></a></p>
<p style="text-align: center;">Figura 4 &#8211; Exemplo de ativação das regras em um sistema de inferência nebuloso e o processo de defuzzificação pelo cálculo do centroide.</p>
<h1> 4. Ferramentas de software livre</h1>
<p>Esta seção apresenta as ferramentas de software livre utilizadas para simular o sistema nebuloso de navegação proposto neste trabalho.</p>
<h2>4.1 Simulador Simbad</h2>
<p>O Simbad é um simulador de sistemas robóticos utilizado para fins científicos e educacionais. Esta ferramenta é principalmente dedicada a pesquisadores/programadores que querem uma base simples para estudar Inteligência Computacional (IC), aprendizado de máquina e outros algoritmos IC no contexto da robótica autônoma e agentes autônomos. O projeto Simbad está hospedado no SourceForge, este projeto é livre para ser usado e modificado sob as condições da Licença Pública Geral GNU.</p>
<p>O emprego de um simulador de sistemas robóticos traz inúmeras vantagens. Uma destas vantagens é a sua utilização no desenvolvimento da programação offline (programas elaborados em um computador e carregados posteriormente no robô, possibilitando que o mesmo não seja retirado das funções de produção e ocupado com a tarefa de programação), permitindo que sejam feitos testes dos programas antes de executá-los no robô real (REDEL e HOUNSELL, 2004). Outra vantagem é a possibilidade de seu uso para o ensino, pois permite que cada aluno se familiarize com o robô de forma individual, mesmo sem a existência física do mesmo, fazendo com que estes alunos adquiram os conhecimentos básicos necessários antes de utilizarem o robô real.</p>
<p>O simulador Simbad possui sensores de visão, sensores de alcance (com sonares e infravermelho) e sensores de contato. O uso destes sensores permite a interação do robô com o ambiente que o rodeia de uma forma flexível. Existem vários tipos de sensores e cada um se adapta a uma função específica. Estes são adicionados no sentido anti-horário em cada robô e retornam o alcance, o ângulo e informam se houve colisão.</p>
<p>O Simbad possui uma interface que permite a manipulação e a visualização dos eventos da simulação. Durante a execução do programa, aparecerá uma janela dividida em três setores, como mostra a Figura 5. A janela World exibe o mundo da simulação descrito pelo usuário ou algum dos exemplos presentes no Simbad. Na parte lateral situada à esquerda são exibidas as informações do robô e de seus acessórios, como o nome do robô, alcance dos sensores, velocidade translacional e rotacional, visão da câmera, colisão, tempo de vida do robô, entre outras, que podem variar de acordo com o projeto. A terceira janela é a Control, esta é dividida em três abas. As abas View From e a Follow são responsáveis pela visualização da simulação. A aba Simulator permite rodar, pausar, reiniciar ou passar cada etapa da simulação manualmente, além de alterar a velocidade da simulação na opção Time Factor.</p>
<p style="text-align: center;"> <a href="http://www3.eletronica.org/wp-content/uploads/2012/02/fig5.jpg"><img class="alignnone size-full wp-image-361" title="fig5" src="http://www3.eletronica.org/wp-content/uploads/2012/02/fig5.jpg" alt="" width="599" height="503" /></a></p>
<p style="text-align: center;">Figura 5 &#8211; Visão geral do simulador Simbad.</p>
<h2>4.2 jFuzzyLogic</h2>
<p>O jFuzzyLogic é um pacote de lógica fuzzy escrito em Java, disponível pela licença &#8220;LGPLv3&#8243;, este pacote implementa uma Linguagem de Controle Fuzzy (FCL). A FCL é um padrão para a programação de Controle Difuso, publicado pela Comissão Electrotécnica Internacional (IEC). As especificações para a sintaxe FCL podem ser encontradas no documento IEC 61131-7. Esta linguagem é uma linguagem de programação de domínio específico, ou seja, possui características diretamente relacionadas com a lógica fuzzy. Dessa forma, o FCL permite ao programador especificar conjuntos fuzzy, que são listas de pontos em um gráfico, bem como o conjunto de regras do sistema de inferência e o método de defuzzificação.</p>
<h1>5. Sistema Robótico móvel e nebuloso</h1>
<p>O sistema robótico móvel e nebuloso proposto neste trabalho objetiva controlar os movimentos do agente robótico de forma que este seja capaz de alcançar uma sequência especificada de coordenadas no ambiente, ao mesmo tempo em que desvia dos obstáculos. Neste modelo, o agente robótico é ciente de sua localização no ambiente, bem como das coordenadas que devem ser alcançadas para completar sua trajetória.</p>
<p style="text-align: center;"> <a href="http://www3.eletronica.org/wp-content/uploads/2012/02/fig6_1.png"><img class="alignnone size-full wp-image-362" title="fig6_1" src="http://www3.eletronica.org/wp-content/uploads/2012/02/fig6_1.png" alt="" width="707" height="200" /></a></p>
<p style="text-align: center;"><a href="http://www3.eletronica.org/wp-content/uploads/2012/02/fig6_2.png"><img class="alignnone size-full wp-image-363" title="fig6_2" src="http://www3.eletronica.org/wp-content/uploads/2012/02/fig6_2.png" alt="" width="242" height="229" /></a></p>
<p style="text-align: center;">Figura 6 &#8211; Módulo de navegação e diferença de direção, adaptado de Fracasso (2005).</p>
<p>A postura do robô é determinada pela sua orientação no ambiente (x, z, ξ), na qual x e z representam suas coordenadas no plano bi-dimensional e o ângulo ξ representa a direção do seu movimento. Durante a navegação, a postura atual, a próxima postura e o ângulo atual são utilizados para calcular o ângulo de rotação necessário para o robô alcançar o objetivo, como ilustrado na Figura 6. Os sonares frontais indicam a distância dos obstáculos que possam existir no caminho. O controlador nebuloso utiliza as informações sobre a diferença angular das posturas e da distância dos obstáculos para definir o ângulo de rotação. A velocidade de translação do robô é mantida fixa para simplificar a modelagem.</p>
<h2>5.1 Variáveis linguísticas</h2>
<p>Neste sistema nebuloso, são utilizadas três variáveis linguísticas de entrada. As variáveis esquerda e direita indicam a distância dos obstáculos obtida pela leitura dos pares de sonares existentes. A última variável linguística é o ânguloє1, queé obtida pela diferença dos ângulos de orientação das posturas inicial e final. Além disso, existe apenas uma variável linguística de saída: o ângulo de rotaçãoє2.</p>
<p>As funções de pertinência das variáveis linguísticas são apresentadas na Figura 7. Pode-se observar que o universo do discurso dos sonares varia de 0 à 1.5m, com os valores linguísticos: Perto e Longe, simplificando o projeto para que o robô apenas evite as colisões. Por outro lado, o universo do discurso dos ângulos de entrada є1 e de saída є2 varia de -30º à +30º, ambos possuem doze variáveis linguísticas, Ângulo Muito Pequeno (AMP), Ângulo Pequeno (AP), Ângulo Médio (AM), Ângulo Médio Zero (AMZ), Ângulo Grande (AG), Ângulo Muito Grande (AMG), que podem ser positivos ou negativos.</p>
<p style="text-align: center;"> <a href="http://www3.eletronica.org/wp-content/uploads/2012/02/fig7.png"><img class="alignnone size-full wp-image-364" title="fig7" src="http://www3.eletronica.org/wp-content/uploads/2012/02/fig7.png" alt="" width="870" height="238" /></a></p>
<p style="text-align: center;">Figura 7 &#8211; Funções de pertinência das variáveis de entrada: direita/esquerda e ângulo. A função de pertinência para o ângulo de saída é a mesma da função que representa o ângulo de entrada.</p>
<h2>5.2 Regras, sistema de inferência e defuzzificação</h2>
<p>As regras de inferência são colocadas no arquivo navigation.fcl, tendo um objetivo com duas premissas: fazer o robô desviar dos obstáculos, se os mesmos estiverem próximos, ou fazer simplesmente o robô continuar a sua trajetória quando o caminho está livre. A Figura 8 apresenta algumas das regras utilizadas. O sistema utilizado foi o método dos mínimos de Mamdani. No processo de defuzzificação, os valores obtidos pelas regras acionadas foram defuzzificados através do método de máximo mais à esquerda.</p>
<p style="text-align: center;"><a href="http://www3.eletronica.org/wp-content/uploads/2012/02/fig8.png"><img class="alignnone size-full wp-image-365" title="fig8" src="http://www3.eletronica.org/wp-content/uploads/2012/02/fig8.png" alt="" width="685" height="168" /></a></p>
<p style="text-align: center;">Figura 8 &#8211; Exemplo de algumas regras utilizadas na simulação.</p>
<h2>6. Resultados</h2>
<p>Após a implementação dos sistemas de fuzzificação, motor de inferência e defuzzificação, bem como a implantação do conjunto de regras elaboradas, iniciou-se a etapa de simulação. O código-fonte do simulador Simbad foi modificado para que a rota realizada pelo robô seja exibida em tempo de simulação. Possibilitando, dessa forma, a visualização do percurso realizado.</p>
<p>A avaliação do sistema proposto utiliza dois ambientes de simulação. Nos quais foram criados obstáculos no intuito de bloquear a trajetória do robô através das coordenadas inseridas, representadas pelas esferas vermelhas no cenário, testando assim, a lógica nebulosa para desvio de obstáculos. Para o primeiro ambiente, foi modelado um cenário simples, com dois obstáculos do tipo parede, o qual é ilustrado na Figura 9. Através da utilização da lógica fuzzy, a navegação do robô foi realizada com êxito. A Figura 9 demonstra também como o robô consegue seguir as coordenadas estipuladas e, ao mesmo tempo, desviar dos obstáculos dispostos no ambiente.</p>
<p style="text-align: center;"> <a href="http://www3.eletronica.org/wp-content/uploads/2012/02/fig9_1.png"><img class="alignnone size-full wp-image-366" title="fig9_1" src="http://www3.eletronica.org/wp-content/uploads/2012/02/fig9_1.png" alt="" width="404" height="404" /></a><a href="http://www3.eletronica.org/wp-content/uploads/2012/02/fig9_2.png"><img class="alignnone size-full wp-image-367" title="fig9_2" src="http://www3.eletronica.org/wp-content/uploads/2012/02/fig9_2.png" alt="" width="403" height="404" /></a></p>
<p style="text-align: center;">Figura 9 &#8211; Rota realizada pelo robô antes e após a simulação.</p>
<p>Em uma segunda simulação, foi utilizado um ambiente com mais obstáculos. A Figura 10 demonstra o ambiente antes do início da simulação e o percurso realizado pelo robô com tais obstáculos. Durante essa simulação, o robô consegue novamente percorrer com êxito as coordenadas definidas.</p>
<p style="text-align: center;"><a href="http://www3.eletronica.org/wp-content/uploads/2012/02/fig10_1.png"><img class="alignnone size-full wp-image-368" title="fig10_1" src="http://www3.eletronica.org/wp-content/uploads/2012/02/fig10_1.png" alt="" width="378" height="379" /></a><a href="http://www3.eletronica.org/wp-content/uploads/2012/02/fig10_2.png"><img class="alignnone size-full wp-image-369" title="fig10_2" src="http://www3.eletronica.org/wp-content/uploads/2012/02/fig10_2.png" alt="" width="378" height="379" /></a></p>
<p style="text-align: center;">Figura 10 &#8211; Rota realizada pelo robô em um segundo ambiente de simulação.</p>
<p>Como foi visto, a lógica nebulosa para o desvio de obstáculos funcionou perfeitamente para os dois ambientes de simulação propostos. O robô apresentou como saída os movimentos giratórios para esquerda ou direita, fazendo com que o mesmo consiga evitar as colisões validando, dessa forma, o sistema fuzzy proposto.</p>
<p>7. Considerações finais</p>
<p>Este artigo apresenta o modelo e a simulação de um sistema robótico móvel e nebuloso baseado nas ferramentas de software livre: Simbad e jFuzzyLogic. Os resultados demonstram que o agente robótico consegue não só desviar dos obstáculos, mas percorrer a trajetória designada nos dois ambientes de simulação propostos. Contudo, o modelo apresentado não é capaz de percorrer trajetos em um ambiente mais complexo e com muitos obstáculos, nesse caso é necessário modificar as regras e tornar o sistema mais robusto. Assim, surgem duas motivações principais para um futuro trabalho: adicionar e melhorar as regras existentes, com o objetivo de deixar o sistema mais tolerante a falhas, e realizar a implementação desse projeto em um ambiente com elementos reais.</p>
<h1>Referências</h1>
<p>BATISTA, I. J. L. et al. Navegação de Robôs Móveis com Ênfase em Planejamento e Supervisão de Trajetórias. In: XVIII Congresso Brasileiro de Automática, 1., 2010, Bonito. Anais&#8230; Bonito: UNESP-MS. 1 CD-ROM.<br />
CINGOLANI, P. jFuzzyLogic. Disponível em: &lt;http://jFuzzyLogic.sourceforge.net&gt; Acesso em: 20 jul. 2011.<br />
FILHO, F. A. R. et al. Development of Robots for the Pipeline Industry… 2010.Trabalhoapresentadoao41st International Symposium (ISR) on and 2010 6th German Conference on Robotics (ROBOTIK), Munique, 2010.<br />
FRACASSO, P. T.; REALI COSTA, A. H. Navegação reativa de robôs móveis autônomos utilizando lógica nebulosa com regras ponderadas. In: IEEE LATIN-AMERICAN ROBOTICS SYMPOSIUM. São Luis, MA, 2005. SBAI IEEE LARS. São Luis: IEEE, 2005. pp. 1-7.<br />
FUZZY INFERENCE SYSTEMS. Disponível em: &lt;http://www.mathworks.com/help/toolbox/fuzzy/fp351dup8.html&gt;. Acessado em: 21 jul. 2011.<br />
GOEBEL, G. A Introduction To Fuzzy Control Systems. Disponível em: &lt;http://www.faqs.org/docs/fuzzy/&gt; Acesso em: 19 jul. 2011.<br />
HIRZINGER, G. et al. ROTEX-the first remotely controlled robot in space.In: Proc. IEEE Conf. on Robotics and Automation. Anais Proceedings San Diego: IEEE, 1994. pp. 2604-2611.<br />
HUGUES, L.; BREDECHE, N. Simbad: An Autonomous Robot Simulation Package for Education and Research. In: Proceedings of SAB&#8217;2006. pp.831~842<br />
JOSHI, M.M.; ZAVERI, M.A.; Fuzzy Based Autonomous Robot Navigation System. Proceedings of the India Conference (INDICON), 2009 Annual IEEE, ISBN: 978-1-4244-4858-6, DOI: 10.1109/INDCON.2009.5409419, pp. 1-4, Gujarat, India, 18-20 Dec. 2009.<br />
MOTTA, J. M. S. T.; TOURINO, S. R. G. Sistema de Rastreamento por Visão em Robôs Móveis com Otimização por Projeto Fatorial. Revista Iberoamericana de Ingeniería Mecánica. Vol. 12, N° 1, pp. 25-34, jan. 2008.<br />
OTTONI, G. L.; LAGES, W. F. Navegação de robôs móveis em ambientes desconhecidos utilizando sonares de ultra-som. Sba Controle &amp; Automação [online]. 2003, vol.14, n.4, pp. 402-411.<br />
PERRY, T.S. Lotfi A. Zadeh [fuzzy logic inventor biography]. Ieee Spectrum. Disponível em: &lt;http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=387136&gt; Acesso em: 21 jul. 2011.<br />
PREISING, B.; HSIA, T. C.; MITTELSTADT, B. A literature review: robots in medicine. IEEE Engineering in Medicine and Biology Magazine. Vol. 10, N° 2, pp. 13-22, jun. 1991.<br />
REDEL, R.; HOUNSELL, M.S. Implementação de Simuladores de Robôs com o Uso da Tecnologia de Realidade Virtual. In: IV Congresso Brasileiro de Computação, Itajaí – SC. IVCBCOMP, v. 1, 2004, pp. 398-401.<br />
RAGURAMAN, S.M.; TAMILSELVI, D.; SHIVAKUMAR, N. Mobile robot navigation using Fuzzy logic controller. In: International Conference on Control, Automation, Communication and Energy Conservation, Perundurai &#8211; 638052, Erode, Tamilnadu, Índia – INCACEC 2009. pp. 1-5.<br />
SIMBAD PROJECT HOME. Disponível em: &lt;http://simbad.sourceforge.net/&gt; Acesso em: 21 jun. 2011.<br />
SIMÕES, A. S.; MARTINS, A. C. G.; CARRION, R. Robôs móveis autônomos na missão marte: projetando um sistema reativo com transição sequencial de comportamentos. In: Anais do XXVI Congresso da Sociedade Brasileira de Computação (SBC). ENRI&#8217;06: Encontro de Robótica Inteligente. Campo Grande, 17-20 de julho de 2006.<br />
SOLIS, J.; TAKANISHI, A. Practical Issues on Robotic Education and Challenges Towards RoboEthics Education. In: 18th IEEE International Symposium on Robot and Human Interactive Communication, 3., 2009, Toyama. IEEE Press, 2009 pp. 561-565.<br />
STALLMAN, R. Open Source: Voices from the Open Source Revolution. 1. ed. Sebastopol: O&#8217;Reilly &amp; Associates. 1999.</p>
<p>&nbsp;</p>
<h1>Autores</h1>
<p>Jardel Rodrigues &lt;jardel.ifce@gmail.com&gt; &#8211; Aluno de graduação em Ciência da Computação, IFCE Campus Maracanaú.</p>
<p>Leandro Bezerra &lt;leandrobezerramarinho@gmail.com&gt; &#8211; Aluno de graduação em Ciência da Computação, IFCE Campus Maracanaú.</p>
<p>MSc. Otávio A. de Lima Jr. &lt;otavio@ifce.edu.br&gt; &#8211; Professor, IFCE Campus Maracanaú.</p>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/artigos/simulacao-baseada-em-software-livre-de-um-sistema-robotico-fuzzy/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Desacoplando Através de Exemplos</title>
		<link>http://www3.eletronica.org/artigos/desacoplando-atraves-de-exemplos</link>
		<comments>http://www3.eletronica.org/artigos/desacoplando-atraves-de-exemplos#comments</comments>
		<pubDate>Wed, 09 Nov 2011 00:41:44 +0000</pubDate>
		<dc:creator>Administrador Eletronica.org</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[capacitor]]></category>
		<category><![CDATA[layout]]></category>
		<category><![CDATA[pci]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=241</guid>
		<description><![CDATA[Enquanto eu desfrutava os projetos do Concurso 7400 me ocorreu que muitos dos projetos lógicos submetidos não tinham um dos elementos de segurança mais básicos para garantir um bom resultado. O  aspecto mais desconsiderado foi a falta de capacitores de bypass. Então, após ler um artigo sobre a Lei de Murphy que referenciava um outro application ...]]></description>
			<content:encoded><![CDATA[<p>Enquanto eu desfrutava os projetos do Concurso 7400 me ocorreu que muitos dos projetos lógicos submetidos não tinham um dos elementos de segurança mais básicos para garantir um bom resultado.</p>
<p>O  aspecto mais desconsiderado foi a falta de capacitores de <em>bypass</em>. Então, após ler um <a>artigo sobre a Lei de Murphy</a> que referenciava um outro <a>application note da Maxim</a>, eu decidi escrever um pouco sobre capacitores de desacoplamento e <em>bypass</em>.</p>
<p>Como uma pessoa que pode ser considerada velha neste trabalho, eu já experimentei os problemas da ausência de desacoplamento em primera mão. Meu primeiro projeto em alta velocidade foi como aprendiz em meados dos anos oitenta em uma grande empresa de eletrônica. O projeto que eu estava construindo, um medidor de frequência digital, usava portas lógicas 74Fxx a uma velocidade de 11MHz (que era muito rápido para a época). Ele estava feito em &#8220;wire-up&#8221; em uma placa do tamanho de uma <a href="http://en.wikipedia.org/wiki/Eurocard_(printed_circuit_board)">placa euro-card</a> dupla e usava em torno de 40 CIs. Quando chegou a hora de ligar, eu notei que ele não funcionava como o esperado e todo o tipo de coisa apareceu em todos os lugares. Depois de verificar a montagem várias vezes eu conversei com o meu supervisor sobre o problema e ele me disse: &#8220;Não existem capacitores de bypass; monte-os em todos os chips, junto à alimentação, e nós conversaremos novamente&#8221;. Completamente desorientado eu fiz o que ele disse e, como um milagre, tudo simplesmente funcionou. Porque a aparente inerte capacitância da fonte de alimentação não faz as coisas simplesmente funcionarem?</p>
<p>Meu supervirsor então me falou sobre correntes de chaveamento/surto, indutância dos fios e sobre o conto do desacoplamento. Eu admito que somente alguns anos depois eu <em>realmente</em> entendi o que ele falava, mas a lição estava aprendida: sempre coloque capacitores na alimentação de CIs lógicos.</p>
<p>Os termos &#8220;capacitor de <em>bypass</em>&#8221; e &#8220;desacoplamento&#8221; não são simplesmente palavras aleatórias, elas possuem um significado específico neste contexto:<br />
- desacoplamento (<em>decoupling</em>): o ato de separar (parcialmente) a fonte de energia do CI da fonte principal de alimentação.<br />
- capacitor de <em>bypass</em>: o capacitor montado desta forma atua como bypass da fonte principal de alimentação e funciona (temporariamente) como uma fonte de energia local.</p>
<p>Mas porque isso é tão importante? Bom, deixe-me te mostrar uma imagem:</p>
<p><img src="http://www3.eletronica.org/wp-content/uploads/2011/11/figura1.jpg" alt="" /></p>
<p>Figura 1: Ausência de capacitor de bypass</p>
<p>Isso parece com algum sinal digital? Isso é o que você tem <strong>sem</strong> capacitores de bypass.</p>
<p>Por favor atente ao fato que a <span style="text-decoration: underline;">frequência principal de operação é irrelevante</span>. O problema são as bordas de subida e descida das saídas. Então sistemas com o clock 1Hz, 20kHz ou 50MHz necessitam das mesmas considerações. O uso das frequências nos exemplos abaixo foi escolhida apenas para tornar fácil a visualização no osciloscópio.<br />
Deve-se destacar que projetos com alta frequência irão falhar mais rápido porque o número de transições é significamente maior que em projetos de baixa frequência. No entanto, isto não significa que projetos de baixa frequência são imunes. Longe disso, eles falham tão facilmente quanto Murphy nos ensinou. Há&#8230; você imaginou agora aquele seu pequeno microcontrolador rodando a 16Mhz ou talvez aquele controlador de LEDs, usado para o show de luzes?</p>
<h1>Medindo correntes de surto</h1>
<p>Para ver o que está acontecendo nós precisamos medir a corrente que flui. Um circuito de teste simples foi criado para ilustrar.</p>
<p><img src="http://www3.eletronica.org/wp-content/uploads/2011/11/decoupling-2.png" alt="" /></p>
<p>Figura 2: Circuito Inversor</p>
<p>&nbsp;</p>
<p><img src="http://www3.eletronica.org/wp-content/uploads/2011/11/decoupling-3.png" alt="" /></p>
<p>Figura 3: Medição de Corrente</p>
<p>Um gerador de pulso é conectado a um inversor 74HC04 e um capacitor de 10pF de capacitância é colocado como carga. A saída, TP1, é mostrada no traço superior do osciloscópio. A fonte de alimentação é conectada nos pinos 14 e 7 com um resistor de 10 ohm para o GND. A corrente de alimentação do 74HC04 é medida em TP2 e visualizada no traço inferior do osciloscópio. O capacitor de bypass é montado e desmontado como indicado no texto.</p>
<p>As pontas do osciloscópio usadas são do tipo 1:10, então todos os valores no eixo Y da imagem do osciloscópio devem ser multiplicados por um fator de 10. Todos os pinos não utilizados do 74HC04 são conectados ao GND. A configuração se parece com isso:</p>
<p><img src="http://www3.eletronica.org/wp-content/uploads/2011/11/breadboard-4.jpg" alt="" /></p>
<p>Figura 4: Montagem na <em>breadboard</em></p>
<p>A Figura 5 ilustra o problema em baixas e altas frequências de entrada. As imagens da esquerda são <strong>sem</strong> os capacitores e os da direita são <strong>com</strong> os capacitores montados:</p>
<p><img src="http://www3.eletronica.org/wp-content/uploads/2011/11/figura5.jpg" alt="" /></p>
<p>Figura 5: Saída e corrente sem (esquerda) e com (direita) capacitores de bypass</p>
<p>Algumas observações sobre a figura 5:</p>
<p>- A corrente medida é somente a que flui entrando e saindo através do GND da fonte de alimentação e o pino do 74HC04 e pelo capacitor de bypass, quando montado. Isto não representa toda a corrente que entra e sai da saída do inversor. É difícil medir correntes que fluem nos dois sentidos pelo Vcc e GND simultanetamente (com o osciloscópio no modo DC). No entanto, a corrente de GND é suficiente para ilustrar o problema do circuito.</p>
<p>- &#8220;Ruído&#8221; de alta frequência no nível alto da saída. Esta &#8220;oscilação&#8221; é de mais de 2V pico-a-pico e supera a fonte de alimentação (5V) significativamente. Adicionando os capacitores de bypass esta &#8220;oscilação&#8221; é reduzida a um nível virtualmente inexistente. Ainda existe este <em>overshoot</em>, mas ele é suprimido muito mais eficientemente.</p>
<p>- &#8220;<em>Spikes</em>&#8221; (picos) de corrente nas transições. Adicionar um capacitor de bypass reduz os spikes e torna-os simétricos nas transições de subida e descida. Os picos de corrente vão de -22 a +45mA sem o capacitor de bypass e de -32 a +36mA com o capacitor.</p>
<p>- A simetria da corrente nas imagens <strong>com</strong> o capacitor de bypass montado mostra que a energia é tando recuperada como armazenada. Isso é um fator muito importante.</p>
<p>- O ruído residual de altíssima frequência depende bastante da posição das ponteiras (não mostradas), o que indica que existem significativas antenas de RF no circuito (circuitos LC indesejados). O layout da <em>breadboard</em> (matriz de contatos) e a posição dos fios de conexão possuem impacto significativo na amplitude e frequência. Isso não pode ser eliminado mas pode ser bastante reduzido em um bom layout de PCI (placa de circuito impresso).</p>
<p>Olhando as transições em mais detalhes:</p>
<p><img src="http://www3.eletronica.org/wp-content/uploads/2011/11/figura6.jpg" alt="" /></p>
<p>Figura 6: Detalhes da borda de saída e da corrente sem (esquerda) e com (direita) o capacitor de bypass</p>
<h1>As correntes que fluem</h1>
<p>O 74HC04 é um projeto de chip totalmente CMOS. Isso significa que a corrente estática drenada é próxima de zero. A corrente é desenhada nas transições de alto para baixo e de baixo para alto. Nas transições é que todas as cargas, parasitas ou não, precisam ser (des)carregadas. O circuito de teste da figura 2 possui um capacitor de 10pF como carga. O pino &#8211; e sua capacitância devem ser adicionadas, o que nós dá algo na ordem de 5pF+2pF. A ponteira do osciloscópio também possui sua capacitância, que adiciona outros 10pF. A capacitância total da carga na saída é, então, da ordem de 27pF.<br />
Considerando somente essa capacitância de saída, nós estamos (des)carregando a carga com 5V a cada 4,3ns. Se assumirmos a medida da corrente constante (tornando os cálculos mais fáceis) nós podemos estimar a corrente através dos parâmetros acima, utilizando a <a href="http://pt.wikipedia.org/wiki/Coulomb">equação da carga</a>:</p>
<pre>Q = I • t  =  C • U I = 5 • 27 • 10 -12 4.3 • 10 -9 ≅ 31.4mA</pre>
<p>Isto significa que uma <strong>enorme</strong> corrente está fluindo em ambas direções para equilibrar a corrente em todas as direções. De onde vem todo este poder? Bom, da fonte de alimentação. Isso pode ser visto claramente na figura 6, onde temos que a corrente não é instantânea; ela acumula-se a um nível específico e depois cai de novo. Este comportamento indica claramente um elemento indutivo.</p>
<p>Isto pode ser visto melhor nas duas imagens da direita na figura 6 (<strong>com</strong> o capacitor de bypass), quando a corrente (o traço inferior) dá um pico no momento que a saída (traço superior) vai a zero. A corrente então cai, derrubando a saída com ela.</p>
<p>A corrente calculada comparada com as medições estão bem compatíveis, considerando que o nosso cálculo foi uma simples estimativa.</p>
<h1>Então, para que o capacitor de bypass?</h1>
<p>Dê outra olhada de perto nas duas imagens inferiores da figura 6. A esquerda não atinge o nível dos 5V na saída por algum tempo, enquanto a da direita não tem nenhum problema neste aspecto. Não há energia suficiente sem o capacitor de bypass para suportar a borda de subida e ela trava em 4V por algum tempo. Adicionar o capacitor de bypass supre o 74HC04 com potência instantânea neste período.</p>
<p>O capacitor de bypass é cerca de 4000 vezes maior que a capacitância da carga, o que significa que a queda de tensão esperada é cerca de 4000 vezes menor (na faixa de 1 a 2mV) para dar suporte à transição.</p>
<p>Quando a transição é no sentido contrário, como na parte superior das duas imagens da figura 6, então o capacitor de bypass funciona como um reservatório para receber a energia liberada. A capacitância da carga precisa ser descarregada e então a corrente quer fluir para o GND. No entanto, a energia não pode se mover facilmente para a fonte de alimentação principal e então o capacitor armazena-a temporariamente.</p>
<h1>Fonte de alimentação sem potência</h1>
<p>A fonte de alimentação principal não pode prover o chip lógico com toda a energia necessária por causa da indutância. Todo fio possui indutância (parasita) e isso dificulta as variações de corrente. A <a href="http://en.wikipedia.org/wiki/Inductance">equação básica</a> na eletrônica para indutância é:</p>
<pre> U = L dI dt ⇒ dI = U • dt L</pre>
<p>A partir desta equação pode ser visualizado que a mudança na corrente dI é inversamente proporcional a L (indutância). Em outras palavras, quando a indutância aumenta torna-se mais difícil alterar a corrente em determinado período de tempo, se todos os outros parâmetros permanecerem os mesmos. Além disso, uma mudança na corrente atual significa que há uma queda de tensão sobre a indutância. Um fio longo (ou uma trilha na PCI) tem indutância maior e, portanto, atua contra as mudanças rápidas de corrente provocando uma queda de tensão grande.<br />
O capacitor de bypass é uma fonte local de energia. Ele precisa ser montado bem perto dos pinos de alimentação do CI, reduzindo assim a indutância entre o CI e o capacitor ao mínimo. Esta configuração <strong>desacopla</strong> a fonte principal do fornecimento de energia do chip.</p>
<h1>Stress no inversor</h1>
<p>Existem seis inversores no encapsulamento, então o circuito de teste foi modificado para consumir mais corrente:</p>
<p><img src="http://www3.eletronica.org/wp-content/uploads/2011/11/figura7.png" alt="" /></p>
<p>Figura 7: Circuito de teste com carga adicional</p>
<p><img src="http://www3.eletronica.org/wp-content/uploads/2011/11/figura8.jpg" alt="" /></p>
<p>Figura 8: Alta carga na saída e corrente sem (esquerda) e com (direita) o capacitor de bypass; note a mudança na escala da corrente</p>
<p>A corrente no pino de GND agora atinge pico de cerca de 70mA quando o capacitor de bypass não está instalado. Uma imagem simétrica é novamente visualizada <strong>com</strong> o capacitor de bypass instalado, mostrando +/-50mA, dependendo da borda, se subindo ou descendo.<br />
Note que as transições, como mostrado na imagem inferior esquerda da figura 8, são significativamente mais irregulares. O 74HC04 simplesmente não possui energia para suportar a transição. Adicionando o capacitor de bypass (imagem da direita) a transição volta novamente a um nível aceitável.</p>
<p><img src="http://www3.eletronica.org/wp-content/uploads/2011/11/figura9.jpg" alt="" /></p>
<p>Figura 9: Detalhe da borda alta <strong>com</strong> o capacitor de bypass; note a mudança na escala da corrente</p>
<p>O detalhe da borda revela uma alongado consumo de corrente, que é causado por uma demanda de energia muito mais alta. A carga no chip é seis vezes maior (o primeiro inversor tem uma carga 5 vezes ~5pF da capacitância dos inversores secundários).</p>
<p>Este foi só um exemplo com um CI de portas inversoras. Agora, extrapole a idéia para CIs lógicos complexos, que possuem muitas portas internamente com muitas transições. Existem muitas capacitâncias parasitas nas portas que precisam ser (des)carregados toda vez que uma entrada muda. Ou pense sobre microcontroladores, com milhares de portas lógicas lá dentro.</p>
<h1>Aterramento</h1>
<p>Apartir dessa explanação e visualização dos dados, deve ficar claro que o capacitor de bypass é um elemento importante com uma função bem definida. Ele armazena energia e libera quando necessário, além de recebê-la quando há excesso.</p>
<p>Esta fonte local está sempre sendo suprida pela fonte de alimentação principal através da conexão de Vcc. No entanto, o excesso de energia precisa ser devolvida para a fonte principal através da conexão de GND. Receber esta energia no capacitor de bypass eleva a tensão e, efetivamente, cria temporariamente uma ilha com um potencial diferente. Remover este desequilíbrio é muito importante e isto é feito através das conexões de GND.</p>
<p>Projeto de PCIs (Placas de Circuito Impresso) oferecem <a href="http://en.wikipedia.org/wiki/Ground_plane#Printed_circuit_boards">planos de aterramento</a> que fazem conexões muito eficientes com a fonte principal. Um bom projeto de plano de GND é essencial para liberar a energia excessiva. Mas seja cauteloso, pois um simples plano de aterramento também pode induzir<a href="http://pt.wikipedia.org/wiki/Corrente_de_Foucault"> correntes parasitas (Foucault)</a><a> </a>e múltiplas conexões ao GND podem introduzir <a>loops</a>.</p>
<p><strong>Sempre</strong> é uma boa idéia conversar com aquele experiente amigo projetista de PCIs. A maioria dos erros já foram cometidos e não há necessidade que sejam repetidos por nós <em>ad infinitum</em>.</p>
<p>&nbsp;</p>
<p><strong>Bertho Stultiens</strong></p>
<p>Este artigo foi adaptado para o Eletronica.org a partir do original, em inglês, disponível em <a href="http://www.vagrearg.org/?p=decoupling">http://www.vagrearg.org/?p=decoupling</a>, com autorização do autor.</p>
<p><em><strong>Obra sob Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)</strong></em><br />
<em>Você tem a liberdade de:</em></p>
<ul>
<li><em>    Compartilhar — copiar, distribuir e transmitir a obra.</em></li>
<li><em>    Remixar — criar obras derivadas.</em></li>
<li><em>    fazer uso comercial da obra</em></li>
</ul>
<p><em>Sob as seguintes condições:</em></p>
<ul>
<li><em>    Atribuição — Você deve creditar a obra da forma especificada pelo autor ou licenciante (mas não de maneira que sugira que estes concedem qualquer aval a você ou ao seu uso da obra).</em></li>
<li><em>    Compartilhamento pela mesma licença — Se você alterar, transformar ou criar em cima desta obra, você poderá distribuir a obra resultante apenas sob a mesma licença, ou sob uma licença similar à presente.</em></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/artigos/desacoplando-atraves-de-exemplos/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Estação de Solda Hakko FX 951</title>
		<link>http://www3.eletronica.org/reviews/estacao-de-solda-hakko-fx-951</link>
		<comments>http://www3.eletronica.org/reviews/estacao-de-solda-hakko-fx-951#comments</comments>
		<pubDate>Sun, 30 Oct 2011 00:17:57 +0000</pubDate>
		<dc:creator>Administrador Eletronica.org</dc:creator>
				<category><![CDATA[Reviews]]></category>
		<category><![CDATA[equipamento]]></category>
		<category><![CDATA[solda]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=211</guid>
		<description><![CDATA[Nos últimos 2 anos este equipamento tem sido a estação de solda utilizada no laboratório  Eletronica.org. Com um design bonito e compacto, sua coloração azul com amarelo não fica despercebida em nenhuma bancada. O equipamento vem acondicionado em uma embalagem bem desenhada que traz o manual de instruções em várias linguas (mas não o português), ...]]></description>
			<content:encoded><![CDATA[<p>Nos últimos 2 anos este equipamento tem sido a estação de solda utilizada no laboratório  Eletronica.org. Com um design bonito e compacto, sua coloração azul com amarelo não fica despercebida em nenhuma bancada.</p>
<p style="text-align: center;"><a href="http://www3.eletronica.org/wp-content/uploads/2011/10/products_hakko_fx951_img.jpg"><img class="size-full wp-image-212 aligncenter" title="products_hakko_fx951_img" src="http://www3.eletronica.org/wp-content/uploads/2011/10/products_hakko_fx951_img.jpg" alt="" width="236" height="194" /></a></p>
<p>O equipamento vem acondicionado em uma embalagem bem desenhada que traz o manual de instruções em várias linguas (mas não o português), a própria estação de solda, seu ferro com ponta destacável (modelo FM-2028) e suporte para o ferro com sensor de posição. Além disso acompanha uma espuma para água (limpeza da ponta), chave para programação e uma placa de material resiste ao calor para a movimentação das pontas à quente.</p>
<p>Duas características deste equipamento se destacam no dia-a-dia: o ferro de solda <strong>extremamente</strong> leve e a resistência incorporada à ponta. Estes dois fatores, além das 85  pontas disponibilizadas pela Hakko para este modelo, tornam o conjunto imbatível em qualidade e conforto para a soldagem. O ferro, com a minha ponta  preferida (T2L 0,2mm),  pesa não muito mais que uma caneta &#8220;gordinha&#8221;  (e isso faz toda a diferença).</p>
<p>O suporte para o ferro de solda é conectado através de um jack simples para determinar se o ferro encontra-se em repouso. Nesta condição a temperatura é alterada, de forma a economizar energia e salvar a ponta de desgaste excessivo em altas temperaturas. Ao contrário do que parece a primeira vista,  isto não dificulta em nada a utilização pois a curva de subida da temperatura é extremamente elevada. O simples tempo de retirar o ferro do suporte e dirigir para o local da soldagem é suficiente para recuperar a temperatura setada digitalmente, com precisão de 1ºC, até o limite de 450ºC. Outro detalhe do suporte é o movimento articular que o coloca em uma posição ideal &#8211; e diferente &#8211; para colocação e remoção do ferro de solda.</p>
<p><img class="alignleft" title="FX951" src="http://www.hakko.com/english/products/imgs/other/951_05.jpg" alt="" width="180" height="135" /><img class="alignleft" title="FX950" src="http://www.hakko.com/english/products/imgs/other/fx950_04.jpg" alt="" width="140" height="160" /><img class="alignleft" title="fx951_2028.jpg" src="http://www.hakko.com/english/products/imgs/other/fx951_2028.jpg" alt="Ferro FM-2028 Hakko FX951" width="213" height="32" /></p>
<p><img class="alignleft" title="TIP FX950" src="http://www.hakko.com/english/products/imgs/other/fx950/tip_illust.gif" alt="" width="178" height="49" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>A chave para programação é util para evitar mudanças incorretas nas temperaturas e ajustes do ferro. Quanto este chave (plástica, azul) não está inserida no equipamento a mudança de temperatura fica bloqueada.</p>
<p>Importante ressaltar que praticamente todos os itens, ferro, suporte e pontas, possuem algumas outras versões disponíveis para compras adicionais junto à Hakko, permitindo personalizar a estação para cada nicho específico.</p>
<p>Infelizmente, por tratar-se de um produto importado, o custo não é dos mais baixos aqui no Brasil. Comumente encontra-se em alguns distribuidores nacionais com preços variando entre R$1250,00 e R$1500,00. Por possuir um preço alto, esta estação é indicada para quem a utiliza de forma profissional e frequente, com necessidade de reposição de pontas e extrema precisão na soldagem.</p>
<p>Mais informações sobre este produto podem ser encontradas na <a href="http://www.hakko.com/english/products/hakko_fx951.html">página do fabricante</a>.</p>
<p>&nbsp;</p>
<p>Por Roberto Alcântara (roberto@eletronica.org)</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/reviews/estacao-de-solda-hakko-fx-951/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Programming Embedded Systems, Second Edition</title>
		<link>http://www3.eletronica.org/reviews/programming-embedded-systems-second-edition</link>
		<comments>http://www3.eletronica.org/reviews/programming-embedded-systems-second-edition#comments</comments>
		<pubDate>Sat, 29 Oct 2011 16:55:09 +0000</pubDate>
		<dc:creator>Administrador Eletronica.org</dc:creator>
				<category><![CDATA[Reviews]]></category>
		<category><![CDATA[sistemas embarcados]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=201</guid>
		<description><![CDATA[Recentemente recebi gratuitamente uma encomenda com 4 livros da editora O’Reilly para que eu fizesse as resenhas desses livros. Antes de tudo eu devo avisar que essa resenha não pertence à série de resenhas que eu vinha fazendo, e que devo continuar em breve, à qual eu dei o nome de “Leitura Obrigatória”. O livro de hoje ...]]></description>
			<content:encoded><![CDATA[<p>Recentemente recebi gratuitamente uma encomenda com 4 livros da editora <a href="http://www.oreilly.com/">O’Reilly</a> para que eu fizesse as resenhas desses livros.</p>
<p>Antes de tudo eu devo avisar que essa resenha não pertence à série de resenhas que eu vinha fazendo, e que devo continuar em breve, à qual eu dei o nome de “Leitura Obrigatória”.</p>
<p>O livro de hoje é o <strong><a href="http://www.livrariacultura.com.br/scripts/cultura/externo/index.asp?id_link=4092&amp;tipo=2&amp;isbn=0596009836">Programming Embedded Systems, Second Edition</a></strong>. Eu já estou quase terminando a leitura deste livro e já me sinto à vontade para recomendá-lo por aqui porque eu realmente me empolguei com o material.</p>
<p>Como muitos já sabem eu voltei a praticar o antigo <em>hobby</em> de montar dispositivos eletrônicos, e desde que eu havia parado de brincar com essas coisas muita coisa mudou. Hoje em dia é muito comum encontrar microprocessadores e microcontroladores em vários projetos, e trabalhar com esses componentes exige um conhecimento que mora entre a eletrônica “pura” e a informática.</p>
<p>Como eu já tenho bons conhecimentos de informática e meus conhecimentos de eletrônica “pura” estavam evoluindo com a prática do meu antigo <em>hobby</em>, estava faltando construir a ponte que iria unir essas duas áreas do conhecimento.</p>
<p>Na mesma época recebi uma proposta da O’Reilly para fazer resenhas dos livros de Python deles e aproveitei para pedir alguns títulos que tratavam de dispositivos embarcados. Recebi este livro juntamente com outros 3 de Python (aguardem resenhas) e comecei a lê-lo.</p>
<p>O livro tem foco prático como em quase todos os títulos da editora O’Reilly. Os autores realmente irão desenvolver o assunto em cima de uma <a href="http://www.arcom.com/oreilly.htm">plataforma real</a> de desenvolvimento que usa um processador ARM XScale e irão conduzir o leitor desde o ponto onde a gente faz um LED piscar até o momento onde desenvolvemos aplicações reais com RTOS e Linux.</p>
<p>O livro fala sobre <em>device drivers</em>, interrupções, registradores, memória e sobre como gerenciar e desenvolver software em C (gcc) para usar todas essas funcionalidades.</p>
<p>Vale destacar que esse livro fica exatamente na fronteira entre um livro de nível básico e um livro avançado, ou seja, se você não entende nada de eletrônica e muito pouco de informática esse livro não irá lhe servir. Se você também já é um especialista no assunto pode achar o livro massante demais na primeira parte que trata de assuntos mais básicos.</p>
<p>O próximo passo agora é adquirir um kit de desenvolvimento parecido com esse que foi proposto no livro e começar a brincar. Eu tenho certeza que eu vou me divertir muito com esse tipo de coisa depois de ler este livro.</p>
<p>Para comprar: <a href="http://www.livrariacultura.com.br/scripts/cultura/externo/index.asp?id_link=4092&amp;tipo=2&amp;isbn=0596009836">Programming Embedded Systems, Second Edition</a><br />
<em>Por <strong>Osvaldo Santana</strong><br />
Veja esta resenha também em <a href="http://pythonologia.org/2006/11/17/programming-embedded-systems-second-edition/" target="_self">www.pythonologia.org</a></em></p>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/reviews/programming-embedded-systems-second-edition/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Designing Embedded Hardware 2nd Edition</title>
		<link>http://www3.eletronica.org/reviews/designing-embedded-hardware-2nd-edition</link>
		<comments>http://www3.eletronica.org/reviews/designing-embedded-hardware-2nd-edition#comments</comments>
		<pubDate>Sat, 29 Oct 2011 16:52:58 +0000</pubDate>
		<dc:creator>Administrador Eletronica.org</dc:creator>
				<category><![CDATA[Reviews]]></category>
		<category><![CDATA[sistemas embarcados]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=198</guid>
		<description><![CDATA[Com foco exclusivo no hardware, John Catsoulis inicia o seu livro com conceitos básicos dos elementos da arquitetura de computadores como memórias, I/O, DMA, etc., antes de falar um pouco sobre software. A sua abordagem do tema é bastante simplória e antecede uma revisão sobre os conceitos básicos da eletricidade, como tensão e corrente, para ...]]></description>
			<content:encoded><![CDATA[<p>Com foco exclusivo no hardware, John Catsoulis inicia o seu livro com conceitos básicos dos elementos da arquitetura de computadores como memórias, I/O, DMA, etc., antes de falar um pouco sobre software. A sua abordagem do tema é bastante simplória e antecede uma revisão sobre os conceitos básicos da eletricidade, como tensão e corrente, para posteriormente fazer uma breve passagem sobre os componentes básicos dos circuitos eletrônicos, como diodos, cristais, capacitores, circuitos RC, indutores, etc. Esta seção, sobre eletrônica básica, é perfeitamente descartável para usuários com um pouco de experiência no assunto.</p>
<p>Em seguida o autor dedica capítulos específicos que abordam áreas importantes dos projetos de sistemas embarcados, iniciando com as fontes de alimentação. Baseado na sua própria experiência, algumas dicas básicas sobre redução de ruídos e interferências são mostradas após descrever e exemplificar, através de circuitos, meia dúzia de componentes específicos para a regulação da alimentação, em 5Vcc e em 3.3Vcc.</p>
<p><img class="aligncenter" src="http://www2.eletronica.org/resenhas/designing-embedded-hardware-2a-edicao/designingembeddedhardware.jpg" alt="designingembeddedhardware.jpg" />No sexto capítulo nós temos uma série de dicas sobre ferramentas, soldagem e prototipagem de circuitos impressos para em seguida, no sétimo capítulo, iniciar uma abordagem mais detalhada sobre alguns protocolos de comunicação utilizados como SPI, I2C, portas seriais, IRDA, USB, CAN e Ethernet. Algumas dessas abordagens são mais resumidas que outras, mantendo o foco do autor principalmente nos protocolos que ele posteriormente vem a utilizar quando trata, no capítulo &#8220;Analógico&#8221;, sobre diversos sensores e circuitos de conversores analógicos digitais. Neste ponto vê-se mais uma vez o uso da experiência do autor ao selecionar sensores que estão presente de forma bastante ativa nos projetos de sistemas embarcados tradicionais.</p>
<p>Os últimos seis capítulos do livro são dedicados aos microcontroladores. Nestas mais de 100 páginas o autor não foca exclusivamente em um fabricante ou arquitetura. Ele prefere abordar  algumas arquiteturas mais utilizadas no mercado para que o estudante possa adquirir uma bagagem de conhecimento que lhe seja útil para escolher o componente que melhor se adequa ao seu projeto. Os microcontroladores citados são os PIC e AVR, contando em seguida com textos sobre o 68HC11, MAXQ, 68k e DSPs. Neste espaço o autor detalha diversos parâmetros envolvidos nos projetos, como temporizações de clock, conexões de barramentos, lógica de decodificação de memórias, entre outros, sempre com a utilização de exemplo de circuitos reais que facilitam a absorção do conteúdo.</p>
<p>Muito dos conceitos descritos no decorrer do livro podem frustrar os mais experientes pela simplicidade, mas a abordagem é ideal para quem está tendo o primeiro contato com este mundo. Vale ressaltar também que, por não ser o foco do livro, muito pouco sobre software é abordado, obrigando os estudantes a procurarem outra referência sobre o tema.  Enfim, Designing Embedded Hardware é um livro ideal para quem está começando no mundo dos projetos de sistemas embarcados, mas não recomendado para usuários que já desenvolveram projetos de médio porte.<br />
Para comprar (30% de desconto para os membros Eletronica.org): <a href="http://www.oreilly.com/catalog/dbhardware2/" target="_self">Loja Internacional da O&#8217;Reilly</a>. Para comprar no Brasil: <a href="http://www.livrariacultura.com.br/scripts/cultura/resenha/resenha.asp?nitem=813684" target="_self">Livraria Cultura</a>.<br />
Não existe, até o momento, edição em português deste livro.</p>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/reviews/designing-embedded-hardware-2nd-edition/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Math Toolkit for Real-Time Programming</title>
		<link>http://www3.eletronica.org/reviews/math-toolkit-for-real-time-programming</link>
		<comments>http://www3.eletronica.org/reviews/math-toolkit-for-real-time-programming#comments</comments>
		<pubDate>Sat, 29 Oct 2011 16:51:39 +0000</pubDate>
		<dc:creator>Administrador Eletronica.org</dc:creator>
				<category><![CDATA[Reviews]]></category>
		<category><![CDATA[sistemas embarcados]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=196</guid>
		<description><![CDATA[Jack W. Crenshaw, especialista em desenvolvimento de sistemas industriais e aeroespaciais, consegue em seu livro Math Toolkit for Real-Time Programming, de forma muito clara e objetiva, apresentar alguns dos fundamentos matemáticos essenciais para qualquer desenvolvedor de sistemas, em especial aqueles que trabalham com sistemas embarcados em tempo real. Eu iria além: se os seus processadores ...]]></description>
			<content:encoded><![CDATA[<p>Jack W. Crenshaw, especialista em desenvolvimento de sistemas industriais e aeroespaciais, consegue em seu livro Math Toolkit for Real-Time Programming, de forma muito clara e objetiva, apresentar alguns dos fundamentos matemáticos essenciais para qualquer desenvolvedor de sistemas, em especial aqueles que trabalham com sistemas embarcados em tempo real. Eu iria além: se os seus processadores possuem recursos limitados, leia este livro.</p>
<p>Elementos matemáticos fundamentais, como raiz quadrada, exponenciais, logarítmos, seno, cosseno, tangente e suas variantes, e os fundamentos do cálculo numérico são revisados teoricamente e analisados através de uma abordagem prática, com exemplos de algorítmos com diferentes estratégias de cálculos, priorizando precisão e velocidade.</p>
<p><img id="il_fi" class="aligncenter" src="http://img1.willyfogg.com/thumb.php?pid=159132824&amp;pref=t&amp;it=1&amp;mod=Fri%2C+08+Jul+2011+17%3A50%3A45+GMT&amp;url=http%3A%2F%2Fmicrocontrollershop.com%2FImages%2Fthumbs%2F1929629095.jpg" alt="" width="99" height="99" /></p>
<p>Outros temas, como ponto flutuante, constantes, erros, série de Taylor, transformada Z, são tratados em capítulos dedicados ou como subtema em um capítulo maior.</p>
<p>No final do livro, uma pequena biblioteca em C++ com funções estudadas no livro e um CD-ROM contendo as bibliotecas e todos os exemplos utilizados ajudam ainda mais o desenvolvedor em seus estudos.</p>
<p>Enfim, leitura fortemente recomendada se você se encaixa no perfil descrito no início ou se é um entusiasta da área. Como diz o autor, &#8220;Se você está procurando um livro sobre os últimos métodos para escrever Applets Java ou aprender como criar seus próprios controles VBx, devolva o livro e pegue o seu dinheiro de volta&#8221;.</p>
<p>Infelismente não existe uma versão em português do livro. Dois locais onde você pode encontrá-lo: <a href="http://www.livrariacultura.com.br/scripts/cultura/resenha/resenha.asp?nitem=1183700&amp;sid=20112117481210608267677874&amp;k5=3A434E64&amp;uid=" target="_self">Livraria Cultura</a> e <a href="http://www.amazon.com/Math-Toolkit-Real-Time-Programming-Crenshaw/dp/1929629095" target="_self">Amazon</a>.</p>
<p>Por Roberto Alcântara</p>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/reviews/math-toolkit-for-real-time-programming/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Building Embedded Systems Devices</title>
		<link>http://www3.eletronica.org/reviews/building-embedded-systems-devices</link>
		<comments>http://www3.eletronica.org/reviews/building-embedded-systems-devices#comments</comments>
		<pubDate>Sat, 29 Oct 2011 16:47:47 +0000</pubDate>
		<dc:creator>Administrador Eletronica.org</dc:creator>
				<category><![CDATA[Reviews]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[sistemas embarcados]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=194</guid>
		<description><![CDATA[Não sendo um livro introdutório sobre Linux ou sistemas embarcados, Building Embedded Linux Systems é voltado para desenvolvedores que já possuem alguma familiaridade com sistemas Linux, mas que desejam se aprofundar nos detalhes necessários para o desenvolvimento de aplicações embarcadas ou distribuições extremamente personalizadas. Os tópicos abordados vão desde conceitos básicos sobre os tipos de hosts e ...]]></description>
			<content:encoded><![CDATA[<p>Não sendo um livro introdutório sobre Linux ou sistemas embarcados, <strong>Building Embedded Linux Systems</strong> é voltado para desenvolvedores que já possuem alguma familiaridade com sistemas Linux, mas que desejam se aprofundar nos detalhes necessários para o desenvolvimento de aplicações embarcadas ou distribuições extremamente personalizadas. Os tópicos abordados vão desde conceitos básicos sobre os tipos de hosts e arquiteturas suportadas até o ajuste do bootloader, rede e ferramentas de debug.</p>
<p>Os capítulos que tratam da preparação do kernel, das bibliotecas, dos utilitários e dos compiladores são bastante práticos, com uma vasta lista de comandos necessários em cada etapa para construir os binários, o que facilita bastante para os desenvolvedores que não estão habituados com estes procedimentos de compilação. São estes tópicos os mais numerosos, mas sempre que algum detalhe da estrutura do kernel é necessária para o entendimento do texto este é devidamente tratado como, por exemplo, o capítulo sobre dispositivos de armazenamento precedendo a configuração e ajuste do sistema de arquivos.</p>
<p>Em suma, este livro é voltado para o desenvolvedor que pretende conhecer como selecionar, configurar e empacotar um sistema Linux para uma plataforma específica, criando um sistema de arquivos completo voltado para as suas necessidades, fazendo-o iniciar corretamente e depurá-lo. Porém, não é intenção do autor abordar detalhes da estrutura do kernel, teóricas ou práticas, que permitam ao desenvolvedor intervir nas estruturas de baixo nível do sistema para, por exemplo, portar o sistema para uma nova arquitetura. Se este é o seu foco, esta não é a literatura correta, mas se o seu objetivo é condizente com o do livro esta é uma obra bastante recomendada pela riqueza de detalhes e qualidade do texto.</p>
<table>
<tbody>
<tr>
<td><img src="http://www2.eletronica.org/resenhas/building-embedded-linux-systems/059600222x_cat.gif" alt="Building Embedded Linux Systems" /></td>
<td>Building Embedded Linux Systems</p>
<p>Karim Yaghmour</p>
<p>ISBN 0-596-00222-X</p>
<p><strong>416 Páginas &#8211; Editora O&#8217;Reilly</strong></p>
<p>Você pode encontrá-lo na <a title="Loja Internacional da O'Reilly" href="http://www.oreilly.com/catalog/belinuxsys/">Loja Internacional da O&#8217;Reilly</a> (com desconto¹ de 35% para membros do Eletronica.org) e também na <a title="Livraria Tempo Real" href="http://www.temporeal.com.br/produtos.php?id=169456">Livraria Tempo Real</a> e<a title="Livraria Cultura" href="http://www.livrariacultura.com.br/scripts/cultura/resenha/resenha.asp?nitem=693834&amp;sid=201980121978554936309325&amp;k5=368B2E07&amp;uid=">Livraria Cultura</a>.</p>
<p><sub>¹ Para verificar como proceder <a title="clique aqui" href="http://www2.eletronica.org/login_form">clique aqui.</a></sub></td>
</tr>
</tbody>
</table>
<p>Roberto Alcântara<br />
roberto@eletronica.org</p>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/reviews/building-embedded-systems-devices/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introdução às Redes Intraveiculares</title>
		<link>http://www3.eletronica.org/artigos/introducao-as-redes-intraveiculares</link>
		<comments>http://www3.eletronica.org/artigos/introducao-as-redes-intraveiculares#comments</comments>
		<pubDate>Sat, 29 Oct 2011 16:38:44 +0000</pubDate>
		<dc:creator>Administrador Eletronica.org</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[can]]></category>
		<category><![CDATA[serial]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=187</guid>
		<description><![CDATA[Em mais um artigo, os professores Alexandre Mendonça e Ricardo Zelenovsky descrevem de forma resumida os tipos de barramento intraveiculares, com especial atenção ao barramento CAN. Hoje em dia, o mercado oferece milhares de produtos que contêm um grande conjunto grande de sensores e atuadores, como automóveis, sistemas de segurança ou sistemas de telemetria. Integrar ...]]></description>
			<content:encoded><![CDATA[<p>Em mais um artigo, os professores Alexandre Mendonça e Ricardo Zelenovsky descrevem de forma resumida os tipos de barramento intraveiculares, com especial atenção ao barramento CAN.</p>
<p>Hoje em dia, o mercado oferece milhares de produtos que contêm um grande conjunto grande de sensores e atuadores, como automóveis, sistemas de segurança ou sistemas de telemetria. Integrar as informações destes sensores e atuadores não é uma tarefa fácil, já que muitas vezes é exigido um meio físico construído com uma fiação enorme, isto sem contar o número de conectores. Ora, fiação enorme implica numa linha de montagem mais cara, complexa e lenta, o que inviabiliza seu uso em larga escala. Para ter-se uma idéia, um carro luxuoso chega a conter 4km de fios, com o custo perto de US$ 300.</p>
<p>Motivados pelas aplicações intraveiculares, várias companhias vêm investindo no projeto de controladores que pudessem gerenciar o tráfego de informações com interfaces através de um meio físico reduzido, possivelmente um barramento serial, porém capaz de possibilitar a multiplexação dessas informações. A esta forma de conexão é dado o nome de &#8220;rede intraveicular&#8221; (In-Vehicle Networking).</p>
<p>O uso de uma rede intraveicular oferece muitos benefícios, dentre eles:<br />
· requer um número bem menor de fios e conectores, diminuindo custos materiais e de instalação;<br />
· possibilita o compartilhamento de sensores disponíveis na rede em diferentes medidas;<br />
· flexibiliza o projeto, já que um novo sistema pode ser projetado apenas readaptando-se o software de controle.</p>
<p>Visando a uniformizar os projetos de redes intraveiculares, o mercado vem oferecendo diversos padrões, como CAN, SAE, VAN e ABUS, onde os dois primeiros são os mais populares. A SAE definiu três categorias de redes baseada nas aplicações. São elas:</p>
<p><strong>Classe A:</strong> engloba aplicações que requerem baixa velocidade de comunicação (até 10Kb/s), como entretenimento, áudio, etc.. Geralmente é implementada com uma UART (Universal Asynchronous Receiver/Transmitter) genérica, como a bem conhecida RS-232.<br />
<strong>Classe B:</strong> abrange aplicações de média exigência de velocidade (10Kb/s a 125Kb/s), como transmissões broadcast e monitoramento do ambiente (temperatura, pressão, etc.). Um exemplo deste protocolo é o SAE J1850<br />
<strong>Classe C:</strong> designa aplicações que exigem grande velocidade de comunicação (acima de 125KB/s), como controle de servo-mecanismos em tempo real (suspensão inteligente, controle aerodinâmico, etc.). O protocolo predominante desta classe é o CAN 2.0.</p>
<p><strong>CAN &#8211; Controller Area Network</strong></p>
<p>O protocolo CAN foi desenvolvido por Robert Bosch e tem como principal aplicação a implementação de uma rede intraveicular Classe C, particularmente exemplificada na indústria automotiva, que se tem mostrada uma cliente em potencial do CAN. Basicamente, a especificação CAN prevê identificadores de mensagens que facilitam o controle do fluxo de informação pela fiação. Como características de extrema relevância do CAN, podemos citar um controle de alto nível na detecção/correção de erros, grande flexibilidade na topologia e arranjo da rede intraveicular e baixa latência na comunicação entre os componentes. Como exemplo desta última característica, citamos um sistema de prevenção de acidentes que deve monitorar, com baixa latência na aquisição de dados, para processar em tempo real diversas variáveis de diferentes origens, como sensores de posição e radar, potência do motor, poder de frenagem, etc..<br />
Os principais benefícios fornecidos pelo protocolo CAN podem ser resumidos por:<br />
· um padrão de comunicação facilita e torna econômica a tarefa de interfacear sensores e atuadores de diferentes fabricantes;<br />
· o esforço computacional é diluído entre uma CPU principal e um periférico com inteligência de processamento, o que deixa a CPU livre para as tarefas de gerenciamento do sistema;<br />
· com a integração dos componentes através de um barramento único, reduz-se drasticamente a quantidade de fios e, automaticamente, os custos materiais e de montagem da rede embutida;<br />
· por ser um padrão com grande aceitação no mercado, o protocolo CAN incentiva a fabricação de circuitos integrados que irão abastecer a indústria, o que cria a perspectiva de redução de preços devido à concorrência iminente.<br />
A figura 1 ilustra uma típica aplicação do CAN usando um arranjo tradicional de componentes de um automóvel, incluindo o motor, a transmissão e reservatório de combustível. Tal aplicação engloba o controle de direção ou injeção de combustível. Podemos imaginar duas situações. Na primeira, o motor transmite uma mensagem de informação de seu torque que, juntamente com informações de velocidade e aceleração, podem ser usadas pela transmissão para controle da direção. Na segunda, quando o motorista muda de marcha, a transmissão envia uma mensagem para que o motor possa regular a injeção de combustível.</p>
<p style="text-align: center;"><img src="http://www.mzeditora.com.br/artigos/veic1.gif" alt="" width="362" height="226" /><br />
Figura 1: Aplicação típica do protocolo CAN em uma rede embutida num automóvel.</p>
<p>A Intel foi a primeira companhia a implementar o CAN, em 1989, através do controlador 82526 (versão 1.2). O 82527 veio como uma adaptação à revisão 2.0 e, posteriormente, a família 87C196 surgiu permitindo implementações mais sofisticadas.</p>
<p>&nbsp;</p>
<p>Controlador CAN 82527 da Intel</p>
<p>O 82527 foi o primeiro controlador da Intel com suporte para o CAN 2.0, sendo fabricado com o processo CHMOS III 5V e estando disponível com encapsulamento PLCC-44. Ele pode ser configurado para interfacear com CPUs usando 8 ou 16 bits de dados, multiplexados ou não com endereços. Possui também uma interface serial flexível, conhecida como SPI, que pode ser muito útil quando se torna dispensável o interfaceamento paralelo. O 82527 usa uma comunicação via mensagens de comprimento 8 bytes, podendo transmitir, receber ou filtrar mensagens de seu interesse, isto graças à utilização de máscaras especiais implementadas em hardware.<br />
O diagrama em blocos do 82527 está resumido na figura 2. Como nela pode ser observado, estão integradas uma CPU com barramentos de dados e endereços de 8 ou 16 bits, uma RAM, duas portas de I/O e uma unidade de interface com o protocolo CAN. Basicamente, vide figura 3, as linhas de dados, endereços e controle fornecem a base mínima para a implementação de um módulo inteligente capaz de executar programas. As portas são responsáveis por receber informações de sensores ou transmitir comandos para atuadores. Finalmente, o controlador CAN permite a comunicação serial em rede, via protocolo CAN 2.0, de vários módulos inteligentes.</p>
<p style="text-align: center;"><img class="aligncenter" src="http://www.mzeditora.com.br/artigos/veic2.gif" alt="" width="477" height="204" /><br />
Figura 2: Diagrama básico do 82527. <img class="aligncenter" src="http://www.mzeditora.com.br/artigos/veic3.gif" alt="" width="323" height="98" /><br />
Figura 3: Exemplo típico de implementação com o 82527.</p>
<p style="text-align: center;">
<p><strong>Alexandre Mendonça (alexmend@aquarius.ime.eb.br) e Ricardo Zelenovsky (zele@leblon.ime.eb.br)</strong> são professores do IME, autores dos livros &#8220;PC e Periféricos: um Guia Completo de Programação&#8221; e &#8220;PC: um Guia Prático de Hardware e Interfaceamento &#8211; 2a Ed.&#8221; (<a href="http://www.mzeditora.com.br/">http://www.mzeditora.com.br</a>) e colaboradores da Developers&#8217; Magazine desde 1996.</p>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/artigos/introducao-as-redes-intraveiculares/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sistemas Embarcados em Tempo Real</title>
		<link>http://www3.eletronica.org/artigos/sistemas-embarcados-em-tempo-real</link>
		<comments>http://www3.eletronica.org/artigos/sistemas-embarcados-em-tempo-real#comments</comments>
		<pubDate>Sat, 29 Oct 2011 16:35:16 +0000</pubDate>
		<dc:creator>Administrador Eletronica.org</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[sistemas embarcados]]></category>
		<category><![CDATA[tempo-real]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=184</guid>
		<description><![CDATA[Os sistemas computacionais estão presentes em diversas áreas de nosso cotidiano. Fazemos uso deles quando realizamos uma transação bancária via Internet, dirigimos nosso carro ou escutamos música com um tocador de CD portátil. De fato, com a proliferação dos sistemas dedicados de controle, grande parte dos dispositivos que usamos contam com um processador digital, que ...]]></description>
			<content:encoded><![CDATA[<p>Os sistemas computacionais estão presentes em diversas áreas de nosso cotidiano. Fazemos uso deles quando realizamos uma transação bancária via Internet, dirigimos nosso carro ou escutamos música com um tocador de CD portátil. De fato, com a proliferação dos sistemas dedicados de controle, grande parte dos dispositivos que usamos contam com um processador digital, que é responsável pelo controle de suas funcionalidades.</p>
<p>Nesse conjunto de aplicações, destaca-se um grupo de sistemas que são limitados pelo tempo, os chamados sistemas em tempo-real. Como os sistemas anteriores, esses também realizam tarefas de controle e processamento de informações, mas com um diferencial: suas respostas ao ambiente devem ser retornadas em tempo hábil ou o sistema irá entrar em um estado inconsistente de funcionamento.</p>
<p>Um exemplo comum de sistema em tempo-real é o computador de controle de uma usina nuclear. As tarefas de controle dos processos desse tipo de sistema são extremamente complexas e exigem máxima confiabilidade. As ações realizadas pelo controle devem ser executadas em tempo correto ou um desastre ocorrerá. “Sistemas em tempo-real são aplicados ou estão engajados em atividades do mundo real, as quais são inerentemente complexas” (CARNEIRO, 2001, p.58). Será usado o termo sistema em tempo-real em um sentindo bem amplo, referindo-se ao sistema inteiro, incluindo o ambiente, o software e hardware do computador.</p>
<p>Os sistemas em tempo-real podem ser encontrados em várias outras áreas de aplicação, como:</p>
<ul>
<li>Sistemas de navegação para veículos;</li>
<li>Controle de tráfego aéreo;</li>
<li>Sistemas de monitoramento de vida;</li>
<li>Controle de processos industriais;</li>
<li>Sistemas distribuídos de multimídia.</li>
</ul>
<p>Neste artigo, serão abordados os principais conceitos dos sistemas em tempo-real: suas características, classificação e principais linguagens de desenvolvimento.</p>
<h2>1. CONCEITOS DE TEMPO-REAL</h2>
<p>“O funcionamento correto de sistemas em tempo-real depende não somente do resultado lógico da computação, mas também do tempo em que os resultados são produzidos” (STANKOVIC, 1988, p.10).</p>
<p>Um sistema em tempo-real é basicamente composto por um sistema de controle, interfaces de entrada e saída e um ambiente, explicados a seguir:</p>
<ul>
<li>Sistema de controle – é responsável por responder aos estímulos do ambiente em tempo hábil. “É dito reativo porque sua tarefa primária é responder ou reagir aos sinais do ambiente” (SHAW, 2001, p.1).</li>
<li>Interfaces de entrada e saída – são as portas de comunicação entre o sistema de controle e o sistema controlado. Geralmente, são sensores, atuadores, receptores de sinais de rádio, entre outros.</li>
<li>Sistema controlado – é o ambiente com que o computador interage (cf. STANKOVIC, 1996, p. 206).</li>
</ul>
<p>Então, sistemas em tempo-real são sistemas computacionais que monitoram, controlam ou respondem a ambientes externos. Além disso, devem cumprir várias restrições de tempo impostas pelo comportamento do sistema externo (cf. SHAW, 2001, p.1).</p>
<p>O fato de fornecerem resposta em tempo hábil requer que os sistemas em tempo-real tenham o comportamento determinístico. Além disso, é necessário que outros aspectos entrem na especificação de projetos em tempo-real. São eles:</p>
<ul>
<li>Previsibilidade &#8211; em vez de ser rápido (que é um termo relativo), a mais importante propriedade de um sistema em tempo-real deve ser sua previsibilidade, que definese como: seu comportamento funcional e temporal deve ser tão determinístico quanto impõe as especificações do sistema (cf. STANKOVIC, 1988, p.11). </li>
<li>Confiabilidade – está relacionada à exatidão no funcionamento do sistema, ou seja, a falha do sistema é que pode gerar uma resposta fora do tempo esperado;</li>
<li>Desempenho – o sistema deve ser eficiente o suficiente para lidar com a complexidade inerente ao ambiente de comportamento em tempo-real;</li>
<li>Compactação – geralmente as soluções de sistemas em tempo-real são embarcadas, o que implica recursos reduzidos de processamento, memória e fontes de alimentação.</li>
</ul>
<h3>1.2. Interações entre o Sistema de Controle e o Ambiente</h3>
<p>O sistema de controle interage com o ambiente usando as informações disponibilizadas por vários sensores. É imperativo que o estado do ambiente, como percebido pelo sistema de controle, seja consistente como o real estado do ambiente. Então, o monitoramento periódico do ambiente e o processamento temporizado das informações dos sensores são necessários (cf. STANKOVIC, 1996, p. 206).</p>
<p>As restrições de tempo mais comuns para tarefas em sistemas em tempo-real são as periódicas, as aperiódicas e as esporádicas. Segundo STANKOVIC (1996, p. 206), estas são as definições para tarefas em sistemas em tempo-real:</p>
<ul>
<li>Tarefa periódica &#8211; é uma tarefa que é ativada a cada “T” unidades de tempo. O seu limite de execução para cada ativação pode ser menor, igual ou maior do que o período “T”.</li>
<li>Tarefa aperiódica – é uma tarefa ativada em períodos indeterminados.</li>
<li>Tarefa esporádica &#8211; é uma tarefa aperiódica com a restrição adicional de possuir um intervalo mínimo entre ativações de tarefas.</li>
</ul>
<p>Analisando o exemplo dado por LI &amp; YAO (2003, p.11) sobre as interações entre os sistemas de controle e sistemas controlados, vê-se que ele é baseado em um sistema de defesa em tempo-real para navios de guerra. O objetivo do sistema é destruir os projéteis lançados contra a embarcação, antes que eles a atinjam. O sistema é composto por um sistema de radar &#8211; que rastreia e procura por alvos em potencial e repassa a localização do alvo ao D&amp;C constantemente &#8211; um sistema de Decisão e Comando (D&amp;C) – que deve caracterizar o grau de ameaça, calcular a trajetória a partir das informações do sistema de radar e apontar as armas, através do sistema de controle de armamentos, para a área calculada e as ativar até que o alvo seja eliminado &#8211; e um sistema de controle de armamentos. O sistema de controle é o sistema D&amp;C, os sistemas controlados são o sistema de radar e o sistema de controle de armamentos, que são também interfaces com o ambiente externo.</p>
<p>A comunicação entre o sistema de radar e o D&amp;C é aperiódica. Apenas quando um alvo for detectado é que o radar irá passar suas informações para o D&amp;C. Por outro lado, a comunicação entre o sistema de armamentos e o D&amp;C, depois da detecção do alvo, é periódica, visto que o D&amp;C deve constantemente atualizar a posição das armas, em altíssima freqüência.</p>
<h2>2.TIPOS DE SISTEMAS EM TEMPO-REAL</h2>
<p>Os sistemas em tempo-real podem ser classificados em relação ao cumprimento de seus prazos de resposta ao ambiente, os deadlines. Deadline é o tempo limite que o sistema deve responder e/ou atuar para garantir sua consistência, sendo uma meta que deve ser perseguida e alcançada sempre.</p>
<p>Alguns sistemas são mais tolerantes às perdas de deadlines, ou seja, eles continuam em funcionamento mesmo não retornando suas respostas em tempo correto. É claro que o acúmulo de faltas pode levar o sistema para um estado inconsistente. Geralmente, esses sistemas contam o número de faltas ocorridas e, a partir de certo valor, acionam uma rotina de proteção e/ou correção. “Esses sistemas são chamados de soft real-time, em que a perda ocasional de um deadline é aceitável” (TANENBAUM, 2001, p.19).</p>
<p>Um bom exemplo de sistema em tempo-real soft é um aparelho de DVD. O aparelho de DVD realiza algumas atividades, tais como ler e decodificar o disco DVD, enviar as informações de vídeo e som para as respectivas saídas e receber comandos através do controle remoto. É aceitável que o decodificador perca algum deadline quando o aparelho é submetido a uma rápida série de comandos do usuário. A penalidade é uma momentânea, mas visível, distorção do vídeo ou do áudio.</p>
<p>Por outro lado, existem sistemas que um deadline não alcançado significa grande prejuízo econômico e/ou humano. Esses sistemas são do tipo hard real-time; um sistema de navegação de mísseis teleguiados é um bom exemplo do mesmo. O sistema deve ser constantemente realimentado com novas posições, de modo que possa desviar dos obstáculos ambientais e ainda atingir seu alvo. Caso o comando de reposicionamento não seja processado no tempo desejado, o míssel poderá colidir com uma montanha, ou pior, com habitações civis. “Se a ação deve acontecer absolutamente em um certo momento (ou em certo intervalo), temse um sistema em tempo-real hard ” (TANEBAUM, 2001, p.19).</p>
<p>Não se tem como caracterizar, de modo preciso, um sistema em tempo-real como hard ou soft. A maioria dos sistemas se encontra em algum lugar entre essas duas definições (cf. SHAW, 2001, p.2). Um sistema em tempo-real seria uma composição de tarefas hard e soft.</p>
<p>O projetista deve ter essa idéia bem clara na mente quando for escolher a estratégia de escalonamento e prioridade dos processos do sistema. “Design ar prioridades de tarefas não é um exercício trivial, por causa da complexidade natural dos sistemas em tempo-real” (LABROSSE, 2001, p.73). Uma estratégia mal formulada pode acarretar em perdas contínuas de deadlines.</p>
<p>Por exemplo, o processo que controla os sensores de ambiente, responsáveis por detectar obstáculos, do míssel teleguiado deve ter maior prioridade do que o processo que faz a comunicação com a central base. É fácil perceber o porquê: se a leitura dos sensores é feita de forma “lenta”, o sistema de navegação estará sendo alimentado com dados antigos, o que acarretará em uma possível colisão não desejada. Um atraso na comunicação com a central base não significa um grande prejuízo para o objetivo do sistema, que é atingir o alvo.</p>
<h2>3.CARACTERÍSTICAS DE UM SISTEMA EM TEMPO-REAL</h2>
<p>Algumas características são inerentes aos sistemas de comportamento em tempo-real, porém nem todos os sistemas em tempo-real irão apresentar todas estas características. A seguir, algumas delas são apresentadas:</p>
<ul>
<li>Requisitos de tempo determinísticos &#8211; “ deadlines e outras asserções concernentes a tempo são expressas em termos de valores fixos e exatos, ao invés de medidas médias” (SHAW, 2001, pg. 3). O motivo é que variações no tempo de execução das tarefas significam falhas de sistema, principalmente se o sistema for hard.</li>
<li>Execução Concorrente – Sistemas em tempo-real devem lidar com a concorrência natural das tarefas, que faz parte do mundo externo conectado ao sistema (cf. SHAW, 2001, p. 3). Além disso, a concorrência pode ser usada para aumentar o desempenho do sistema, usando-se processadores em paralelo.</li>
<li>Confiabilidade e tolerância a faltas – “Confiabilidade pode ser entendida como a probabilidade de um sistema funcionar corretamente em um intervalo de tempo completo, o qual depende da aplicação em questão” (CARNEIRO, 2001, p. 6). Porém, nenhum sistema é perfeitamente confiável e falhas podem ocorrer. “Tolerância a faltas está relacionada com o reconhecimento e gerenciamento das falhas” (SHAW, 2001, p. 3).</li>
<li>Tamanho e Complexidade – As dificuldades no desenvolvimento de software estão diretamente ligadas ao tamanho e à complexidade de programas. Sistemas em tempo-real são aplicados ou estão engajados em atividades do mundo real, as quais são inerentemente complexas (cf. CARNEIRO, 2001, p. 58). Esta complexidade é passada para o software de controle. Por isso, as linguagens de desenvolvimento para tempo-real devem fornecer facilidades para decompor sistemas complexos em módulos independentes, que são mais facilmente manipulados.</li>
<li>Manipulação de Números Reais – Diversas atividades de controle industrial fazem uso de controle por realimentação, que manipula dados associados à saída do sistema, realimentado-os à entrada para posterior comparação e geração de um sinal de erro (cf. CARNEIRO, 2001, p. 59). Então, um sistema em tempo-real deve ser hábil a lidar com matemática complexa.</li>
</ul>
<h2>4. LINGUAGENS DE DESENVOLVIMENTO PARA APLICAÇÕES EM TEMPO-REAL</h2>
<p>As linguagens serão apresentadas de acordo com suas facilidades para sistemas em tempo-real, não cabendo ao escopo deste trabalho um detalhamento mais profundo.</p>
<h3>Real-Time UML</h3>
<p>A Linguagem Unificada de Modelagem (UML) é uma linguagem usada para expressar construções e relacionamentos de sistemas complexos. Iniciou como uma resposta do Grupo de Modelagem de Objetos (OMG) a uma requisição de uma linguagem padrão de modelagem orientada a objetos.</p>
<p>Vem sendo usada em projetos de sistemas comercias, distribuídos, web services, dentre outros, com bastante sucesso. A UML possui um mecanismo de extensão da linguagem que permite flexibilizar sua notação para aplicações mais específicas.</p>
<p>A UML é mais completa do que outras linguagens no seu suporte para sistemas complexos e é particularmente preparada para sistemas embarcados em tempo-real (cf. DOUGLASS, 2001, p. 14).</p>
<p>Suas maiores características são:</p>
<ul>
<li>Modelo de objetos;</li>
<li>Casos de uso e cenários;</li>
<li>Modelagem comportamental com diagramas de estados;</li>
<li>Empacotamento de vários tipos de entidades;</li>
<li>Representação de tarefas e sincronização de tarefas;</li>
<li>Modelos de topologia física;</li>
<li>Modelos da organização do código fonte;</li>
<li>Suporte a padrões de projetos orientados a objetos.</li>
</ul>
<p>No trabalho de SELIC &amp; RUMBAUGH (1998), encontram-se algumas extensões para modelagem de sistemas em tempo-real. O diagrama de estados da UML fornece poderosas ferramentas para o projetista de sistema modelar as restrições de tempo do sistema. E como o diagrama é uma máquina de estados finita, pode-se obter um modelo matemático de fácil comprovação do sistema.</p>
<h3>OCCAM</h3>
<p>OCCAM é uma linguagem para aplicações científicas e de engenharia, para processos de controle industrial e para sistemas embarcados. OCCAM foi originalmente projetado para transputer (contração entre transistor e computer), uma arquitetura microprocessada, desenvolvida pelo INMOS, que suporta concorrência e sincronização.</p>
<p>A OCCAM possui características especiais para solução de problemas de programação concorrente (cf. CARNEIRO, 2001, p.35) e a semântica formal da linguagem auxilia a transformação e validação dos programas em modelos matemáticos.</p>
<p>Em OCCAM, as partes de um programa são tomadas como processos que executam suas funções e terminam. Pode-se ter mais de um processo sendo executado concorrentemente e processos podem trocar mensagens entre si (cf. CARNEIRO, 2001, p.35).</p>
<p>A comunicação é feita através de um construtor especial da linguagem chamado canal. Um canal é um caminho unidirecional de comunicação entre dois processos concorrentes e é implementado na prática usando regiões alocadas de memória, se os processos estão residentes no mesmo transputer, ou por links de comunicação dos transputers, se os processos comunicantes estiverem em diferentes transputers.</p>
<h3>HANDEL C</h3>
<p>Handel – C é uma linguagem de programação parecida com C projetada para fornecer compilação de programas em implementações sincrônicas de hardware, geralmente baseadas em FPGA. Desta forma, desenvolvedores de software podem, com uma curva de aprendizagem curta, implementar projetos em hardware.</p>
<p>As implementações em hardware têm como principal vantagem a performance, isto é, é possível se conseguir um paralelismo verdadeiro em um programa escrito em Handel – C. Cada instrução é executada simultaneamente em blocos separados de hardware, a linguagem permite primitivas de sincronização entre blocos paralelos de execução chamadas canais de comunicação (cf. AUBURY et al, 2000, p.11).</p>
<p>Quando um bloco paralelo é encontrado, ocorre uma divisão na execução das instruções e cada novo ramo segue executando simultaneamente. Após o término da execução de cada ramo, o fluxo do programa segue de forma seqüencial. A Figura 1 ilustra a situação. O procedimento de comunicação através de um canal pode ser exemplificado da seguinte maneira: um ramo paralelo libera o dado sobre o canal e o outro ramo lê o dado deste canal; a comunicação através de canais é sincronizada (cf. CARNEIRO, 2001, p. 45). O paralelismo e concorrência são importantes pois os eventos do mundo real podem ocorrer simultaneamente.</p>
<p><img class="aligncenter" src="http://www.eletronica.org/arquivos/figura1_temporeal.gif" alt="" width="420" height="350" /></p>
<h3>ADA</h3>
<p>A ADA é uma linguagem desenvolvida pelo Departamento de Defesa Americano com o intuito de prover uma solução robusta para projetos de aplicações críticas. Foi originalmente desenvolvida no início da década de 80 (ADA 83) e então revisada e melhorada para a linguagem ADA 95, que foi a primeira linguagem de programação orientada a objetos padronizada internacionalmente (ISO).</p>
<p>A ADA possui características fortes de modularização que auxiliam na construção de grandes sistemas, fornecendo ainda métodos de encapsulamento de informações. Além disto, a ADA disponibiliza recursos avançados de concorrência: as tarefas ADA podem comunicar entre si implicitamente, através de regiões compartilhadas de memória, ou explicitamente por meio de rendezvous.</p>
<p>O rendezvous em ADA possui as seguintes características: comunicação não armazenada e sincronizada, identificação assimétrica – a tarefa fonte conhece a identidade da tarefa destino, mas o contrário é falso, fluxo de dados bidirecional (cf. CARNEIRO, 2001, p. 36).</p>
<p>Em ADA, as primitivas de comunicação e sincronização são baseadas em passagens de mensagens, todas as ações de processos simples são atômicas, desde que não existam variáveis compartilhadas e o próprio processo não comunique durante a ação. Esta característica é importante para as fases de avaliação e confinamento de danos e recuperação de erros de sistemas tolerantes a faltas (cf. CARNEIRO, 2001, p. 37).</p>
<p>A ADA possui recursos de gerenciamento de tarefas inerentes a sua especificação, as tarefas em ADA possuem prioridades e seguem a política de escalonamento preemptivo, a tarefa em execução cede o direito de execução para a tarefa de maior prioridade e pronta para executar. Segundo ISO (2001), as implementações de ADA tem permissão de definir recursos adicionais e definir políticas de alocação correspondentes a estes. Tais recursos devem ter uma implementação definida na política de despacho de tarefas, que gerencia a alocação de tarefas nas filas de estado de tarefas.</p>
<h3>Real-Time JavaTM</h3>
<p>A Plataforma Java foi desenvolvida pela Sun Microsystems como uma solução portável, orientada a objetos, distribuída e segura para o desenvolvimento de aplicações comerciais. Devido a sua portabilidade, Java vem sendo utilizada em diversos ambientes, desde aplicações para dispositivos embarcados até aplicações corporativas (cf. GOSLING, 1996).</p>
<p>Os princípios que norteavam o projeto de Java eram discordantes com os requisitos de aplicações em tempo-real. A independência de sistema operacional e hardware implicaram em pouco detalhamento nas questões de comportamento de threads, sincronização, gerenciamento de memória e interrupções, entrada e saída.</p>
<p>Tendo em vista isso, a Java Community Process (JCP), a pedido da IBM, organizou um grupo de experts da indústria da computação para produzir e publicar a Especificação de Java para Tempo-Real (RTSJ). Os trabalhos do grupo foram focados em sete áreas principais: escalonamento de threads, gerenciamento de memória, sincronização e compartilhamento de recursos, gerenciamento de eventos assíncronos, transferência de controle assíncrona, terminação assíncrona de threads e acesso à memória física.</p>
<p>Segue algumas características interessantes de Real-Time Java encontradas em BOLLELA et al (2000): “A RTSJ definiu o conceito de objeto escalonável, que é um objeto que implementa a interface schedulable. A instância do objeto Scheduler é responsável por escalonar os objetos da classe schedulable. Existe espaço na especificação para o usuário definir seus próprios algoritmos de escalonamento, o padrão é o preemptivo com 28 prioridades. O gerente de memória heap de Java, comumente chamado de coletor de lixo, é considerado como um empecilho para a programação em tempo-real devido ao seu comportamento imprevisível. A solução encontrada foi permitir a alocação de memória fora da área de heap do coletor de lixo, isso é conseguido através de áreas de memória que possuem características específicas em relação a duração dos objetos alocados nela. Threads esperando por um recurso são organizadas seguindo a ordem de elegibilidade, ou seja, através da prioridade que foi designada pelo desenvolvedor do sistema. A RTSJ também definiu proteções contra o problema de inversão de prioridades, bastante comum em sistemas em temporeal”.</p>
<h2>Referências</h2>
<p>AUBURY, Matthew; PAGE, Ian; RANDALL, Geoff; SAUL, Jonathan; WATTS, Robin.<br />
Handel-C Language Reference Guide. Oxford University Computing Laboratory, 1996.</p>
<p>BOLLELA, Greg; BROSGOL, Bem; FURR, Steve; HARDIN, David; DIBBLE, Peter;</p>
<p>GOSLING, James; TURNBULL, Mark. The Real-Time Specification for JavaTM.</p>
<p>Massachussetts: Addison-Wesley, 1 Ed. 2000.</p>
<p>CARNEIRO, P. Régis. Gerenciador de Processos para Aplicações em Tempo-Real: Uma Experiência com Arquitetura DSP (Processador de Sinal Digital), Fortaleza, 2001.</p>
<p>Dissertação de Mestrado em Engenharia Elétrica apresentada ao Departamento de Engenharia Elétrica da Universidade Federal do Ceará.</p>
<p>GOSLING, James; MCGIHON, Henry. The Java Language Enviroment, 1996. Disponível em http://java.sun.com/docs/white/langenv/ .</p>
<p>LABROSSE, Jean j. Embedded Systems Building Blocks. San Francisco: CMP Books, 2. ed. 2002.</p>
<p>LI, Qing; YAO, Caroline. Real-time concepts for Embedded Systems. San Francisco: CMP Books, 1. ed. 2003.</p>
<p>SHAW, Alan C. Real-time Systems and Software. New York: John Wiley &amp; Sons, 1. ed. 2001.</p>
<p>SELIC, Bran; RUMBAUGH, Jim. Using UML for Modeling Complex Real-Time Systems. 1998.</p>
<p>STANKOVIC, John A. Misconceptions About Real-Time Computing. IEEE Computer: out. 1988.</p>
<p>STANKOVIC, John A. Real-Time and Embedded Systems. ACM Computing Surveys. V. 28, n. 1, mar. 1996.<br />
TANENBAUM, Andrew S. Modern Operational Systems. New York: Prentice Hall, 3. Ed. 2000.</p>
<p>Este artigo é uma compilação, efetuada pelo autor, do capítulo 2 do seguinte trabalho: <strong>Estudo Comparativo de Kernels de Sistemas Operacionais em Tempo-Real – Fortaleza, 2005. Monografia de graduação do curso Tecnólogo em Telemática apresentada ao Centro Federal de Educação Tecnológica do Ceará.</strong></p>
<p>&nbsp;</p>
<p><strong>Otávio Alcântara</strong></p>
<p>Otávio Alcântara é Tecnólogo em Telemática pelo CEFET-CE e especializado em desenvolvimento de software em tempo real para sistemas embarcados.</p>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/artigos/sistemas-embarcados-em-tempo-real/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Interrupções e DMA</title>
		<link>http://www3.eletronica.org/artigos/interrupcoes-e-dma</link>
		<comments>http://www3.eletronica.org/artigos/interrupcoes-e-dma#comments</comments>
		<pubDate>Sat, 29 Oct 2011 16:32:27 +0000</pubDate>
		<dc:creator>Administrador Eletronica.org</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[interrupção]]></category>
		<category><![CDATA[microcontrolador]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=182</guid>
		<description><![CDATA[Interrupções e DMA são muito importantes para a operação de sistemas microprocessados, pois possibilitam ao microprocessador responder rapidamente a seus dispositivos de entrada e saída (E/S). A importância dessas abordagens pode ser entendida comparando-as a uma campainha. Se uma porta não tiver nenhum dispositivo para chamar a atenção (como uma campainha), é necessário ir até ...]]></description>
			<content:encoded><![CDATA[<p>Interrupções e DMA são muito importantes para a operação de sistemas microprocessados, pois possibilitam ao microprocessador responder rapidamente a seus dispositivos de entrada e saída (E/S).</p>
<p>A importância dessas abordagens pode ser entendida comparando-as a uma campainha. Se uma porta não tiver nenhum dispositivo para chamar a atenção (como uma campainha), é necessário ir até a porta para verificar se não existe ninguém à porta. Com uma campainha, precisa-se ir até a porta apenas quando a campainha toca. Caso tenha-se um mordomo, nem é necessário ir até a porta. Do mesmo modo, não é eficiente esperar que o microprocessador verifique se seus periféricos requerem atenção. Para isto existem as interrupções, que são como campainhas que avisam ao microprocessador que algum dispositivo necessita dele. Assim, o DMA pode ser comparado ao mordomo que vai abrir a porta deixando o microprocessador livre para outras tarefas. Ambas as abordagens têm vantagens e desvantagens, por isso é necessário conhecer-se bem cada uma delas.</p>
<div>
<div>
<p><strong>Interrupções</strong><br />
Durante a execução normal do programa, as instruções são lidas da memória e executadas de acordo com o fluxo normal do programa. O processador usa um registrador especial chamado de apontador de instrução (IP) para sinalizar a próxima instrução a ser executada. Um conjunto de registradores de propósito geral é usado para manipular e armazenar temporariamente algum dado usado pelo programa.</p>
<p>Quando o microprocessador recebe um sinal de interrupção, o processador executa a corrente instrução e salva o IP, juntamente como todos os outros registradores, na pilha. Em seguida, vai para uma rotina especial chamada de “rotina de tratamento de interrupção”. Nesta rotina encontra-se todas as instruções necessárias para atender as necessidades do dispositivo que requisitou a interrupção. A última instrução executada por esta rotina é uma instrução de retorno (RTI). Esta instrução força o microprocessador a restaurar o IP e todos os demais registradores, com os valores salvos na pilha. Dessa forma, após atender a interrupção, o microprocessador volta ao estado que estava antes da requisição de interrupção (IRQ).</p>
<p>Como pode ser notado, a interrupção requer um certo tempo de processamento. Este tempo é necessário para que a CPU salve os registradores na pilha e vá para a rotina de tratamento de interrupção. Por isso, durante o projeto do sistema o tempo de sobre carga, conhecido também como tempo de latência, precisa ser estimado. Se o tempo de latência for muito elevado para a aplicação, outro método tem que ser estudado.</p>
<p><strong>Interrupções na família 80&#215;86</strong><br />
Todas as pastilhas Intel possuem dois níveis de interrupção, mascarável e não-mascarável. As interrupções não-mascaráveis são usadas para sinalizar “quase catástrofes”, como um erro de paridade de memória. Todos os dispositivos de E/S utilizam interrupções mascaráveis.</p>
<p>As interrupções de “hardware” são coordenadas através do chip 8259A, que permite até 8 interrupções com prioridade. Quando um dispositivo necessita efetuar alguma operação (geralmente de entrada/saída) ele envia um sinal (IRQ), em seguida o 8259A põe sua saída (INT) em nível alto. Esta saída é conectada ao microprocessador no pino INTR, este pino é usado pelo microprocessador para sinalizar uma interrupção mascarável. Se o bit de interrupção (IF) do registrador FLAGS estiver setado, o microprocessador envia um sinal (INTA) de volta ao 8259A. Ao receber este sinal, o controlador coloca um número inteiro no barramento, este número é usado para identificar o tipo de dispositivo e é chamado de vetor de interrupção. A CPU então usa este número para indexar uma tabela de 256 entradas para encontrar o endereço da rotina de tratamento de interrupção.</p>
<p>Um chip 8259A possui 8 níveis de prioridade (IRQ0 até IRQ7). Com este controlador de interrupção, quando a primeira interrupção acontece, por exemplo, a IRQX, a CPU é interrompida. Se uma interrupção subseqüente de maior prioridade ocorrer, o 8259A interrompe a CPU pela segunda vez. Se a interrupção tiver prioridade menor, ela é suspensa até a primeira terminar. Para isto, a rotina de interrupção deve enviar explicitamente um comando para o 8259A para informar quando terminar.</p>
<p><strong>DMA</strong><br />
O DMA (Acesso Direto à Memória) é um dispositivo útil e poderoso para transferir dados entre dispositivos de E/S, ou entre dispositivo de E/S e a memória. Esta transferência ocorre muito rapidamente porque uma peça de “hardware” dedicada transfere dados de uma parte do computador para outra em apenas um ou dois ciclos de E/S por dado transferido. O DMA também minimiza a latência em atender um dispositivo de E/S, pois um “hardware” dedicado responde mais rapidamente que interrupções, e o tempo de transferência é curto. Logo, a quantidade de memória temporária necessária nos dispositivos de E/S é reduzida. Além disso, o DMA também diminui a carga da CPU, pois ela não tem que executar instrução alguma para transferir dados. Portanto, o processador não é usado para gerenciar a transmissão e fica disponível para outras atividades. Isto é ainda mais importante em sistemas nos quais o microprocessador opera primariamente na sua memória “cache”, neste caso a transferência ocorre em paralelo, logo a performance geral do sistema é melhorada.</p>
<p><strong>Como o DMA funciona</strong><br />
Um controlador de DMA gerencia vários canais de DMA, cada canal pode ser programado para realizar uma seqüência de transferências. Dispositivos, normalmente periféricos de E/S, que necessitam enviar ou receber dados sinalizam para o controlador de DMA enviando um sinal de requisição de DMA (DRQX, com X igual ao número do canal). Um sinal de DRQX para cada canal é roteado para o controlador. Este sinal é monitorado e respondido da mesma forma que o processador gerencia interrupções. Quando o controlador de DMA recebe o sinal de requisição de DMA (DRQX), o controlador responde realizando uma ou mais transferências do dispositivo de E/S para a memória ou vice versa. Os canais do DMA precisam ser habilitados pelo processador para que o controlador de DMA responda aos sinais de DRQX. O número de operações efetuadas, modos de transferências usados, e locações de memória possíveis dependem de como os canais de DMA são programados.</p>
<p>Um controlador de DMA tipicamente compartilha a memória do sistema com a CPU e pode operar como mestre ou escravo. Operando como mestre, o controlador assume o comando do barramento do sistema (linhas de endereço, dados e controle) para realizar as transferências.</p>
<p>Operando como escravo, o controlador de DMA é acessado pela CPU, que programa os registradores internos ao controlador para configurar a transferência. Estes consistem dos registradores de endereço fonte e destino e contador de transferências, para cada canal de DMA, assim como um registrador de status para configuração e monitoramento da operação do controlador.</p>
<p><strong>Tipos e modos de transferências</strong><br />
Controladores de DMA variam de acordo com os tipos de transferências e modo suportados. Os dois tipos de transferência são o “flyby” e o “fetch-and-deposit”. Os três modos mais comuns são o “sigle”, “block”, e “demand”. Todos esses tipos e modos são descritos a seguir.</p>
<p>O tipo de transferência mais rápida é o “flyby”. Neste caso, uma única operação de barramento é usada para a transferência, com os dados lidos da fonte e escritos no destino simultaneamente. O dispositivo envia um sinal de DRQX para o canal apropriado, em seguida o controlador toma o controle do barramento e envia um sinal para o dispositivo (sinal DACKX, com X igual ao número do canal). Este sinal avisa-o para ler o dado do barramento ou coloca-lo no barramento, dependendo da direção da transferência. Em outras palavras, este tipo de transferência ocorre como uma operação de E/S na memória, e apenas um ciclo de memória é utilizado. Apesar de muito eficiente, este tipo de operação não pode transferir dados da memória para a memória.</p>
<p>O segundo tipo de transferência é chamado de “fetch-and-deposit”. Neste caso, são envolvidos dois ciclos de memória ou de E/S. Os dados são inicialmente lidos dos dispositivos ou da memória e são armazenados em registradores internos ao controlador de DMA. Os dados são então escritos na memória ou no dispositivo de E/S no próximo ciclo. Apesar de ineficiente, pois utiliza dois ciclos de memória, este tipo de transferência é útil para transferir dados entre dispositivos incompatíveis. Por exemplo, um controlador de DMA pode efetuar duas leituras de 16 bits em um local seguida de uma escrita de 32 bits. Diferente do tipo “flyby”, o “fetch-and-deposit” pode ser usado para operações entre a memória e a memória.</p>
<p>Além dos tipos de transferência, um controlador de DMA pode suportar um ou mais modos de transferência. Os mais comuns são o “sigle”, “block”, e “demand”. O modo “sigle” é o mais lento, pois, neste caso, o DMA transfere um único dado para cada sinal de DRQX. Isto pode não ser problema para sistema com pouca demanda de barramento, porém pode causar sérios problemas de latência quando múltiplos dispositivos tentam acessar o barramento. Os modos “block” e “demand” podem ser mais eficientes, pois permitem realizar várias transferências quando o DMA ganha o controle do barramento. No modo “block”, em resposta a um único sinal de DRQ, o DMA realiza múltiplas transferências de acordo com seu registrador contador. No modo “demand”, o DMA realiza transferências enquanto o dispositivo sustentar o sinal de DRQ.</p>
<p><strong>Operação do controlador</strong><br />
Para cada canal, o controlador de DMA armazena os endereços e o contador programados nos registradores de base e matem uma cópia dessas informações nos registradores de endereço corrente e no de contador corrente. Cada canal é habilitado ou inibido através do registrador de mascara. Quando o DMA é iniciado escrevendo-se nos registradores de base e habilitando-se o canal, os registradores correntes (de endereço e contador). A cada transferência, o valor no registrador de endereço corrente é colocado no barramento, em seguida o registrador é incrementado ou decrementado. O contador corrente determina o número de transferências remanescentes e é automaticamente decrementado a cada transferência. Quando o valor deste registrador passa de 0 para -1, um sinal chamado “terminal count” (TC) é gerado. Isto significa que o DMA completou a seqüência de transferências. Este sinal pode ser monitorado pelos dispositivos de E/S que participam da transferência.</p>
<p>O controlador de DMA necessita de programação a cada sinal TC. Quando este sinal ocorre, a CPU precisa programar o DMA para uma nova transferência. Para isto, alguns controladores de DMA interrompem a CPU à cada da fim de transferência. Logo, o controlador consome algum tempo da CPU, mas muito menos que o consumido por serviço de E/S baseados em interrupções. Alguns controladores possuem mecanismos de auto-configuração. Geralmente, quanto mais sofisticado for o controlador, menos tempo da CPU ele vai consumir para realizar esta configuração.</p>
<p>Um controlador de DMA tem um ou mais registradores de status que são lidos pela CPU para determinar o estado de cada canal. Este registrador geralmente indica quando um canal foi requisitado e quando o canal envia um TC. Contudo, ler um registrador de status sempre elimina a informação do TC do registrador, o que pode provocar problemas se múltiplos dispositivos estão tentando usar canais diferentes.</p>
<p><strong>Gerenciando o controlador de DMA</strong><br />
O DMA é um recurso compartilhado e pode se usado por aplicações complemente diferentes, logo precisa ser propriamente gerenciado. As maiores preocupações são manter as informações de status coerentes e controlar a transferência dos dados, visto que não existe suporte por parte do sistema operacional para operações com DMA.</p>
<p>O controlador de DMA usado nos microcomputadores PC e compatíveis é o chip 8237A. Este possui registradores de programação de 16 bits, porém são programados através de uma porta de 8 bits. Para isto, existe um registrador apontador que define quais das duas posições receberá cada operações de 8 bits de leitura ou escrita. Evidentemente, para evitar conflitos, o registrador apontador deve ser “limpo” e as interrupções interrompidas antes de cada operação de leitura ou escrita.</p>
<p>Outro problema envolve a determinação de fim de transferência do DMA. Cada canal de DMA tem um bit de TC no registrador de status, infelizmente uma leitura neste registrador limpa o bit de TC de todos os canais. Logo, o dispositivo de E/S tem que achar outra forma de saber o fim de transferência de DMA. No caso do PC e do AT, isto é feito através de um cartão de E/S que trabalha como um “DMA slave” e gera um IRQ para cada canal de DMA.</p>
<p><strong>Conclusão</strong><br />
A técnica de interrupção é imprescindível para realizar operações de entrada e saída em grandes sistemas microprocessados. Caso ela não seja aplicada, o microprocessador tem que verificar constantemente a existência de um novo dado. Contudo, em sistemas de baixa velocidade, isto pode ser aceitável.</p>
<p>A transferência de dados via DMA é essencialmente mais rápida que as outras abordagens. Devido principalmente a pouca (ou nenhuma) interferência da CPU. No entanto, a configuração de um controlador de DMA é um pouco complicada e susceptível a erros. Mesmo nos microcomputadores não existe suporte, por parte do sistema operacional, para este tipo de transferência. Por isso, deve ser usado com cautela.</p>
<p><strong>Autor</strong>: José Alexandre de França ( webmaster@eeol.org ).<br />
Texto original localizado em: <a href="http://www.eeol.org/">http://www.eeol.org</a></p>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/artigos/interrupcoes-e-dma/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Protocolo de Comunicação I²C</title>
		<link>http://www3.eletronica.org/artigos/protocolo-de-comunicacao-i%c2%b2c</link>
		<comments>http://www3.eletronica.org/artigos/protocolo-de-comunicacao-i%c2%b2c#comments</comments>
		<pubDate>Sat, 29 Oct 2011 16:30:57 +0000</pubDate>
		<dc:creator>Administrador Eletronica.org</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[microcontrolador]]></category>
		<category><![CDATA[serial]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=180</guid>
		<description><![CDATA[Para explorar todos os benefícios dos sistemas e dispositivos eletrônicos, os engenheiros e projetistas visam melhorar a eficiência do hardware e minimizar a complexidade dos circuitos. 1. Introdução Para explorar todos os benefícios dos sistemas e dispositivos eletrônicos, os engenheiros e projetistas visam melhorar a eficiência do hardware e minimizar a complexidade dos circuitos. Para ...]]></description>
			<content:encoded><![CDATA[<p>Para explorar todos os benefícios dos sistemas e dispositivos eletrônicos, os engenheiros e projetistas visam melhorar a eficiência do hardware e minimizar a complexidade dos circuitos.</p>
<p><strong>1. Introdução</strong></p>
<div>
<p>Para explorar todos os benefícios dos sistemas e dispositivos eletrônicos, os engenheiros e projetistas visam melhorar a eficiência do hardware e minimizar a complexidade dos circuitos.</p>
<p>Para facilitar esta árdua tarefa surgiu o protocolo de comunicação I2C.</p>
<p>O protocolo de comunicação em 2 sinais I2C foi originalmente desenvolvido pela Philips em meados de 1996. Atualmente este protocolo está amplamente difundido e interconecta uma ampla gama de dispositivos eletrônicos. Dentre estes encontramos vários dispositivos de controle inteligente, normalmente microcontroladores e microprocessadores assim como outros circuitos de uso geral, como drivers LCD, portas de I/O, memórias RAM e EEPROM ou conversores de dados.</p>
<p>Muitas vantagens podem ser atribuídas ao protocolo I2C. Destacam-se entre elas:</p>
<p>- Organização funcional em blocos, providenciando um simples diagrama esquemático final.<br />
- Não há necessidade dos projetistas desenvolverem interfaces. Todos os dispositivos integram as interfaces &#8220;on-chip&#8221;, o que aumenta a agilidade no desenvolvimento.<br />
- Endereçamento e protocolo de transferência de dados totalmente definido via software.<br />
- Possibilidade de inclusão ou exclusão de dispositivos no barramente sem afeta-lo ou outros dispositivos conectados a este.<br />
- Diagnóstico de falhas extremamente simples. O mal funcionamento é imediatamente detectado.<br />
- Desenvolvimento simplificado do software através do uso de bibliotecas e módulos de software reutilizáveis.<br />
- Facilidade no desenvolvimento de placas de circuito impresso, devido a quantidade de interconexões.</p>
<p>Adicionalmente, utilizando as vantagens da tecnologia CMOS na fabricação dos dispositivos, temos:<br />
- Baixíssimo consumo de corrente.<br />
- Alta imunidade à ruidos.<br />
- Ampla faixa de tensões p/ alimentação.<br />
- Ampla faixa de temperatura p/ operação.</p>
<p><strong>2. Características Gerais do Barramento I2C:</strong></p>
<p>- Suporta qualquer tecnologia de produção.<br />
- Duas vias de comunicação: serial data (SDA) e serial clock (SCL), ambas bidirecionais, conectadas ao positivo da fonte de alimentação através de um resistor de pull-up. Enquanto o barramento está livre ambas as linhas ficam em nível lógico alto.<br />
- A taxa de transferência máxima é de 100kbit/s no modo padrão (standart), ou 400kbit/s no modo rápido (fastmode).<br />
- Informação de carry entre dispositivos conectados.<br />
- Todo dispositivo possui um endereço único no barramento, independente de sua natureza.<br />
- Qualquer dispositivo conectado pode operar com transmissor ou receptor. Claro que isso depende da natureza do dispositivo &#8211; um LCD não vai operar como transmissor, assim como um teclado não operará como receptor. Independente disto, qualquer dispositivo <em>endereçado</em> é chamado de escravo (slave).<br />
- O número de interfaces conectadas fica dependente da capacitância máxima do barramento, que é de 400pF.</p>
<p><strong>3. Definições:</strong><br />
- Transimiter (Transmissor): dispositivo que envia dados através do barramento.<br />
- Receive (Receptor): dispositivo que recebe dados através do barramento.<br />
- Master: dispositivo que inicia a comunicação, gera o sinal de clock e encerra a comunicação.<br />
- Multi-master: vários dispositivos podem controlar o barramento, mesmo sem comprometer a mensagem. Quando isto ocorre temos vários dispositivos operando em modo maste<br />
- Arbitrarion (Arbitrariedade) : procedimento p/ o controle do barramento em modo multi-master. Visa não corromper a transmissão dos dados e perder a sincrioia do clock.<br />
- Sincronização: procedimento p/ sincronizar o clock de um ou mais dispositivos.</p>
<p><strong>4. Comunicação:</strong></p>
<p>4.1 Níveis lógicos<br />
Como o protocolo de comunicação i2c aceita uma ampla gama de métodos de fabricação para os seus dispositivos (CMOS,NMOS,Bipolar,etc.) os níveis lógicos alto e baixo não possuem valores pré-estabelecidos, dependendo diretamente da tenção Vcc de alimentação.</p>
<p>4.2 Validação dos dados<br />
O dado na linha SDA precisa ser estável durante o período ALTO do clock. A mudança entre os níveis lógicos alto e baixo só podem ser feitas enquanto a sinal de clock estiver BAIXO.</p>
<p>4.3 Condições Iniciais e Finais<br />
Durante todo o processo apenas dois sinais são caracterizados como condições de START e STOP.</p>
<p>4.4 O procedimento de comunicação do protocolo I2C é extremamente simples. Basicamente temos 6 itens para análise:<br />
- 1. O dispositivo master ajusta a condição inicial.<br />
- 2. O dispositivo master envia 7 bis de endereçamento.<br />
- 3. O dispositivo master envia o 8o bit, RW/<br />
- 4. O dispositivo slave envia o sinal de ACK (Acknowledge)<br />
- 5. O dispositivo master (ou slave) envia pacotes de 8 bits de dados, sempre seguidos de um sinal ACK enviado pelo dispositivo slave (ou master) confirmando a recepção.<br />
- 6. O dispositivo master encerra a comunicação.</p>
<p><strong>Sinais de de dados e clock em um exemplo de comunicação prática:</strong></p>
<p><img class="aligncenter" src="http://www.eletronica.org/img_artigos/ciclo_i2c.gif" alt="" /><br />
É importante fazer algumas observações:<br />
1. O endereçamento default é feito com 7 bits, mas existe o modo extendido que possibilita o uso de 10 bits de endereçamento (1024 dispositivos).<br />
2. A quantidade de pacotes de transmissão é controlada pelo dispositivo master, não possuindo um valor máximo definido. Este é um ponto importante a ser observado, pois como os dados sao transmitidos serialmente, na utilização de memórias, perde-se os limites de endereçamento que existem nos dispositivos paralelos.<br />
3. A comunicação pode ser suspensa, simplesmente travando-se o sinal de clock. Isto pode ser útil para efetuar o tratamento de interrupções ou derivados, sem, no entanto, corromper os dados transmitidos.</p>
<p><strong>5. Conclusão</strong><br />
Este pequeno artigo visou fazer um apanhado geral sobre o protocolo de comunicação I2C, tentando demonstrar de modo rápido e didático como funciona este método de transeferência de dados. Documentos com características técnicas mais apuradas podem ser encontrados no site da Philips Instruments ( <a href="http://www.philips.com/">www.philips.com</a> ).<br />
Aos que já conhecem e utilizaram o protocolo, já estão por dentro das<br />
facilidades. Para os que nunca utilizaram, não deixem de experimentar. Vocês se surpreenderão com as facilidades e agilidades proporcionadas.</p>
<p>Sugestões ou correções no texto acima, contacte-nos através do nosso <a href="mailto:rpfilho@mailbr.com.br">e-mail</a> .</p>
<p>Roberto Paulo Dias A. Filho<br />
roberto@eletronica.org</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/artigos/protocolo-de-comunicacao-i%c2%b2c/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Conectando 6 LEDs com Apenas 3 Pinos do Microcontrolador</title>
		<link>http://www3.eletronica.org/dicas-e-hacks/conectando-6-leds-com-apenas-3-pinos-do-microcontrolador</link>
		<comments>http://www3.eletronica.org/dicas-e-hacks/conectando-6-leds-com-apenas-3-pinos-do-microcontrolador#comments</comments>
		<pubDate>Sat, 29 Oct 2011 16:23:31 +0000</pubDate>
		<dc:creator>Administrador Eletronica.org</dc:creator>
				<category><![CDATA[Dicas e Hacks]]></category>
		<category><![CDATA[microcontrolador]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=178</guid>
		<description><![CDATA[Algumas vezes você precisa de mais do que o que tem. Eeu estou falando sobre os pinos do microcontrolador. Veja bem: você tem que conectar 6 LEDs mas possui apenas três pinos do microcontrolador disponíveis. Utilizar outro microcontrolador não é sempre uma opção e outros circuitos decodificadores também não. Esta é uma dica simples de ...]]></description>
			<content:encoded><![CDATA[<p>Algumas vezes você precisa de mais do que o que tem. Eeu estou falando sobre os pinos do microcontrolador.</p>
<p>Veja bem: você tem que conectar 6 LEDs mas possui apenas três pinos do microcontrolador disponíveis. Utilizar outro microcontrolador não é sempre uma opção e outros circuitos decodificadores também não.</p>
<div>Esta é uma dica simples de como fazer isso. Conecte os diodos LED ao microcontrolador dessa forma:</div>
<div>
<p><img src="http://www2.eletronica.org/hack-s-dicas/conectando-6-leds-com-apenas-3-pinos-do-microcontrolador/6_leds.gif" alt="6_leds.gif" /></p>
<p>Agora veja: se você setar o pino um para &#8220;1&#8243; e o segundo para &#8220;0&#8243; (deixando o pino 3 no estado de alta impedância, como entrada) então você somente vai acender um LED. Você pode ligar dois leds ao mesmo tempo setando o terceiro pino para o estado &#8220;1&#8243; ou &#8220;0&#8243;, dependendo de qual LED adicional você pretende acender.<br />
Se você precisar ligar todos os LEDs ao mesmo tempo, precisará mudar o estado dos pinos em uma freqüência mais alta para evitar a sensação dos LEDs piscando.</p>
<p>Com esse método você pode ligar até doze LEDs com apenas 4 pinos. Este é um método conveniente para ser utilizado com LEDs bicolores, quando dois LEDs são colocados no mesmo encapsulamento, mas em diferentes direções.</p>
<p>Este é um exemplo de código em C para o ARV-GCC de como controlar os LEDs. No exemplo, os LEDs estão conectados na porta B, entre os pinos 0 e 2.</p>
<p>Fragmento da função de controle:</p>
<pre></pre>
<pre>unsigned char leds;           // Os bits são os estados dos leds
void LEDs_refresh(void)
{
static unsigned char state;   // Taxa de atualização atual
OFF();                      // Coloca todos os pinos em alta impedância (entrada)
switch (state)
{
   default:
      CLR_0();                  // Coloca o pino 0 baixo
        if (leds &amp;  1) {SET_1();} // Coloca o pino 1 alto para o led 1
        if (leds &amp;  2) {SET_2();} // Coloca o pino 2 alto para o led 2
        state=1;                  // próximo estado
       break;
  case 1:
       CLR_1();                  // Coloca o pino 0 baixo
        if (leds &amp;  4) {SET_0();} // Coloca o pino 0 alto para o led 3
        if (leds &amp;  8 ) {SET_2();} // Coloca o pino 2 alto para o led 4
       state=2;                  //próximo estado
       break;
    case 2:
       CLR_2();                  // Coloca o pino 2 em nível baixo
       if (leds &amp; 16) {SET_0();} // Coloca o pino 0 alto para o LED 5
       if (leds &amp; 32) {SET_1();} // Coloca o pino 1 alto para o LED 6
       state=0;                 // Próximo estado
       break;
}//end switch
}
<span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; white-space: normal;">Esta função deve ser chamada com freqüência para evitar deixar visível a piscada dos LEDs. O melhor é utilizar a interrupção do timer.</span></pre>
<p>O código completo do projeto está na caixa abaixo para download.</p>
</div>
<fieldset id="attachmentsBox">
<legend>Anexos</legend>
<ul>
<li><a title="" href="http://www2.eletronica.org/hack-s-dicas/conectando-6-leds-com-apenas-3-pinos-do-microcontrolador/6leds.zip">6leds.zip</a></li>
</ul>
</fieldset>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/dicas-e-hacks/conectando-6-leds-com-apenas-3-pinos-do-microcontrolador/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Acesso à Porta Paralela nos Windows XP / NT/ 2000</title>
		<link>http://www3.eletronica.org/dicas-e-hacks/acesso-a-porta-paralela-nos-windows-xp-nt-2000</link>
		<comments>http://www3.eletronica.org/dicas-e-hacks/acesso-a-porta-paralela-nos-windows-xp-nt-2000#comments</comments>
		<pubDate>Sat, 29 Oct 2011 16:21:04 +0000</pubDate>
		<dc:creator>Administrador Eletronica.org</dc:creator>
				<category><![CDATA[Dicas e Hacks]]></category>
		<category><![CDATA[porta paralela]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=176</guid>
		<description><![CDATA[Acessar o hardware diretamente pode oferecer problemas nestes sistemas operacionais. Esta é uma solução simples e eficiente para evitar possíveis erros.  As versões XP, NT e 2000 dos sistemas operacionais da Microsoft implementam uma política de segurança que impede o usuário de trabalhar diretamente com a porta paralela. Neste breve texto, mostraremos como liberar o ...]]></description>
			<content:encoded><![CDATA[<p>Acessar o hardware diretamente pode oferecer problemas nestes sistemas operacionais. Esta é uma solução simples e eficiente para evitar possíveis erros.</p>
<div>
<p> As versões XP, NT e 2000 dos sistemas operacionais da Microsoft implementam uma política de segurança que impede o usuário de trabalhar diretamente com a porta paralela. Neste breve texto, mostraremos como liberar o acesso para que nossos projetos eletrônicos funcionem devidamente.</p>
<p>A solução para esta situação dar-se através de peças de software. Bibliotecas diferentes devem ser utilizadas na hora de implementar as rotinas para que não haja problemas de segurança.</p>
<p>No entanto, vários softwares já estão prontos e não possuem versões desenhadas especificamente para suprir estas necessidades. É aí que entra um outro programa, o UserPort, desenvolvido por Tomas Franzon.</p>
<p>Para facilitar, aqui estão os passos rápidos para que os seus programas voltem a funcionar:</p>
<ol>
<li> Pegue o arquivo UserPort.zip <a href="http://www.eletronica.org/arquivos/userport.zip" target="_self">clicando aqui</a>.</li>
<li> Descompacte o arquivo em um diretório (pasta) escolhido por você.</li>
<li> Copie o arquivo UserPort.sys para o diretório c:/windows/system32/drivers (ou c:/winnt/system32/drivers para o Windows NT).</li>
<li> Execute o programa UserPort.exe.</li>
<li> Mude os endereços para 0&#215;378-0x37A, clicando em &#8220;ADD&#8221;.</li>
<li> Remova os outros endereços com o botão &#8220;Remove&#8221;.</li>
<li> Clique em &#8220;Start&#8221;.</li>
</ol>
<p>Com estes passos, o seu sistema operacional estará &#8220;desbloqueado&#8221; para acesso direto a porta paralela. O procedimento só é necessário uma única vez. Caso deseje voltar a condição anterior, basta iniciar novamente o programa e clicar em &#8220;STOP&#8221;.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/dicas-e-hacks/acesso-a-porta-paralela-nos-windows-xp-nt-2000/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Considere Utilizar um Sinal PWM</title>
		<link>http://www3.eletronica.org/dicas-e-hacks/considere-utilizar-um-sinal-pwm</link>
		<comments>http://www3.eletronica.org/dicas-e-hacks/considere-utilizar-um-sinal-pwm#comments</comments>
		<pubDate>Sat, 29 Oct 2011 16:19:27 +0000</pubDate>
		<dc:creator>Administrador Eletronica.org</dc:creator>
				<category><![CDATA[Dicas e Hacks]]></category>
		<category><![CDATA[pwm]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=174</guid>
		<description><![CDATA[Considere um Sinal PWM Quando você está utilizando um microcontrolador e deseja controlar um driver de motor ou a intensidade de um LED, esta pode ser uma opção. Apesar de poder utilizar um conversor digital/analógico (DAC) para gerar a tensão de saída analógica, existe uma maneira mais fácil de fazer isso. Você pode usar uma ...]]></description>
			<content:encoded><![CDATA[<h1>Considere um Sinal PWM</h1>
<div>
<div>Quando você está utilizando um microcontrolador e deseja controlar um driver de motor ou a intensidade de um LED, esta pode ser uma opção.</div>
</div>
<div>Apesar de poder utilizar um conversor digital/analógico (DAC) para gerar a tensão de saída analógica, existe uma maneira mais fácil de fazer isso. Você pode usar uma saída digital e ter o mesmo resultado. Esta técnica é conhecida como PWM &#8211; Modulação por Largura de Pulso.</div>
<div>
<p><img src="http://www2.eletronica.org/hack-s-dicas/considere-um-sinal-pwm/pwm.png" alt="The image “http://www2.eletronica.org/hack-s-dicas/richdocument.2006-12-10.1847455731/pwm.png” cannot be displayed, because it contains errors." /><br />
Nesta imagem você pode ver uma onda quadrada com o &#8220;duty cycle&#8221; de 50%. A largura do pulso no nível 1 é igual a do nível 0. Isso significa que, se a amplitude do sinal é 5V, a saída será a tensão média em todo ciclo, que é 2.5V. É como ter uma tensão constante de 2.5V.</p>
<p>Se você tivesse um &#8220;duty cycle&#8221; de 10% teria uma tensão média de 0.5V.</p>
<p>Você precisa usar um filtro passa baixa para converter os pulsos em tensão analógica:</p>
<div><img src="http://www2.eletronica.org/hack-s-dicas/considere-um-sinal-pwm/rc.png" alt="The image “http://www2.eletronica.org/hack-s-dicas/richdocument.2006-12-10.1847455731/rc.png” cannot be displayed, because it contains errors." /></div>
<p>Também é possível gerar sinais de áudio, alterando a freqüência do duty cycle. Motores DC podem ser controlados eficientemente por PWM.<br />
<sub>Versão em português por Eletronica.org.<br />
Adaptado com autorização do original em <a href="http://www.scienceprog.com/" target="_self">Science Prog.</a></sub></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/dicas-e-hacks/considere-utilizar-um-sinal-pwm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Alternativas de Baixo Custo ao MAX232</title>
		<link>http://www3.eletronica.org/dicas-e-hacks/alternativas-de-baixo-custo-ao-max232</link>
		<comments>http://www3.eletronica.org/dicas-e-hacks/alternativas-de-baixo-custo-ao-max232#comments</comments>
		<pubDate>Sat, 29 Oct 2011 16:16:39 +0000</pubDate>
		<dc:creator>Administrador Eletronica.org</dc:creator>
				<category><![CDATA[Dicas e Hacks]]></category>
		<category><![CDATA[rs232]]></category>
		<category><![CDATA[serial]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=171</guid>
		<description><![CDATA[Algumas vezes os projetos eletrônicos possuem orçamento apertado e você não pode gastar com um conversor MAX 232. Aqui estão algumas alternativas. Normalmente nós usamos um circuito com MAX 232 como esse: O MAX 232 é um circuito integrado conversor de nível, que converte sinais TTL em RS232 e virse-versa. Ele fornece uma ótima rejeição ...]]></description>
			<content:encoded><![CDATA[<p>Algumas vezes os projetos eletrônicos possuem orçamento apertado e você não pode gastar com um conversor MAX 232. Aqui estão algumas alternativas.</p>
<div>
<p>Normalmente nós usamos um circuito com MAX 232 como esse:</p>
<p><img title="RS232_adapter.PNG" src="http://www.scienceprog.com/wp-content/uploads/2006i/RS232_ALT/RS232_adapter.PNG" alt="RS232_adapter.PNG" width="441" height="478" /><br />
O MAX 232 é um circuito integrado conversor de nível, que converte sinais TTL em RS232 e virse-versa. Ele fornece uma ótima rejeição de ruído e é mais robusto à descargas e curtos. Se o seu projeto for mais avançado, você deve utilizar um CI especializado para esta tarefa. No entanto, soluções especializadas são mais caras que as outras.<br />
Este é um exemplo de circuito com transistor para executar a tarefa de conversão:</p>
<p><img title="interface_schematic.gif" src="http://www.scienceprog.com/wp-content/uploads/2006i/RS232_ALT/interface_schematic.gif" alt="interface_schematic.gif" width="390" height="264" /></p>
<div>Os transistores podem ser todos de uso geral. Este circuito é muito simples e trabalhar sem problemas. É a solução mais barata, pois requer apenas um par de transistor e quatro resistores. Os dois transistores executam um truque para ter a tensão negativa necessária por alguns PCs. Quando o PC não transmite dados, seu pino TX está com uma tensão negativa. A tensão negativa presente é então trazida através do resistor R3 ao pino RD (recepção) do PC.</p>
<p>Alternativamente, RS232 pode ser conseguido utilizando portas lógicas. Isto é acessível quando sua aplicação já está utilizando elementos lógicos e há portas sobreando em algum CI. Como alguns PCs trabalhar bem apenas com tensões positivas, tudo que nós precisamos é inverter a lógica do sinal e para isso utilizamos as portas lógicas. Por exemplo, utilizando o CI CMOS CD4066B:</p>
</div>
<p><img title="interface_4066.gif" src="http://www.scienceprog.com/wp-content/uploads/2006i/RS232_ALT/interface_4066.gif" alt="interface_4066.gif" width="456" height="224" /></p>
<p>E, é claro, utilizando circuitos NAND e NOR:</p>
<p><img title="interface_4001.gif" src="http://www.scienceprog.com/wp-content/uploads/2006i/RS232_ALT/interface_4001.gif" alt="interface_4001.gif" width="450" height="226" /></p>
<p><img title="interface_4011.gif" src="http://www.scienceprog.com/wp-content/uploads/2006i/RS232_ALT/interface_4011.gif" alt="interface_4011.gif" width="456" height="225" /></p>
<p>&nbsp;</p>
<p>E não se esqueça de alimentar os CI&#8217;s com 5V.</p>
<p>&nbsp;</p>
<p><sub>Versão em português por Eletronica.org.<br />
Adaptado com autorização, do original em <a href="http://www.scienceprog.com/alternatives-of-max232-in-low-budget-projects/" target="_self">Science Prog.</a></sub></div>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/dicas-e-hacks/alternativas-de-baixo-custo-ao-max232/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Valores Comerciais de Resistores, Capacitores, Indutores e Fusíveis</title>
		<link>http://www3.eletronica.org/dicas-e-hacks/valores-comerciais-de-resistores-capacitores-indutores-e-fusiveis</link>
		<comments>http://www3.eletronica.org/dicas-e-hacks/valores-comerciais-de-resistores-capacitores-indutores-e-fusiveis#comments</comments>
		<pubDate>Tue, 25 Oct 2011 13:10:04 +0000</pubDate>
		<dc:creator>Administrador Eletronica.org</dc:creator>
				<category><![CDATA[Dicas e Hacks]]></category>
		<category><![CDATA[capacitor]]></category>
		<category><![CDATA[fusível]]></category>
		<category><![CDATA[indutor]]></category>
		<category><![CDATA[resistor]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=141</guid>
		<description><![CDATA[Breve tabela contendo os valores comerciais destes componentes. Resistores Comerciais 1.0ohm 1.1ohm 1.2ohm 1.3ohm 1.5ohm 1.6ohm 1.8ohm 2.0ohm 2.2ohm 2.4ohm 2.7ohm 3.0ohm 3.3ohm 3.6ohm 3.9ohm 4.3ohm 4.7ohm 5.1ohm 5.6ohm 6.2ohm 6.8ohm 7.5ohm 8.2ohm 9.1ohm Para obter os demais valores basta multiplicar por: 10, 102, 103, 104, 105, 106, Capacitores Comerciais 1.0F 1.1F 1.2F 1.3F 1.5F 1.6F 1.8F 2.0F 2.2F 2.4F 2.7F 3.0F ...]]></description>
			<content:encoded><![CDATA[<p>Breve tabela contendo os valores comerciais destes componentes.</p>
<div><span class="Apple-style-span" style="font-size: 20px; font-weight: bold;">Resistores Comerciais</span></div>
<div>
<table>
<tbody>
<tr>
<td>1.0ohm</td>
<td>1.1ohm</td>
<td>1.2ohm</td>
<td>1.3ohm</td>
</tr>
</tbody>
<tbody>
<tr>
<td>1.5ohm</td>
<td>1.6ohm</td>
<td>1.8ohm</td>
<td>2.0ohm</td>
</tr>
<tr>
<td>2.2ohm</td>
<td>2.4ohm</td>
<td>2.7ohm</td>
<td>3.0ohm</td>
</tr>
<tr>
<td>3.3ohm</td>
<td>3.6ohm</td>
<td>3.9ohm</td>
<td>4.3ohm</td>
</tr>
<tr>
<td>4.7ohm</td>
<td>5.1ohm</td>
<td>5.6ohm</td>
<td>6.2ohm</td>
</tr>
<tr>
<td>6.8ohm</td>
<td>7.5ohm</td>
<td>8.2ohm</td>
<td>9.1ohm</td>
</tr>
</tbody>
</table>
<p>Para obter os demais valores basta multiplicar por: 10, 10<sup>2</sup>, 10<sup>3</sup>, 10<sup>4</sup>, 10<sup>5</sup>, 10<sup>6</sup>,</p>
<p><span class="Apple-style-span" style="font-size: 20px; font-weight: bold;">Capacitores Comerciais</span></p>
<table>
<tbody>
<tr>
<td>1.0F</td>
<td>1.1F</td>
<td>1.2F</td>
<td>1.3F</td>
</tr>
</tbody>
<tbody>
<tr>
<td>1.5F</td>
<td>1.6F</td>
<td>1.8F</td>
<td>2.0F</td>
</tr>
<tr>
<td>2.2F</td>
<td>2.4F</td>
<td>2.7F</td>
<td>3.0F</td>
</tr>
<tr>
<td>3.3F</td>
<td>3.6F</td>
<td>3.9F</td>
<td>4.3F</td>
</tr>
<tr>
<td>4.7F</td>
<td>5.1F</td>
<td>5.6F</td>
<td>6.2F</td>
</tr>
<tr>
<td>6.8F</td>
<td>7.5F</td>
<td>8.2F</td>
<td>9.1F</td>
</tr>
</tbody>
</table>
<p>Para obter os demais valores multiplique pelos seus submultiplos: mili, micro, nano e pico.</p>
<h2>Indutores Comerciais</h2>
<table>
<tbody>
<tr>
<td>1.0H</td>
<td>1.1H</td>
<td>1.2H</td>
<td>1.3H</td>
</tr>
</tbody>
<tbody>
<tr>
<td>1.5H</td>
<td>1.6H</td>
<td>1.8H</td>
<td>2.0H</td>
</tr>
<tr>
<td>2.2H</td>
<td>2.4H</td>
<td>2.7H</td>
<td>3.0H</td>
</tr>
<tr>
<td>3.3H</td>
<td>3.6H</td>
<td>3.9H</td>
<td>4.3H</td>
</tr>
<tr>
<td>4.7H</td>
<td>5.1H</td>
<td>5.6H</td>
<td>6.2H</td>
</tr>
<tr>
<td>6.8H</td>
<td>7.5H</td>
<td>8.2H</td>
<td>9.1H</td>
</tr>
</tbody>
</table>
<p>Para obter os demais valores basta multiplicar por: 10<sup>-3</sup>, 10<sup>-6</sup>.</p>
<p><span class="Apple-style-span" style="font-size: 20px; font-weight: bold;">Fusíveis comerciais</span></p>
<table>
<tbody>
<tr>
<td>0,1A</td>
<td>0,315A</td>
<td>1,25A</td>
<td>3,15A</td>
<td>6A</td>
<td>20A</td>
</tr>
<tr>
<td>0,125A</td>
<td>0,35A</td>
<td>1,5A</td>
<td>3,5A</td>
<td>7A</td>
<td>25A</td>
</tr>
<tr>
<td>0,15A</td>
<td>0,4A</td>
<td>1,6A</td>
<td>3,15A</td>
<td>8A</td>
<td>30A</td>
</tr>
<tr>
<td>0,2A</td>
<td>0,5A</td>
<td>2A</td>
<td>3,5A</td>
<td>9A</td>
<td>40A</td>
</tr>
<tr>
<td>0,25A</td>
<td>0,8A</td>
<td>2,5A</td>
<td>4<sup>A</sup></td>
<td>10A</td>
<td>50A</td>
</tr>
<tr>
<td>0,3A</td>
<td>1A</td>
<td>3A</td>
<td>5<sup>A</sup></td>
<td>15A</td>
<td></td>
</tr>
</tbody>
</table>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/dicas-e-hacks/valores-comerciais-de-resistores-capacitores-indutores-e-fusiveis/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Uma breve visão dos algoritmos para compressão de dados</title>
		<link>http://www3.eletronica.org/artigos/compressao-de-dados</link>
		<comments>http://www3.eletronica.org/artigos/compressao-de-dados#comments</comments>
		<pubDate>Tue, 25 Oct 2011 00:15:55 +0000</pubDate>
		<dc:creator>Administrador Eletronica.org</dc:creator>
				<category><![CDATA[Artigos]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=133</guid>
		<description><![CDATA[Compressão de Dados A Largura da banda de transmissão é sempre limitada (se você estiver lendo isto via um link de 28.8KB, você conhece a situação!). A compressão de dados pode ajudar muito. O senador Joe Biden ficou “enrolado” por supostamente plagiar material durante a faculdade. As academias militares regularmente vivem escândalos de fraude. Eu ...]]></description>
			<content:encoded><![CDATA[<h1><span class="Apple-style-span" style="font-size: 20px;">Compressão de Dados</span></h1>
<div>
<p>A Largura da banda de transmissão é sempre limitada (se você estiver lendo isto via um link de 28.8KB, você conhece a situação!). A compressão de dados pode ajudar muito.</p>
<p>O senador Joe Biden ficou “enrolado” por supostamente plagiar material durante a faculdade. As academias militares regularmente vivem escândalos de fraude. Eu estou tentando ensinar ao meu filho de seis anos a fazer um trabalho criativo na escola, sem se apoiar em cima do ombro de ninguém.</p>
<p>No entanto, o meu lema de engenharia é roubar constantemente. Eu repetidamente olho por cima as páginas e furtivamente imito das últimas edições da ESP, EDN, ou qualquer das outras centenas de fontes. Tudo vai para a minha coleção de algoritmos. (Os artigos de Jack Crenshaw&#8217;s nesta revista são ótimos – so na semana passada eu puxei um pouco em <a href="http://www.google.com/url?q=http%3A%2F%2Fwww.ganssle.com%2Farticles%2Facrc.htm&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNEgg0RktKKphc6CYuT3NLB9OXlQOw">CRCs</a> para ajudar um amigo). Eu compro livros, e agora CD ROMs, sobre temas obscuros, jogando-os em uma prateleira para o caso de algum dia eu precisar fazer referência a eles. Uma ou duas vezes por ano eu navego nas bibliotecas da Universidade de Maryland Computer Science and Math, procurando técnicas elegantes, idéias e métodos.</p>
<p>Como resultado minha coleção de algoritmos cresce um pouco a cada mês; talvez ao acaso, talvez com um pouco de direção, mas sempre se expande. Algum dia eu vou ter que fazer um trabalho decente de categorizar o material mas, entretanto, é a fonte de muitos dos algoritmos que eu uso no meu trabalho. Por que re-inventar uma FFT ou a rotina do ponto flutuante quando os outros têm desenvolvido métodos comprovados e confiáveis? Roube descaradamente!</p>
<p>Recentemente, enquanto procurava uma rotina de compressão, fiquei chocado ao descobrir que quase nenhuma das dezenas de artigos na coleção contém quaisquer fluxogramas, pseudocódigo, ou trechos de código. Tudo cai rapidamente em uma discussão de entropia, as teorias da informação de Shannon e assim por diante. O mais próximo que a maioria vem a oferecer algo útil é uma discussão profunda da criação de árvores binárias que descrevem esquemas de codificação. Não sei você, mas eu não tenho tempo nem paciência para descobrir algumas teorias acadêmicas. Preciso de código agora!</p>
<p>Uma vez que muitos sistemas embarcados transmitem e armazenam dados, compressão é uma questão importante que muitos designers ignoram, talvez por causa da escassez de informações úteis. Aqui vou apresentar algumas técnicas rápidas  que podem não fornecer os melhores resultados possíveis, mas que pode ser utilizado imediatamente. No próximo mês eu acrescento mais discussões e detalhes do código.</p>
<h2><strong>Opções</strong></h2>
<p>Até recentemente, a ciência da computação tinha interesse apenas em compressão sem perdas. Este esquema transmite os dados perfeitamente, não há degradação devido ao processo de compressão / descompressão.</p>
<p>Alguns tipos de dados podem tolerar um pouco de corrupção também. Vídeo, em particular, simplesmente não exige o mesmo tipo de perfeição bit a bit que um programa de computador precisa. A compressão com perdas reduz o uso da largura de banda de dados em parte, permitindo que informações redundantes ou não-essenciais possam ser perdidas.</p>
<p>Na categoria com perdas a mais fascinante aproximação (para mim) é reduzir a imagem a uma série de fractals &#8211; números ponto flutuantes que representa a complexidade de uma forma, explorando regularidades escondidas na imagem. Muitas vezes exige centenas de compressões para um resultado. Embora tenha havido algumas tentativas de comercializar isso, o processo de extração da estrutura fractal de uma imagem é tão complexa que levavam a um número de compressões muito elevado.</p>
<p>A compressão com perdas é ainda hoje utilizada pela Bell Atlantic para transmitir vídeos completos através de linhas convencionais de telefone feitas de cobre, na Virgínia. Eu não fui capaz de descobrir como eles estão fazendo isso, mas o pensamento de um link de banda larga nas casas, sem trocar toda a fiação dos EUA por fibra óptica, é muito legal.</p>
<p>A compressão com perdas é em si, um campo inteiro que agora está a ser estudada intensamente. No entanto, o meu interesse está mais em técnicas que permitem poucas perdas e permitam transmitir um fluxo de texto ou código do programa intacto.</p>
<p>Todos os esquemas de compressão de dados exploram algum padrão ou característica dos dados, por isso nenhum método é ideal para todas as situações. Por exemplo, máquinas de fax transmitem mais imagens brancas, o fluxo de bits é então, comprimido, enviando apenas as diferenças entre as linhas verificadas.</p>
<p>Muitas das fontes de dados são muito repetitivas por natureza. A maioria das fotos, por exemplo, contêm longas strings de dados idênticos. Muitas vezes, o texto transmitido de um computador tem grandes quantidades de espaço em branco (seqüências de 0&#215;20 caracteres). Run Length Encoding (RLE) comprime os dados simplesmente notando a presença de seqüências de caracteres idênticos e substitui cada seqüência com o caractere repetido e um número que indica o número necessário de repetições.</p>
<p>Por exemplo, a seqüência “sssttttooo0o&#8221; poderia ser compactada para algo como &#8220;3s4t5o”, onde os números indicam o número de repetições para cada caractere.</p>
<p>RLE pode realmente reduzir a necessidade de transporte de informações de um canal quando os dados quando ele está muito ocupado. Uma imagem estática pode ter algumas repetições de seqüências. Uma solução, em um sistema baseado em byte, é reservar 7 bits de cada byte como um bit flag indicando &#8220;envie este caractere também sem uma contagem de repetição&#8221;. Qualquer caractere com o bit 7 = 0 será uma contagem de repetição, sempre seguido por um caractere único a ser repetido. È claro, isto significa que o número de repetições não pode exceder 127.</p>
<p>As regras para a codificação deste tipo de código RLE são:</p>
<p>1. Se o caractere (i) não é o mesmo caractere (i +1), bit 7 = 1 e transmi-ta.</p>
<p>2. Caso contrário conte o número de caracteres idênticos (num limite de 127).</p>
<p>3. Jogue o contador da repetição seguido pelo caractere na transmissão.</p>
<p>Pseudocódigo para o processo de codificação é:</p>
<pre>i = 0;
ENQUANTO (i &lt;número total de caracteres para transmitir)
{SE (dados (i)!= dados (i +1) FAÇA   ; se este ponto não é como o próximo ponto
            (Transmissão (dados (i) +  128)     ;seta bit 7 e transmite
            i = 1 i; incrementa o ponteiro
     }TERMINA FAÇA
  SENÂO
   {contador = i +1; contador- i é a repetição da contagem
      ENQUANTO ((dados (i) = dados(count) E (contador - i &lt; 127)) DO
         {count = count + 1; incremento contador
          }TERMINA FAÇA
     count = count - i contagem de repetição;
     transmitir (contador); envia contador de repetição com bit7 = 0
     transmitir (dados (i)); enviar caractere
     i = contador + 1; aponta para o próximo caractere
   } TERMINA SE
}TERMINA ENQUANTO</pre>
<p>A Decodificação é ainda mais fácil:</p>
<pre>ENQUANTO (caracteres continuam chegando)
     {SE ((dados {BITWISE} E 2 ** 7) = 2 ** 7) FAÇA
         {Salve (dados - 128) ; salva o caractere sem o bit 7
      }TERMINA FAÇA
  SENÃO
    {Contador = dados ; contagem de repetição
      salve (contador) cópias de (dados a seguir)
}TERMINA SE
}TERMINA ENQUANTO</pre>
<p>A codificação RLE é fácil de implementar e, em muitos casos, muito eficiente. Consulte &#8220;Run-Length Encoding Slashes Image-File Storage Requirements&#8221;, por Richard Quinn, Personal Engineering &amp; Instrumentation New, setembro de 1990 para código C e mais discussões sobre o assunto.</p>
<p>EDN publicou um artigo mais abrangente, em 21 de junho de 1990 com o tema: &#8221; Compression Algorithms Reduce Digitized Images to Manageable Size&#8221;, de William Warner. Altamente recomendado para lidar com uma imagem mais complexa e tipos de transmissão.</p>
<h2><strong>Codificação Huffman</strong></h2>
<p>Como eu mencionei, todas as compressões de dados exploram alguma característica conhecida do fluxo de dados. No texto em Inglês, por exemplo, a letra &#8220;e&#8221; ocorre mais frequentemente do &#8220;z&#8221;, mas o ASCII atribui exatamente o mesmo número de bits (7) para os dois caracteres.</p>
<p>Em 1952, D. A. Huffman propôs usar códigos de comprimento variável para expressar caracteres. O código resultante é utilizado na maioria dos sistemas de compressão de texto, incluindo o compilador da Ajuda do Windows. Novamente, uma vez que &#8220;e&#8221; é tão comum, um código ideal de Huffman poderia atribuir-lhe apenas um par de bits, dando a letra &#8220;z&#8221; mais rara, muitos mais.</p>
<p>Códigos de Huffman alocam o menor código para os caracteres mais freqüentes e outro mais longo para os que não são tão freqüentes. A má notícia: os dados transmitidos de modo codificado não serão alinhados nos limites do byte, já que a maioria dos caracteres terá menos bits que o padrão de 8 bits. Para evitar ambigüidade, cada código deve ter uma propriedade &#8220;prefixo”. Ou seja, nenhum código pode conter a primeira parte de um outro. Assim, se a letra &#8220;e&#8221; for codificada como &#8220;01” então nenhum outro código pode começar com essa seqüência. Isso permite que o decodificador alinhe corretamente um caractere, mas também aumenta um pouco o comprimento mínimo de código.</p>
<p>A Tabela 1 apresenta um conjunto de códigos Huffman para o alfabeto. Note que os caracteres que mais comuns têm menos bits do que os menos comuns.</p>
<p>Tabela 1: Um conjunto de códigos Huffman</p>
<p>e             100 t              001 a              1111 o              1110 n              1100 r              1011 i              1010 s              0110 h              0101 d              11011 l              01111 f              01001 c              01000 m             00011 u              00010 g              00001 y              00000 p              110101 w             011101 b              011100 v              1101001 k              110100011 x              110100001 j              110100000 q              1101000101 z              1101000100 O processo de compressão usa uma chamada de pesquisa no &#8220;dicionário&#8221;; nada mais do que obter o código do caractere e o tamanho de uma tabela, e depois enviá-los na corrente de transmissão. Um pseudocódigo pode ser semelhante ao seguinte, assumindo que os códigos existem em uma estrutura &lt;huffman&gt;, que tem elementos &lt;code&gt; (código justificado na tabela 1), e &lt;size&gt;, que é o número de bits no código.</p>
<pre>While (existem mais caracteres){</pre>
<pre>   code = huffman[caractere]. code  ; obtém o código Huffman
   size = huffman[caractere]. size     ; obtém o tamanho do código</pre>
<pre>   i = 0
   While (i &lt;size){
       Sendbit (code)                           ; enviar MSB do código
         shift code left 1 bit                   ; seleciona o bit seguinte
         i += 1                                         ; incremento da variável de controle
       }Endwhile
}Endwhile</pre>
<p>Decodificar a transmissão comprimida é um pouco mais complexo, simplesmente porque o tamanho do caractere não é conhecido até ocorrer uma correspondência. Muitos quebram o código Huffman em uma árvore binária, representado em uma tabela com links (fazendo uma referencia direta) para acelerar a busca. Embora o código não seja terrivelmente complexo, a construção de uma tabela para uma pesquisa eficiente requer um pouco de explicação, que eu vou dar na parte do próximo mês.</p>
<p>Para obter informações sobre código de Huffman, &#8220;An Introduction to Data Compression&#8221; de Harold Corbin (April, 1981 Byte), ou &#8220;Data Compression&#8221;, de Gilbert Held, John Wiley &amp; Sons, New York, 1983.</p>
<p>Existem muitos códigos Huffman. Só porque a maioria da língua  inglesa contém uma distribuição particular de letras não significa que todos os dados transmitidos inglês será a mesma. Grandes quantidades de código C, por exemplo, irá mostrar uma preponderância elevada de chaves. Embora muitos usuários Huffman ignorem isso e codifiquem os seus dados com a probabilidade de distribuição padrão da língua inglesa, às vezes é possível melhorar consideravelmente a eficiência da compressão computando novos códigos para os caracteres com base no bloco de texto a ser transmitido. Isso é chamado Adaptive Compression (Compressão Adaptativa). Exige mais tempo para calcular o valor dos códigos, e sobrecarrega um pouco mais, já que a tabela de códigos deve ser transmitida juntamente com os dados compactados, mas pode resultar em um desempenho consideravelmente melhor.</p>
<p>Finalmente, é fascinante ver uma criança aprender a ler. Um jovem começa por reconhecer claramente cada letra, laboriosamente monta cada uma em uma palavra. O mesmo tipo de efeito de alta entropia ocorre na codificação Huffman quando nós atribuímos códigos curtos aos caracteres, mas ignoram o fato de que o inglês está repleto de palavras/frases usadas com freqüência. Num texto em Inglês &#8220;the”, &#8220;to&#8221;, e uma série de outras palavras, são tão comuns que faz sentido alargar a compressão para além das fronteiras de caractere tradicional e atribuir um código curto para todas as palavras comuns. O decodificador irá reconhecer a palavra como uma entidade única, com relativamente poucos bits, assim como um leitor habilidoso reconhece palavras, ignorando os detalhes das letras. De fato, poucos programadores se preocupam se o tempo de computação maior podem não justificar os resultados.</p>
<h1><strong>Compressão de dados &#8211; Parte 2</strong></h1>
<p>No mês passado, eu introduzi vários esquemas que comprimem o texto e dados binários transmitidos através de canais de comunicação. Todos os métodos que eu expliquei foram para compressão sem perdas, que preservam todas as nuances dos dados brutos. A compressão com perdas é um campo totalmente diferente, onde é difícil dizer muito sobre se ao menos alguém está disposto a definir exatamente o quanto a falta de fidelidade é tolerável.</p>
<p>Códigos Huffman são um método fácil e comumente utilizado para converter uma seqüência de dados para símbolos, cada um, cujo tamanho é inversamente proporcional à freqüência do caráter codificado. Por exemplo, para transmitir texto inglês codificado em padrão Huffman, o símbolo correspondente à letra &#8220;e&#8221; utiliza pouquíssimos bits, já que &#8220;e&#8221; é o caractere mais comum no alfabeto. A letra &#8220;z&#8221; certamente irá levar muitos mais bits para enviar, mas não terá impacto sobre as comunicações de banda já que não ocorre tão frequentemente.</p>
<p>Embora eu tenha apresentado um quadro de distribuição de freqüência para o texto no inglês padrão no mês passado, a maioria dos esquemas de compressão dinâmica computa a freqüência de caracteres de cada conjunto de dados.  Você pode ver certamente que um código C transmitido, por exemplo, terá um número extraordinariamente elevado de chaves em comparação com o épico Beowulf. Mesmo pequenos segmentos de texto padrão em inglês podem ter distribuição distorcida devido ao assunto da matéria ou as habilidades do escritor.</p>
<p>É mais fácil visualizar como o algoritmo Huffman converte cada caractere em um conjunto de bits, usando uma árvore binária. Na verdade, a maioria das técnicas de compressão usar árvores para simplificar o código e ajuda na construção de algoritmos recursivos.</p>
<p>A figura é parte de uma árvore binária típica usada para construir o dicionário de compressão (a lista de códigos para cada caractere). Cada caractere é representado pelos ramos de um descende para atingir o caractere na parte inferior. Nesta árvore simplificada a letra &#8220;e&#8221; utiliza apenas um único bit, um zero, para a sua codificação. &#8220;t&#8221; é 10, &#8220;m&#8221; é 11.</p>
<p>root node</p>
<p>|</p>
<p>|</p>
<p>__0__________1______________</p>
<p>|                                                               |</p>
<p>|                                          ____0_______1______________</p>
<p>E                                        |                                                            |</p>
<p>|                                                            |</p>
<p>T                                                          M</p>
<p>A compressão Huffman consiste nas seguintes etapas:</p>
<p>1) Verificar os dados de entrada e desenvolver uma matriz da freqüência de ocorrência de cada caractere. Se você estiver comprimindo ASCII ou outros dados de tamanho byte, o código é algo como:</p>
<pre> Repita até toda a informação ser processada {
 LCont [caractere_entrada] + +}</pre>
<p>A matriz LCount terá 256 elementos, um por possível entrada no conjunto de caracteres definido. Certifique-se de usar uma estrutura que vai tolerar o número máximo possível de contagem do caractere no fluxo de dados. Eu gosto do tipo Long, pois é muito difícil de acontecer overflow em qualquer fluxo de dados real.</p>
<p>É uma boa idéia então reduzir a matriz de longs para um array de bytes. Provavelmente você estará lidando com um volume alto de dados de entrada; é insensato fazer um número alto de comparações com longs quando a versão com byte é suficiente. Já que existem apenas 256 caracteres possíveis, você pode simplesmente converter a matriz de contagens para uma matriz de freqüência relativa, 0 significa que o caractere nunca foi visto e 255 significa que é o mais freqüente.</p>
<p>2) Construir a árvore do dicionário. Eu poderia usar a terminologia de árvore aqui e provavelmente confundir pelo menos metade de vocês, gentis leitores, então vou tentar aproximar de uma abordagem mais ilustrativa para que você possa realmente ver como a árvore é construída. As etapas são as seguintes, e resultarão na árvore mostrada na figura 2.</p>
<p>2.1) Organizar o conjunto de caracteres em uma matriz ordenada por uma freqüência decrescente. Incluir a freqüência (isto é, a contagem do número de vezes que cada caractere ocorreu).</p>
<p>2.2) Iniciando pelo fim, conecte os dois caracteres com menor freqüência. Some os contadores de cada um e coloque-os nas linhas de intersecção.</p>
<p>2.3) Continue a combinar grupos de dois até que todos se fundam num só.</p>
<p>2.4) Atribua um ‘0’ ao lado de cada nó e ‘1’ para o outro (ou seja, ‘0’ para ramos à esquerda e ‘1’ para ramos à direita).</p>
<p>A árvore é tudo que precisamos para comprimir a entrada de dados, mas é complicado de usar. Pior que isso, nós construímos uma árvore de cabeça para baixo, com a “entrada de dados” (os caracteres) na folha, ou pior, nós presumimos que vamos comprimir uma matriz que é muito maior do que esta árvore pequena, então faz sentido a adicionar mais um passo para construir uma estrutura mais simples de dados. Nós realmente queremos uma matriz de códigos Huffman (com o número associado de bits por código), com uma entrada por caractere. Em outras palavras, podemos percorrer a árvore uma vez por caractere possível e registrar os códigos resultantes em uma matriz HuffCode. HuffCode tem 256 índices e é uma estrutura que inclui dois elementos por entrada: o código em si e um inteiro indicando o número de bits usados em cada código.</p>
<p>3) Envie a árvore para o receptor para que ela possa ser usada na  descompressão dos dados. Embora você pode simplesmente transmitir a estrutura total da árvore, algumas pessoas a reduzem a mínimos elementos para economizar largura da banda de transmissão. Grande parte da árvore pode estar vazia, dependendo do fluxo de entrada, que no caso é bobagem adicionar os nós extras com valor nulo quando o ponto do exercício é a redução de dados!</p>
<p>4) Compactar cada byte de dados. Agora que o dicionário da matriz foi construído (HuffCode), transmitir dados bit a bit:</p>
<pre>ENQUANTO (existem mais caracteres){
   code = HuffCode[caractere].code; obtém o código Huffman
   size = HuffCode[caractere].size; obtém o tamanho do código
   i  = size
   WHILE (i){
            Sendbit (code); envia MSB do código
         I &lt;&lt; 1; seleciona o bit seguinte
         i -- ; decremento variável de controle
       }Endwhile
}Endwhile</pre>
<h2><strong>Expansão Huffman</strong></h2>
<p>O receptor deve ter uma cópia da árvore de compressão para que ele possa decodificar o fluxo de bits corretamente. Eu sugeri acima que você transmita mais ou menos a árvore toda. Algumas pessoas ao invés, enviam a matriz linear do dicionário (HuffCode), mas o código necessário para descompactar um byte usando apenas HuffCode é volumoso e lento.</p>
<p>Expansão usando a árvore é uma abordagem mais natural, especialmente porque você não tem idéia de onde estão os limites do caractere. Um fluxo rápido de bits, talvez milhares deles, irá derrubar a linha de transmissão sem marcação clara entre os caracteres. A árvore capta tanto os códigos caracteres e o número de bits necessários para representar cada um.</p>
<p>Isso faz a descompressão apenas uma questão de percorrer a árvore. Para cada bit na entrada desça na árvore, ramificação à esquerda se o bit de entrada é um zero, ramificação à direita se a entrada é um. Você saberá que a expansão estará concluída quando você acaba em um nó ‘folha’ da árvore. O código para descomprimir um único caractere é parecido com este:</p>
<pre>TreeNode = RootNode
Repita até que esteja em uma folha
{
     TreeNode = Tree.right; assume ramificação filha direita
     if (inputbit == 0) TreeNode = Tree.left; Se 0, ir para a ramificação filha esquerda
}
Saída (TreeNode);</pre>
<p>É uma boa idéia adicionar o código para imprimir as estruturas de dados intermédiarias (por exemplo, a árvore) para fins de depuração.</p>
<h2><strong>Lempel/Ziv</strong></h2>
<p>Por que compactar caracteres simples, quando muitas vezes o texto ou dados binários conterão longas sequências de frases idênticas? Em inglês, a palavra &#8220;and&#8221; surge constantemente e ainda utiliza quatro caracteres ASCII (incluindo o espaço à esquerda): 32 bits para uma palavra raramente não utilizada em um parágrafo.</p>
<p>A maioria dos utilitários de compressão conhecidos, como PKZIP e LHARC, tentam encontrar as frases comuns em vez de caracteres simples. Todos estes algoritmos têm suas raízes para o trabalho feito por Lempel e Ziv, em 1977 e posteriores.</p>
<p>Na abordagem LZ77, Lempel e Ziv tentaram primeiro um novo método de compressão de dados, que tenta comprimir um arquivo através da construção de um dicionário de frases inteiras usado antes nos dados a serem compactados. Ela mantém uma janela deslizante, uma longa cadeia (vários milhares de bytes) de dados que foram recentemente processados, bem como um pequeno buffer que &#8220;olha em frente&#8221;. Toda vez que este encontra uma expressão no buffer que corresponde a uma parte do texto na janela deslizante, ele cria um ponteiro para a frase correspondente na janela deslizante, bem como um número que indica quantos caracteres corresponderam, e qual foi o primeiro caractere não correspondente. A filosofia Lempel / Ziv é assumir que a sequência de dados atual muitas vezes parece muito com o que foi recentemente processado.</p>
<p>A janela deslizante torna-se um dicionário cujo conteúdo está sempre mudando, enquanto ela desliza sobre o fluxo de dados de entrada. A saída comprimida é uma série de números dizendo ao decodificador onde olhar na janela deslizante para a frase comprimida. Pelo fato de que a janela desliza, não é estática, ela precisa de um tempo de procura razoável.</p>
<p>O algoritmo LZ77 e suas versões mais recentes podem algumas vezes produzir tremendas taxas de compressão para instrumentação de transmissão embarcada, sempre transmitindo mais ou menos os mesmos tipos de dados. Dando primeiramente, alguns conhecimentos da saída do instrumento, pode ser possível construir uma janela LZ deslizante e um buffer “olhar em frente” que explora bem a natureza da repetição dos dados.</p>
<p>Seja cauteloso! Diversas variantes dos algoritmos LZ foram patenteados e uso comercial destas pode exigir o pagamento de royalties não triviais. Parece terrível ter que dizer: &#8220;consultar seu advogado antes de escrever&#8221; código, mas talvez não haja outra opção. Por esta razão eu fico com as técnicas padrão Huffman, embora não tão eficientes quanto os algoritmos LZ.</p>
<h2><strong>Recursos</strong></h2>
<p>Você pode jogar com todas essas técnicas em um PC para fins não comerciais, utilizando o código em &#8220;The Data Compression Book&#8221;, de Mark Nelson (M&amp;T Books, San Mateo, CA, 1992 800-533-4372 (in CA 800-356-2002)). Ele vem com um par de discos que contêm código-fonte C para Huffman, LZ77, e muitos outros esquemas de compressão / expansão. Recomendo muito.</p>
<p>Além disso, refira-se a May, 1986 Byte para obter mais informações sobre como lidar com as árvores Huffman. Consulte &#8220;Data Compression with Huffman Coding&#8221;, de Jonathan Amsterdam, pgs 99-108.</p>
<p><strong>Por Jack Ganssle</strong>, adaptado para o português por Eletronica.org, com autorização do autor.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/artigos/compressao-de-dados/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Reentrância</title>
		<link>http://www3.eletronica.org/artigos/70</link>
		<comments>http://www3.eletronica.org/artigos/70#comments</comments>
		<pubDate>Mon, 24 Oct 2011 16:46:05 +0000</pubDate>
		<dc:creator>Administrador Eletronica.org</dc:creator>
				<category><![CDATA[Artigos]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=70</guid>
		<description><![CDATA[A maioria dos sistemas em tempo real necessitam de alguma porção de código reentrante, porém muitos programadores não fazem idéia do que isso envolve. Por muitas razões, debugar um sistema baseado em interrupções é muito mais difícil que fazê-lo em um loop simples de código. Uma das mais chatas fontes de bugs, difíceis de encontrar ...]]></description>
			<content:encoded><![CDATA[<p>A maioria dos sistemas em tempo real necessitam de alguma porção de código reentrante, porém muitos programadores não fazem idéia do que isso envolve.</p>
<div>Por muitas razões, debugar um sistema baseado em interrupções é muito mais difícil que fazê-lo em um loop simples de código. Uma das mais chatas fontes de bugs, difíceis de encontrar e, algumas vezes, de entender, é o problema da reentrância.</div>
<div>
<p>Funções reentrantes, também conhecidas como &#8220;código puro&#8221;, são falsamente conhecidas como qualquer código que não modifica a si mesmo. Muitos programadores se sentem tranquilos simplesmente evitando código que se modifique, então as suas rotinas seriam garantidamente reentrantes e, então, passiveis de interrupção sem problemas (interrupt-safe). Nada poderia ir tão além da verdade quanto isso.</p>
<p>Uma função é reentrante se, enquanto estiver sendo executada, puder se re-invocada por si mesmo ou por outras rotinas, interrompendo a execução atual por um instante. A reentrância foi originalmente inventada para os mainframes, nos dias em que memória era um luxo. Os operadores dos sistemas noticiaram que dezenas ou centenas de cópias idênticas de alguns grandes programas estavam ao mesmo tempo no array de memória do computador. Na Universidade de Marylard, meu velho terreno de hacking, o monstro Univac1108 possuia um dos primeiros compiladores FORTRAN reentrantes. Ele gastava (naquela época) 32k da memória do sistema mas, com o código reentrante, ele precisava apenas destes 32k se 50 usuários estivessem rodando-o. Cada usuário executava o mesmo código, a partir do mesmo conjunto de endereços.</p>
<p>A rotina precisa satisfazer as seguintes condições para ser reentrante:</p>
<ol>
<li> Jamais modificar a si mesma. Isto é, as instruções do programa jamais devem mudar. Sempre. Em nenhuma circunstância. Vários sistemas embarcados violam este regra crucial.</li>
<li>Qualquer variável alterada pela rotina precisa ser alocada para a &#8220;instância&#8221; particular da função invocada. Isto é, se a função FOO é chamada por três funções diferentes, então os dados em FOO precisam ser armazenadas em três diferentes áreas da RAM.</li>
</ol>
<p>O item (2) merece um pouco mais de discussão. Uma das melhores tendências na indústria é utilizar profissionais engenheiros de software no desenvolvimento de projetos de firmware. Nos velhos dias do design de hardware, quem escrevia o código era provavelmente o pessoal com pouca formação formal no assunto (com algumas excessões), que o faziam apenas depois de construir todo o hardware.</p>
<p>Os software de verdade utilizam estruturas mais sofisticadas de programas que levam à um código mais limpo (normalmente), como a recursão, mas elas trazem novos perigos.</p>
<p>Uma função recursiva chama a si mesma. O exemplo clássico é o cálculo de n! (n fatorial), onde a forma mais elegante é escrita com algumas linhas de código recursivo.</p>
<p>Qualquer função recursiva precisa ser reentrante, porque cada instância da execução precisa do seu próprio conjunto de variáveis para evitar corromper qualquer outra instância.</p>
<p>Por exemplo, considere esta simples função recursiva retirada de um exemplo do Borland C++ Programmers Guide:</p>
<pre>double power(double x, int exp)
{
if (exp&lt;=0) return(1);
return(x*power(x, exp-1));
}</pre>
<pre></pre>
<p>Esta função vai funcionar corretamente em um ambiente recursivo, assim como em um sistemas em tempo-real, com interrupções, onde &#8220;power&#8221; pode ser chamada a partir de uma rotina sequencial ou a partir de um serviço de interrupção. A função é certamente &#8220;pura&#8221; &#8211; todas as variáveis utilizadas são criadas para cada instância da execução.</p>
<div>Suponhamos que nós a modifiquemos da seguinte forma:</div>
<pre>double power(double x)
{
if (exp&lt;=0)return(1);
--exp;
return(x*power(x));
}</pre>
<p>onde exp é agora definida como uma variável pública, acessível de muitas outras funções. A função vai funcionar corretamente. No entanto, se esta função for chamada por, digamos, main(), e a interrupção for iniciada chamando a mesma função enquanto ela ainda estava executando, nós teremos um resultado incorreto. A variável exp é fixa na memória; ela não é única em cada chamada e quando chamadas compartilhadas ocorrem nós temos um desastre no ambiente.</p>
<p>Então um código &#8220;puro&#8221; jamais deve modificar a si mesmo e jamais deve compartilhar dados com outras instâncias de si mesmo, quando chamado por recursão, em um serviço de interrupção, ou qualquer outro processo.</p>
<p>No exemplo anterior nós mencionamos o compilador FORTRAN. Enquanto o próprio compilador era carregado apenas uma vez na memória principal, cada usuário alocava um pedaço desta ou daquela área de memória interna do compilador para seu próprio uso. Cada variável ou array de dados que o compilador usava era referenciado através de um conjunto base de registradores que ficavam no espaço de dados iniciado pelo usuário.</p>
<p>C é elegantemente orientado através de reentrância, onde variáveis locais automáticas são geralmente armazenadas em uma pilha cada vez que a função é invocada. Desta forma, como nós vimos, ainda é possível escrever código problemático em C. Em Assembly, é claro, o caos reina.</p>
<p>&nbsp;</p>
<h3>Reentrância em Sistemas Embarcados</h3>
<p>Qualquer sistema embarcado precisa de reentrância e mesmo os mais simples sistemas irão, normalmente, necessitar de código reentrante.  Antes de ver aonde a reentrância é crítica, nós devemos dar uma olhada em áreas típicas onde o código é &#8220;impuro&#8221;.</p>
<p>Alguns processadores possuem limitadas capacidades de endereçamento de I/O. Por exemplo, o 8085 só pode enviar dados para um específico endereço hard coded (definido no hardware) (algo como &#8220;envia o conteúdo da saída da porta para o registrador C&#8221;). A tradicional escapatória (work arround) seria gerar a saída e retornar o resultado na RAM, dinamicamente a partir da porta desejada, e então chamar o código baseado-se na RAM. Isso viola qualquer regra da reentrância. Uma abordagem melhor é gerar uma tabela das instruções de saída no espaço da ROM e chamá-las indiretamente cada uma. Isso, no entanto, consome uma grande quantidade de memória.</p>
<p>O 1802 não possui pilha&#8230; nenhuma. Não existem instruções de chamadas ou retorno (sem brincadeira!). Reentrância era completamente impossível.</p>
<p>Cada sistema operacional de tempo real moderno, normalmente, possui pequenos segmentos de máquina específicos para o código que não é reentrante. Uma vez que isso não é mais perigoso que ter código &#8220;impuro&#8221;, todos os fornecedores fazem um bom trabalho ao proteger seções &#8220;impuras&#8221; desabilitando interrupções por um curto tempo.</p>
<p>Reentrância é crucial em qualquer seção de código que precisa ser invocado por qualquer outro processo. Em um SO tempo real, cada tarefa é independente e preparada para os interesses da reentrância. Qualquer subrotinas compartilhadas entre tarefas podem ser fontes reais para estes interesses, uma vez que o RTOS pode trocar de contexto em um tick do timer durante a execução desta rotina crítica e então agendar outra tarefa que invoca a mesma função.</p>
<p>Existem muito mais problemas aqui. Suponha que sua rotina principal e as ISR (interrupt service routine) estão todas escritas em C. O compilador irá certamente invocar funções em tempo de execução para suportar matemática de ponto flutuante, I/O, manipulação de string, etc. Se o pacote com estas funções é apenas parcialmente reentrante, então as suas ISRs podem muito bem serem corrompidas durante a execução do código principal. Este problema é comum, mas é virtualmente impossível para pesquisar estes defeitos, uma vez que os sintomas podem apenas aparecer ocasionalmente e produzindo erros diversos. Você pode imaginar o quão difícil é isolar um bug que se manifesta apenas ocasionalmente e com características completamente diferentes cada vez ?</p>
<p>A moral da história é ter certeza que o seu compilador possui um pacote de runtime completamente &#8220;puro&#8221;.</p>
<p>Os programadores que usam Assembly estão vacinados deste mal, uma vez que qualquer rotina comum em baixo nível compartilhada entre uma ISR e outro código precisa ser puro. Se você compra uma biblioteca de ponto flutuante, de comunicação, etc., tenha certeza que o fornecedor garante a reentrância em todos os modos.</p>
<p>Uma vez que muitos sistemas embarcados executam a partir da ROM, alguns níveis de reentância são assegurados. Não importa o quanto se tente é impossível escrever código auto modificável, pelo menos no espaço da ROM! Infelizmente, isso adiciona uma certa complacência.</p>
<p>A minha empresa vende emuladores. O maior número de ligações no suporte vem de programadores que possuem um código que funciona na ROM, mas tem problemas quando executados a partir da memória interna do emulador. O problema é sempre o mesmo: o usuário inadvertidamente escreve código sobre outro código. Na ROM o problema nunca aparece. Certamente, no entanto, isso indica um problema mais sério. Essa escrita deveria provavelmente ocorrer em algum espaço de dados na RAM, que não está sendo atualizada. Ou, se o código for suspeito, algum valor aleatório pode estar indo para os registradores de índices e podem causar a escrita de algum lixo na pilha ou algum outra estrutura de dados crítica.</p>
<p>Tendo uma CPU relativamente decente, não é tão difícil escrever código reentrante do início (recursos para a pilha são uma grande requisito), mas o que eu vi é que é quase impossível fazer um grande programa impuro reentrante. Geralmente os monstros então no heap das variáveis globais. Se a reentrância é necessária, somente pequenas áreas podem, algumas vezes, se proteger desabilitando as interrupções ao seu redor. Então nenhuma ISR pode ser sincronizada com os recursos críticos. Isso pode não funcionar bem em sistemas multitarefas.</p>
<p>Infelismente, desabilitar as interrupções traz seus próprios problemas. Aumenta a latência das interrupções e em alguns casos pode fazer perder alguma interrupção.</p>
<p>Muitos anos atrás eu havia convertido uma pacote de ponto flutuante em Assembly para código &#8220;puro&#8221;. Eu tentei várias saídas para corrigir os problemas, mas no final eu só obtive a cura com um pacote totalmente reescrito.</p>
<h5></h5>
<h3>Encontrando a &#8220;Pureza&#8221;</h3>
<p>Como nós sabemos se o código é verdadeiramente reentrante ? Não importa o quão cuidadoso é o design do seu novo projeto, é simplesmente muito fácil inadvertidamente criar referências impuras aos dados, ocasionamente. Em uma atualização de um velho projeto o problema é mais severo, pois você pode não estar totalmente confortável com a estrutura do código ou as intenções do programador original.</p>
<p>Eu tenho dúvidas se existe um teste completo para reentrância. Apenas alguns testes parciais são simples e podem ajudar.</p>
<p>É muito fácil encontrar código que acidentalmente (ou de outra forma) escreve sobre si mesmo. Qualquer emulador decente deixa você escrever no espaço de programa. Quando utilizando um monitor de ROM, simulador, ou algo assim, regularmente execute checksum no código. Se o checksum mudar (para uma particular versão do código), alguma coisa está errada.</p>
<p>Eu faço buscas globais por declarações STATIC em C. STATIC pode indicar um problema de reentrância em potencial.</p>
<p>Em rotinas escritas em linguagem Assembly, qualquer referência direta a um endereço da RAM é um ponto para examinar a reentrância. Não há nada implicitamente errado com um MOV [CONT], AX; a maioria das vezes isso vai funcionar bem em rotinas reentrantes. Ainda assim, isso pode ser um indicador de código &#8220;impuro&#8221;. Uma solução é armazenar as variáveis locais no quadro atual da pilha.</p>
<p>Como você pode dizer se um pacote runtime comprado é realmente reentrante sem ler todo o código? Uma abordagem é linkar o programa sem o pacote (retirando as chamadas às rotinas) e depois fazê-lo com elas. Compare o relatório do linker para o espaço de dados. Um pacote realmente reentrante não vai necessitar de nenhuma RAM adicional além da pilha e/ou heap.</p>
<p><sub>Adaptado por Eletronica.org do artigo <strong>Reentrancy</strong> escrito pelo consultor americano <a href="http://www.ganssle.com/bio.htm" target="_self"><strong>Jack Ganssle</strong></a>, com a devida autorização.</sub></p>
<p><sub><em>Todos os direitos são reservados ao autor. Você pode encontrar mais artigos e informações sobre o Jack no site do <strong><a href="http://www.ganssle.com/" target="_self">Ganssle Group</a></strong>.</em></sub></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/artigos/70/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Programando em C: Boas Práticas</title>
		<link>http://www3.eletronica.org/artigos/programando-em-c-boas-praticas</link>
		<comments>http://www3.eletronica.org/artigos/programando-em-c-boas-praticas#comments</comments>
		<pubDate>Mon, 24 Oct 2011 16:11:01 +0000</pubDate>
		<dc:creator>Administrador Eletronica.org</dc:creator>
				<category><![CDATA[Artigos]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=50</guid>
		<description><![CDATA[Este artigo aborda algumas dicas que visam melhorar a legibilidade do código fonte. Em 1972 o funcionário da AT&#38;T Dennis Ritchie iniciou o desenvolvimento de uma linguagem de programação que simplificasse a sua tarefa diária de programador nos laboratórios Bell. Chamou-a simplesmente de &#8220;C&#8221;, em referência clara à uma linguagem anterior, escrita por Ken Thompson, ...]]></description>
			<content:encoded><![CDATA[<p>Este artigo aborda algumas dicas que visam melhorar a legibilidade do código fonte.</p>
<p><img class="alignright" title="Dennis Ritchie" src="http://www.ubuntero.com.br/wp-content/uploads/2011/10/dennis_ritchie6-104755.jpg" alt="" width="284" height="274" /></p>
<div>Em 1972 o funcionário da AT&amp;T <strong>Dennis Ritchie</strong> iniciou o desenvolvimento de uma linguagem de programação que simplificasse a sua tarefa diária de programador nos laboratórios Bell. Chamou-a simplesmente de &#8220;C&#8221;, em referência clara à uma linguagem anterior, escrita por Ken Thompson, conhecida como &#8220;B&#8221;. Após estar madura o suficiente para substituir o assembly no kernel do sistema Unix em 1973, a linguagem ganhou o mundo, evoluindo com o tempo e tornando-se referência, mas sem perder as principais características que a fizeram ocupar uma posição de destaque.</div>
<div>
<p>Este artigo pretende conversar diretamente com o programador, revelando algumas boas práticas que podem auxiliá-los no desenvolvimento e manutenção do código. Apesar de genérico à linguagem C, os tópicos abordados são frutos da experiência como desenvolvedor de sistemas embarcados, sendo estes o nosso foco principal.</p>
<p>&nbsp;</p>
<h2>Mantendo Bonito</h2>
<p>A linguagem C, por definição, não exige que você escreva o programa seguindo regras que o tornem esteticamente agradável de ver (e ler). Nada impede você de escrever algo como:</p>
<pre>/*#define ppp xp</pre>
<pre> * /## define */#define x =
 #define zim void
 /*\**\*\***//*/ #denife $/*/
 #define p ()
 #define iu for(
 /*\**\*\***//*/ #defie $##def x^3printdf/*/
 #define xyz &lt;
 /*/*  8/ *******/ #define o ;}
 #define v "\na l o   m u n d o "
 int s (zim) { char b x 1; iu b x 9;\
 b xyz 21; b++){ printf( v ) o /*}}}*/}
 zim main( zim ) { s p o</pre>
<p>Exceto, claro, o bom senso. De uma maneira geral, o código bonito e organizado é sempre mais fácil de ler.</p>
<p>&nbsp;</p>
<h2>Indentação &amp; Espaços</h2>
<p>Utilizar indentação no código é algo essencial para a legibilidade. O tamanho do espaçamento pode variar, mas o importante é sempre manter blocos aninhados respeitando os níveis de indentação das estruturas condicionais e laços de repetição. De uma forma geral, o nível de indentação muda sempre após o início de uma função, estrutura condicional ou laço:</p>
<pre>void exemplo ( void ) {
    if ( a &gt; 5 ) {
        b += 3;
        for ( i=0; i&lt;5; i++ ) {
          z++;
          x--;
        }
     }
 }</pre>
<p>No exemplo acima foram utilizados quatro espaços entres os blocos. Você pode configurar o seu editor de texto preferido para que a tecla TAB substitua o caracter invisível de tabulação por estes espaços, é bastante útil. Evite espaçamentos muito curtos, como apenas um espaço, ou muito longos.</p>
<p>Além da indentação, que você já deve estar habituado, outro recurso que facilita a legibilidade é a utilização de espaços horizontais e verticais. Aumentar o número de linhas e espaços não vai, obviamente, aumentar o tamanho do binário compilado. Ao invés de escrever uma sentença condicional como:</p>
<p>if (a&lt;20 &amp;&amp;(c==5||d==6)) { }</p>
<p>prefira algo assim:</p>
<p>if (  (a &lt; 20)   &amp;&amp;   ( (c==5) || (d==6) )  ) { }</p>
<p>que é visivelmente mais agradável de avaliar. Separar as sentenças por parênteses também evita algum erro de precedência que você possa cometer ao digitar as expressões, reduzindo o tempo de depuração no futuro.</p>
<p>Laços complexos também podem ser quebrados em várias linhas, com o mesmo objetivo:</p>
<pre>for ( cont = 0, aux = 3;
   cont &lt; 100;
   cont++, aux+=2 ) {</pre>
<pre>     a = c + b;
     d = e - f;
 }</pre>
<p>Quando falo em legibilidade do código, lembro-me que existe um operador na linguagem C, o ternário, que utilizado em excesso pode tornar as expressões pouco legíveis aos olhos menos treinados. De uma forma geral eu evito utilizar o operador ternário, mesmo em sentenças simples. A operação</p>
<pre>aux = ( cont &lt; aux ) ? cont : cont * -1;</pre>
<p>poderia ser escrita, sem nenhum prejuízo, como:</p>
<pre>if ( cont &lt; aux )
     aux = cont;
 else
     aux = cont * -1;</pre>
<p>Mas se você gosta do operador ternário, uma opção para melhorar a legibilidade é separar as sentenças por linhas indentadas. A mesma expressão poderia ser escrita assim:</p>
<pre>aux = ( cont &lt; aux )
 ? cont
 : cont * -1;</pre>
<pre>Isto será especialmente útil caso você utilize o operador ternário de forma encadeada. Este código:</pre>
<pre>a = ( b &lt; z )
 ? x
 : ( i &gt; x )
     ? i
     : ++i;</pre>
<p>é certamente mais legível que este:</p>
<pre>a = ( b &lt; z ) ? x : ( i &gt; x ) ? i : ++i;</pre>
<pre></pre>
<h2>- ++ e &#8211;</h2>
<p>Evite agregar mais de um ++ ou &#8212; na mesma sentença. Com o mesmo intuito, evite atribuir ao resultado da operação operadores que utilizaram o incremento ou decremento na expressão.</p>
<p>Portando, expressões como:</p>
<pre>z = a++ + ++b;</pre>
<p>ou</p>
<pre>a[b] = b++;</pre>
<p>devem ser evitadas e substituidas por cláusulas que inibam, ou pelo menos minimizem, interpretações errôneas.</p>
<p>&nbsp;</p>
<h2>Números Mágicos</h2>
<p>As constantes são suas amigas, e os &#8220;#define&#8221; uma das mais ricas formas de melhorar a legibilidade do código. &#8220;Números Mágicos&#8221; são valores, inteiros ou não, que aparecem no código e que são constantes, mas não foram declarados como tais. Fazer isso prejudica a organização e dificulta a manutenção.</p>
<p>Ao invés de ter condições como:</p>
<pre>while ( tensao_bateria &lt; 30 ) {
    if ( potencia_transmissor &gt; 50 )
        diminua_potencia();
    else {
        desliga_radio();
        while ( tensao_bateria &lt; 30 ) { /* espera bateria carregar */ }
        liga_radio();
    }
 }</pre>
<p>substitua os inteiros por constantes com nomes adequados, como LIMITE_BATERIA_CRITICA e POTENCIA_MINIMA_TRANSMISSOR. Além de melhorar a organização facilita a manutenção, em caso de alterações nestas constantes.</p>
<p>&nbsp;</p>
<h2>Loops &#8220;Parados&#8221;</h2>
<p>Utilizando o exemplo anterior, observe que escrevemos</p>
<pre>while ( tensao_bateria &lt; 30 ) { /* espera bateria carregar */ }</pre>
<p>ao invés de simplesmente</p>
<pre>while ( tensao_bateria &lt; 30 );</pre>
<p>A primeira forma deixa explícita a nossa intenção, ao contrário da segunda, que poderia ser confundida com um erro do programador ou causar problemas posteriormente, caso o &#8220;;&#8221; fosse erroneamente removido (possivelmente sem erro na compilação).</p>
<p>&nbsp;</p>
<h2>Convenções</h2>
<p>Não importa exatamente quais convenções você utiliza, o importante é que você defina uma (própria ou não) e siga-a da forma mais rigorosa possível. Preferencialmente estas convenções devem ser descritas em um documento simples, que permita consultas rápidas sempre que necessário. Exemplificarei algumas abaixo que são bastante populares, mas você deve adaptá-las às suas necessidades.</p>
<pre>- Constantes: para as constantes utilize sempre letras maiúsculas. Desta forma será fácil distingui-la entre as variáveis.
 Ex.:
 #define LIMITE_TEMPERATURA 40
 #define BATERIA_BAIXA 30</pre>
<p>- Variáveis: mais importante que as convenções, uma regra básica: utilize nomes claros para as variáveis, abreviando apenas o que é bastante conhecido ou óbvio. Programadores são, em sua maioria, ágeis no teclado. Portanto, abreviar pressaoMotorEsquerdo para preMotE provavemente não vai economizar muito do seu tempo durante o desenvolvimento e certamente dificultará a leitura do código.</p>
<p>Existem algumas convenções mais antigas como a <a href="http://pt.wikipedia.org/wiki/Nota%C3%A7%C3%A3o_H%C3%BAngara" target="_self">Notação Húngara</a> ou mais modernas, como a <a href="http://pt.wikipedia.org/wiki/CamelCase" target="_self">Notação Camelo</a>, muito utilizada na programação orientada a objetos. Usualmente, em C, é bastante comum todas as variáveis serem escritas com letras minúsculas e/ou com o &#8220;_&#8221; como separador de palavras. Sendo assim, variáveis como velocidademaxima ou velocidade_maxima são bastante comuns, sendo esta última forma mais freqüente.</p>
<p>- Tipos de Variáveis: uma das grandes vantagens da linguagem C é a portabilidade entre arquiteturas. No entanto, alguns tipos de variáveis possuem comprimento variável dependendo da arquitetura e compilador, o que pode ocasionar problemas no software, como overflow ou erros de conversões. Por exemplo, o tipo inteiro (int) normalmente representa o tamanho da palavra do processador, nos processadores modernos de 32 e 64 bit e compiladores como o GCC. Mas isso não é necessariamente uma regra; no compilador HITECH para microcontroladores PIC de 8 bit, por exemplo, o inteiro possui 16 bit.<br />
Sendo assim, defina tipos claros e utilize-os, como uint8 para inteiros não sinalizados de 8 bit ou int16 para inteiros sinalizados de 16 bit.</p>
<p>Também seja atencioso ao declarar ponteiros. Uma declaração como:</p>
<pre>char*   s, t, u;</pre>
<p>não está errada, mas provavelmente não é o que você deseja, já que t e u não serão declarados como ponteiros. Sendo assim, prefira esta forma para declarar os ponteiros sem margem para erros:</p>
<pre>char   *s, *t, *u;</pre>
<pre></pre>
<h1>Conclusão</h1>
<p>Nossa intenção neste artigo foi abordar algumas técnicas que podem ajudá-lo a melhorar a legibilidade do seu código. Apesar de existirem vários outros pontos que podem ser abordados neste tópico, de uma forma geral, escrevendo um código organizado, bonito e bem comentado existe uma grande probabilidade do seu código tornar-se bastante legível, quesito que traduz-se em agilidade e produtividade em todas as fases do ciclo de vida do software.</p>
<p>&nbsp;</p>
<p>Roberto Alcântara<br />
roberto@eletronica.org</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/artigos/programando-em-c-boas-praticas/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Construa seu Próprio Monitor Cardíaco, um ECG simples</title>
		<link>http://www3.eletronica.org/projetos/construa-seu-proprio-monitor-cardiaco-um-ecg-simples</link>
		<comments>http://www3.eletronica.org/projetos/construa-seu-proprio-monitor-cardiaco-um-ecg-simples#comments</comments>
		<pubDate>Mon, 24 Oct 2011 16:07:07 +0000</pubDate>
		<dc:creator>Administrador Eletronica.org</dc:creator>
				<category><![CDATA[Projetos]]></category>

		<guid isPermaLink="false">http://www3.eletronica.org/?p=47</guid>
		<description><![CDATA[Este projeto vai ensinar você a criar o seu próprio dispositivo de monitoramento cardíaco, um ECG/EKG (eletrocardiógrafo) simples. Nos Estados Unidos e no resto do mundo, milhões de pessoas perdem as suas vidas por problemas cardíacos. Estes problemas acompanham doenças como diabetes, estresse, etc. Antes de continuar a explicar a você o que eu fiz, ...]]></description>
			<content:encoded><![CDATA[<p>Este projeto vai ensinar você a criar o seu próprio dispositivo de monitoramento cardíaco, um ECG/EKG (eletrocardiógrafo) simples.</p>
<div>Nos Estados Unidos e no resto do mundo, milhões de pessoas perdem as suas vidas por problemas cardíacos. Estes problemas acompanham doenças como diabetes, estresse, etc. Antes de continuar a explicar a você o que eu fiz, gostaria de ALERTAR você. 500mA (mili-ampéres) em 220V irá destruir completamente o seu sistema nervoso (então alimente isso a partir de baterias!), verifique tudo duas vezes e a responsabilidade é toda sua.</div>
<div>
<p>OK! Eu acho que posso continuar agora. Este foi um trabalho estudantil de quando eu iniciei no campo da biomedicina. Para fazer o meu CV parecer melhor eu queria contruir alguma coisa nessa área e fiz um ECG. A primeira coisa que eu procurei fazer foi ir até o google.com e pesquisar por projetos similares. Lá eu encontrei um bom número de projetos sobre o assunto. Alguns para logar dados de pacientes com doenças cardíacas, alguns outros sistemas de monitoramento cardíaco futuristas e mais alguns feitos apenas por diversão, como o meu.</p>
<p>Vamos iniciar com a definição do que é um ECG e algumas coisas sobre ele (retirado de &#8220;Introduction to Medical Electronics Application&#8221;, por D. Jennings, A. Flint, BCH Turton, LDM Nokes):</p>
<p>&#8220;O coração humano pode ser considerado um grande músculo que bate apenas por contrações musculares. Conseqüentemente, estas contrações causam uma diferença de potencial. O estudo da medida do potencial produzido pelo músculo cardíaco é chamada de eletrocardiologia.<br />
O campo despolarizante no coração é um vetor que altera a sua direção e magnitude através do ciclo cardíaco. A colocação de eletrodos na superfície do paciente determina a visão que será obtida desse vetor em função do tempo.</p>
<p>O esquema de posicionamento mais utilizada dos eletrodos é mostrada na Figura 1. Aqui, a diferença de potencial é medida entre os braços direito e esquedo, entre o braço direito e a perna esquerda e entre o braço esquerdo e a perna esquerda. Estas três medidas podem ser referenciadas como I, II e III, respectivamente. Este posicionamento foi desenvolvida por Einthiven, que determinou que conhecendo o estado das medidas dos sinais das  ligações I e II, o sinal que ia ser visualizado em III poderia ser calculado. E este é o princípio básico do posicionamento das ligações do ECG: a partir dos vários recursos disponíveis, a despolarização do coração pode ser calculada.</p>
<div style="text-align: center;"><img src="http://www2.eletronica.org/projetos/construa-seu-proprio-monitor-cardiaco-um-ecg-simples/3lead_ecg.jpg" alt="3lead_ecg.jpg" /><br />
Figura 1</div>
<p>&nbsp;</p>
<p>Conseqüentemente, o sinal do ECG mostra ao clínico as formas de ondas elétricas associadas com as contrações dos ventrículos e artérias. Apartir de um ECG, o clínico pode determinar o tempo das contrações dos ventrículos e artérias e avaliar a magnitude relativa das polarizações e despolarizações ventriculares e arteriais. Esta informação pode permitir a identificação de pequenos bloqueios do coração. Depois de um ataque cardíaco, o ECG do paciente mostra alterações de sincronismo e forma de ondas, transmitidas através dos tecidos musculares. Estas alterações são associadas com danos cardíacos causados pelo ataques do coração&#8221;.</p>
<div style="text-align: center;"><img src="http://www2.eletronica.org/projetos/construa-seu-proprio-monitor-cardiaco-um-ecg-simples/ecg_connection_diagram.jpg" alt="ecg_connection_diagram.jpg" /></div>
<div style="text-align: center;">Figura 2., diagrama de conexão</div>
<p>&nbsp;</p>
<p>Depois desta pequena introdução sobre o ECG, vamos falar da descrição eletrônica. A maneira mais simples de explicar como isso funciona é fazer um diagrama de blocos.<br />
O sinal que vem do corpo inicia sendo amplificado (este sinal é muito pequeno e fraco, variando entre 0,5mV e 5,0mV), filtrado (para remover o ruído), amostrado (para amostrar eu preciso de um conversor Analógico/Digital, conhecido como ADC) e então envio ao computador através de uma interdace RS232 (uma interface sem fio ou qualquer outro tipo poderia ser escolhida, mas a RS232 é simples e rápida para desenvolver).</p>
<p>Os primeiros dois passos são mostrado na Figura 3.</p>
<p style="text-align: center;"><img src="http://www2.eletronica.org/projetos/construa-seu-proprio-monitor-cardiaco-um-ecg-simples/ecg_chain.jpg" alt="ecg_chain.jpg" /></p>
<div style="text-align: center;">Figura 3., Blocos ECG</div>
<p>Os amplificadores que nós usamos na engenharia de biomedicida, aquisição de dados ou qualquer outro lugar onde é interessante representar uma pequena flutuação de tensão sobreposto em um offset de tensão, são chamados amplificadores de Instrumentação. Estes amplificadores possuem uma grande CMMR (Commom Mode Rejection Ratio), o que significa que eles têm a habilidade de um amplificador diferencial em não passar (rejeitar) a parte do sinal que é comum nas entradas + e -. Os famosos produtores de amplificadores de instrumentação são a Texas Intruments e a Analog Devices. Eu utilizei um amplificador da segunda empresa, Analog Devices. O AD620, amplificador de intrumentação, e o OP97, amplificador operacional de alta precisão. Como eles precisam de uma fonte de tensão negativa, eu a gerei com o LTC1044 da Linear, conversor de tensão com chaveamento de capacitor, Figura 4. A tensão fornecida é 5V. O esquemático é mostrado na Figura 5, e mais detalhes sobre o seu funcionamento pode ser visto em seu <a href="http://www.e-dsp.com/downloads/ecg.pdf" target="_blank">datasheet</a>.</p>
<p style="text-align: center;"><img src="http://www2.eletronica.org/projetos/construa-seu-proprio-monitor-cardiaco-um-ecg-simples/ltc1044.jpg" alt="ltc1044.jpg" /></p>
<div style="text-align: center;">Figura 4., LTC1044, gerador de tensão negativa</div>
<p>&nbsp;</p>
<p style="text-align: center;"><img src="http://www2.eletronica.org/projetos/construa-seu-proprio-monitor-cardiaco-um-ecg-simples/ecg_schematic.jpg" alt="ecg_schematic.jpg" /><br />
Figure 5., ECG Esquemático do ECG</p>
<p>Os ruídos podem vir das contrações musculares, interferências da rede na faixa de 50-60Hz, ruídos do contato dos eletrodos, ruídos vindo de qualquer outro dispositivo eletrônico, etc. O filtro para a aplicação do ECG deve ser um filtro de corte (passa-alta e passa-baixa). Ele deve filtrar a faixa de 0.5Hz até 50Hz. Eu criei um filtro simples RC passa-alta e passa-baixa, conectados em série (apenas dois capacitores e resistores).</p>
<p>&nbsp;</p>
<p style="text-align: center;"><img src="http://www2.eletronica.org/projetos/construa-seu-proprio-monitor-cardiaco-um-ecg-simples/ecg_signal.jpg" alt="ecg_signal.jpg" /><br />
Figura 6., Sinal do ECG</p>
<p>O ADC usado foi o interno da CPU Atmel, ATMega8. O código está aqui:</p>
<div>
<ol>
<li>
<div>.include “m8def.inc”</div>
</li>
<li>
<div>.def temp = r16</div>
</li>
<li>
<div>.equ CLOCK = 4000000    ; define frequency speed</div>
</li>
<li>
<div>.equ BAUD = 9600    ; define baud rate of sending data</div>
</li>
<li>
<div>.equ UBRRVAL = CLOCK/(BAUD*16)-1</div>
</li>
<li>
<div>main:</div>
</li>
<li>
<div>ldi r16, 0b00100000    ; configure the ADC</div>
</li>
<li>
<div>out ADMUX, r16</div>
</li>
<li>
<div>ldi r17, 0b10000111</div>
</li>
<li>
<div>out ADCSRA, r17</div>
</li>
<li>
<div>; Stackpointer initialisation</div>
</li>
<li>
<div>ldi temp, LOW(RAMEND)</div>
</li>
<li>
<div>out SPL, temp</div>
</li>
<li>
<div>ldi temp, HIGH(RAMEND)</div>
</li>
<li>
<div>out SPH, temp</div>
</li>
<li>
<div>; Baudrate configuration</div>
</li>
<li>
<div>ldi temp, LOW(UBRRVAL)</div>
</li>
<li>
<div>out UBRRL, temp</div>
</li>
<li>
<div>ldi temp, HIGH(UBRRVAL)</div>
</li>
<li>
<div>out UBRRH, temp</div>
</li>
<li>
<div>; Frame-Format: 8 Bit</div>
</li>
<li>
<div>ldi temp, (1&lt;&lt;</div>
</li>
<li>
<div>out UCSRC, temp</div>
</li>
<li>
<div>sbi UCSRB,TXEN    ; TX activate</div>
</li>
<li>
<div>ADC:</div>
</li>
<li>
<div>ldi r18, 0b00100000</div>
</li>
<li>
<div>out ADMUX, r18</div>
</li>
<li>
<div>ldi r19, 0b11000111</div>
</li>
<li>
<div>out ADCSRA, r19</div>
</li>
<li>
<div>loop:</div>
</li>
<li>
<div>in r24, ADCSRA    ; check if ADC done</div>
</li>
<li>
<div>sbrc r24, 6</div>
</li>
<li>
<div>rjmp loop</div>
</li>
<li>
<div>in temp, ADCH    ; fill the converted ADC value to temp</div>
</li>
<li>
<div>rcall serout    ; send ADC value to RS232(to computer)</div>
</li>
<li>
<div>rjmp ADC</div>
</li>
<li>
<div>serout:</div>
</li>
<li>
<div>sbis UCSRA,UDRE</div>
</li>
<li>
<div>rjmp serout</div>
</li>
<li>
<div>out UDR, temp</div>
</li>
<li>
<div>ret</div>
</li>
</ol>
</div>
<p>Os resultados podem ser vistos nas figuras a seguir. Eu utilizei o LabView para ver o ECG do meu coração.</p>
<p>&nbsp;</p>
<p style="text-align: center;"><img src="http://www2.eletronica.org/projetos/construa-seu-proprio-monitor-cardiaco-um-ecg-simples/ecg.jpg/image_preview" alt="ecg.jpg" /></p>
<p style="text-align: center;">Figura 7. Resultado do ECG no LabView</p>
<p style="text-align: center;"><img src="http://www2.eletronica.org/projetos/construa-seu-proprio-monitor-cardiaco-um-ecg-simples/ecg1.jpg/image_preview" alt="ecg1.jpg" /></p>
<p style="text-align: center;">Figura 8. Resultado do ECG no LabView</p>
<p style="text-align: center;"><img src="http://www2.eletronica.org/projetos/construa-seu-proprio-monitor-cardiaco-um-ecg-simples/electrode_man_rofl.jpg/image_preview" alt="electrode_man_rofl.jpg" /></p>
<p style="text-align: center;">Figura 9. Este sou eu com os eletrodos (a imagem na camisa é o logo da Associação de Basquete da Bósnia)</p>
<p style="text-align: center;"><img src="http://www2.eletronica.org/projetos/construa-seu-proprio-monitor-cardiaco-um-ecg-simples/ecg_front.jpg" alt="ecg_front.jpg" /></p>
<p style="text-align: center;">Figura 10. A placa do ECG criada por mim, frente</p>
<p style="text-align: center;"><img src="http://www2.eletronica.org/projetos/construa-seu-proprio-monitor-cardiaco-um-ecg-simples/ecg_back.jpg" alt="ecg_back.jpg" /></p>
<p style="text-align: center;">Figura 11. A placa do ECG criada por mim, lado de baixo</p>
<p><span class="Apple-style-span" style="font-size: 11px;">Adaptado, com autorização do autor, por Eletronica.org.</span></p>
<div><sub>Veja o original, em inglês, em <a href="http://www.e-dsp.com/how-to-build-your-own-heart-monitoring-device-a-simple-ecg/" target="_self">http://www.e-dsp.com/how-to-build-your-own-heart-monitoring-device-a-simple-ecg/</a></sub></div>
<div><sub><br />
</sub></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www3.eletronica.org/projetos/construa-seu-proprio-monitor-cardiaco-um-ecg-simples/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

