Aqui apresentamos os projetos e informações sobre microcontroladores e sistemas embarcados
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
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
}
}
// 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.
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:
Tue, 06 Aug 2024
Sun, 09 Jun 2024
Deixe um comentário