domingo, 17 de fevereiro de 2013

Algoritmos e Programação - Algoritmos


Olá a todos. Hoje vou começar uma série de posts com o objetivo de ensinar Algoritmos e Programação. Quando tive essa matéria na universidade, aprendi A&P em uma pseudo-linguagem que consistia em um português estruturado. Como achei isso uma perda de tempo, resolvi ensinar Algoritmos aqui no blog direto em uma linguagem útil, a Linguagem C. Se você não entendeu nada dessa introdução, não se preocupe... nosso objetivo é ensinar. A bibliografia da série estará fundamentalmente baseada no livro de Herbert Schildt: C Completo e Total, 3ª Edição, editora Pearson. Caso você queira aprender a programar em C (já que a ideia do blog, por enquanto, é ensinar somente algoritmos), recomendo que adquira esse livro, que é muito bom. Vamos ao post então...

Vamos começar definindo: Algoritmo é uma palavra que, segundo a Wikipédia, vem do sobrenome do matemático persa Mohamed bem Musa Al-Khwarizmi. Um algoritmo é uma sequência finita de passos que podem ser realizados numa quantidade finita de tempo, para chegar a um propósito, que pode ser resolver um problema. Lembre-se disso: Algoritmo é uma sequencia de passos para chegar a um resultado.

Vou explicar melhor aquela coisa do "finito". Imagine que você queira fazer um bolo. Então o resultado que você quer alcançar é este: ter o bolo pronto para poder comê-lo. O algoritmo para fazer o bolo se chama 'receita', que você procurou no Google ou viu no programa da Ana Maria Braga. Imagine que, para fazer o bolo, você tenha que fazer infinitas etapas (ou seja, o algoritmo demanda infinitos passos). Neste caso, você nunca vai chegar a ter o bolo pronto, pois nunca terminará de fazê-lo. Se você nunca chega no seu objetivo, então a sequência de passos não é um algoritmo.

Agora imagine que a receita tenha uma sequencia finita de passos, mas que um dos passos demanda uma quantidade infinita de tempo, como por exemplo, mexa a massa infinitamente. Neste caso, novamente, você nunca alcançará o objetivo de ter o bolo pronto e, portanto, a sequência de passos não define um algoritmo.

Portanto, está explicado. Algoritmo é uma sequência de passos finitos com duração finita que permite obter um resultado. Exemplos de algoritmos: receitas, tutoriais de qualquer coisa, alguns manuais, etc...

Pois bem, com o advento da computação, foi percebido que o computador poderia ser usado para fins úteis, além do entretenimento e pornografia. O computador poderia resolver problemas como calcular a trajetória de mísseis, achar um arquivo através de uma engine de buscas e, inclusive, descobrir a resposta para a vida, o universo e tudo mais (42).

Mas para o computador resolver todos os problemas que não existiam antes dele, era preciso ensiná-lo a fazer as coisas. E o ato de ensinar um computador a fazer algo é chamado de programação. Programar um computador nada mais é que ensiná-lo um algoritmo em uma determinada linguagem de programação. E existem muitas linguagens de programação, cada uma com suas vantagens, desvantagens e aplicações específicas. Dentre as linguagem, eu cito a linguagem Assembly, C, C++, Java, MATLAB,etc...

A diferença entre linguagens é muita. Enquanto algumas linguagens conseguem comunicar diretamente com o hardware da máquina (mexer em bits de registradores, por exemplo), dentre elas o Assembly e o C, outras servem para criar aplicativos, e não lidar tanto com hardware, como Java. MATLAB, por exemplo, é uma linguagem com recursos específicos para lidar com simulação e problemas matemáticos.

Cada linguagem é diferente. São recursos diferentes e propósitos diferentes. Porém a linguagem é a parte mais fácil do processo de programação. O mais difícil é o algoritmo, que basicamente se aplica para qualquer linguagem. Um programa que coloque uma lista em ordem crescente seria diferente em C e Java, mas ambos poderiam ter a mesma ideia, basicamente a mesma sequencia de passos, ou seja, o mesmo algoritmo. Ao resolver um problema de programação, a parte mais trabalhosa é pensar em como resolver. Uma vez pensado no algoritmo que chega ao resultado esperado, se vamos implementá-lo em C ou em Java depende dos nossos conhecimentos e do tipo de aplicação em que o problema está inserido.

Post curto, só para introduzir o assunto. Vamos ficar por aqui hoje, embora eu tenha ficado com vontade de escrever muitas outras coisas. Recomendo, quem pretende seguir os posts sobre Algoritmos, que baixe o programa DEV C++ de graça no site da Bloodsheed Software, observando se a versão dele é compatível com seu sistema operacional. Basicamente o DEV C++ é o programa que irá permitir compilar e rodar os programas que você criar em C. Por enquanto é isso. Vou ficar por aqui, pois estou com fome, e vou executar um algoritmo para fazer um molho branco para uma massa. Um abraço e vamos, juntos, estudar e desbravar um pouco do vasto mundo da PROGRAMAÇÃO. Até nossa próxima aventura...


Imagem meramente ilustrativa...

sábado, 16 de fevereiro de 2013

Blog Parado

Bom, eu tenho visto que existem pessoas que leem este blog, o que me deixa aliviado, por que caso ninguém lesse o blog, eu estaria escrevendo um monte de coisas pra nada. Mas enfim, como podem ver, o blog está meio parado. Isso tem dois motivos: tenho estado muito ocupado com trabalho e estudos, e não tenho tido boas ideias para posts.

Se vocês quiserem ajudar, há dois jeitos. Virem resolver meus problemas para mim, ou dar ideias do que vocês gostariam de ler aqui no blog. Caso escolham a segunda opção, por favor, deixem um comentário com alguma ideia. Eu tenho visto que os posts sobre associação de resistores fazem sucesso... mas e aí? O que você quer ler? Deixe sua ideia neste post!

Eu respondo o post em até 1 dia, geralmente, pois sempre olho o blog. Então você com certeza receberá feedback de sua opinião. Abraço e continuem estudando.

domingo, 27 de janeiro de 2013

De Luto por Santa Maria

Hoje ocorreu uma tragédia, o incêndio na boate Kiss em Santa Maria. Até o momento foram contabilizadas cerca de 240 vítimas fatais...

240 pessoas mortas. 240 histórias que tiveram um fim naquele lugar. Para quem morre, a dor acaba. Para quem fica, a dor é interminável, insuportável. São pais que perderam as crianças que criaram e educaram com tanto amor e carinho. Amigos que perderam gente querida. A mãe desesperada que, ao ouvir a notícia, liga incessantemente para o filho para saber seu paradeiro e lá, no local do incidente, um celular toca no bolso de um corpo sem vida.

Para mim é fácil escrever esse texto, sentado ao meu computador. Estou bem, as pessoas que amo estão bem. Por mais que eu tente, seria impossível imaginar a dor sentida. Mas na medida em que minha ignorância me permite, eu desejo muita força aos que perderam seus entes queridos.

Que todas essas almas possam descansar em paz...

Lógica Sequencial - Flip-Flop Master-Slave (Mestre-Escravo) com Preset e Clear

Bom, primeira postagem minha de 2013, e vamos começar dando sequencia aos posts de lógica sequencial, continuando a série falando do Flip-Flop Master-Slave com entrada \Preset e \Clear. Comentaremos o que ele é, como ele funciona e para que ele serve. Então, sem mais delongas, vamos a ele.


Na figura acima vemos o circuito que compõe o Flip-Flip Master-Slave. Veja que ele é basicamente constituído por 2 FF-JK. O primeiro Flip-Flop JK é composto pelas portas AND F1, F2, F3 e F4. Este primeiro flip-flop, que fica na entrada, é o Master (Mestre). O segundo flip-flop fica na saída, e é composto pelas portas AND F6, F7, F8 e F9. Este flip-flop é o Slave (Escravo).

Os outros elementos são as entradas \Preset e \Clear, que são ativadas em 0 (este é o significado da barra em cima do nome das entradas) e o Clock. Perceba que o Clock do flip-flop mestre é o contrário do clock do escravo. Esta inversão é dada pela porta NOT F5.

Agora que conhecemos o interior do flip-flop, e comentamos os elementos que o constituem, vamos falar da relação entre estes elementos e como eles determinam o funcionamento deste flip-flop.

Este flip-flop surgiu para resolver um problema. Acontece que no outro flip-flop, se o sinal de Clock fica muito tempo no estado alto, podem ocorrer duas mudanças na saída durante o mesmo período de Clock. Então surgiu o flip-flop JK mestre-escravo.

Como eu falei antes, o Flip-Flop JK Master-Slave é composto por dois flip-flops JK, cujos sinais de Clock estão invertidos um com relação ao outro. Então, se o sinal de Clock do primeiro flip-flop está alto, o do segundo está baixo, e vice-versa.

Quando o sinal de Clock do primeiro flip-flop está alto, ele muda sua saída conforme suas entradas. Mas neste momento as entradas do segundo flip-flop estão desabilitadas, pois o Clock deste flip-flop está baixo. Quando o sinal de Clock muda de alto para baixo, o primeiro flip-flop desabilita a leitura de suas entradas e "congela" sua saída. Neste momento o Clock do segundo flip-flop fica alto, e, logo, as entradas são habilitadas. Com isso, o segundo flip-flop lê a saída "congelada" do primeiro flip-flop e decide sua saída a partir das saídas do primeiro flip-flop, que não irão mais variar por enquanto. Quando o Clock do primeiro volta a ser alto, o do segundo volta a ser baixo. Então, a saída do segundo flip-flop fica "congelada", independente das entradas do primeiro flip-flop, só se alterando na próxima transição do Clock de alto para baixo.

Com isso, percebemos que não há possibilidade de duas variações na saída no mesmo período de clock, independente do formato do sinal do Clock (de seu duty-cycle).

De resto, o funcionamento desse flip-flop é igual ao do JK comum. Com J=0 e K=0 a saída se mantém igual ao período anterior. Com J=1 e K=0 a saída é setada (posta em nível lógico 1). Com J=0 e K=1 a saída é resetada (posta em nível lógico 0). Com J=1 e K=1, então a saída é invertida com relação a saída do período anterior.

A entrada \Preset serve para setar a saída (colocá-la em nível lógico 1) e a entrada \Clear serve para limpar a saída (colocá-la em nível lógico 0). A diferença delas para as entradas do flip-flop é que as entradas \PR e \CLR tem precedência ao clock, ou seja, não obedecem ao sinal de clock. Colocando J=0 e K=1 você limpa a saída, mas somente no próximo ciclo de clock, enquanto colocando 0 na entrada \CLR você limpa a saída, mesmo que o flip-flop esteja na metade de um ciclo de clock.

Observe que as entradas \PR e \CLR são entradas negadas, ou seja, são ativadas com nível 0 e não ativadas com nível 1.

O funcionamento dessas entradas é similar as entradas do flip-flop SR. Com \PR=1 e \CLR=1 o flip-flop funciona normalmente, lendo as entradas e respeitando o sinal de Clock. Com \PR=0 e \CLR=1 o flip-flop tem sua saída setada, independente do Clock e das entradas do flip-flop. Com \PR=1 e \CLR=0 o flip-flop tem sua saída resetada, independente do Clock e das entradas do flip-flop. A condição \PR=0 e \CLR=0 causa uma saída não desejada (Q=0 e \Q=0) e, por isso, deve ser evitada.

E por hoje era isso. No próximo post vamos continuar falando de lógica sequencial, mas ainda não tenho certeza qual será o tema. Mas, de qualquer forma, abraço e continuem estudando. Até a próxima. Qualquer dúvida, sugestão ou correção, deixem um comentário que eu respondo em até 2 dias. Fui...

segunda-feira, 31 de dezembro de 2012

Lógica Sequencial - Flip-Flop JK

Continuando a sequência de posts sobre lógica sequencial, vamos falar hoje deste outro elemento da lógica sequencial: o flip-flop JK, que, a princípio, pode ser entendido como um flip-flop SR melhorado. Então, sem mais delongas, vamos ao post de hoje.

A imagem abaixo mostra o interior de um flip-flop JK com entrada de clock e é nesta imagem que iremos basear nosso estudo.


Basicamente é um flip-flop SR com uma realimentação um pouco diferente. A ideia é montarmos uma tabela igual à montada no post sobre o Flip-Flop SR, alguns posts atrás.

1) Se J=0 e K=0, vamos ver o que acontece:
     * Se Q=0 e Q'=1: Neste caso a saída da porta AND de cima é 0 e da porta AND de baixo é 0 também.
Assim, as entradas R e S do Flip-Flop SR "interno" são 0 e as saídas continuam iguais ao do estado anterior. Ou seja, Q=0 e Q'=1.

     * Se Q=1 e Q'=0: Neste caso a saída da porta AND de cima é 0 e da porta de baixo é também é 0. Com isso as entradas S e R do Flip-Flop SR "interno" são 0 e a saída, novamente, permanece inalterada, ou seja Q=1 e Q'=0.

2) Se J=1 e K=0, vamos ver o que acontece:
     * Se Q=0 e Q'=1: Neste caso a saída da porta AND de cima é 1 e da porta AND de baixo é 0. Com isso a entrada S=1 e R=0 do Flip-Flop SR "interno". Assim a saída Q=1 e Q'=0.

     * Se Q=1 e Q'=0: Neste caso a saída da porta AND de cima é 0, assim como a da porta de baixo. Com isso as entradas S e R do Flip-Flop SR "interno" são ambas 0 e as saídas continuam como estão, ou seja, Q=1 e Q'=0.

3) Se J=0 e K=1, vamos ver o que acontece:
     * Se Q=0 e Q'=1: Neste caso a saída da porta AND de cima é 0, assim como a saída da porta AND de baixo. Com isso ambas as entradas do Flip-Flop SR "interno" são 0 e a saída se mantém do jeito que estava, ou seja, com Q=0 e Q'=1.

     * Se Q=1 e Q'=0: Neste caso a saída da porta AND de cima é 0, porém a saída da porta AND de baixo é 1. Dessa forma, a entrada S é 0 e a entrada R é 1 do Flip-Flop SR "interno". Assim, a saída Q se torna 0 e Q' se torna 1. Com isso, acabamos por ter Q=0 e Q'=1.

Se você conhece o Flip-Flop SR, você talvez tenha percebido que o Flip-Flop JK, até agora, se comportou de forma igual ao Flip-Flop SR, sendo a entrada J similar a entrada S e a entrada K similar a entrada R. Então, qual a diferença do Flip-Flop JK para o Flip-Flop anterior, o SR? A resposta vem agora...

4) Se J=1 e K=1, vamos ver o que acontece:
     * Se Q=0 e Q'=1: Neste caso a saída da porta AND de cima é 1 e a saída da porta AND de baixo é 0. Dessa forma a entrada S=1 e R=0 do Flip-Flop SR "interno". Com isso terminamos com Q=1 e Q'=0.

     * Se Q=1 e Q'=0: Neste caso a saída da porta AND de cima é 0 e a saída da porta AND de baixo é 1. Dessa forma temos S=0 e R=1 no Flip-Flop SR "interno". Com isso terminamos com Q=0 e Q'=1.

Agora vemos a diferença entre os dois flip-flops. Enquanto o Flip-Flop SR não aceitava as duas entradas sendo 1 simultaneamente, o Flip-Flop JK aceita. Quando isso acontece, o Flip-Flop JK inverte o estado das saídas. Assim, se a saída Q era 1 passa a ser 0 e, se a saída Q era 0, passa a ser 1. Neste caso percebemos novamente a importância de um sinal de Clock. Caso não houvesse clock, se colocássemos 1 em ambas as entradas do Flip-Flop JK, a saída ficaria alternando rapidamente, pois não haveria um sinal para sincronizar a operação deste flip-flop.

E por hoje era isso. Nos vemos ano que vem, e que venha 2013. Abraço e continuem estudando. Qualquer dúvida, sugestão ou correção, usem os comentários. Fui!

segunda-feira, 24 de dezembro de 2012

Fim de 2012

Enfim, o mundo não acabou, mas o ano está prestes a acabar. Fazendo um balanço desse ano, posso afirmar que foi um período bom, tanto para o blog quanto para minha vida pessoal e profissional.

Então desejo a todos que lêem este blog um feliz natal e um próspero ano novo, cheio de muita felicidade e conhecimento. Torço por um 2013 cheio de oportunidades para todos nós, e que possamos nos encontrar muitas vezes neste espaço.

Abraço e continuem estudando. Até 2013. \o/

sábado, 8 de dezembro de 2012

Iluminação Ep. 6: LED

Hoje eu declaro encerrado a série de iluminação falando de um último tópico importantíssimo. O LED, que provavelmente irá marcar o futuro da iluminação moderna. Vamos entender o que ele é então.

O LED é um dispositivo semicondutor que emite luz. Sua sigla significa Light Emitter Diode, ou seja, Diodo Emissor de Luz. Ele é realmente um diodo, que produz uma queda de tensão quando diretamente polarizado e a corrente que passa por ele nessa situação produz luz. O link abaixo possui explicações interessantes sobre o funcionamento físico e químico do LED e do processo de dopagem de material.

http://www.chemistry.wustl.edu/~edudev/LabTutorials/PeriodicProperties/MetalBonding/MetalBonding.html

Além disso há vários tipos de LED. Existem LED's bicolor, tricolor, infra-vermelho, ultra-violeta, RGB (que não deixa de ser tricolor também). Há também vários tamanhos, como 3mm, 5mm e 10mm, e também vários formatos, como redondo e retangular. Ou seja, a variedade de LEDs existente é enorme. Para os LEDs vale a seguinte regra: Pense em um LED. Ele provavelmente existe.

No começo de sua história, o LED foi usado exclusivamente para sinalização. Ele era usado em alguns equipamentos para mostrar o estado de seu funcionamento. Mas não era realmente levado a sério como tecnologia em iluminação pois ainda estava numa fase primitiva.

Com o passar do tempo foi começado a pensar na iluminação em LED com interesse comercial. Isso culminou em empresas que hoje investem nessa tecnologia em lâmpadas. Estima-se que até 2020 cerca de 90% de toda a iluminação seja feita com tecnologia LED. Então, vamos dar uma olhada nas características técnicas desse tipo de lâmpada.

* Eficiência Energética: Bastante Alta. A eficiência energética de um LED é sua grande vantagem. Lâmpadas de LED tem, facilmente, 80% de eficiência e uma nova tecnologia de LEDs, chamada de OLED (Organic LED) promete uma eficiência muito maior.

* Durabilidade: A duração de um LED pode chegar a até 100 mil horas, batendo facilmente a duração de Lâmpadas Incandescentes e Fluorescentes.

* Temperatura de Cor: A luz da lâmpada de LED é muito mais branca que da Lâmpada Incandescente, produzindo uma iluminação melhor.

* Custo: O custo do investimento incial ainda é alto. Mas com o passar do tempo, se o público realmente se interessar pela aquisição desses produtos, o preço com certeza cairá.

E para terminar, gostaria de mostrar a minha lâmpada de LED, que está na imagem abaixo. Eu a fiz no final do ano passado (2011) sob a orientação do meu professor e acabei apresentando-a na feira de tecnologia daquele ano.



Enclausurada na parte do soquete está uma fonte chaveada cuja saída possui 24V com capacidade para 500mA, entregando 12W para o conjunto de 140 LED's brancos de alto-brilho. A potência consumida pela lâmpada da rede elétrica não foi medido, mas não deve ultrapassar  15W, devido à alta eficiência da fonte chaveada. Outros cálculos, como fator de potência, também não foram efetuados na época da construção e eu tenho preguiça de calculá-los hoje. :)

A imagem abaixo mostra ela acesa. Pode-se perceber que ela não deixa nada a desejar no quesito de iluminação. A fonte chaveada foi construída usando alguns dos componentes de reatores de lâmpadas fluorescentes queimadas, o que é bom, devido a reciclagem de componentes que acabariam, provavelmente, não recebendo o destino correto.



Enfim, depois de meses terminei a série iluminação. Espero que tenha esclarecido muitas dúvidas. Caso alguém tenha alguma sugestão, crítica ou dúvida, por favor: deixe um comentário. Abraço, se cuidem e boas festas de fim de ano para todos.