Projetos e Informações

Aqui apresentamos os projetos e informações sobre microcontroladores e sistemas embarcados

Projeto com o compilador MPLAB XC8 e o PIC16F628A – Parte 2

ACEPIC Tecnologia

Fri, 21 Jun 2024

Projeto com o compilador MPLAB XC8 e o PIC16F628A – Parte 2

Agora que criamos o projeto com o compilador XC8 e o PIC16F628A, podemos criar o código fonte do projeto, porém primeiramente, é necessário a configuração dos bits de controle (Configuration Bits).

Para isso, no MPLAB X, clique no menu Production e sem seguida, escolha a opção Set Configuration Bits;


Será exibido no rodapé da área de edição de código um painel contendo todos os bits de configuração para o microcontrolador PIC16F628A;


E para alterar a configuração de cada bit, pode-se clicar na coluna Option e realizar a configuração de acordo com a necessidade.

Veja na figura a seguir a configuração da seleção do oscilador.


Então podemos alterar as configurações dos bits(*) conforme segue:

FOSC = HS
WDTE = OFF
PWRTE = ON
MCLRE = ON
BOREN = OFF
LVP = OFF
CPD = OFF
CP = OFF


* Não entraremos em detalhes sobre as explicações dos bits de configuração, caso deseje mais detalhes, recomendamos o nosso Curso Linguagem C para Microcontrolador PIC baseado na família 18F.

Veja a seguir a configuração dos bits completa.


Após, clique no botão Generate Source Code to Output para gerar o código de configuração.


Após gerado o código, copie e cole no editor, conforme a figura. Atente-se para que as configurações devem ficar acima da inclusão do arquivo xc.h (#include < xc.h > ).


Agora, complete o código conforme segue:

// CONFIG

#pragma config FOSC = HS   // Oscillator Selection bits (HS oscillator: High-speed
                           // crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
#pragma config WDTE = OFF  // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON  // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = ON  // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin
                           // function is MCLR)
#pragma config BOREN = OFF // Brown-out Detect Enable bit (BOD disabled)
#pragma config LVP = OFF   // Low-Voltage Programming Enable bit (RB4/PGM pin has
                           // digital I/O function, HV on MCLR must be used for programming)
#pragma config CPD = OFF   // Data EE Memory Code Protection bit (Data memory code
                           // protection off)
#pragma config CP = OFF    // Flash Program Memory Code Protection bit (Code
                           //protection off)

#include < xc.h >

#define _XTAL_FREQ 8000000

void main(void) {
  TRISBbits.TRISB6 = 0;     //Direciona o pino 6 da porta B como saída
  PORTBbits.RB6 = 0;        //Atribui nível lógico 0 (0V) ao pino 6 da porta B

  while(1)
    {
    PORTBbits.RB6 = 1;      //Atribui nível lógico 1 (5V) ao pino 6 da porta B (acende o LED)
    __delay_ms(1000);       //Gera atraso de 1 segundo
    PORTBbits.RB6 = 0;      //Atribui nível lógico 0 (0V) ao pino 6 da porta B (apaga o LED)
    __delay_ms(1000);       //Gera atraso de 1 segundo
  }
}


Entendendo o código fonte


// CONFIG

#pragma config FOSC = HS    // Oscillator Selection bits (HS oscillator: High-speed
                            // crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
#pragma config WDTE = OFF   // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON   // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = ON   // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin
                            // function is MCLR)
#pragma config BOREN = OFF  // Brown-out Detect Enable bit (BOD disabled)
#pragma config LVP = OFF    // Low-Voltage Programming Enable bit (RB4/PGM pin has
                            // digital I/O function, HV on MCLR must be used for programming)
#pragma config CPD = OFF    // Data EE Memory Code Protection bit (Data memory code
                            // protection off)
#pragma config CP = OFF     // Flash Program Memory Code Protection bit (Code
                            //protection off)


Primeiramente, como já verificamos, temos a seleção dos bits de configuração (configuration bits). Esta configuração, de certa maneira, informa ao microcontrolador como ele deve trabalhar, ou seja, qual o tipo de oscilador que deverá ser utilizado, se será ou não habilitado o timer de segurança ou watchdog, se será habilitado ou não o timer de inicialização PWRTE, etc.

#include < xc.h >

Esta diretiva #include faz com que seja incluído no código fonte as funções do arquivo ‘xc.h’ que trata das configurações do compilador XC8 diante do microcontrolador utilizado.

#define _XTAL_FREQ 8000000

Em seguida, através da diretiva #define, deve ser definido a frequência do oscilador que será utilizado como fonte de clock, no caso, será um oscilador a cristal (#pragma config HS) de 8MHz (8.000.000 Hz).

Após, temos a função principal (main) do código fonte. Através desta função, serão realizadas todas as configurações dos periféricos do microcontrolador e será executado todo o seu funcionamento.

void main(void)
{

....
}

Perceba que uma função do tipo void (nulo), ou seja não retorna nada e também não recebe nenhum argumento (void).

Dentro da função principal, temos as configurações iniciais do microcontrolador, no caso, vamos trabalhar somente com a porta B como periférico, assim, é necessário informar que um determinado pino ou todos os pinos de uma determinada porta será (ão) pino(s) de entra ou de saída.

TRISBbits.TRISB6 = 0;   //Direciona o pino 6 da porta B como saída
PORTBbits.RB6 = 0;      //Atribui nível lógico 0 (0V) ao pino 6 da porta B

O direcionamento do(s) pino(s) de uma porta se dá através do registrador TRISx, onde x indica qual a porta deverá ser configurada. No caso, a porta B, então TRISB.

Caso seja desejada o direcionamento de todos os pinos da porta B, deve-se utilizar:

TRISB = 0;            //Direciona todos os pinos da porta B como saída

Ou

TRISB = 1;            //Direciona todos os pinos da porta B como entrada

No caso de nosso código temos o sufixo bits após o registrador TRISB, assim será atribuído o direcionamento a um determinado pino e que, para nosso projeto, será o pino 6 da porta B, então temos:

TRISBbits.TRISB6 = 0; //Direciona o pino 6 da porta B como saída

Em seguida, usa-se o mesmo princípio de configuração para atribuir o nível lógico ao(s) pino(s) da porta, onde quando atribuído o nível lógico 0, temos 0V no(s) pino(s) e, se atribuído o nível lógico 1, temos 5V no(s) pino(s).

PORTBbits.RB6 = 0;    //Atribui nível lógico 0 (0V) ao pino 6 da porta B

Note que TRISB6 e RB6 são os nomes do bit dos seus respectivos registradores TRISB e PORTB (veja o datasheet do PIC16F628A).

Logo após as configurações dos periféricos na função principal, partiremos para a execução dos procedimentos que realmente são desejados, ou seja, fazer com que o microcontrolador execute o que se é desejado, no caso, fazer com que o LED permaneça aceso por 1 segundo e permaneça apagado por mais 1 segundo. Para isso, o processo deverá ser realizado infinitamente, assim, podemos utilizar o que é chamado de loop infinito (ou laço infinito), onde, desta maneira os códigos são executados dentro de um laço sem fim.

A linguagem C disponibiliza alguns comandos para execução de um laço infinito, entre eles o comando while (enquanto), sendo que, como o próprio nome diz, serão executados os códigos dentro do laço enquanto uma expressão seja verdadeira, dessa maneira, temos:

while(1); //loop infinito

Neste caso, a expressão (1) é sempre verdadeira, deste modo o microcontrolador deverá executar este laço infinitamente.

Para o nosso caso, devemos fazer:

while(1)
{
  PORTBbits.RB6 = 1;    //Atribui nível lógico 1 (5V) ao pino 6 da porta B (acende o LED)
  __delay_ms(1000);     //Gera atraso de 1 segundo
  PORTBbits.RB6 = 0;    //Atribui nível lógico 0 (0V) ao pino 6 da porta B (apaga o LED)
  __delay_ms(1000);     //Gera atraso de 1 segundo
}


Então, todos os códigos entre as chaves do laço while serão executados infinitamente.

Compilando o projeto

Finalizando, agora é necessário compilar o projeto para que seja gerado o código hexadecimal (*.hex) para que seja programado o microcontrolador.

Para isso, no MPLAB X, pode-se clicar no menu Production e em seguida escolher a opção Build Main Project, ou pressionar a tecla F11 do teclado.


Outra maneira de compilar o código é clicar no símbolo de martelo na barra de ferramentas, conforme mostra a figura a seguir:


Abaixo do editor de código será exibido o resultado da compilação:


O arquivo hexadecimal gerado estará disponível em … dist->default->production. Ela terá o nome do seu projeto, seguido de X.production.hex, conforme abaixo:


0 Comentários

Deixe um comentário