quarta-feira, 27 de abril de 2016

Microprocessadores x Microcontoladores... Existe diferença?

Depois de falar sobre o básico da eletrônica digital, está na hora de falar um pouco sobre circuitos mais complexos.
Neste post vamos identificar e diferenciar Microprocessadores e Microcontroladores assim como seus possíveis usos.

Microprocessador: O "Cérebro" da computação.

Para que um circuito eletrônica possa realizar alguma tarefa de forma organizada é necessário que ele seja programado, um programa é uma sequência de regras lógicas a serem seguidas com o objetivo de realizar alguma atividades.
Um circuito que realiza essa atividade é chamado de Microprocessador, ele é o que chamamos de "Cérebro" do computador ou equipamento, já que ele é quem segue a sequência que foi determinada previamente.
Para que um programa seja executado ele precisa estar armazenado em algum lugar, nos microcomputadores eles ficam em uma memória externa como um Disco Rígido, Pendrive ou Mídia de CD/DVD. Mas esse programa não pode ser executado pelo microprocessador enquanto está nesse tipo de armazenamento, então a forma de executar um programa é fazer uma cópia do seu conteúdo para a memória principal (também chamada de memória RAM).
Dessa forma vemos que o "Cérebro" possui uma unidade que interpreta as instruções (Microprocessador) e outra que "lembra" dessas informações (As memórias RAM ou ROM).
Vamos criar um exemplo fictício e didático apenas para mostrar como os comandos poderiam ser tratados e executados por um Microprocessador, antes veja as seguintes considerações importantes sobre este exemplo:
1) Cada instrução possui um valor numérico equivalente, já que na memória só é possível armazenar números.
2) Um registrador interno é o local dentro do Microprocessador onde um valor pode ser armazenado temporariamente.
3) A memória é endereçada por meio de números (nesse exemplo usei a notação decimal, mas o comum é usar em hexadecimal).
4) Nesse exemplo tanto o programa como os dados são armazenados na mesma memória, mais adiante mostrarei que isso depende da arquitetura do Microprocessador.
5) Cada instrução aqui está ocupando dois bytes, mas em um caso real diferentes instruções usam quantidades diferentes de bytes, isso só depende de como o Microprocessador foi projetado. O primeiro byte indica qual instrução deve ser executada e o segundo indica qual o parâmetro para essa instrução.
6) O endereçamento inicial é a posição de memória 01 e será assumido como o endereço inicial para que a rotina seja executada, geralmente os endereços reais começam em zero. Esse programa já está armazenado em algum tipo de memória acessível ao Microprocessador como ROM, RAM ou Flash.

Considerações sobre portas de entrada/saída nesse exemplo:
A porta 01 está ligada um botão e o valor lido nessa porta pode ser 0 (botão não pressionado) ou 1 (botão pressionado)
A porta 02 está conectada a um LED, quando a porta estiver em 0 o LED estará apagado e quando estiver em 1, aceso.
obs: em um dispositivo real é provável que sejam necessários diversos circuitos extras para ligar tanto as portas de I/O quanto às memórias RAM ou ROM ao Microprocessador, mas não vamos abordar esse assunto aqui por enquanto.

As instruções disponíveis no microprocessador são:
    Código da instrução: Mnemônico - Descrição
    01: IN  XX - Leia o estado da porta XX e armazene em um registrador interno.
    02: CMP XX - Compare o valor do registrador interno com o valor XX.
    03: JE  XX - Se a última comparação foi igual, pule para o endereço XX.
    04: OUT XX - Armazena o valor do registrador interno na porta XX.
    05: JMP XX - Salta para o endereço XX.
    06: MOV XX - Movimenta o valor XX para dentro do registrador interno.
    07: LD  XX - Carrega para o registrador o conteúdo da memória em XX.
    08: ST  XX - Armazena na memória em XX o valor do registrador interno.

obs: Mnemônicos são representações na forma de siglas dos comandos que são entendidos por um Microprocessador, esse conjunto é definido pelo fabricante e equivale a uma configuração de bits que instrui como devem ser executados os comandos.

O programa a seguir verifica se o botão está pressionado, se estiver faz com que o LED fique piscando.   
    Posição: Conteúdo - Mnemônico # Comentário
    01: 06 00  -  MOV 00  #  Zera o registrador
    03: 08 31  -  ST 31   #  Armazena o zero na variável
    05: 01 01  -  IN  01  #  Lê o valor da porta 1 (botão)
    07: 02 00  -  CMP 00  #  Verifica se botão não pressionado
    09: 03 05  -  JE 05   #  Se não estiver, salta para INI
    11: 07 31  -  LD 31   #  Lê a variável
    13: 02 00  -  CMP 00  #  Compara se é zero
    15: 03 23  -  JE  23  #  Pula, se for zero
    17: 06 00  -  MOV 00  #  Coloca 0 no registrador
    19: 08 31  -  ST 31   #  Salva na variável
    21: 05 27  -  JMP 27  #  Volta para piscar o LED
    23: 06 01  -  MOV 01  #  Coloca 1 no registrador
    25: 08 31  -  ST 31   #  Salva na variável
    27: 04 02  -  OUT 02  #  Alterna o LED na porta 2
    29: 05 05  -  JMP 05  #  Volta para o início
    31: 00


A primeira coluna mostra o número do endereço de memória, em seguida vem os bytes que representam o código a ser entendido pelo Microprocessador e em seguida o seu parâmetro.
Tente ler o código e observar como o programa se comporta.

Observe que a posição 31 não possui instrução, ela é usada como um local de armazenamento de dados, contém o estado atual do LED (aceso ou apagado) para fazer ele piscar. Essa arquitetura que armazena programas e dados na mesma memória é chamada de arquitetura de Von-Neumann e é usada nos microprocessadores dos computadores pessoais da atualidade. Isso quer dizer que quando usamos uma memória RAM ela é usada para armazenar tanto os programas que serão executados quanto os dados que são usados por estes programas.
Mas existe também a arquitetura Harvard em que o Microprocessador possui uma ligação com um barramento de memória para programas e outro barramento diferente para dados. Isso significa que eles não são armazenados no mesmo local. Cada uma possui suas vantagens e desvantagens características.

Esse tipo de codificação de comandos em mnemônicos é conhecido como linguagem Assembly, o programa que faz a "montagem" (ou seja, converte os mnemônicos em valores binários entendíveis pelo Microprocessador) são chamados de Assembler, como os mnemônicos variam de um Microprocessador para outro, a linguagem Assembly também varia. Na prática podemos criar os programas usando uma linguagem de programação mais simples e de mais alto nível, como a linguagem C, por exemplo, e usar um programa chamado "compilador" para converter nosso programa que está escrito na forma de texto em um arquivo binário que contém as instruções que o Microprocessador entendem e que são equivalentes ao programa que escrevemos.

Microcontrolador: Mais próximo ao Hobby e ao hardware.

Agora vamos falar um pouco sobre os Microcontroladores. Estes circuitos integrados são muito importantes para quem quer usar a eletrônica como hobby, eles implementam um pequeno computador quase completo em um único circuito integrado. Em geral eles possuem um Microprocessador, memória RAM, memória Flash (onde os programas são armazenados e executados), portas de I/O digitais, alguns possuem portas analógicas e PWM (esse último tipo vale uma postagem só sobre esse assunto, vou deixar para explicar depois).
Dentre os circuitos Microcontroladores mais usados na atualidade temos a linha PIC da Microchip e os AVR da Atmel que são o núcleo das famosas placas Arduino.
Os Microprocessadores da linha ARM são os mais comuns em dispositivos móveis como Smartphones e Tablets, mas geralmente a indústria não utiliza esse Microprocessador na forma de um circuito integrado discreto, geralmente eles utilizam um circuito chamado SoC (System on Chip) onde além do Microprocessador eles colocam no mesmo integrado outros circuitos para controlar o acesso à memória, unidades de cartão SD, gráficos, touchscreen, som e etc.

Utilizar Microprocessadores em um projeto de hobby é impraticável, eles necessitam de muitos outros circuitos adicionais e tornam o projeto muito complexo. Por outro lado os Microcontroladores foram feitos para suprir essa necessidade, eles operam em uma velocidade muito inferior, possuem menos recursos mas são suficientes para a maioria dos projetos, desde pequenos robôs, impressoras 3D e drones esses circuitos podem fazer muita coisa, mas quando isso não for suficiente podemos criar um sistema híbrido (que também é um bom tema a ser explorado em outra postagem) onde podemos usar um celular como processamento central e um microcontrolador como interface com dispositivos de hardware ou controlar ele por meio de um computador usando uma comunicação WiFi.

segunda-feira, 25 de abril de 2016

Encoder... Quais são as suas prioridades?

Além do Shift Register, existem outras formas de se utilizar menos pinos digitais dos microcontoladores com o apoio de circuitos integrados externos, hoje vamos conversar um pouco sobre um circuito chamado "Encoder", com ele é possível se "ler" o valor de vários bits de entrada e indicar qual deles está ativo a partir de uma saída codificada com menos sinais.
Vamos ver como isso é feito na prática, vou usar o circuito integrado 74LS148, mas existem outros Encoders com características diferentes no mercado. Esse CI possui oito sinais de entrada (ou oito bits) e a saída é feita por meio de três sinais que codificam as entradas, é como se fosse feita a conversão da posição do sinal na entrada em um valor binários (com 3 bits).
A entrada ativa é indicada por um sinal em nível LOW e todos os outros sinais deveriam estar inativos (em nível HIGH), no caso de mais de uma entrada estar ativa com o valor LOW, o circuito decide por um processo de prioridades onde os sinais de numeração maior são considerados primeiro, ou seja, dos sinais de entrada de 0 a 7 o sinal do pino 7 é o de maior prioridade, se ele estiver ativo (em LOW) não importa se outros sinais também estão ativos, ele será o resultado.
Nas imagens abaixo você pode conferir a tabela verdade que mostra a ordem de prioridade e o símbolo desse circuito integrado. Na tabela os valores "1" equivalem a HIGH, "0" a LOW e "X" a qualquer valor.


A pinagem do circuito integrado e o diagrama interno são mostrados na figura abaixo:





sexta-feira, 22 de abril de 2016

Shift Register... chega pra lá, fazendo o favor !!!

Shift Register, um conversor de serial em paralelo.

Quando projetamos circuitos eletrônicos utilizando microcontroladores podemos nos deparar com o problema da existência de poucas portas de comunicação, uma boa solução é a utilização de um conversor de serial em paralelo, assim podemos expandir o número de saídas digitais.
Vou apresentar agora cada um dos conceitos envolvidos nesse tipo de circuito para depois juntar todas as peças desse quebra-cabeças.
Bit: Nesse circuito e em muitos outros o uso do termo bit identifica uma informação que pode ser armazenada indicando um estado lógico, como vimos nas portas lógicas, onde 0 é o mesmo que falso ou LOW (0V) e 1 é verdadeiro ou HIGH (5V).
Entrada serial: os bits são enviados um por vez usando o mesmo canal, para que o receptor saiba quando ocorre a mudança de bit pode ser usado um temporizador sincronizado ou uma fonte de sincronismo gerada pelo emissor.
Saída paralela: todos os bits carregador serialmente no registrador ficam disponíveis cada qual em sua saída individual.
Deslocamento de bit: A entrada funciona como uma fila, a cada novo bit que chega os outros que já existem são deslocados para a próxima posição, o último bit é "jogado pra fora" do circuito por uma porta para esse fim e pode ser usado para "transbordar" esse bit para a entrada de outro circuito.
Tamanho do registrador: Número de bits que podem ser armazenados, depende do tipo de circuito integrado, alguns modelos são construídos para suportar 4 ou 8 bits, mas eles podem ser "cascateados" de forma que juntos podem funcionar como um único circuito de tamanho maior.
Porta de três estados: Já vimos que existem dois estados possíveis em um sistema binário (falso/verdadeiro, 0/1, desligado/ligado, etc..) mas alguns circuitos implementam um terceiro estado que não representa nenhum dos dois casos chamado de alta impedância, é como se o circuito estivesse desconectado, isso é útil quando utilizamos uma saída comum unindo a saída de vários outros circuitos, nesse estado ele não interfere no sinal dos outros circuitos.
Clock: Entrada que dá o ritmo de leitura dos bits seriais e também faz com que os existentes sejam deslocados.
Latch: Se você acompanha o Blog deve ter lido o meu artigo sobre Latch, se ainda não leu e quiser entender mais sobre o assunto pode dar uma olhada lá, para quem não quer saber disso agora eu vou comentar brevemente, o Latch é um circuito que, quando acionado, faz uma cópia dos dados das entradas e os deixa disponíveis na saídas, depois de acionado o pulso de cópia os dados de saída não se modificam mais (como uma foto) até que seja solicitada uma nova cópia.

Juntando tudo: O Shift register é um circuito integrado onde os bits entram por uma única porta de forma serial, controlada pelo pino de clock preenchendo as posições internas do registrador por meio de deslocamento (Shift), após carregar todos os bits podemos acionar um Latch que copia todos os bits de uma vez para a saída paralela, enquanto essa saída não estiver habilitada ela estará em alta impedância, após a habilitação da saída, cada pino apresentará um sinal equivalente ao bit que foi carregado.

O circuito Shift Register é construído por meio de uma série de circuitos chamados flip-flops, cada um armazena um bit, a entrada de um é ligado na saída do seu predecessor e a saída do último vai para um dos pinos do CI que pode ser usado como entrada do próximo CI, no caso de cascateamento.
Veja a ilustração abaixo:


Cada flip-flop é ilustrado por uma caixa, o sinal CK é o clock que faz a leitura do bit em D, colocando o seu valor na saída Q, observe que o valor anterior de um flip-flop é a entrada do próximo, no exemplo existem 4 bits e a sua saída paralela está nos sinais Q0 a Q3.
O dado entra pelo SERIAL IN, a cada pulso em CK os dados são lidos e deslocados e o bit em Q3 vai para o SERIAL OUT. É como se fossem várias caixas que transferem os seus conteúdos para a caixa ao lado e a última despeja o seu conteúdo pra fora do circuito.

O Latch, quando acionado, tira uma "foto" do registrador de deslocamento e faz com que eles sejam mostrados na saída paralela, veja o diagrama abaixo que mostra a pinagem do TTL 74595 e com ele implementa o Shift Register com Latch em um único circuito integrado:


Podemos usar esse circuito integrado em nossos projetos eletrônicos, por meio de apenas 3 pinos digitais de saída podemos controlar 8 saídas digitais ou mais, bastando ligar o pino 9 (SERIAL DATA OUTPUT) no pino 11 (SHIFT CLOCK) de outro circuito obtendo assim um registrados de 16 bits e ligando em paralelo os sinais de CLOCK e LATCH.
Veja um exemplo de como usar o circuito:


Para controlar 8 LEDs o microcontrolador precisa enviar cada bit pela porta de entrada "dataPin", pulsando (alternando entre 1 e 0) o sinal na portal "clockPin" e, ao final da transferência, pulsar o sinal na portal "latchPin" para que os bits transferidos sejam enviados para as saídas controlando cada um dos LEDs individualmente.

quarta-feira, 20 de abril de 2016

Latch... O fotógrafo de bits

O Latch funciona como um buffer pra onde os dados, depois de totalmente carregados, são transferidos e ficam disponíveis para uso. Esse tipo de circuito é importante nos casos onde as entradas ficam modificando de valor até que cheguem a um estado final que interessa ser trabalhado.

Quando acionado, o latch tira uma "foto" dos sinais de entrada e faz com que eles sejam mostrados na saída. Resumindo, ele armazena a cópia da entrada em um determinado momento.

Esse circuito é composto por uma série de flip-flops tipo D que, após receber o pulso de clock CK, guardam o estado dos sinais de entrada D em sua memória e os deixa expostos na saída Q, depois de receber o pulso de clock as variações nas entradas já não influenciam mais nas saídas até que um novo pulso ocorra. Cada flip-flop D é responsável por um bit, os sinais de entrada são individuais mas veja que o pulso de clock é o mesmo para todos eles.

Vejam o esquema do CI TTL 74377, ele implementa um Latch de 8 bits, observem que existe um flip-flop D conectado a cada entrada, o sinal de clock de todos eles está ligado ao pino chamado LE (Latch Enable, que é ativo em LOW - barra acima do nome do sinal), após pulsar esse sinal os dados são copiados para as memórias internas mas só serão apresentados na saída quando os amplificadores operacionais (representados pelos triângulos) estiverem habilitados pelo sinal OE (acionado em LOW, observe que ele entra no amplificador por meio de uma porta inversora representada pela bolinha).



Abaixo está a pinagem completa do circuito 74LS377.



Uma boa aplicação para o Latch é usar em conjunto com o circuito de Shift Register pois essas entradas ficam mudando até que uma conversão de serial para paralelo seja concluída, mas isso é assunto para próxima postagem, acompanhem...

terça-feira, 19 de abril de 2016

Flip-flop... A menor memória do mundo

Existem alguns tipos diferentes de flip-flops, vou falar apenas sobre dois que são os mais utilizados em circuitos digitais, o tipo JK e o tipo D.

Primeiro é bom começar falando pra que serve esse tipo de circuito, vamos lá, esse circuito funciona como se fosse uma memória de 1 único bit, ou seja, você pode armazenar um sinal verdadeiro/falso e depois consultar o valor armazenado. Agora vamos ver como isso é possível.

O flip-flop tipo JK possui 3 entradas e 1 saída (algumas implementações colocam duas saídas mas uma é sempre o inverso da outra, então vamos ignorar isso por enquanto). A saída sempre será indicada pela letra "Q" (a saída invertida, quando existir, será indicada por um "Q" com um traço acima da letra indicando que é o inverso do sinal "Q").

Para que uma informação seja armazenada é preciso pulsar o pino de clock indicado por "CK", na verdade toda a ação ocorre exatamente no momento em que ele muda do nível LOW para o nível HIGH. No caso do tipo JK esse armazenamento é feito a partir da seguinte lógica:
1) Se os valores de J e K estão em LOW, o valor da saída não é modificado.
2) Se o valor de J é LOW e K é HIGH então a saída Q será forçada a ficar em LOW.
3) Se o valor de J é HIGH e K é LOW então a saída Q será forçada a ficar em HIGH.
4) Quando os valores de J e K estão em HIGH o valor de Q será invertido.

O outro flip-flop do tipo D ("Data" pois armazena o dado de entrada) possui um funcionamento semelhante ao JK nos pinos Q e CK, mas o armazenamento se comporta de forma diferente. Em vez de ter dois sinais de entrada "J" e "K" agora temos apenas um sinal "D" e o valor que estiver presente em "D", seja LOW ou HIGH, será transferido para a memória interna na mudança de clock.

Observe os símbolos de cada um, o sinal com um triângulo (ou seta) é o clock.


Dentre as várias implementações de circuitos integrados com flip-flops eu selecionei dois da linha TTL 74xx, o 7474 possui dois flip-flops tipo D e o 7476 com dois flip-flops JK, veja as imagens abaixo.

Se você quer entender em detalhes o funcionamento desses circuitos,analise a figura abaixo que mostra o flip-flop JK construído com portas lógicas, na internet existe muita informação sobre isso, mas esteja avisado que não é realmente necessário pra gente seguir adiante, o que realmente importa é entender o básico para prosseguir e ver como esses elementos serão aplicados nas próximas postagens.




Até a próxima !!!