100% acharam este documento útil (1 voto)
396 visualizações9 páginas

Guia MultiPIC C18: Exemplos Práticos

Este documento fornece um guia e lista de exemplos em C para o compilador MPLab C18 utilizando o Microchip PIC18F4520 no MultiPIC Advanced. Os exemplos ilustram conceitos básicos de programação em C como uso de IOs, timers, conversão analógica-digital, e interrupções de alta e baixa prioridade.

Enviado por

dnl
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd

Tópicos abordados

  • PWM,
  • Interrupções,
  • Configuração de Bits,
  • Estruturas de Repetição,
  • Exemplos de Código,
  • Bibliotecas C18,
  • Alocação de Memória,
  • Comunicação Serial,
  • Programação em C,
  • Timers
100% acharam este documento útil (1 voto)
396 visualizações9 páginas

Guia MultiPIC C18: Exemplos Práticos

Este documento fornece um guia e lista de exemplos em C para o compilador MPLab C18 utilizando o Microchip PIC18F4520 no MultiPIC Advanced. Os exemplos ilustram conceitos básicos de programação em C como uso de IOs, timers, conversão analógica-digital, e interrupções de alta e baixa prioridade.

Enviado por

dnl
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd

Tópicos abordados

  • PWM,
  • Interrupções,
  • Configuração de Bits,
  • Estruturas de Repetição,
  • Exemplos de Código,
  • Bibliotecas C18,
  • Alocação de Memória,
  • Comunicação Serial,
  • Programação em C,
  • Timers

MultiPIC Advanced

Guia de uso
Exemplos Compilador C18

Rev 0 Jun/11

Guia de uso exemplos MultiPIC Advanced em C18 - by Smart Radio


Exemplos de Programao C utilizando compilador Microchip MPLab C18
O MultiPIC Advanced dispe de vrios exemplos em linguagem C utilizando o compilador
Microchip MPLab C18.
Estes exemplos mostram tanto a arquitetura de hardware do PIC18F4520 quanto o uso da
linguagem C na prtica para inciantes em programao.
O PIC utilizado o PIC18F4520, um dos PICs mais populares atualmente devido ao seu alto poder
de processamento, vrios perifricos importantes internos disponveis, vasta documentao
incluindo diversos livros nacionais, disponibilidade de compra em muitas lojas do pas e tudo isto
aliado um baixo custo.
Caso ainda no conhea o uso do MPLab e a gravao por BootLoader do MultiPIC Advanced,
refira-se ao MPLab - TinyBootLoader Guia [Link] disponibilizado tambm para download em
[Link]/Pic/MultiPic
Lista dos Exemplos
Exemplo 1 Hello World Acendendo LED
Exemplo 2 Piscando LED
Exemplo 3 Sequenciando LEDs
Exemplo 4 Entrada Teclas
Exemplo 5/6 Usando Timers e Debugger (opcional)
Exemplo 7 Conversor Analgico/ Digital
Exemplo 8 Interrupes de alta e baixa prioridade
Exemplo 9 Usando Oscilador Interno
Exemplo 10 Memria de dados E2prom interna
Exemplo 11 Acessando a memria de programa
Exemplo 12 Mdulo PWM
Exemplos de uso de Hardware da placa MultiPIC
Hardware - Buzzer e Rel
Hardware Memria externa E2Prom I2C 24C04
Hardware - LCD 16x2 padro HD44780
Hardware - Placa opcional EB-04 Relgio RTC DS1307
Hardware - Placa opcional EB-04 RTC DS1307
Hardware Usando Teclado Matriz 3x4 / 12 teclas utilizando 7 IOs
Hardware Exemplo de programa usando UART / Serial RS232
seguir teremos um breve descritivo de cada exemplo
Exemplo 1: Hello World Acendendo LED
Este exemplo mostra a inicializao do PIC, IO como sada e como colocar um pino de IO um
nvel desejado.
Temos tambm o uso de pragmas como em: #pragma config WDT = OFF, OSC = HS, LVP =
OFF, PWRT = ON, PBADEN = OFF que acerta os configuration bits do PIC, refira-se ao
documento PIC 18 Config Settings disponvel atravs do menu help do MPLab, para saber mais

[Link]/Pic/MultiPic

pgina 2

Guia de uso exemplos MultiPIC Advanced em C18 - by Smart Radio


sobre cada uma destas diretivas.
Em seguida so colocados os Includes, como na linha: #include <p18f4520.h>, que nada mas faz
do que informar ao compilador onde encontrar o arquivo padro com nomes de IOs, etc daquele
PIC. Experimente clickar com o boto direito do mouse sobre esta linha e escolher a opo Open
.
Logo abaixo est a funo main , que todo programa em C deve conter
void main (void)
{
TRISD = 0b01111111;
6:0 so entradas/ inputs (1)

// PORTD bit 7 como sada/output (0); bits

LATDbits.LATD7 = 1;
para ligar LED

// Seta registrador LAT register bit 7 1

while (1);

// LOOP infinito

A linha TRISD = 0b01111111; coloca todos Ios do PORT D que esto marcados com 1
como entrada e o IO D7 como sada
Em seguida a linha LATDbits.LATD7 = 1; coloca o Port D 7 nvel 1 fazendo com que o
LED acenda
A diretiva while usada na linha while (1); faz com que o programa fique parado nela no
avanando o contador de programa para buscar novas instrues (que no existem), se no houvesse
esta linha o PIC continuaria executando o cdigo at chegar ao final da memria quando ento,
voltaria ao comeo primeira linha da memria de programa causando um comportamento
estranho no circuito

Exemplo 2: Piscando LED


Neste exemplo temos ilustrada a inicializao do PIC, uso de rotina de delay da biblioteca do C18
Delay10KTCYx(xxx); e uma das maneiras de se inverter o estado de determinado(s) IO nas linhas:
LATDbits.LATD7 = ~LATDbits.LATD7;

// inverte pino

LATDbits.LATD0 = ~LATDbits.LATD0;

// inverte pino

Exemplo 3: Sequenciando LEDs


Uma nova diretiva a usada no comeo do programa #pragma udata, define as variveis no
inicializadas ou seja, declaradas no comeo mas sem um valor definido e tambm ficam alocadas
estaticamente em determinado endereo da memria RAM de dados.

[Link]/Pic/MultiPic

pgina 3

Guia de uso exemplos MultiPIC Advanced em C18 - by Smart Radio


seguir a linha #pragma romdata Lesson3_Table = 0x180, define que teremos variveis seguir
alocadas partir do endereo determinado, 0x180 neste caso.
A linha LATD = LED_LookupTable[LED_Number]; faz com que seja colocado no PORTD o valor
da varivel LED_LookupTable com ndice de outra varivel: [LED_Number]
Tambm mostrado o incremento e decremento de variveis LED_Number++; e LED_Number--;
e uso do if then else.
Exemplo 4: Entrada Teclas
O monitoramento de uma das teclas feito de maneira simples pela linha de cdigo:
if (!Switch_Pin);
ou seja, enquanto o pino definido como Switch_Pin (veja arquivo 04 Switch Input.h) no estiver
0 ele no executa o cdigo nas chaves seguir
Em seguida temos um timo exemplo do uso do loop do while:
do
{

Delay10TCYx(200);
Switch_Count--;
if (Switch_Pin)
break;
}while (Switch_Count != 0);

// decrementa contador

E aps isto se contador atingiu o zero o nmero de vezes do loop foi satisfeito:
if ( Switch_Count == 0 ); como mostrado abaixo
if ( Switch_Count == 0 )
{
// se sim executa aqui
LATD = LED_Display;
// envia valor LED_Display para PORTD LED
LED_Display <<= 1;
// desloca display 1
if (LED_Display == 0)
LED_Display = 1;
// se zerou ento seta 1o
}while (!Switch_Pin);
// espera soltar tecla

Exemplos 5/6 Usando Timers e Debugger (opcional)


O PIC18F4520 dispe de vrios Timers internos, neste exemplo mostrado como inicializar e
monitorar quando chegou contagem final (estouro / overflow)
Com um debuger (opcional) conectado no MultiPIC Advanced podemos a qualquer momento parar
a execuo do programa e ver quais os valores esto nos registradores internos naquele momento.
No exemplo temos na janela Watch os registradores TMRH, TMR0L e LED_Display e tambm
podem ser adicionados outros pra visualizao
A inicializao do Timer0 feita em

[Link]/Pic/MultiPic

pgina 4

Guia de uso exemplos MultiPIC Advanced em C18 - by Smart Radio

byte

// Inicia Timer
INTCONbits.TMR0IF = 0;
//T0CON = 0b00001000;
//T0CON = 0b00000001;
T0CON = 0b00000011;
TMR0H = 0;

//
//
//
//
//

TMR0L = 0;
T0CONbits.TMR0ON = 1;

// start timer;

limpa interrupt flag estouro timer


no prescale - incrementa instruction clock
prescale 1:4 - four times the delay.
prescale 1:14 - four times the delay.
limpa timer - sempre escrever 1o upper

outra maneira, talvez at mais facilitada, de inicializar os Timers usando-se a biblioteca do C18,
consulte o documento PIC18F Peripheral Library Help [Link] que fica na pasta \doc
onde o C18 est instalado .
Exemplo 7: Conversor Analgico/ Digital
A converso de sinais analgicos em digitais muito facilitada no C18 com comandos simples. Para
tal, precisamos inicializar o mdulo AD do PIC e configur-lo como desejado e aps habilitar
converses A/D; veremos no programa do exemplo 7 contido no projeto 07 [Link] como fazer
isto
A configurao do AD feita no programa nas linhas de cdigo conforme mostrado abaixo
AD_SEL_CH0;
ADCON1 = 0x0E;
ADCON2 = 0xBE;
(~21.0kHz)
[Link] = 1;

// seleciona Channel AD
// Vdd/Vss is +/-REF, AN0-AN3 is analog
// Right justify, 20TAD ACQ time, Fosc/64
// LiGA AD,

Aps isto, toda vez que desejado obter uma converso, chamada a funo Start_AD mostrada
abaixo:
void Start_AD (void)
{
[Link] = 1;
while([Link]);
}

// d incio a converso
// espera at que a converso esteja pronta

Esta funo seta e depois monitora o bit GO do registrador ADCON0 at que ele volte a zero:
linha while([Link]), indicando que a converso est pronta. Outra maneira seria
habilitar a interrupo do AD que geraria ento uma interrupo quando pronta a converso.
Quando a converso est pronta (refira-se ao datasheet do PIC p/ detalhes de tempo) o programa
volta para aps a chamada e a o valor j est nos registradores como mostrado no trecho d ecdigo
abaixo:
AD_Result = ADRESH ;
AD_Result <<= 8;
AD_Result += ADRESL;

// Pega parte alta do resultado


// e desloca pro 8 bits altos
// e soma parte baixa do resultado

[Link]/Pic/MultiPic

pgina 5

Guia de uso exemplos MultiPIC Advanced em C18 - by Smart Radio


Logo aps o programa pega o valor e o comprara com valores pr determinados para acender os
LEDs no PORTD de acordo com a tenso lida
Exemplo 8: Interrupes de alta e baixa prioridade
No PIC18F4520 podemos ter interrupo de alta e baixa prioridade mas, o que isto?
A reposta simples: Um programa roda normalmente at que ocorra um interrupo quando
desviado para um endereo de memria de programa especfico onde executa um cdigo nosso
de programa para o tratamento desta interrupo.
Ento o fato de termos 2 nveis de interrupo significa que, se enquanto o programa j est
tratando de uma interrupo de Baixa Prioridade se ocorrer uma interrupo de Alta Prioridade o
programa deslocado para tratar esta interrupo mais Prioritria e, aps tratar ela, retorna ao
tratamento da de baixa prioridade e aps isto a sim, retorna ao fluxo normal do programa at que
aconteam mais interrupes.
Estes endereos da memria de programa determinados para tratamento das interrupes, so
normalmente chamados de Vetores de interrupo (interrupt vector) e, no caso dos PICs 18F so
eles:
endereo 0x08 para interrupes de Alta Prioridade
endereo 0x18 para interrupes de Baixa Prioridade
No Exemplo 8 tempos com o estouro do Timer 0 como interrupo de Alta Prioridade e a mudana
de estado do PortB 4 7 como baixa prioridade.
Isto acaba fazendo com que o o programa possa monitorar ambos dando a impresso de que ao
mesmo tempo. Experimente manter a tecla pressionada e veja que o LED continua a piscar
normalmente
Exemplo 9: Usando Oscilador Interno
Os PICs da famlia 18F permitem inmeros tipos de oscilador: interno, externo RC, externo Xtal, c/
PLL e mais (consulte o datasheet ), cada um mais adequado para determinada aplicao, por
exemplo para operao com baterias onde consumo importante, podemos optar por uso de baixa
frequncia (pois quanto maior a de Clock maior tambm o consumo), ou se espao e custo forem
importantes e preciso do oscilador nem tanto podemos usar interno e assim por diante.
Neste exemplo visto como o prprio PIC pode alterar sua velocidade de Clock quando est usando
o tipo de oscilador interno, isto pode ser til em uma aplicao onde, por exemplo, a velocidade de
processamento tem que ser alta somente em determinados momentos e o equipamento opera com
bateria ento, o PIC pode chavear o oscilador para frequncias altas somente quando necessrio
poupando assim a carga da bateria.
Logo no incio do programa temos os configuration bits programados conforme desejado, repare
que no OSC = INTIO67 fica setado o uso do oscilador interno.
/** C O N F I G U R A T I O N
B I T S ******************************/
#pragma config WDT = OFF, OSC = INTIO67, LVP = OFF, PWRT = ON, PBADEN = OFF

[Link]/Pic/MultiPic

pgina 6

Guia de uso exemplos MultiPIC Advanced em C18 - by Smart Radio


Aqui temos exemplo de como usar o switch case da linguagem C para tomada de decises
atravs de comparaes. O uso de passagem de parmetros atravs de vetores (endereo na
memria) & utilizado na chamada de funo: SetIntOSC(&Contador_Clock)
Exemplo 10: Memria de dados E2prom interna
Os PICs da famlia 18F dispe de uma memria interna No Voltil (no perde dados mesmo aps
retirada a alimentao) tipo E2PROM (mesmo que EEPROM) para armazenamento de dados
No C18 temos a facilidade de usar bibliotecas prontas para acesso de leitura e escrita da memria,
facilitando em muito o trabalho.
As funes da biblioteca Write_b_eep (ee_address, number_count), Read_b_eep(ee_address) so
usadas para escrita e leitura respectivamente e Busy_eep () para esperar enquanto a EEPROM
gravada, veja maiores detalhes delas e outras relacionadas no PIC18F Peripheral Library Help
[Link] que fica na pasta \doc onde o C18 est instalado .
No exemplo temos o acesso memria tanto manualmente atravs dos registradores/ bits
relacionados, como pelo uso da biblioteca
Logo aps o incio do programa, na sub main, temos o loop inicial while (number_count > 127
&& !FlagError) que usa o acesso direto para gravar e ler do endereo 0 ao 126 da EEPROM
atravs das funes EEPROM_Write e EEPROM_Read .
partir do 126 no loop: while (number_count && !FlagError) usada a biblioteca c/ as funes
Write_b_eep () e Read_b_eep().
Exemplo 11: Acessando a memria de programa
Um grande recurso de alguns PICs e todos da famlia 18F, poder gravar a prpria memria de
programa. Isto permite aplicaes versteis e contribui quando utilizado, para reduo de hardware
externo e com isto reduo do custo de produto. Um exemplo de uso o prprio processo de
gravao do MultiPIC Advanced por BootLoader que nada mais do que um programa interno
residente, que permite gravar outras reas de memria do PIC fazendo com isto, que no seja mais
necessrio ter que adquirir um gravador externo, outras aplicaes podem ser feitas para usar a
prpria memria Flash como memria de armazenamento de dados como por exemplo em um
Data Logger.
O uso da memria Flash tem algumas diferenas se comparado ao uso da EEPROM: Deve ser
apagada em blocos de 64bytes e escrita em blocos de 32 bytes.
No exemplo 11 temos demonstraes de como escrever, ler e apagar a memria de programa
interna tipo FLASH
Exemplo 12: Mdulo PWM
PWM ou Pulse Width Modulation a modulao de sinal por largura de pulso, que uma as
maneiras que permite converter um sinal digital em analgico, o PIC18F4520 possui duas sadas de
PWM por hardware e este pode ser acessvel tanto pelos registradores associados como pela
biblioteca do C18 (veja mais detalhes sobre o uso da biblioteca no documento PIC18F Peripheral
Library Help [Link] que fica na pasta \doc onde o C18 est instalado )

[Link]/Pic/MultiPic

pgina 7

Guia de uso exemplos MultiPIC Advanced em C18 - by Smart Radio


Exemplos de uso de Hardware da placa MultiPIC em C18
1. Hardware - Buzzer e Rel
Neste exemplo simples demostrado como acessar e controlar o rel e o buzzer da placa
2. Hardware Memria externa E2Prom I2C 24C04
A placa dispe de uma memria externa I2C tipo EEPROM para armazenamento de dados e
neste exemplo so usadas as funes de acesso memrias i2C do prprio compilador C18 que
facilitam muito o trabalho de programao. Tambm utilizada a biblioteca para setup do Timer0
em OpenTimer0(...).
3. Hardware - LCD 16x2 padro HD44780
Aqui temos uma biblioteca completa para escrever no LCD da placa alm da demonstrao
de como us-la.
4. Hardware - Placa opcional EB-04 Relgio RTC DS1307
Tambm utilizando o protocolo i2C o Real Time Clock DS1307 tem um exemplo aqui de
um relgio completo (requer uso de placa opcional EB-04 ou montagem de circuito externo)
5. Hardware Usando Teclado Matriz 3x4 / 12 teclas utilizando 7 Ios
O teclado do MultiPIC Advanced ligado como matriz de 4 linhas por 3 colunas, com isto
com apenas 7 IOs do PIC possvel controlar 12 Teclas! Outro detalhe que elas esto conectadas
ao PORTB do PIC que tem um recurso especial: Interrupt on Change que nada mais do que gerar
uma interrupo (se habilitado claro) quando ocorre alguma mudana de estado nos IOs 4 7 , isto
permite que faamos programas que transcorram normalmente at que seja acionada uma tela,
quando o programa pode ser desviado para atender e depois retornar ao seu fluxo normal.
No trecho de cdigo mostrado abaixo temos como setar interrupo.

[Link] = 0;
[Link] = 0;

// habilita pull ups portB


//Interrupo portB = baixa prioridade

[Link] = 1;

// habilita interrupt na mudana estado portB 4

[Link] = 1;

// habilita interrupts c/ nveis de prioridades

O programa devolve na varivel Tecla qual tecla foi pressionada.

6. Hardware Exemplo de programa usando UART / Serial RS232


A placa MultiPIC Advanced dispe interfaceamento para a UART/ Serial do PIC18F4520,
temos duas formas de us-la: atravs de RS232 pelo conector DB9 PL2 conectando outro
equipamento RS232 como por exemplo um computador ou, atravs atravs da USB que ao
ser conectada no PC cria uma porta serial virtual sendo um canal de comunicaes com o
PC tanto para troca de dados como para gravao. Veja no manual como setar a placa
escolhendo entre uma e outra conexo.

[Link]/Pic/MultiPic

pgina 8

Guia de uso exemplos MultiPIC Advanced em C18 - by Smart Radio


Um software terminal serial, como por exemplo o Hyper terminal do Windows ou o Mini
Terminal, necessrio rodando no PC, setado 19200 8N1 e com a porta serial COM correta
escolhida, para comunicao com a placa.
No exemplo em C18, temos como configurar e ativar a serial na funo Configura_Usart ();
O recebimento de dados feito pela sub rx_handler() que executada, atravs de interrupo, toda
vez que um caractere est disponvel no buffer de recebimento do PIC.
Para o envio chamada a funo ConsoleTX(), que monitora e espera se o buffer de transmisso
pode receber um caractere: while([Link] == 0) e se sim escreve ele: WriteUSART
(c);

void ConsoleTX( char c )


{
while([Link] == 0);
WriteUSART (c);
}

Aqui novamente a biblioteca do C18 simplifica bastante o trabalho de configurao e uso de um


perifrico.

[Link]/Pic/MultiPic

pgina 9

Você também pode gostar