Monte um gravador de PICs e de Memórias I²C Bus EEPROM

Conforme falado no Post anterior ( Monte suas próprias placas para teste dos PICs! (03) ), vamos agora mostrar um pequeno projeto de confecção de uma placa que permite a gravação tanto de PICs como de memórias seriais I²C.
Este circuito tem como características: não precisar de fonte de alimentação externa (usa a voltagem fornecida pela interface serial do computador – COM1 – por exemplo), ter três LEDs (vermelho, verde e amarelo) com uma chave liga-desliga para eles, que permitem monitorar o funcionamento do circuito (a saber – vermelho: pino 3 TX, verde: pino 7 RTS, amarelo: pino 4 DTR –> que são todos os PINOS DE SAÍDA DA SERIAL DO PC – os outros são de ENTRADA), e facilitam o desenvolvimento de programas que manipulam os pinos das interfaces seriais no computador (por exemplo, no Windows pode se utilizar o C#.NET para esta tarefa - Microsoft Visual Studio 2010 Express ).
O circuito foi idealizado para utilizar a técnica ICSP (gravação no circuito – In Circuit Serial Programming) permitindo uma grande facilidade de uso, utilizando para isto 5 pinos a saber: VCC (em torno de +5V – obtido do pino 3 TX), GND (negativo/terra – pino 5 GND), VPP (+13V –> ideal, o PIC pode ser programado de +10V (mínimo) à +13V (máximo) – obtido do pino 3 TX), PGD (Dados – DTR do circuito – pino 4) e PGC (Clock - RTS do circuito – pino 7).
Existe um artigo interessante na web ( Details of pic ICSP and how to use it for pic microcontrollers ) que mostra como proteger o circuito de teste quando for gravar com o circuito ICSP, e também um pdf da Microchip sobre o assunto (  In-Circuit Serial Programming™ ). Neste projeto, para simplificar, existe uma pequena placa, que possui um soquete de 14 pinos com um PIC ( PIC16F688 ) e um conector em barra com 5 pinos para o gravador, simplificando a demonstração do gravador – este serve para qualquer PIC, desde que se conecte os 5 pinos da placa aos respectivos sinais do gravador – veja a documentação e pinagem do PIC que se quer utilizar.
Importante é a escolha do software que irá fazer uso do gravador – existem várias opções, vamos citar algumas:
1 – IC-Prog Prototype Programmer;
2 – winpic800;
3 – WinPicProg;
4 – WinPic – A PIC Programmer for Windows;
5 – PonyProg – serial device programmer;
6 – PICPgm – PIC Development Programmer;
7 – MPLAB IDE da Microchip;

Vamos então escolher o WinPic800 para a nossa demonstração. Baseado no arquivo .hex do artigo ( Projeto-Lanterna-de-5-LEDs.zip ), vamos então abrí-lo:

A – Executar o programa (Note que já está configurado para Hardware JDM – Mensagem no rodapé, e também já escolhido o PIC16F688 – canto superior direito): – clique na imagem para ampliar!

B - Carregar o programa (arquivo .hex – observe a mensagem no rodapé): – clique na imagem para ampliar!

C - Por motivo de segurança, vamos apagar o que estiver no PIC: – clique na imagem para ampliar!

D - Agora, a programação do PIC: – clique na imagem para ampliar!

         

E - Agora, a etapa de verificação para saber se ele foi corretamente gravado no PIC: – clique na imagem para ampliar!

         

Vamos então escolher agora o IC-Prog para a nossa demonstração da gravação no CI de memória ( 24C16 ). Vou criar no PC um arquivo no formato Hexadecimal com o utilitário Hex Editor Neo 4.95 (da HHD Software ) a ser gravado no 24C16 (o tamanho é de 2kBytes = 16KBits), preenchido com “ok”:

A – Executar o programa Hex Editor Neo (gerar o arquivo a ser gravado!): – clique na imagem para ampliar!

B - Executar o programa IC-Prog ( já escolhido o 24C16 – canto superior direito e já está configurado para Hardware JDM – rodapé): – clique na imagem para ampliar!

 - Observar também a seguinte configuração (Settings–> Options –> aba I²C) – clique na imagem para ampliar!

C - Carregar o arquivo hex (exemplo – teste24c16.hex): – clique na imagem para ampliar!

D - Gravar o arquivo hex (teste24c16.hex) na memória (I²C – 24C16): – clique na imagem para ampliar!

  

E - Mensagem de sucesso: – clique na imagem para ampliar!

F - Feche e abra novamente o programa IC-Prog: – clique na imagem para ampliar!

G - Opção de leitura do dispositivo (IC-Prog): – clique na imagem para ampliar!

H - Arquivo lido com sucesso, e comprova a gravação da memória (conteúdo gravado = conteúdo lido): – clique na imagem para ampliar!

Figura 01 – placas:  Gravador, soquete para PIC 14 Pinos (por exemplo), Memórias I²C e cabo de ligação: (Vista Superior) – clique na imagem para ampliar!

Figura 02 - Gravador: (Lado A) – clique na imagem para ampliar!

Figura 02 - Gravador: (Lado B) – clique na imagem para ampliar!

Figura 03 e 04 - Gravador: (Lados C e D) -a sequencia dos pinos de saída são: (Lado D)
1- Vpp (+13V); 2- Vcc (+5V); 3- SCL (clock); 4- SDA (dados); 5-GND (terra/negativo)
 – clique na imagem para ampliar!

   

Figura 05 - Gravador: (Verso) – clique na imagem para ampliar!

Figura 06 - Soquete PIC 14 Pinos: (Lado A) – clique na imagem para ampliar!

Figura 07 - Soquete PIC 14 Pinos: (Verso) – clique na imagem para ampliar!

Figura 08 - Memórias 24C16 (x3) e seus soquetes, conector em barra 5 pinos e LED que indica alimentação ligada (+5V): (Lado A) – clique na imagem para ampliar!

Figura 09 - Memórias 24C16 (x3) e seus soquetes, conector em barra 5 pinos e LED que indica alimentação ligada (+5V): (Verso) – clique na imagem para ampliar!

Figura 10 - Circuito montado, para uso como gravador de PICs – clique na imagem para ampliar!

Figura 11 - Circuito montado, para uso como gravador de Memória protocolo I²C  – clique na imagem para ampliar!

Abaixo, o diagrama esquemático dos circuitos criados para esta montagem – OBS: no diagrama aparece para simplificar, somente um CI de memória, para mais de um, conectar os pinos respectivos entre si:  – clique na imagem para ampliar!

Segue agora, testes que podem ser feitos na placa, para controle individual dos LEDs (vermelho, verde e amarelo), utilizando o C#.NET da Microsoft:

- Tela do programa de controle dos LEDs: – clique na imagem para ampliar!

- Link do arquivo contendo o programa de controle, e o código fonte (ProgramaControlePortaSerial.zip):

- Código Fonte do Programa:

// ————————————————————
// Programa: ControlePortaSerial
// Autor: Dimensão By Net
// Data: 25/11/2010
// Versão: 1.0
// ————————————————————

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.IO;

namespace WindowsFormsApplication1
{

    public partial class Form1 : Form
    {
        SerialPort port = new SerialPort(“COM1″, 9600, Parity.None, 8, StopBits.One);
        bool ledvermelho = false;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            bool x;
            if (port.IsOpen == false)
                return;
            else
            {
                port.BreakState = true;
                ledvermelho = true;
                x = port.CtsHolding;
            }
      }

        private void button2_Click(object sender, EventArgs e)
        {
            if (port.IsOpen == false)
                return;
            else
            {
                if (port.DtrEnable == false)
                    port.DtrEnable = true;
                if (ledvermelho == true)
                    port.BreakState = true;
                else
                    port.BreakState = false;
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (port.IsOpen == true)
                label1.Text = “Já Conectado”;
            else
            {
                port.Open();
                label1.Text = “Conectado”;
            }
        }

        private void button5_Click(object sender, EventArgs e)
        {
            if (port.IsOpen == false)
                return;
            else
            {
                if (port.RtsEnable == false)
                    port.RtsEnable = true;
                if (ledvermelho == true)
                    port.BreakState = true;
                else
                    port.BreakState = false;
            }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            if (port.IsOpen == false)
            {
                label1.Text = “Já Desconectado”;
            }
            else
            {
                port.DiscardInBuffer();
                port.DiscardOutBuffer();
                port.RtsEnable = false;
                port.DtrEnable = false;
                port.BreakState = false;
                port.Close();
                label1.Text = “Desconectado”;
            }
        }

        private void button6_Click(object sender, EventArgs e)
        {
            if (port.IsOpen == false)
                return;
            else
            {
                if (port.DtrEnable == true)
                    port.DtrEnable = false;
                if (ledvermelho == true)
                    port.BreakState = true;
                else
                    port.BreakState = false;
            }
        }

        private void button7_Click(object sender, EventArgs e)
        {
            if (port.IsOpen == false)
                return;
            else
            {
                if (port.RtsEnable == true)
                    port.RtsEnable = false;
                if (ledvermelho == true)
                    port.BreakState = true;
                else
                    port.BreakState = false;
            }
        }
        private void button8_Click(object sender, EventArgs e)
        {
            if (port.IsOpen == false)
                return;
            else
            {
                port.BreakState = false;
                ledvermelho = false;
            }
        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {

        }

    }
}

// ————————————————————

Em resumo, este pequeno projeto pode ser aproveitado para uma série de testes, controlar dispositivos (por exemplo relês), a partir da serial. Com este hardware simples, também pode ser implementado o uso de componentes como o DS1307 – Serial Real-Time - Clock 2-wire serial data bus, e o DS18S20 – High Precision 1-wire Digital Thermometer, que, se necessário, podem ser configurados e lidos a partir do PC sem o uso de controladores, mas contribuindo para a facilidade de interfaceamento entre o PC (configurando o dispositivo) e o Microcontrolador (fazendo uso deste).

Por enquanto é só, aguardem o próximo Post!