Mostrando postagens com marcador MICROCONTROLADORES. Mostrar todas as postagens
Mostrando postagens com marcador MICROCONTROLADORES. Mostrar todas as postagens

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