Como piscar um LED com o PIC16F877A

Eletrônica 16 de Novembro de 2019 às 13:57

Os microcontroladores PIC desenvolvidos pela Microchip são famosos no meio do desenvolvimento embarcado, são chips baratos que podem ser encontrados a venda em qualquer loja de componentes eletrônicos. Existem PICs baseados em 8 bits, 16 bits e recentemente em 32 bits, sendo que os mais populadores são os chips de 8 bits. Encontram-se diversos tipos de famílias 8 bits deste microcontrolador, como por exemplo o PIC16 com sua extensa lista de modelos ou o famoso PIC18 onde podemos encontrar vários livros e tutoriais.

O PIC16F877A é o modelo mais conhecido entre a sua família, segundo o datasheet este chip contém 40 pinos disponíveis sendo separados em 5 grupos de portas I/O. Sua base é desenvolvida na arquitetura de Harvard ou RISC seguindo o padrão de tecnologia de circuitos integrados CMOS low-power, igualmente ao microcontrolador Atmega328p da Atmel. O clock permite trabalhar em diferentes frequências como 8 MHz, 16 MHz ou em seu máximo, 20 MHz. Existem pinos dedicados para comunicação serial USART, SPI e I2C. Confira a pinagem do PIC16F877A abaixo.

Pinagem do PIC16F877A - Datasheet Microchip

Materiais

O primeiro passo para inicializar o projeto é montar uma estrutura adequada para receber o microcontrolador PIC16F877A no protoboard, para isso pegue uma caneta e um papel para anotar os seguintes componentes e módulos necessário para esta montagem.

Dica: Sempre que possível reutilize componentes da sucata e teste com um multímetro antes de utilizá-los no protoboard, isso ajuda na falta de algum componente.

  1. 1 Microcontrolador Microchip PIC16F877A
  2. 1 Programador universal MiniPro 40 pinos USB
  3. 1 Cristal de 16MHz ou 20MHz
  4. 2 Capacitores cerâmicos de 22pF NPO
  5. 2 Capacitores de poliéster de 100nF
  6. 1 Chave push button N/O de 2 pinos ou 4 pinos
  7. 1 Resistor de 10KΩ
  8. 1 Resistor de 220Ω
  9. 1 Protoboard
  10. Fonte de alimentação 5V (LM7805 e capacitores) - faça a sua agora!
  11. 1 Bateria
  12. 1 Conector Jack P4 2.1mm com fios
  13. Fonte de bancada ajustável (Opcional)
  14. Fios jumpers
  15. 1 LED

Dicas de montagem

Com estes materiais em mãos podemos inicializar a montagem do PIC16F877A, para isso encaixe ele no protoboard e observe atentamente a pinagem no esquema abaixo.

Esquema estrutura básica PIC16F877A (EasyEDA)

A montagem no protoboard deve ficar semelhante à imagem abaixo.

Montagem no protoboard

No pino 1 coloque o resistor pull-up de 10KΩ no 5V e a chave push button no GND para realizar o reset do microcontrolador.

A notação VDD significa a alimentação positiva do circuito integrado, no PIC16F877A são os pinos 11 e 32, com isso conecte os cabos nestes pinos no 5V do protoboard.

A notação VSS significa a alimentação negativa do circuito integrado, no PIC16F877A são os pinos 12 e 31, com isso conecte os cabos nestes pinos no GND do protoboard.

Para um melhor funcionamento do microcontrolador, adicionamos os dois capacitores poliéster de 100nF com a função de desacoplamento, com o objetivo de evitar ruídos da rede elétrica circulando na nossa montagem, para isso ligue um capacitor no pino 11 do PIC levando para o GND do protoboard e o outro capacitor no pino 32 para o GND também.

Os pinos 13 e 14 são responsáveis pelo clock, então coloque o cristal de 16MHz ou 20 MHz e em cada pino um capacitor cerâmico de 22pF NPO ao GND.

A fonte de alimentação foi desenvolvida com o regulador de tensão LM7805 e capacitores, no pino 1 foi conectado o fio positivo do jack P4 e o GND ao GND do circuito.

IDE e compilador

Com todas as ligações realizadas corretamente, por enquanto deixe o protoboard de lado. O primeiro passo é instalar uma IDE e um compilador que interprete os registradores do PIC16F877A.

Existem diversos ambientes de desenvolvimento (IDE) e compiladores para o PIC, neste tutorial foi utilizado a IDE oficial da Microchip MPLAB X com o compilador XC8. Curiosidade: Quem trabalha com o NetBeans irá reconhecer o MPLAB X!

Na página oficial do MPLAB X clique na aba "Downloads" ao lado da aba "Features" e baixe a última versão correspondente ao seu sistema operacional. Este tutorial foi realizado com a versão IDE 64x para Microsoft Windows. Se você tiver dúvidas com o MPLAB X, na aba "Documentation" estão disponíveis várias documentações em PDF para consulta.

Clicando somente em Next, no final da instalação irá abrir uma janela indicando links úteis, o link que temos que dar atenção é o primeiro, o instalador indica que é necessário baixar o compilador XC8.

Na página oficial do compilador clique na aba "Downloads" ao lado da aba "Additional Information" e faça o donwload da última versão do XC8 para microcontroladores 8 bits correspondente ao seu sistema operacional.

Clicando somente em Next, você irá perceber no final da instalação que esta versão do compilador é free, porém para este tutorial não influenciará em nenhuma função,

Tudo pronto para inicializar o MPLAB X IDE! A janela que você deverá visualizar é semelhante a imagem abaixo.

Microchip MPLAB X IDE - v4.05

Pronto para criar o seu primeiro projeto? Siga os passos necessários para esta tarefa:

  • No menu File -> New Project.
  • Em Categories -> Microchip Embedded e em Projects -> Standalone Project e Next.
  • Em Family -> All Families e Device -> PIC16F877A e Next.
  • O passo Select Tool é para selecionar o tipo de gravador, como vamos utilizar um gravador universal sem debugger, deixe selecionado o ICD 3 (padrão da IDE) e Next.
  • Selecione o compilador XC8 e Next.
  • Coloque um nome para seu projeto como por exemplo "PiscarLED" e um local para salvar o projeto e Finish!

Seu projeto está criado, feche as abas da página inicial e da loja do MPLAB, como o projeto está em branco será necessário um arquivo main.c para escrever o código, observe a imagem abaixo para criar este arquivo.

  • Source Files -> New -> main.c...
  • Coloque um nome para seu arquivo .c como por exemplo "led" e Finish!
  • Abra o arquivo led.c com 2 cliques.

Codificando o PIC

Para começar a programar é importante entender como funciona os registradores utilizando o compilador XC8. Para cada porta podem ser associados 2 registradores, o TRIS (Tri-State) e PORT. Todos os pinos do PIC possuem diferentes PORTs e TRISs, como PORTD e PORTB ou TRISB e TRISD contendo grupos de pinos GPIO (General Purpose Input Output), sendo que cada PORT contém 8 pinos I/O, por exemplo PORTB7 ou PORTD2. Para definir se um pino é Input ou Output utilizamos o registrador TRIS, se TRIS = 1 significa Input e TRIS = 0 significa Output.

De modo geral, se o registrador TRIS = 0 e o registrador PORT = 1 corresponderá a o estado HIGH ou 5V, e se o PORT = 0 será LOW ou GND. Outra condição é se o TRIS = 1 e o PORT = 1 temos o estado de alta impedância ou terceiro estado do Tri-State, levando o pino ao HIGH ou 5V, igualmente se a condição for TRIS = 1 e o registrador PORT = 0 corresponderá ao estado LOW ou GND como demonstra a imagem abaixo.

Registradores do PIC - TRIS e PORT

Para definir as portas e seus registradores você pode escreve-los utilizando números decimais, octais, hexadecimais e com a técnica bitwise.

A forma que é definido com as bases numéricas são representados da seguinte forma:

  • 0b indica números binários.
  • 0 indica números octais e decimais.
  • 0x indica números hexadecimais

Veja a tabela abaixo com algumas conversões:

Decimal Binário Octal Hexadecimal
0 b00000000 00 0x00
1 0b00000001 01 0x01
128 0b10000000 0200 0x80
255 0b11111111 0377 0xFF

Estes exemplos de código mostram como são utilizados na programação para o PIC.

PORTD = 0xFF; // Todos os pinos PORTD setados como 1/HIGH
TRISD = 0x00; // Todos os pinos TRISD setados como 0/OUTPUT
PORTB = 128;  // Seta o sétimo bit do PORTB como 1/HIGH
PORTA = 0b00000001; // Seta o primeiro bit do PORTA como 1/HIGH
TRISB = 0b00100000; // Seta o quinto bit como 1/INPUT e os demais como 0/OUTPUT

A imagem abaixo demonstra a atribuição dos bits de entrada e saída em binário do TRISB do código acima TRISB = 0b00100000;:

Exemplo de atribuições de bits entrada/saída em binário de um registrador TRISB

A técnica bitwise em C++ significa bit a bit, a forma utilizada com esta técnica consiste em operações de deslocamento a direita e a esquerda de bits. Observe os exemplos de códigos que são interpretados pelo PIC.

// Seta o pino TRISB como OUTPUT
TRISB = (0 << TRISB0);

// Seta os pinos TRISD1 ou TRISD2 como OUTPUT
TRISD = (0 << TRISD1)||(0 << TRISD2);

Agora que você entendeu o básico sobre os registradores do PIC, cole este código em seu main.c e clique no botão "Build Main Project". Se apareceu a mensagem no painel Output da IDE "BUILD SUCCESSFUL" seu código foi compilado com sucesso!

Atenção, altere o valor da constante "_XTAL_FREQ" conforme o valor do cristal utilizado. Neste caso foi utilizado um de 16MHz.

/*
 * File:   led.c
 * Author: Ana Paula Messina - tecdicas
 *
 * Created on 2 de Novembro de 2017, 20:05
 */

// Clock 20 MHz
// #define _XTAL_FREQ 20000000 

// Clock 16MHz
#define _XTAL_FREQ 16000000 // 16 MHz

#include <xc.h>

// Padrão de configurações
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = ON // Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)

int main()
{
  TRISD = (0 << TRISD2); //RD2 (Pino 21) definido como OUTPUT
  while(1)
  {
    RD2 = 1;  
    __delay_ms(100); 
    RD2 = 0; 
    __delay_ms(100);
  }
  return 0;
}

Gravando o PIC

Para este tutorial foi utilizado um gravador universal de 40 pinos USB sem debbuger, o único problema é que você terá que tirar o PIC toda vez do protoboard para gravar um firmware.

O gravador utilizado é o MiniPro e o software para gravação é do mesmo fabricante disponível em seu site oficial.

Gravador universal MiniPro USB

Para gravar utilizando o MiniPro precisamos do arquivo hexadecimal do nosso projeto "PiscaLED" desenvolvido na IDE MPLAB X, quando você clicou para compilar o projeto, automaticamente ele gera esse arquivo no diretório do projeto. Para encontrá-lo acesse a pasta do projeto e siga este caminho:

  • \dist\default\production\PiscarLED.X.production.hex

Com o arquivo hexadecimal em mãos podemos abrir o software de gravação MiniPro, para isso retire com cuidado o PIC do protoboard sem amassar os pinos e coloque no gravador, neste gravador indica o lado correto para ser encaixado com uma flecha. Siga estes passos para configurar o software e gravar o hex em seu PIC.

Voltando ao protoboard

Seu PIC está gravado com o código para piscar um LED, agora retire o PIC do gravador e encaixe novamente no protoboard com a pinagem correta e veja o esquema para ligar um LED em modo current source com um resistor limitador de corrente de 220 ohms conectado na porta 21 do PIC.

Esquema do PIC16F877A com LED e resistor. (EasyEDA)

Com as conexões realizadas corretamente, conecte a bateria ou a fonte de bancada e veja o resultado!

Comente qual foi sua experiência em ter montado este projeto com PIC! Ou tire suas dúvidas.

Se inscreva no canal do YouTube para mais conteúdo de eletrônica digital e embarcados!

Download do projeto

Referência

  1. Getting Started with MPLAB XC8 Compiler – LED Blinking