quarta-feira, 25 de maio de 2011

Programação em C para PIC - III



Olá todos, hoje vou continuar a falar sobre a programação de microcontroladores, abordando as portas lógicas.

PORTAS LÓGICAS

De maneira bem abrangente podemos dizer que as portas lógicas são o fundamento do processamento digital. Elas estão relacionadas às operações matemáticas que podem ser efetuadas no sistema binário. Estas operações são chamadas de álgebra booleana (ou aritmética computacional), em homenagem à GEORGE BOOLE, matemático e filósofo.

LÓGICA DIGITAL

Assim como temos as quatro operações básicas da álgebra decimal, temos também as operações básicas da álgebra booleana, que são:

 1- E (and); corresponde à "multiplicação"
 2- OU (or); corresponde à "adição"
 3- NÃO (not); corresponde à "inversão"
 4- OU EXCLUSIVO (xor); corresponde à "adição especial"

Vamos ver cada uma destas operações com mais detalhes:

E (AND):

Corresponde à multiplicação na álgebra booleana. É também chamada de conjunção lógica. O valor binário 0 ao ser multiplicado resulta sempre 0. Deste último fato e lembrando que binário possui apenas dois digitos (0 e 1), podemos concluir com facilidade que o resultado de uma operação E (multiplicação) só será igual a 1 se todos os fatores forem iguais a 1, ou seja:

A x B = Resultado

OU (OR):

Corresponde a adição na álgebra booleana. É também chamada de disjunção lógica. Lembrando que 0 é o elemento neutro da soma, concluímos que, sempre que temos o valor 1 somando, teremos sempre um resultado igual a 1. Mas e quando acontece 1 + 1? Neste caso o resultado continua sendo igual a 1, pois em binário não podemos ter o algarismo 2 e o resultado destas operações não pode ter uma quantidade de algarismos (bits) maior do que as entradas (A e B) têm.

A + B = Resultado
NÃO (NOT):

 Esta operação é uma simples inversão e possui apenas uma entrada para uma saída. Quando a entrada assume valor 1 (H) a saída vai a 0 (L) e vice-versa.


= Resultado (note a barra em cima do A)


OU EXCLUSIVO (XOR):

Esta é uma soma diferenciada. É também chamada de disjunção exclusiva. Resulta um valor alto (1) se, e somente se, uma das entradas for diferente da outra. Ou seja:

A B = Resultado (perceba o círculo em torno do sinal de +)



Estas são as quatro operações básicas da álgebra booleana. Juntando-se várias operações podemos ter várias outras tabelas-verdade (o nome dado às tabelas acima).

Estas operações matemáticas podem ser efetuadas através de circuitos eletrônicos (circuitos digitais). Estes "blocos" de circuitos correspondem às PORTAS LÓGICAS.

Vejamos como fica cada operação em circuitos digital e em representação de portas lógicas:

PORTA AND:

CIRCUITO ELÉTRICO EQUIVALENTE ----SIMBOLOGIA DA PORTA LÓGICA






PORTA OR:

CIRCUITO ELÉTRICO EQUIVALENTE ----SIMBOLOGIA DA PORTA LÓGICA





PORTA NOT:

CIRCUITO ELÉTRICO EQUIVALENTE ----SIMBOLOGIA DA PORTA LÓGICA

 


PORTA XOR:

CIRCUITO ELÉTRICO EQUIVALENTE ----SIMBOLOGIA DA PORTA LÓGICA




Estas quatro operações são muito importantes, uma vez que são o fundamento de toda a lógica digital.

Além destas temos as associações entre as diversas portas lógicas que podem formar as mais variadas tabelas verdades, mas isso já é assunto da próxima postagem: Álgebra Booleana.

Até lá, fiquem com Deus.

sexta-feira, 15 de abril de 2011

Subníveis de energia - orbitais

    Olá a todos, trago hoje uma postagem não muito convencional no meu blog, pois trata-se de um assunto do campo da química, mas de muita importância para o estudo dos fenômenos elétricos. O vídeo a seguir mostra como funcionam os orbitais de um átomo. Para quem não sabe um orbital é a região do espaço onde há a probabilidade de encontrar elétrons. Cada orbital recebe um nome em função de seu formato: s, p, d e f, e pode conter um número máximo de elétrons:
s  = 2
p = 6
d =10
f  =14
 
 

      Até a próxima pessoal.

sexta-feira, 8 de abril de 2011

Programação em C para PIC - II


    Olá amigo, nesta segunda postagem da série sobre os fundamentos da programação em C para PIC vamos ver como se faz a conversão entre as bases numéricas e os primeiros conceitos de lógica digital.

CONVERSÃO DE BASES NUMÉRICAS

    Agora que já aprendemos como funcionam as bases numéricas precisamos descobrir como podemos converter os valores entre as bases numéricas, pois um conjunto de zeros e uns pode dizer muita coisa a uma máquina, mas não nos é muito significativo.


CONVERSÃO BINÁRIO - DECIMAL 

    A conversão de um número que está na base binária para a base decimal é muito simples, basta apenas decompô-lo em potências de base 2. Observe o exemplo:

1011 0110b =
1.2^7 + 0.2^6 + 1.2^5 + 1.2^4 + 0.2^3 + 1.2^2 +1.2^1 + 0.2^0 =  (perceba que 2^2 = 2²)
2^7 + 2^5 +2^4 + 2^2 + 2^1=
128 + 32 + 16 + 4 + 2 =
182d

   Note que a posição do algarismo binário indica o expoente que será atribuído ao 2.




CONVERSÃO DECIMAL - BINÁRIO

    A conversão de um número em decimal para um número binário também é muito simples, basta realizar sucessivas divisões por 2 tomando o valor do resto e tornando a dividir o quociente.


    No exemplo acima tomamos os valores dos restos das divisões, começando da última para a primeira e formamos o número 182d em binário ou seja 1011 0110b.



CONVERSÃO HEXADECIMAL - DECIMAL

     Para converter um número hexadecimal para a base decimal usamos o mesmo artifício usado acima, ou seja multiplicamos cada digito do número hexadecimal pelo número 16 elevado ao valor de sua posição e ao final somamos os resultados parciais, ou seja:

    Lembre-se que os valores das letras no hexadecimal são:

A = 10;
B = 11;
C = 12;
D = 13;
E = 14;
F = 15;



CONVERSÃO DECIMAL - HEXADECIMAL

    Para transformar um número decimal em hexadecimal podemos usar o mesmo procedimento descrito anteriormente para a base binária, usando agora o divisor 16. Exemplo:




CONVERSÃO HEXADECIMAL - BINÁRIO (BINÁRIO - HEXADECIMAL)

    A conversão entre as bases hexadecimal e binária é extremamente simples e nem requer cálculos. A base hexadecimal é uma forma de facilitar a escrita de números binários, pois cada conjunto de quatro alagrismos binários equivalem a um algarismo hexadecimal (2^4 = 16), assim:

    Para a substituição dos algarismos, basta observar a tabela de conversão abaixo:




REPRESENTAÇÃO DAS BASES NUMÉRICAS

    Quando utilizamos várias bases numéricas ao mesmo tempo na hora da programação e escrevemos para o nosso programa contar até 100, não sabemos se ele irá contar até 3 (se 100 estiver na base binária), se até 100 (decimal), ou até 256 (na base hexadecimal). Desta forma devemos sempre indicar qual a base do número que estamos utilizando.
    Para representar um número hexadecimal geralmente utilizamos $ ou 0x ou h, e para representar um número binário % ou 0b ou B:

Hexadecimal -> $16FA ou 0x16FA ou 16FAh
Binário -------->  %1001 ou 0b1001 ou 1001B

   Se um número não tiver nenhum sufixo ou prefixo subentende-se que é número decimal.

BIT E BYTE

    Até agora o assunto foi puramente matemático. Mas agora vou introduzir as noções de bit e byte, que são os fundamentos da eletrônica digital.
    O bit é o algarismo binário, ou seja, o digito binário.

BIT = Binary digIT

    Supondo o número 1001 0110b os bits são cada um dos algarismos deste número, assim:

    O byte é um agrumento de 8 bits. Como os bits correspondem aos algarismos o byte corresponde aos números. Desta forma todas as operações matemáticas podem ser feitas utilizando os bytes.
    No byte cada algarismo tem um valor relacionado a sua posição, assim como acontece com os números decimais. No número 222, por exemplo, os algarismos são iguais, mas seus valores são diferentes por ocuparem posições diferentes: o 2 à esquerda vale mais que o 2 central, que vale mais que o 2 à direita.
    Em um byte temos duas posições que chamamos de MSB e LSB, respectivamente "bit mais significativo"  e "bit menos significativo". Essa nomenclatura refere-se ao fato de suas posições serem as duas extremidades do byte, ou seja, o bit 7 e o bit 0.


    Outra nomenclatura importante é o NIBBLE. O nibble é a metade de um byte. Assim temos dois nibbles em cada byte, e dizemos "high nibble" e "low nibble".


     Por enquanto é isso pessoal, na próxima postagem vamos ver como funcionam as portas lógicas.
     Deus abençõe e até mais.

sexta-feira, 1 de abril de 2011

Programação em C para PIC - I


INTRODUÇÃO

   Bom dia a todos os hobbistas e técnicos, engenheiros, eletricistas, cientistas, etc.etc..etc... (no final das contas somos somente metidos hehe).

   Vou começar agora uma série com o objetivo de ensinar os princípios básicos da programação em C, haja vista que é a linguagem mais utilizada atualmente por padrão para microcontroladores PIC.

   Pode-se dizer que esta é a linguagem mais simples e cômoda para quem precisa montar circuitos que requeiram um controle mais complexo, pois, na prática, você não precisa preocupar-se com os dados que o núcleo do controlador irá efetuar (CPU), mas com o tratamento que deverá ser dado entre a entrada e a saída, uma vez que a "tradução" para o código de máquina será feito pelo compilador. 

   Nesta série de postagens irei me basear no livro PIC Microcontrollers - Programming in C da Mikroeletrônica.


HISTÓRICO

   O desenvolvimento inicial de C ocorreu no AT&T Bell Labs entre 1969 e 1973. Não se sabe se o nome "C" foi dado à linguagem porque muitas de suas características derivaram da linguagem B e C é a letra conseguinte no alfabeto, ou porque "C" é a segunda letra do nome da linguagem BCPL, da qual derivou-se a linguagem B.

   C foi originalmente desenvolvido para a implementação do sistema Unix (originalmente escrito em PDP-7 Assembly, por Dennis Ritchie e Ken Thompson). Em 1973, com a adição do tipo struct, C tornou-se poderoso o bastante para a maioria das partes do núcleo do Unix, serem reescritas em C. Este foi um dos primeiros sistemas que foram implementados em uma linguagem que não o Assembly, sendo exemplos anteriores os sistemas: Multics (escrito em PL/I) e TRIPOS (escrito em BCPL). Segundo Ritchie, o período mais criativo ocorreu em 1972.



MICROCONTROLADOR x MICROPROCESSADOR

   Iniciantes em programação geralmente acham que estes dois componentes são idênticos, mas isso não é verdade. A maior diferença a favor do microcontrolador é a sua funcionalidade, uma vez que o microprocessador precisa de muitos componentes externos para funcionar, tais como memória RAM, EEPROM, conversores A/D, oscilador (clock) e drivers para comunicação com outros dispositivos. No microcontrolador estes componentes (chamados de periféricos), já estão todos "embutidos" na mesma pastilha, o que economiza tempo e espaço na confecção de um projeto. 

Exemplo de microcontrolador (ds 8051) mostrando seus periféricos.



   O microcontrolador evita o excessivo trabalho manual do hobbista já que nele é possível implementar diversos tipos de lógica usando o mesmo chip e os mesmos terminais, pois praticamente todo o trabalho será realizado no momento da programação. Isto também possibilita futuros aperfeiçoamentos, uma vez que é possível reprogramar o componente uma infinidade de vezes e depois basta reinserí-lo no soquete: pronto! está feito o upgrade do firmware.


BASES NUMÉRICAS

   Bases numéricas são as diferentes notações que podemos usar para representar quantidades. As mais comuns são a decimal, binária e hexadecimal.

1-BASE DECIMAL: A base decimal é a que estamos acostumados a utilizar. Ela utiliza a base 10, tendo algarismos que vão de 0 a 9, ou seja 0,1,2,3,4,5,6,7,8,9. O número 10 significa que cada posição dos algarismos tem um valor 10 vezes maior que seu anterior. Veja como podemos decompor o número 1472 na base decimal:

1472 =
2 + 70 + 400 + 1000 =
2.10º + 7.10¹ + 4.10² + 1.10³

2-BASE BINÁRIA: Assim como a base decimal é aquela que nós estamos acostumados a utilizar, a base binária é aquela que os sistemas digitais utilizam, pois apenas são possíveis dois estados em um mesmo condutor. A base binária caracteriza-se por ter apenas 2 algarismos: 0 e 1, em que cada uma das posições dos algarismos do número tem um valor 2 vezes maior que o anterior. Veja como podemos ter o número 10111001 decomposto:

10111001 =
1.2^7 + 0.2^6 + 1.2^5 + 1.2^4 + 1.2^3 + 0.2^2 + 0.2^1 + 1.2^0

Desta forma fica bem fácil converter este número para um decimal. Vejamos:

10111001 =
1.2^7 + 0.2^6 + 1.2^5 + 1.2^4 + 1.2^3 + 0.2^2 + 0.2^1 + 1.2^0 =
128 + 0 + 32 + 16 + 8 + 0 + 0 + 1 =
185

Assim: 10111001b = 185d.

3-BASE HEXADECIMAL: Esta base é bastante utilizada em programação por ser uma forma mais simples de escrever um número binário. Ela utiliza 16 algarismos: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F, onde cada posição dos algarismos tem um valor 16 vezes maior que o anterior. Os algarismos A, B, C, D, E, F equivalem respectivamente a 10, 11, 12, 13, 14 e 15 em decimal. Vejamos como fica o número 25BD:

25BD =
2 . 16³ + 5.16² + B.16¹ + D.16º =
8192 + 1280 + 176 + 13 =
9661d

Agora observe o comportamento do número 25BD quando convertido para binário:

25BD =
2.16³ + 5.16² + B.16¹ + D.16º =                                                          [como 16 = 2^4]
2.(2^4)^3 + 5.(2^4)^2 + B.(2^4)^1 + D.(2^4)^0 =2.2^12 + 5.2^8 + B.2^4 + D.2^0 =   
(2^1).2^12 + (2^2 + 2^0).2^8 + (2^3 + 2^1 +2^0).2^4 + (2^3 + 2^2 + 2^0).2^0 =
2^13 + 2^10 + 2^8 + 2^7 + 2^5 + 2^4 + 2^3 + 2^2 + 2^0 =             [binário = 0 ou 1]
10010110111101b

Observe que:

25BDh = 0010 0101 1011 1101b

   Isto é, cada algarismo hexadecimal corresponde a 4 algarismos em binário. Por isso usamos a base hexadecimal em programação: para evitar os "zeros" e "uns" tão facilmente confundíveis e para não ter o trabalho de digitar um número extenso.


CODIFICAÇÃO BCD - Binário Codificado em Decimal

   É uma forma de facilitar a comunicação com periféricos que tem de receber os números em binários já divididos em potências de 10.

   Assim a cada 4 algarismos binários temos um número que corresponde a um algarismo decimal.

   Observe como fica o número 1340d em BCD:

1340d = 0001 0011 0100 0000

   Percebeu a diferença do BCD para o binário? No BCD podemos ter conjuntos de 4 algarismos que variam até um máximo de 0101 = 9d , enquanto no binário o máximo é de 1111 = Fh.

   Até a próxima postagem pessoal, em que irei falar sobre a conversão entre bases numéricas e os conceitos básicos da lógica digital. 
   Que Deus abençõe vocês. 

domingo, 2 de janeiro de 2011

Downloads

Por serem muito úteis eu resolvi colocar uma postagem para as páginas de dowload de vários programas eletrônicos.
Embora haja testado muitos deles não me responsabilizo por danos, e/ou erros decorrente do uso dos mesmos.

WinPic800-http://www.winpic800.com//descargas/WinPic800.zip
O winpic800 serve para gravar a maioria dos microcontroladores microchip.

CircuitMaker-http://www.baixatudo.com.br/circuitmaker-student-version#
Trata-se de um simulador de circuitos eletrônicos

Virtual Breadboard-http://www.virtualbreadboard.net/VBB/Download/tabid/150/Default.aspx
Outro útil simulador free, este inclui alguns microcontroladores PIC e o Arduíno

RFSim99-http://electroschematics.com/wp-content/uploads/2008/12/rf-sim-99.zip
Simulador para circuitos de RF

Coilmaestro-http://www.electronicecircuits.com/download/software/coilmaestro%20inductance%20calculator.zip
Este programa é útil na construção de indutores sob medida

RComSerial-http://www.rogercom.com.br/PortaSerial/PortaSerial.htmO RcomSerial é um software para testar dispositivos que se comunicam através da Porta Serial RS232, como projetos baseados em microcontoladores. Também pode se utilizado para enviar alguns comandos para a placa de Fax-Modem e testar sua funcionalidade.

MicroC-http://www.mikroe.com/eng/downloads/get/29/mikroc_pro_pic_2011_v460_setup.zip
Excelente compilador de C para microcontroladores PIC

MPLAB-http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en019469&part=SW007002
Ambiente integrado para desenvolvimento de projetos com PIC

Geogebra-http://www.geogebra.org/cms/en/installers
Excelente programa para plotar gráficos de funções, inclusive função derivada e integral

Kicad-http://www.lis.inpg.fr/realise_au_lis/kicad/
Programa para desenho de circuitos e placas eletrônicas.

Deus abençõe vocês,

Leandro da Silva

Circuito inversor de polaridade


Bom dia a todos,
Estava em busca de coisas novas na net e encontrei um circuito simples para inverter a polaridade de fontes de alimentação em relação ao terra.
Em circuitos como este geralmente não se pode exigir grandes intensidades de corrente, e geralmente são úteis quando existem etapas de pré-amplificação com alimentação simétrica ou coisas afins.
O circuito é o seguinte:

Se desejar uma saída estabilizada pode usar reguladores de tensão 7905 ou 7912.

Leandro da Silva

Referência
http://www.eletronica.com/inversor-de-polaridade/ 

Protocolo I2C

O I2C é um protocolo de comunicação serial que foi criado por Philips Semiconductors em meados de 1996 com o objetivo de compor uma interface simples e padronizada.
Trata-se de uma comunicação bidirecional, com taxas de transferência de até 400kbits/s.
Este protocolo permite a comunicação entre diversos componentes através de um barramento de duas vias: uma de clock e outra de dados, tratando-se então de uma comunicação síncrona.
A princípio o protocolo I2C foi utilizado para interligar periféricos em uma mesma placa de circuito impresso, mas com o passar do tempo passou a ser utilizada para interligar outros periféricos, mesmo que eles não estivessem na mesma placa de circuito impresso.
Neste tipo de protocolo o dispositivo que irá começar a comunicação é o Mestre, podendo existir vários Escravos.

No protocolo I2C temos:
1-A linha de dados é chamada de SDA;
2-A linha de clock é chamada de SCL;
3-As linhas de SCL e SDA são colocadas em nível alto através de resistores de pull-up, por isso para deixá-las em nível alto bastá deixá-las em aberto;
4-O pino de dados (SDA) deve apenas ser colocado em nível baixo pelo Mestre e pelo Escravo, se for utilizar microcontrolador prefira as portas que sejam open-collector;
5- A velocidade de transferência depende exclusivamente da velocidade do clock (SCL);
6-A leitura de SDA deve ser feita enquanto a linha de SCL estiver em nível alto;
7-As mudanças de estado em SDA devem ser feitas enquanto a linha SCL estiver em nível baixo;
8-Somente o Mestre atua sobre a linha de SCL;

DIAGRAMA DE SINAIS DO BARRAMENTO I2C


A rotina para adquirir/enviar dados do/para o Escravo é a seguinte:

1°-O Mestre deve enviar o sinal de Start. Para tanto basta deixar a linha de clock (SCL) em nível alto (aberta) enquanto a linha de dados (SDA) passa de alto para baixo;
2°-O Mestre envia 7 bits de endereçamento. O Mestre é quem envia o SCL. Lembre-se: sempre que for enviar um bit mude o estado de SDA enquanto a linha de SCL estiver baixa, mude o estado de SCL para alto, espere, mude SCL para baixo, e daí já pode enviar o novo bit;

3°-O Mestre deve enviar um bit para o Escravo saber se vai ser feita um leitura ou uma escrita o bit R/W. 0 para leitura, e 1 para escrita;

4°-O Escravo envia o bit de ACK (aknowledge), para a confirmação de recebimento do byte. Para isso o Mestre deve deixar a linha de SDA em aberto. Se ACK=0 o byte foi recebido, se ACK=1 o byte não foi recebido;

5°-O Mestre (ou Escravo) irá enviar a sequencia de 8bits de dados, o qual será seguido de um sinal de ACK proveniente do Escravo (ou Mestre). Cada bit enviado (recebido) é feito sincronizado com o sinal de SCL vindo do Mestre;

6°-O Mestre envia o sinal de Stop. Para tanto basta deixar o SCL em nível alto enquanto o SDA passa de baixo para alto;
O protocolo I2C é muito utilizado em sensores, sintonizadores, e memórias EEPROM seriais. Veja que a comunicação entre Mestre e Escravo é muito simples e pode ser feita em qualquer velocidade até 400kbits/s (a velocidade é determinada pelo dispositivo Mestre que comanda a linha de SCL).
Uma boa idéia para quem utiliza microcontroladores é fazer a transmissão e a recepção do sinal no laço Main (principal) e o restante do programa na interrupção por estouro de timer, uma vez que o I2C não exige uma velocidade fixa de trasmissão.
Esta postagem é apenas uma ajuda para quem nunca utilizou o protocolo I2C. Se você for utilizar algum dipositivo I2C é imprescindível que você leia o datasheet, pois lá você encontrará informações detalhadas sobre seu componente.
Espero que este tutorial seja de grande ajuda aos projetistas que desejam utilizar dispositivos I2C em seus projetos.


Que Deus abençõe,

Leandro da Silva

Referências

[1] LEÃO, Humberto Caio Camilo. SISTEMA DE MEDIÇÃO, CORTE E RELIGAMENTO DE ENERGIA, UTILIZANDO O PADRÃO IEEE 1451. Belém, 2006;

[2]http://www.best-microcontroller-projects.com/i2c-tutorial.html. AN I2C TUTORIAL.