Vimos no artigo anterior todos os detalhes de hardware da placa Curiosity. Neste artigo vamos dar os primeiros passos com o MPLAB X e o compilador XC8 fazendo um exemplo de Hello World para placa.
Para esse tutorial serão necessárias as ferramentas:
Já apresentamos um tutorial sobre os primeiros passos com MPLAB X e XC8, porém nesse artigo vamos apresentar novamente todos os passos com foco na placa Curiosity. Vamos lá!
Criando um novo projetos para a Curiosity
Após instalado o MPLAB X e compilador XC8, abrir o MPLAB X IDE. Para iniciar um novo projeto deve-se escolher a opção: File->New Project onde será aberta uma janela para escolha do tipo de projeto, conforme exibido na figura 1. Selecione as opções Microchip Embedded -> Standalone Project e clique no botão Next.
Próximo passo é a escolha do microcontrolador alvo. Como vimos a Curiosity vem com o PIC16F1619. Selecione Mid-Range 8-bit MCUs (PIC10/12/16/MCP) e depois procure pelo PIC16F1619 em device. Depois clique em Next:
A próxima janela será a escolha do debug header, como apresentado na figura 3. Em nosso caso não utilizaremos este recurso e deixaremos a opção None selecionada. Pressione o botão Next nessa janela:
Próximo passo é a escolha da ferramenta de programação/debug. Como a Curiosity já possui integrada tal ferramenta não há a necessidade de uma ferramenta externa. Com a placa plugada no computador será exibida a opção mostrada na Figura 4. Selecione a Curiosity e clique em Next:
Agora vamos escolher o compilador que será utilizado para a aplicação. No caso vamos trabalhar com o XC8 da própria Microchip. Selecione a versão instalada no computador e clique em Next, conforme exibido na figura 5:
Por último, vamos dar um nome ao projeto e selecionar a pasta onde o mesmo será salvo. Para este projeto pode ser dado o nome de helloWorld, por exemplo, e depois escolha um diretório para o mesmo, conforme figura 6 abaixo. Para finalizar clique no botão Finish:
Pronto! O nosso projeto foi criado e deverá exibir uma tela inicial conforme a figura 7 a seguir:
Código exemplo para a Curiosity
Vamos criar um exemplo que piscará um LED na placa Curiosity. O código será bem simples e servirá de base para outros projetos com a placa Curiosity. Antes de iniciarmos com a codificação é necessário criar o código fonte do projeto. Escolha a opção main.c conforme figura 8:
Será exibida uma janela para criar o novo código fonte em C, conforme figura 9. Vamos dar o nome de “main” para este arquivo e depois clicar em Finish:
Será aberto um arquivo em branco no editor de código fonte conforme Figura 10. Para iniciar a programação, vamos inserir as seguintes linhas de código:
A estrutura de código apresentada é o mínimo necessário para poder compilar o programa. A diretiva #include<xc.h> é necessária em todos os projetos com o compilador XC independente do microcontrolador utilizado no projeto. Nesse arquivo header, o compilador terá acesso às características do microcontrolador, como nome de registradores e demais estruturas. A função main() é a função principal do nosso código fonte.
Para que o microcontrolador PIC funcione corretamente, além da lógica do programa, é necessário também fazer a correta configuração dos Configurations bits, também conhecidos como Fuse bits. No MPLAB X existe uma interface gráfica que auxilia nessa tarefa. O acesso a esse recurso é feito em: Window -> PIC Memory Views -> Configurations Bits, conforme exibido na figura 11, a seguir:
Será aberta uma janela para a configuração dos bits, conforme exibido na figura 12 a seguir:
Selecione as opções de Configurations bits conforme apresentados na figura 12. Após a configuração, pressione o botão Generate Source Code to Output, e será gerado o código, conforme figura 13:
O código gerado deverá ser inserido no código fonte do projeto. Para isso selecione e copie todo o código gerado e depois cole no código fonte, que deverá ficar da seguinte forma:
#include <xc.h> // #pragma config statements should precede project file includes. // Use project enums instead of #define for ON and OFF. // CONFIG1 #pragma config FOSC = INTOSC // Oscillator Selection Bits (INTOSC oscillator: I/O function on CLKIN pin) #pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled) #pragma config MCLRE = OFF // MCLR Pin Function Select (MCLR/VPP pin function is digital input) #pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled) #pragma config BOREN = ON // Brown-out Reset Enable (Brown-out Reset enabled) #pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin) #pragma config IESO = ON // Internal/External Switch Over (Internal External Switch Over mode is enabled) #pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled) // CONFIG2 #pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off) #pragma config PPS1WAY = ON // Peripheral Pin Select one-way control (The PPSLOCK bit cannot be cleared once it is set by software) #pragma config ZCD = OFF // Zero Cross Detect Disable Bit (ZCD disable. ZCD can be enabled by setting the ZCDSEN bit of ZCDCON) #pragma config PLLEN = ON // PLL Enable Bit (4x PLL is always enabled) #pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset) #pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.) #pragma config LPBOR = ON // Low-Power Brown Out Reset (Low-Power BOR is enabled) #pragma config LVP = ON // Low-Voltage Programming Enable (Low-voltage programming enabled) // CONFIG3 #pragma config WDTCPS = WDTCPSE // WDT Period Select (1:524299 (16 s period)) #pragma config WDTE = SWDTEN // Watchdog Timer Enable (WDT controlled by the SWDTEN bit in the WDTCON register) #pragma config WDTCWS = WDTCWS100// WDT Window Select (100 percent window open time (Legacy WDT) ) #pragma config WDTCCS = MFINTOSC// WDT Input Clock Selector (31.25 kHz HFINTOSC (MFINTOSC))
Exemplo
Para nosso exemplo vamos piscar o LED presente no pino RA5, conforme exibido na figura 14:
O nosso exemplo ligará e desligará o LED em intervalos de 1 segundo. Para isso precisamos digitar a seguinte sequência de código em nosso projeto:
#include <xc.h>
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
// CONFIG1
#pragma config FOSC = INTOSC // Oscillator Selection Bits (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled)
#pragma config MCLRE = OFF // MCLR Pin Function Select (MCLR/VPP pin function is digital input)
#pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config BOREN = ON // Brown-out Reset Enable (Brown-out Reset enabled)
#pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = ON // Internal/External Switch Over (Internal External Switch Over mode is enabled)
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)
// CONFIG2
#pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)
#pragma config PPS1WAY = ON // Peripheral Pin Select one-way control (The PPSLOCK bit cannot be cleared once it is set by software)
#pragma config ZCD = OFF // Zero Cross Detect Disable Bit (ZCD disable. ZCD can be enabled by setting the ZCDSEN bit of ZCDCON)
#pragma config PLLEN = ON // PLL Enable Bit (4x PLL is always enabled)
#pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
#pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LPBOR = ON // Low-Power Brown Out Reset (Low-Power BOR is enabled)
#pragma config LVP = ON // Low-Voltage Programming Enable (Low-voltage programming enabled)
// CONFIG3
#pragma config WDTCPS = WDTCPSE // WDT Period Select (1:524299 (16 s period))
#pragma config WDTE = SWDTEN // Watchdog Timer Enable (WDT controlled by the SWDTEN bit in the WDTCON register)
#pragma config WDTCWS = WDTCWS100// WDT Window Select (100 percent window open time (Legacy WDT) )
#pragma config WDTCCS = MFINTOSC// WDT Input Clock Selector (31.25 kHz HFINTOSC (MFINTOSC))
#define _XTAL_FREQ 500000 //define para utilizar funções de tempo - Osc em 500 KHz
void main(void) {
LATA5 = 0; //desliga saídas
TRISA5 = 0; //configura RA5 como saída
while(1){
LATA5 = ~LATA5; //inverte o estado do pino
__delay_ms(1000); //aguarda 1 seg
}
}
O código apresentado acima é bem simples. Na função principal temos a configuração do pino RA5 e no loop infinito a inversão do estado do pino em intervalos de 1 segundo.
Como exercício pode-se manipular os outros LEDs (D5, D6, D7) presentes na placa Curiosity, conforme exibido na Figura 14
Conclusão
Os passos apresentados acima podem ser utilizados para inicialização de qualquer projeto utilizando a IDE MPLAB X e o compilador XC8. O foco desse artigo foi os primeiros passos com a placa Curiosity, placa que estamos utilizando para sequência de artigos sobre o assunto. A aplicação foi bem simples, apenas os primeiros passos, onde apenas foram manipulados os registradores relacionados ao pino que o LED está ligado. No próximo artigo será exibido passo a passo como fazer a configuração utilizando o Microchip Code Configurator (MCC) e fazer uma aplicação mais elaborada para a placa Curiosity.
O que achou do exemplo apresentado? Deixe seu comentário e sugestões para os próximos artigos.









