Escrevendo Seu Primeiro Programa com Microcontrolador PIC e Configurando Bits de Configuração

Tempo de leitura: 10 minutes

Este é o segundo tutorial de nossa Série de Tutoriais PIC. Em nosso tutorial anterior Introdução ao Microcontrolador PIC: Introdução ao PIC e MPLABX, aprendemos o básico sobre nosso microcontrolador PIC, também instalamos o software necessário e compramos um novo programador PicKit 3 que usaremos em breve. Agora estamos prontos para começar nosso primeiro programa de LED piscando usando o PIC16F877A. Também aprenderemos sobre registros de configuração neste tutorial.

Este tutorial espera que você tenha instalado o software necessário em seu computador e que você conheça alguns fundamentos decentes sobre o PIC MCU. Caso contrário, volte ao tutorial anterior e comece a partir daí.

 

Preparando-se para a programação:

Uma vez que decidimos usar o PIC16F877A, com o compilador XC8 vamos começar com sua folha de dados. Recomendo a todos que baixem o Datasheet PIC16F877A e o manual do compilador XC8, já que iremos nos referir a eles com frequência à medida que avançarmos em nosso tutorial. É sempre uma boa prática ler a folha de dados completa de qualquer MCU antes de realmente começar a programar com ela.

Agora, antes de abrirmos nosso MPLAB-X e começarmos a programar, existem algumas coisas básicas das quais devemos estar atentos. De qualquer forma, como este é nosso primeiro programa, não quero arengar a vocês com muita teoria, mas vamos parar aqui e ali enquanto programamos e explicarei as coisas como tais. Se você não tem tempo suficiente para ler tudo isso, dê uma olhada e pule para o vídeo no final da página.

Criando um novo projeto usando MPLAB-X:

Etapa 1: Inicie o MPLAB-X IDE que instalamos na classe anterior, uma vez carregado, ele deve ter a seguinte aparência.

Etapa 2: Clique em Files -> New Project, ou use a tecla de atalho Ctrl+Shift+N. Você obterá o seguinte POP-UP, no qual deverá selecionar Standalone Project e clicar em Avançar.

Etapa 3: Agora temos que selecionar nosso dispositivo para o projeto. Portanto, digite PIC16F877A na seção suspensa Selecionar dispositivo. Depois de feito, deve ser assim e clique em Avançar.

Etapa 4: A próxima página nos permitirá selecionar a ferramenta para nosso projeto. Este seria o PicKit 3 para nosso projeto. Selecione PicKit 3 e clique em Avançar

Etapa 5: a próxima página pedirá para selecionar o compilador, selecione o compilador XC8 e clique em próximo.

Etapa 6: Nesta página temos que nomear nosso projeto e selecionar o local onde o projeto deve ser salvo. Chamei este projeto de Blink e salvei-o na minha área de trabalho. Você pode nomeá-lo e salvá-lo da maneira que preferir. Nosso projeto será salvo como uma pasta com a extensão .X, que pode ser iniciada diretamente pelo MAPLB-X. Clique em Concluir quando terminar.

Etapa 7: É isso aí !!! Nosso projeto foi criado. A janela mais à esquerda mostrará o nome do projeto (Aqui Pisca), clique nele para que possamos ver todos os diretórios dentro dele.

Para iniciar a programação, precisamos adicionar um arquivo C Main, dentro do nosso diretório de arquivos de origem. Para fazer isso, basta clicar com o botão direito do mouse no arquivo de origem e selecionar New -> C Main File, conforme mostrado na imagem abaixo.

Etapa 8: A seguinte caixa de diálogo aparecerá, na qual o nome do arquivo C deve ser mencionado. Eu nomeei no Blink novamente, mas a escolha é deixada para você. Nomeie-o na coluna Nome do arquivo e clique em Concluir

Etapa 9: Uma vez que o arquivo principal C é criado, o IDE irá abri-lo para nós com alguns códigos padrão nele, como mostrado abaixo.

Etapa 10: Agora podemos começar a programar nosso código no arquivo C-principal. O código padrão não será usado em nossos tutoriais. Portanto, vamos excluí-los completamente.

Conhecendo os Registros de Configuração:

Antes de começar a programar qualquer Microcontrolador, devemos conhecer seus registros de configuração.

Então, quais são esses registros de configuração, como e por que devemos defini-los

Os dispositivos PIC têm vários locais que contêm os bits de configuração ou fusíveis. Esses bits especificam a operação fundamental do dispositivo, como o modo do oscilador, temporizador de watchdog, modo de programação e proteção do código. Esses bits devem ser definidos corretamente para executar o código, caso contrário, teremos um dispositivo não funcionando. Portanto, é muito importante saber sobre esses registros de configuração antes mesmo de começarmos com nosso Programa Blink.

Para usar esses registros de configuração, temos que ler a folha de dados e entender quais são os diferentes tipos de bits de configuração disponíveis e suas funções. Esses bits podem ser definidos ou redefinidos com base em nossos requisitos de programação usando um pragma de configuração.

O pragma tem as seguintes formas.

#pragma config setting = state|value
#pragma config register = value

onde definição é um descritor de definição de configuração, por exemplo, WDT, e estado é uma descrição textual do estado desejado, por exemplo, DESLIGADO. Considere os seguintes exemplos.

#pragma config WDT = ON // liga o cronômetro de watchdog
#pragma config WDTPS = 0x1A // especifica o valor pós-escala do cronômetro

RELAXAR!! ….. RELAXE !! …. RELAXE !! ……

Eu sei que isso passou muito pela nossa cabeça e definir esses bits de configuração pode parecer um pouco difícil para um novato! Mas, certamente não é com nosso MPLAB-X.

 

Definindo os bits de configuração no MPLAB-X:

A Microchip tornou este cansativo processo muito mais fácil, usando representações gráficas dos diferentes tipos de bits de configuração. Portanto, agora, para configurá-los, basta seguir os passos abaixo.

Passo 1: Clique em Window -> PIC Memory View -> Configuration Bits. Como mostrado abaixo.

Etapa 2: Isso deve abrir a janela Bits de configuração na parte inferior de nosso IDE, conforme mostrado abaixo. Este é o lugar onde podemos definir cada um dos bits de configuração de acordo com nossas necessidades. Explicarei cada uma das partes e sua finalidade à medida que avançamos nas etapas.

Etapa 3: O primeiro bit é o bit de seleção do oscilador.

O PIC16F87XA pode ser operado em quatro modos diferentes de oscilador. Esses quatro modos podem ser selecionados programando dois bits de configuração (FOSC1 e FOSC0):

  • LP Crystal Low Power
  • Cristal/ressonador XT
  • Cristal/ressonador HS de alta velocidade
  • Resistor/capacitor RC

Para nossos projetos, estamos usando um Osc de 20Mhz, portanto, temos que selecionar o HS na caixa suspensa.

Etapa 4: O próximo bit será nosso bit de habilitação do temporizador de watchdog.

O Watchdog Timer é um oscilador RC on-chip de funcionamento livre que não requer nenhum componente externo. Este oscilador RC é separado do oscilador RC do pino OSC1/CLKI. Isso significa que o WDT será executado mesmo que o relógio nos pinos OSC1/CLKI e OSC2/CLKO do dispositivo tenha sido interrompido. Durante a operação normal, um tempo limite de WDT gera uma reinicialização do dispositivo (reinicialização do temporizador de watchdog). O bit TO no registro de status será apagado após um tempo limite do temporizador de watchdog. Se o cronômetro não for apagado em nossa codificação de software, todo o MCU será zerado a cada estouro do cronômetro WDT. O WDT pode ser desativado permanentemente limpando o bit de configuração.

Não estamos usando WDT em nosso programa, portanto, deixe-nos desmarcá-lo selecionando OFF na caixa suspensa.

Etapa 5: O próximo bit será o Bit do temporizador de inicialização.

O temporizador de inicialização fornece um tempo limite nominal fixo de 72 ms na inicialização apenas a partir do POR. O Powerup Timer opera em um oscilador RC interno. O chip é mantido em Reset enquanto o PWRT estiver ativo. O retardo de tempo do PWRT permite que o VDD suba para um nível aceitável. Um bit de configuração é fornecido para habilitar ou desabilitar o PWRT.

Não precisaremos de tais atrasos em nosso programa, portanto, vamos desligar isso também.

Etapa 6: O próximo bit será a programação de baixa tensão.

O bit LVP da palavra de configuração permite a programação ICSP de baixa tensão. Este modo permite que o microcontrolador seja programado via ICSP usando uma fonte VDD na faixa de tensão de operação. Isso significa apenas que o VPP não precisa ser levado para VIHH, mas pode ser deixado na tensão normal de operação. Neste modo, o pino RB3/PGM é dedicado à função de programação e deixa de ser um pino de E/S de uso geral. Durante a programação, o VDD é aplicado ao pino MCLR. Para entrar no modo de programação, o VDD deve ser aplicado ao RB3/PGM, desde que o bit LVP esteja definido.

Vamos desligar o LVP para que possamos usar o RB3 como um pino de I/O. Para fazer isso, basta DESLIGAR usando a caixa suspensa.

Etapa 7: Os próximos bits serão EEPROM e bits de proteção de memória de programa. Se este bit estiver ativado, uma vez que o MCU é programado, ninguém irá recuperar nosso programa do hardware. Mas, por enquanto, vamos deixar os três desligados.

Assim que as configurações forem feitas conforme as instruções, a caixa de diálogo deve ser semelhante a esta.

Etapa 8: Agora clique em Generate Source Code to Output, nosso código será gerado agora, basta copiá-lo junto com o arquivo de cabeçalho e colar em nosso Blink.c C-File, conforme mostrado abaixo.

É isso que nosso trabalho de configuração está feito. Podemos ter essa configuração para todos os nossos projetos. Mas se você estiver interessado, pode mexer com eles mais tarde.

 

Programando PIC para piscar um LED:

Neste programa, usaremos nosso microcontrolador PIC para piscar um LED conectado a um pino de E/S. Vamos dar uma olhada nos diferentes pinos de E/S disponíveis em nosso PIC16F877A.

Conforme mostrado acima, o PIC16F877 possui 5 portas básicas de entrada / saída. Eles geralmente são denotados por PORT A (R A), PORT B (RB), PORT C (RC), PORT D (RD) e PORT E (RE). Essas portas são usadas para interface de entrada / saída. Neste controlador, “PORT A” tem apenas 6 bits de largura (RA-0 a RA-5), “PORT B”, “PORT C”, “PORT D” têm apenas 8 bits de largura (RB-0 a RB-7 , RC-0 a RC-7, RD-0 a RD-7), ”PORTA E” tem apenas 3 bits de largura (RE-0 a RE-2).

Todas essas portas são bidirecionais. A direção da porta é controlada usando registros TRIS(X) (TRIS A usado para definir a direção de PORT-A, TRIS B usado para definir a direção de PORT-B, etc.). Definir um bit TRIS(X) ‘1’ definirá o bit PORT(X) correspondente como entrada. Apagar um bit TRIS(X) ‘0’ definirá o bit PORT(X) correspondente como saída.

Para nosso projeto temos que fazer o pino RB3 da PORTA B como saída para que nosso LED possa ser conectado a ele. Aqui está o código para LED piscando com microcontrolador PIC:

#include <xc.h>
#define _XTAL_FREQ 20000000 //Especifique o FREQ de cristal XTAL
void main() //A função principal
{
TRISB=0X00; //Instrua o MCU que os pinos PORTB são usados como saída.
PORTB=0X00; //Tornar todas as saídas de RB3 LOW
while(1)    //Entre no loop Infinite While
    {
    RB3=1; //LED ON
    __delay_ms(500);   //Espere
    RB3=0; //LED OFF
    __delay_ms(500);   //Espere
    //Repita
    }
}

Primeiro especificamos a frequência externa do cristal usando #define _XTAL_FREQ 20000000. Então, na função void main(), instruímos nosso MCU que usaremos o RB3 como um pino de saída (TRISB=0X00;). Então, finalmente, um loop while infinito é usado para que o LED pisque para sempre. Para piscar um LED, basta ligá-lo e desligá-lo com um atraso perceptível.

Quando a codificação estiver concluída, construa o projeto usando o comando Executar -> Criar projeto principal. Isso deve compilar seu programa. Se tudo estiver bem (como deveria estar), um console de saída na parte inferior da tela mostrará uma mensagem ‘BUILD SUCCESSFUL’, conforme mostrado na figura abaixo.

Texto original.

 

Diagrama de circuito e simulação Proteus:

Uma vez que construímos um projeto e se a construção for bem-sucedida, um arquivo HEX teria sido gerado no fundo de nosso IDE. Este arquivo HEX pode ser encontrado dentro do diretório abaixo

Desktop\Blink\Blink.X\dist\default\production

Pode variar para você se você salvou em algum outro local.

Agora, vamos abrir rapidamente o Proteus que instalamos anteriormente e criar esquemas para este projeto. Não vamos explicar como fazer isso, pois está fora do escopo deste projeto. Mas não se preocupe, isso é explicado no vídeo abaixo. Depois de seguir as instruções e construir os esquemas, deve ser parecido com isto

Para simular a saída, clique no botão play no canto inferior esquerdo da tela após carregar o arquivo Hex. Deve piscar o LED conectado ao RB3 do MCU. Se você tiver algum problema nele assista ao vídeo, se ainda não tiver resolvido use a seção de comentários para obter ajuda.

Agora fizemos nosso primeiro projeto com microcontrolador PIC e verificamos a saída usando um software de simulação. Vá mexer no programa e observe os resultados. Até nos encontrarmos em nosso próximo projeto.

Ohh espera !!

Em nosso próximo projeto, aprenderemos como fazer isso funcionar em um hardware real. Para isso, precisaremos das seguintes ferramentas para mantê-los prontos. Até então APRENDIZAGEM FELIZ !!

  • PicKit 3
  • PIC16F877A IC
  • Suporte de IC de 40 pinos
  • Quadro de desempenho
  • 20Mhz Crystal OSC
  • Alfinetes de Bergstick femininos e masculinos
  • Capacitor 33pf  (2x)
  • Resistor de 680 ohm
  • LED de qualquer cor
  • Kit de solda.

 

Código

#include <xc.h>
#define _XTAL_FREQ 20000000 //Especifique o FREQ de cristal XTAL
void main() //A função principal
{
TRISB=0X00; //Instrua o MCU que os pinos PORTB são usados como saída.
PORTB=0X00; //Tornar todas as saídas de RB3 LOW
while(1)    //Entre no loop Infinite While
    {
    RB3=1; //LED ON
    __delay_ms(500);   //Espere
    RB3=0; //LED OFF
    __delay_ms(500);   //Espere
    //Repita
    }
}