Apostila - Pic ByPIOL
Apostila - Pic ByPIOL
Apostila - Pic ByPIOL
APOSTILA DE:
PROGRAMAÇÃO DE
MICROCONTROLADORES PIC
USANDO LINGUAGEM C
INTRODUÇÃO ............................................................................................................... 2
1. INTRODUÇÃO AOS MICROCONTROLADORES .............................................. 3
1.1. O que é um Microcontrolador? ......................................................................... 3
1.2. Qual a diferença do Microcontroladores e dos Microprocessadores? .............. 3
1.3. O que significa PIC? ......................................................................................... 3
1.4. Programação do PIC ......................................................................................... 5
1.5. O que é o MpLab?............................................................................................. 6
2. O PIC 16F877A ........................................................................................................ 7
2.1. NOMENCLATURA DOS PINOS ................................................................... 8
2.2. QUE É SCHMITT-TRIGGER?...................................................................... 10
2.3. GERADOR DE RELÓGIO – OSCILADOR ................................................. 12
2.4. Oscilador XT................................................................................................... 12
2.5. Oscilador RC................................................................................................... 13
3. AMBIENTE INTEGRADO DE DESENVOLVIMENTO (IDE) .......................... 15
3.1. CRIAÇÃO DE UM PROJETO:...................................................................... 17
4. INTRODUÇÃO À LINGUAGEM C – O PRIMEIRO PROGRAMA................... 25
5. USO DO MPSIM PARA SIMULAÇÃO ............................................................... 29
6. AS VARIÁVEIS NO COMPILADOR CCS .......................................................... 43
6.1. O que são Variáveis? ...................................................................................... 43
6.2. Tipos de variáveis ........................................................................................... 43
6.3. OS MODIFICADORES.................................................................................. 43
6.4. Declaração de Variáveis ................................................................................. 44
6.5. Inicializando Variáveis ................................................................................... 45
6.6. Variáveis Locais e Globais ............................................................................. 46
6.7. Constantes ....................................................................................................... 46
Exercícios 6.1:............................................................................................................. 47
7. OPERADORES EM C............................................................................................ 48
7.1. O Operador de Atribuição............................................................................... 48
7.2. Os Operadores Aritméticos............................................................................. 48
7.3. Operadores Relacionais e Lógicos.................................................................. 50
7.4. Operadores de Incremento e Decremento....................................................... 51
7.5. Operadores Aritméticos de Atribuição ........................................................... 52
7.6. Operadores Bit a Bit........................................................................................ 53
7.7. O Operador Ternário ? ..................................... Erro! Indicador não definido.
7.8. Interface com os interruptores ........................................................................ 55
Exercícios 7.1: ...................................................................................................... 59
8. TEMPORIZAÇÃO NO PIC ................................................................................... 61
8.1. A função Delay:.............................................................................................. 61
8.2. Interrupção Temporizador: ............................................................................. 64
8.3. O temporizador TIMER 0............................................................................... 64
Exercícios 8.1: ...................................................................................................... 68
9. SINAIS ANALÓGICOS NO PIC........................................................................... 70
9.1. CONCEITOS BÁSICOS DOS CONVERSORES ......................................... 70
9.2. Tratamento de Entradas Analógicas no PIC ................................................... 72
Exemplo 9.2: ............................................................................................................... 74
Exercícios:................................................................................................................... 76
10. COMUNICAÇÃO SERIAL ............................................................................... 78
10.1. Comunicação Serial Síncrona x Comunicação Serial Assincrona.............. 79
10.2. O RS232 no PIC.......................................................................................... 79
MICROCONTROLADORES PIC EM C
INTRODUÇÃO
Edição
O MpLab possui um editor de texto para seus programas que possui diversas
ferramentas de auxílio como localizar, substituir, recortar, copiar e colar.
Compilação
Compilar significa traduzir um programa escrito em assembly (mneumônicos) para
linguagem de máquina (números). A compilação gera um arquivo com extensão
.hex (hexadecimal) a partir dos arquivos de código fonte (.asm) e de projeto (.pjt). É
o conteúdo do arquivo hexadecimal que é gravado na memória de programa do
PIC.
Simulação
O MpLab possui ferramentas para simulação do programa no próprio computador,
possibilitando a execução passo a passo, visualização e edição do conteúdo dos
registradores, edição de estímulos (entradas), contagem de tempo de execução,
etc.
Gravação
Para que o programa seja executado no microcontrolador, o arquivo hexadecimal
deve ser gravado no PIC. O MpLab oferece suporte aos gravadores fabricados pela
Microchip.
Emulação
A Emulação é um recurso de desenvolvimento que possibilita testes em tempo real.
O MpLab oferece suporte ao hardware necessário para estar emulando um
determinado programa. Esta emulação é feita conectando-se (através do hardware
mencionado) o computador ao sistema projetado, no lugar do PIC
MICROCONTROLADORES PIC EM C
2. O PIC 16F877A
(2)
ST
PORTC (I/Os digitais bidirecionais):
RC4/SDI/DAS 23 I/O ST RC4: I/O digital ou entrada de dados para SPI ou via de
dados (entrada/saída) para I²C.
TTL/
(3)
ST
TTL/
(3)
ST
PORTE (I/Os digitais bidirecionais e sistema analógico):
RE0/RD/AN5 8 I/O TTL/ RE0: I/O digital ou controle de leitura da porta paralela
(3)
ST ou entrada analógica AN5.
Legenda:
I =Input (entrada) O = Output(saída)
I/O = Input/OutPut (entrada ou saída) P = Power(Alimentação)
- = não utilizado TTL = Entrada tipo TTL
ST = Entrada tipo Schmitt trigger
Notas:
(1): Esta entrada é do tipo ST, somente quando configurado como interrupção
externa.
(2): Esta entrada é do tipo ST, somente durante o modo de programação serial.
(3): Esta entrada é do tipo ST, quando configurado como I/O de uso geral e TTL
quando usado em modo de porta paralela.
Verifica-se pelo gráfico que a transição de nível lógico baixo (LOW) para alto (HIGH)
é muito longa, implicando na oscilação da saída da porta lógica "NÃO" à medida
que o sinal de entrada passa pelo intervalo indefinido (1 ou 0), transportando para
saída o mesmo efeito.
MICROCONTROLADORES PIC EM C
Portanto fica claro que não existe apenas porta lógica "NÃO" Schmitt-trigger,
existem outras portas com essa tecnologia.
Porta lógica Schmitt-trigger é projetada para aceitar sinais cuja a transição é lenta
e garante na saída nível lógico livre de oscilações.
Analisando o gráfico da figura anterior observa-se que a saída muda de nível lógico
alto (HIGH) para baixo (LOW) quando a tensão de transição é superior a VT +
(Positive-going threshold - limiar de tenso positiva de transição).
MICROCONTROLADORES PIC EM C
Tipos de osciladores
O PIC pode trabalhar com quatro configurações de oscilador. Uma vez que as
configurações com um oscilador de cristal e resistência-condensador (RC) são
aquelas mais frequentemente usadas, elas são as únicas que vamos mencionar
aqui.
2.4. Oscilador XT
O oscilador de cristal está contido num envólucro de metal com dois pinos onde foi
escrita a frequência a que o cristal oscila. Dois condensadores cerâmicos devem
ligar cada um dos pinos do cristal à massa. Casos há em que cristal e
condensadores estão contidos no mesmo encapsulamento, é também o caso do
ressonador cerâmico ao lado representado. Este elemento tem três pinos com o
pino central ligado à massa e os outros dois pinos ligados aos pinos OSC1 e OSC2
do microcontrolador. Quando projetamos um dispositivo, a regra é colocar o
oscilador tão perto quanto possível do microcontrolador, de modo a evitar qualquer
interferência nas linhas que ligam o oscilador ao microcontrolador.
MICROCONTROLADORES PIC EM C
2.5. Oscilador RC
Para ter um controle sobre o reset é conveniente instalar um botão como se mostra
na figura.
MICROCONTROLADORES PIC EM C
• Criar um projeto novo usando o assistente (Wizard), para isto fazer click no
menu Project / Project Wizard .... como é mostrado na seguinte figura.
• Avançar
• Incrementar algum arquivo existente no projeto em caso de ter. Para este curso por
enquanto não incrementaremos nenhum arquivo e clicaremos em avançar
diretamente.
Até aqui o seu projeto esta vazio sem nenhum programa. O programa criado ainda
não esta associado ao projeto.
• Com o mouse sobre Source Files clicar no botão direito do mouse, depois
clicar na opção “Add Files”.
#include <16f877A.h>
#use delay(clock=4000000, RESTART_WDT)
#fuses xt,nowdt,noprotect,put,brownout,nolvp,nocpd,nowrt
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)
#byte porta = 0x05
#byte portb = 0x06
#byte portc = 0x07
#byte portd = 0x08
#byte porte = 0x09
#bit botao = portb.0
#bit led = portb.1
void main ()
{
set_tris_a(0b11111111);
set_tris_b(0b11111001);
set_tris_c(0b11111111);
set_tris_d(0b11111111);
set_tris_e(0b00000111);
porta=0x00;
portb=0x00;
portc=0x00;
portd=0x00;
porte=0x00;
while(TRUE)
{
RESTART_WDT();
if(!botao)
led = 1;
else
led=0;
}
}
MICROCONTROLADORES PIC EM C
#fuses xt,wdt,noprotect,put,brownout,nolvp,nocpd,nowrt
Configuração dos fusíveis.
XT: O oscilador, da maioria dos PIC, é externo, sem ele nada funciona.
Existem vários tipos de osciladores como o RC composto por uma resistência e um
capacitor e o cristal XT que é mais preciso sendo também os mais caros.
put: prevê que o programa não comece antes que a alimentação seja
inicializada. Esta opção irá fazer com que o PIC comece a operar cerca de 72 ms
após o pino /MCLR seja colocado em nível alto.
Trabalho 4.1: Pesquisar para a próxima aula as outras diretivas não comentadas.
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)
Afeta como o compilador gerará código para as instruções de entrada ou
saída que seguem. Esta diretiva tem efeito até que uma nova diretiva #use xxxx_IO
seja encontrado. Este método rápido de configuração de configuração de I/O a
configurar corretamente a direção de I/O usando a instrução set_tris_X().
void main ()
A declaração main() especifica o nome de uma função. No caso, a função
main() é padronizada na linguagem C e é utilizada para definir a função principal, ou
corpo principal do programa.
O sinal de abertura de chave “{“ é utilizado para delimitar o início da função e
o sinal de fechamento de chave “}” indica o final da função. Na verdade, as chaves
delimitam o que chamamos de bloco de programa, ou bloco de código.
set_tris_a(0b11111111);
set_tris_b(0b11111001);
set_tris_c(0b11111111);
set_tris_d(0b11111111);
set_tris_e(0b00000111);
Esta função permite direcionar as I/O. Deve de ser usado com o comando
“fast_io” e quando as portas de I/O estão acessíveis, para isto deve ser usada a
diretiva #BYTE para o acesso da porta. Cada bit no valor representa um pino. O
“1”(um) representa entrada e o zero saída.
Exemplo: SET_TRIS_B( 0x0F ); similar a SET_TRIS_B( 0b00001111 )
// B7,B6,B5,B4 are outputs
// B3,B2,B1,B0 are inputs
porta=0x00;
portb=0x00;
portc=0x00;
portd=0x00;
porte=0x00;
Inicializando as portas, todos os pinos das portas na execução destas linhas
tomarão o valor de zero ou desligado.
while(TRUE)
Este é um comando de controle utilizado na repetição de um determinado
bloco de instruções. Esse bloco será repetido enquanto a avaliação da condição
especificada entre parênteses for verdadeira. No caso, a avaliação é explicitamente
verdadeira (true).
O bloco de instruções que será repetido é aquele especificado dentro das
chaves que seguem o comando while.
if(!botao)
led = 1;
else
MICROCONTROLADORES PIC EM C
led=0;
O comando if (em português “se”) é utilizado para avaliar a condição que esta
entre parênteses. Em caso de que esta condição seja verdadeira o comando
seguinte será executado. Em caso de ser falsa (else) o comando depois da
instrução “else” será executado. Neste exemplo o a variável booleana botão esta
negada (!botao) quer disser se o botão estivesse em estado zero a condição será
falsa e o led será igual a 1. Em caso que o botão seja 1 a condição será falsa e o
led será igual a zero.
Até aqui se espera que o leitor consiga associar o pino do PIC às portas
mencionadas no programa, e que possa entender este exemplo que mesmo sendo
básico é o início do aprendizado de um recurso sem limites. Até a próxima aula
onde aprenderemos a simular programas sem a necessidade de um hardware.
MICROCONTROLADORES PIC EM C
Exercícios 5.1:
1. Incremente a palavra Brasil depois da linha de programa “while(TRUE)” e
compile o projeto.
2. Em que linha se apresentou o erro?. Verifique a barra de indicação inferior na
janela do Mplab que mostra a linha e a coluna na qual se encontra o cursor.
3. Porque ao incrementar esta palavra provocou ao compilador o erro?
Exercícios 5.2:
1. Pressionar o botão Animate e anotar suas observações. Para parar a
animação clicar no botão halt.
2. Clicar no botão Run e anotar suas observações, que esta acontecendo?
3. Clicar várias vezes o botão Step over e anotar suas observações?
MICROCONTROLADORES PIC EM C
Para que a ação seja executada o usuário deverá clicar o botão da coluna
fire.
MICROCONTROLADORES PIC EM C
Agora o leitor deve estar preparado para simular o seu projeto com estímulos
de entrada.
Exercícios 5.3:
1) Pressionar o botão Step Over nos botões de controle de simulação e
verifique se a linha de comando depois da instrução if é executada. Na
seguinte barredura estimule o variável botão e verifique novamente a
execução desta linha. Anote suas observações, que esta acontecendo?
Exercícios 5.4:
1. Inserir na janela watch o byte portb em binário e simular novamente o
programa observando detalhadamente os resultados.
MICROCONTROLADORES PIC EM C
void main ()
{
set_tris_a(0b11111111);
set_tris_b(0b11111011);
set_tris_c(0b11111111);
set_tris_d(0b11111111);
set_tris_e(0b00000111);
porta=0x00;
portb=0x00;
portc=0x00;
portd=0x00;
porte=0x00;
while(TRUE)
{
if(!BotaoLiga)
{
Motor1 = 1;
Lampada=1;
}
if(!BotaoDesliga)
{
Motor1 = 0;
Lampada=0;
}
}
}
MICROCONTROLADORES PIC EM C
/********************************************************
* CEFETES
* Prof: Marco Antonio
* Exemplo 1: Estrutura Básica de um programa em C
* Materia: Microcontroladores
* Data: Agosto 2006
********************************************************/
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* DEFINIÇÃO DAS VARIÁVEIS INTERNAS DO PIC *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include <16f877A.h> // microcontrolador utilizado
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Configurações para gravação *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Constantes internas *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//A definição de constantes facilita a programação e a manutenção.
//Este programa não utiliza nenhuma constante de usuário
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Declaração dos flags de software *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//A definição de flags ajuda na programação e economiza memória RAM.
//Este programa não utiliza nenhum flag de usuário
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Definição e inicialização dos port's *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* ENTRADAS *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#bit BotaoSA14_b1 = portb.1
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* SAÍDAS *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
MICROCONTROLADORES PIC EM C
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Configurações do Microcontrolador *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void main ()
{
// configura CONFIG
setup_counters(RTCC_INTERNAL, WDT_2304MS);
// configura os TRIS
set_tris_a(0b00100000);
set_tris_b(0b00001111);
set_tris_c(0b10011001);
set_tris_d(0b00000000);
set_tris_e(0b00000000);
// inicializa os ports
porta=0x00; // limpa porta
portb=0x00; // limpa portb
portc=0x00; // limpa portc
portd=0x00; // limpa portd
porte=0x00; // limpa porte
HabLed =1;
HabBotao=1;
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Loop principal *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
while(TRUE)
{
RESTART_WDT();
if(BotaoSA14_b1) // testa botão
Led0 = 1; // Se botão = 0, então led = 1
else
Led0=0; // caso contrário, led = 0
}
// FIM DO PROGRAMA
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Fim do Programa *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
MICROCONTROLADORES PIC EM C
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* DEFINIÇÃO DAS VARIÁVEIS INTERNAS DO PIC *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include <16f877A.h> // microcontrolador utilizado
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Configurações para gravação *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Constantes internas *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Declaração dos flags de software *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//A definição de flags ajuda na programação e economiza memória RAM.
//Este programa não utiliza nenhum flag de usuário
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Definição e inicialização dos port's *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* ENTRADAS *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#bit Botao7 = portb.1
#bit BotaoDesLiga = portb.2
#bit Botao9 = portb.3
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* SAÍDAS *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#bit HabLed = porta.4
#bit HabBotao = portb.6
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Configurações do Microcontrolador *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void main ()
{
// configura CONFIG
setup_counters(RTCC_INTERNAL, WDT_2304MS);
// configura os TRIS
set_tris_a(0b00100000);
set_tris_b(0b00001111);
set_tris_c(0b10011001);
set_tris_d(0b00000000);
set_tris_e(0b00000000);
// inicializa os ports
porta=0x00; // limpa porta
portb=0x00; // limpa portb
portc=0x00; // limpa portc
portd=0x00; // limpa portd
porte=0x00; // limpa porte
HabLed =1;
HabBotao=1;//rb7
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Loop principal *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
while(TRUE)
{
RESTART_WDT();
if(Botao9) // testa botão
portd = 0b01101111;
if(Botao7) // testa botão
portd = 0b00000111;
if(BotaoDesLiga)
portd = 0b00000000; // caso contrário, led = 0
}
// FIM DO PROGRAMA
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Fim do Programa *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
MICROCONTROLADORES PIC EM C
Para você poder manipular dados dos mais diversos tipos, é necessário poder
armazená-los na memória e poder referenciá-los quando for preciso. É para isso
que exitem as variáveis, que nada mais são do que um espaço reservado na
memória, e que possuem um nome para facilitar a referência. As variáveis podem
ser de qualquer tipo visto nesta aula: int, char, float, double, etc.
Como o próprio nome diz, as variáveis podem ter o seu conteúdo alterado durante a
execução do programa, ou seja, o programador tem a liberdade de atribuir valores
ao decorrer da execução.
O C tem 5 tipos básicos: char, int, float, void, double. Destes não todos os tipos
fazem parte do compilador CCS. O double é o ponto flutuante duplo e pode ser
visto como um ponto flutuante com muito mais precisão. O void é o tipo vazio, ou
um "tipo sem tipo". A aplicação deste "tipo" será vista posteriormente. Na seguinte
tabela observaremos os tipos de dados do compilador CCS.
6.3. OS MODIFICADORES
que no caso do compilador CCS cria uma variável de apenas um bit. Uma
especificação long int criará uma variável de 16 bits
Assim, um tipo de dados signed int pode representar valores entre -128 e
+127, em vez de 0 a 255.
Todos os tipos, exceto o Float, por defeito são unsigned; porem pode estar
precedido por unsigned ou signed. Na seguinte tabela mostramos alguns exemplos
de combinações possíveis dos tipos de dados do compilador CCS.
Intervalo
Tipo Num de bits
Inicio Fim
char 8 0 255
unsigned char 8 0 255
signed char 8 -128 127
int, int8, byte 8 0 255
unsigned int, unsignet byte 8 0 255
signed int, signed int 8 -128 127
long int 16 0 65.535
signed long int 16 -32.768 32.767
unsigned long int 16 0 65.535
Int32, unsigned int32 32 0 4.294.967.295
Signed int32 32 -2,147.483.648 2,147.483.647
float 32 3,4E-38 3.4E+38
Exemplos:
int id;
MICROCONTROLADORES PIC EM C
float aux;
unsigned int i;
char carac;
Onde tipo pode ser qualquer tipo válido da linguagem C, e nome_da_variavel deve
ser um nome dado pelo programador, sendo o primeiro caractere uma letra ou um
"_", e os demais, letras, números ou "_".
num _carac
peso Id_obj
aluno_1 AUX
1num -idade
$aux id@al
int n=12;
int n;
n=12;
num=i;
#include *****
int main()
{
int contador=0; //contador é uma variável local
num= 10;
printf("%d", n);
return 0;
}
Assim como as variáveis locais, veremos as variáveis globais com mais detalhes na
aula sobre funções.
6.7. Constantes
Constantes em C são valores fixos, que não mudam durante a execução. Elas
podem ser de qualquer tipo básico: inteiras, ponto flutuante, caractere, string.
De maneira geral, qualquer tipo de dado pode ser utilizado para definir uma
constante, cabendo apenas ao programador representar o valor dela
adequadamente.
const valor1 = 10
const valor1 = -3
const valor1 = 13.24
const valor1 = ‘c’
const valor1 = “CEFETES-Linhares”
As constantes são também utilizadas para impedir que uma função altere um
parâmetro passado a ela.
Bem, nesta aula você aprendeu sobre os tipos de dados que a linguagem C pode
manipular. Também viu a forma de armazenar temporariamente estes dados, com o
MICROCONTROLADORES PIC EM C
Exercícios 6.1:
• $num
• -temp
• _carac_
• 3aux
MICROCONTROLADORES PIC EM C
7. OPERADORES EM C
Já aprendemos sobre a estrutura básica de um programa em C, sobre os tipos de
dados que C pode manipular, sobre o que são variáveis e constantes. Na aula de
hoje você aprenderá a criar expressões em C com o uso de operadores, sejam
eles aritméticos, lógicos, relacionais, etc. Mostraremos vários exemplos e
finalizaremos a aula com exercícios.
Então, pé na tábua!
n= 10;
ch= 'a';
fp= 2.51;
n= num;
n= (5+2)/4;
Atribuições múltiplas:
x = y = z = 20;
Como você viu no último exemplo acima, C também permite atribuições múltiplas
(como x = y = z = 20;). Neste caso, todas as variáveis da atribuição (x, y e z)
recebem o valor mais à direita (20).
Mais alta
- unário
*/%
+-
Mais baixa
5+2*3-8/4
5+6-2
Este é apenas um de vários problemas que podem ser resolvidos com o uso do
operador %.
Operador Ação
< Menor que
<= Menor que ou igual
> Maior que
>= Maior que ou igual
== Igual
!= Diferente
int main()
{
int n; /* Declaração de uma variável
inteira */
Tente fazer alguns testes com os outros operadores relacionais. Sei lá, seja criativo!
Você é o programador... :)
MICROCONTROLADORES PIC EM C
Outro exemplo:
Maior
!
>, >=, <, <=
==, !=
&&
||
Menor
Os parênteses também podem ser usados para mudar a ordem de avaliação das
expressões, como no caso das expressões aritméticas.
++n;
MICROCONTROLADORES PIC EM C
ou depois da variável:
n++;
Exemplo 1:
n= 5;
p= ++n;
printf("%d ",p); /* imprime na tela: 6 */
Exemplo 2:
n= 5;
p= n++;
printf("%d ",p); /* imprime na tela: 5 */
x+=10;
que é igual a:
Esses operadores são usados com mais freqüência em drivers de dispositivo, como
rotinas de impressoras, modems, operações com arquivos em disco, rotinas da
porta serial e paralela, etc.
Operador Ação
& and ("e" lógico)
| or ("ou" lógico)
^ exclusive or ("ou exclusivo")
~ complemento de 1
>> deslocamento à direita
<< deslocamento à esquerda
Para saber como se comportam os operadores bit a bit, segue abaixo uma tabela
verdade dos operadores, com exceção dos operadores de deslocamento:
O operador & compara os dois operandos bit a bit e cada bit do resultado é 1
somente quando os dois bits do operando for 1. Caso contrário, 0.
O bits do resultado de uma operação | bit a bit só será 1 quando um dos dois bits,
ou os dois, forem 1. Na operação ^ só será 1 quando os bits dos operandos forem
diferentes. Se forem iguais (0^0 ou 1^1) será 0.
x= 8; /* 8 em binário é 1000 */
y= 9; /* 9 em binário é 1001 */
x & y:
1000
1001
----
1000 => O resultado desta operação é 8 (1000).
x | y:
1000
1001
----
1001 => O resultado desta operação é 9 (1001).
x ^ y:
1000
1001
----
0001 => O resultado desta operação é 1.
~x: 1000
----
MICROCONTROLADORES PIC EM C
~y: 1001
----
0110 => O resultado desta operação é 6 (110).
Você deve ter notado que deslocar um bit à direita é o mesmo que dividir o número
por 2. Deslocar 2 bits à direita é o mesmo que dividir o número por 4, e assim por
diante.
portas de alta impedância é especialmente problemático, uma vez que o valor lógico
da porta poderá oscilar continuamente entre nível lógico alto e baixo.
Exemplos:
Para poder ter uma noção, de como poderia ser o circuito eletrônico, é
apresentado o esquemático deste. O motor não pode ser ligado diretamente
pelo PIC, por enquanto consideraremos que um Led (LMOTOR)representando o
Motor.
/********************************************************
* CEFETES
* Prof: Marco Antonio
* Exemplo 2: Controle de Nível num tanque de água
* Materia: MICROCONTROLADORES
* Data: Julho 2006 /Linhares
********************************************************/
#include <16f877A.h>
#use delay(clock=4000000, RESTART_WDT)
#fuses xt,nowdt,noprotect,put,brownout,nolvp,nocpd,nowrt
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)
void main ()
{
set_tris_a(0b11111111);
set_tris_b(0b11110110);
set_tris_c(0b11111111);
set_tris_d(0b11111111);
set_tris_e(0b00000111);
porta=0x00;
portb=0x00;
portc=0x00;
portd=0x00;
porte=0x00;
while(TRUE)
{
if((!S1)&&(!S2))
LMotor =1;
if((S1)&&(S2))
LMotor = 0;
}
}
MICROCONTROLADORES PIC EM C
Exercícios 7.1:
a) 2+3*5 = 30
b) 5*2/2 = 5
c) 4+6-8/2 = 6
d) (-3)*4 = 12
a) 1 > 2
b) 2 >= 1
c) 3 != 3
d) 'c' == 'c'
4) Fazer um projeto para que a pressão do vapor sempre permaneça entre uma
faixa específica (histerese), sabendo que a histerese do pressostato é calibrada
no instrumento. Os níveis do tanque sempre devem de estar entre S1 e S2,
sabendo que a bomba 1 tem uma partida simples. V2 só abrira quando a
pressão esteja entre os níveis de histereses determinado.
.
Ilustração 32: Exercício 7.4, controle de pressão
MICROCONTROLADORES PIC EM C
8. TEMPORIZAÇÃO NO PIC
Esta função criará código para executar uma demora do tempo especificado.
O tempo é especificado em milissegundos. Esta função trabalha executando um
número preciso de instruções para causar a demora pedida.
O tempo de demora pode ser mais longo do que o pedido se uma interrupção
for chamada durante a espera do tempo. O tempo gastado na interrupção não
conta para o tempo de demora.
Exemplo 8.1:
È conveniente observar que neste exemplo o watch dog timer esta ativado,
neste caso será necessário resetar o WDT para que o PIC não seja resetado e
comece a ser executada a primeira linha do programa. Para isto é usada a função
RESTART_WDT().
Alem da função Delay, existem outras funções que ainda não foram vistas.
Trata-se das funções output_high(PIN_B0) e output_low(PIN_B0).
/********************************************************
* CEABRA
* Prof: Marco Antonio
* Exemplo 1: Pisca – Pisca (Estrutura básica de um programa)
* Matéria: Microcontroladores
* Data: Julho 2006
********************************************************/
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* DEFINIÇÃO DAS VARIÁVEIS INTERNAS DO PIC *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include <16f877A.h> // microcontrolador utilizado
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Configurações para gravação *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Definições para uso de Rotinas de Delay *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Constantes internas *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//A definição de constantes facilita a programação e a manutenção.
//Este programa não utiliza nenhuma constante de usuário
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Declaração dos flags de software *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//A definição de flags ajuda na programação e economiza memória RAM.
//Este programa não utiliza nenhum flag de usuário
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Definição e inicialização dos port's *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* ENTRADAS *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// As entradas devem ser associadas a nomes para facilitar a programação e
//futuras alterações do hardware.
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* SAÍDAS *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// AS SAÍDAS DEVEM SER ASSOCIADAS A NOMES PARA FACILITAR A PROGRAMAÇÃO E
//FUTURAS ALTERAÇÕES DO HARDWARE.
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Configurações do Microcontrolador *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void main ()
{
// configura CONFIG
setup_counters(RTCC_INTERNAL, WDT_2304MS);
// configura os TRIS
set_tris_a(0b11111111); // configuração dos pinos de I/O
set_tris_b(0b11111000);
set_tris_c(0b11111111);
set_tris_d(0b11111111);
set_tris_e(0b00000111);
// inicializa os ports
porta=0x00; // limpa porta
portb=0x00; // limpa portb
portc=0x00; // limpa portc
portd=0x00; // limpa portd
porte=0x00; // limpa porte
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Loop principal *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
while(TRUE)
{
RESTART_WDT();
output_high(PIN_B0);
delay_ms(1000);
output_low(PIN_B0);
delay_ms(1000);
output_high(PIN_B1);
delay_ms(1000);
output_low(PIN_B1);
delay_ms(1000);
}
// FIM DO PROGRAMA
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Fim do Programa *
*************************************
MICROCONTROLADORES PIC EM C
Exemplo 8.2:
Vejamos neste exemplo como configurar o módulo timer 0 para que uma
saída pisque a cada segundo. Neste caso o clock é de 4 MHz e é utilizado um
prescaler de 32, então teremos uma freqüência de entrada no timer 0 de:
Fosc/(4*preEscala) = 4 000 000/(4*32) = 31250
Deste resultado podemos tirar uma conclusão: a cada vez que o registro
TMR0 se incrementa em 1, passa na verdade um tempo de 1/31250 seg.
/********************************************************
* CEFETES
* Prof: Marco Antonio
* Exemplo 8.2: Pisca - Pisca, usando interrupção Timer 0
* Materia: Eletrônica Digital
* Data: Setembro 2005
********************************************************/
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* DEFINIÇÃO DAS VARIÁVEIS INTERNAS DO PIC *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include <16f877A.h> // microcontrolador utilizado
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Configurações para gravação *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
MICROCONTROLADORES PIC EM C
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Definições para uso de Rotinas de Delay *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Constantes internas *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//A definição de constantes facilita a programação e a manutenção.
//Este programa não utiliza nenhuma constante de usuário
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Declaração dos flags de software *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//A definição de flags ajuda na programação e economiza memória RAM.
int conta;
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Definição e inicialização dos port's *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* ENTRADAS *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// As entradas devem ser associadas a nomes para facilitar a programação e
//futuras alterações do hardware.
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* SAÍDAS *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// AS SAÍDAS DEVEM SER ASSOCIADAS A NOMES PARA FACILITAR A PROGRAMAÇÃO E
//FUTURAS ALTERAÇÕES DO HARDWARE.
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Configurações do Microcontrolador *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#int_timer0
void trata_t0()
{
MICROCONTROLADORES PIC EM C
//HABILITA INTERRUPÇÕES
ENABLE_INTERRUPTS (GLOBAL | INT_TIMER0);
// configura os TRIS
set_tris_a(0b11111111); // configuração dos pinos de I/O
set_tris_b(0b11111000);
set_tris_c(0b11111111);
set_tris_d(0b11111111);
set_tris_e(0b00000111);
// inicializa os ports
porta=0x00; // limpa porta
portb=0x00; // limpa portb
portc=0x00; // limpa portc
portd=0x00; // limpa portd
porte=0x00; // limpa porte
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Loop principal *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
while(TRUE)
{
RESTART_WDT();
}
// FIM DO PROGRAMA
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Fim do Programa *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
MICROCONTROLADORES PIC EM C
Exercícios 8.1:
• Como o quintal era grande pediu para usar um diodo lazer para
construir um sensor de barreira, só que o lazer não podia estar ligado
constantemente, devia ficar ligado o 10% do período a uma freqüência
de 1 KHz.
• Para o receptor oriento trabalhar com uma resistência LDR que tem
maior área sensora.
• O alarme não poderia disparar imediatamente ao ser cortada a
barreira, deverá esperar ½ segundo para ter certeza que se trata de
um ladrão.
• Boa sorte galera. Vocês terão que montar o projeto.
MICROCONTROLADORES PIC EM C
Uma entrada analógica de tensão para que possa entrar no CLP, PIC ou
computador precisa de ser amostrada e convertida num valor numérico através de
um conversor A/D.
Ilustração 36: Amostragem de um sinal com freqüência muito maior a frequencia de amostragem
Exercícios 9.1:
a) Sendo que o range de uma entrada analógica de um CLP é de 0 a10V, e o
conversor tivesse uma resolução de 10 bits. Qual seria o valor do número
resultante para uma entrada de 5 volts?
#device adc=10
Especifica ao compilar o número de bits da conversão analógico digital
setup_adc (opções);
Esta função configura o relojo para o conversor A/D. As opções são variáveis
ou constantes inteiras de 8 bits. As opções variam de acordo com cada PIC e
podem ser encontradas no arquito de cabeçalho de cada dispositivo. No caso do
Pic 16F877A encontramos:
• ADC_OFF
• ADC_CLOCK_DIV_2
• ADC_CLOCK_DIV_4
• ADC_CLOCK_DIV_8
• ADC_CLOCK_DIV_16
• ADC_CLOCK_DIV_32
• ADC_CLOCK_DIV_64
• ADC_CLOCK_INTERNAL
Ejemplo:
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel (1);
Sintaxe: set_adc_channel (canal)
Parâmetros: canal é o número do canal selecionado. O número do canal começa
com zero referente ao pino AN0.
Função: Especifica o canal que será usado para executar o próximo comando
READ_ADC. Verifique que passe um pequeno tempo antes de trocar de canal para
que possa ter maior exatidão. O tempo varia em função do valor da impedância da
fonte de entrada. Em geral 10us são suficientes. Não será necessário trocar de
canal antes de cada leitura se o canal não muda. Esta função esta disponível em
PICs com conversores A/D.
Exemplo:
set_adc_channel(2);
delay_us(10);
value = read_adc();
read_adc();
Sintaxe: value = read_adc ([mode])
Parâmetros: mode é um parâmetro opcional. Se usado estes podem ser:
ADC_START_AND_READ (this is the default)
ADC_START_ONLY (starts the conversion and returns)
ADC_READ_ONLY (reads last conversion result)
MICROCONTROLADORES PIC EM C
Retorna: o vaor da conversão analógica digital para o caso do PIC 16F877A, retorna um valor de 16
bits.
Função: Esta função faz a leitura do valor digital do conversor analógico digital.
Examples:
setup_adc( ADC_CLOCK_INTERNAL );
setup_adc_ports( ALL_ANALOG );
set_adc_channel(1);
value = read_adc();
Exemplo 9.2:
Este programa foi feito com a intenção de servir como modelo para o
desenvolvimento de outros projetos.
EscNova = 5 * Conversão/1023
/********************************************************
* CEFETES
* Prof: Marco Antonio
* Exemplo 4: Conversaõ analógica digital
* Materia: Eletrônica Digital
* Data: Julho 2006
********************************************************/
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* ENTRADAS *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
float conversao = 0; // armazena o resultado da conversão AD
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* SAÍDAS *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#bit LedTensaoBaixa = portb.0
#bit LedTensaoMedia = portb.1
#bit LedTensaoAlta = portb.2
void main()
{
// configura microcontrolador
setup_adc_ports (RA0_RA1_RA3_analog);//Configura Vdd e Vss como Vref
setup_adc (adc_clock_div_32);
setup_counters (rtcc_internal, WDT_2304MS);
set_adc_channel (1);
// configura os tris
set_tris_a(0b11011111); // configuração da direção dos pinos
de I/O
set_tris_b(0b00000000);
set_tris_c(0b11111101);
set_tris_d(0b00000000);
set_tris_e(0b00000100);
// inicializa os ports
porta=0x00; // limpa porta
portb=0x00; // limpa portb
portc=0x00; // limpa portc
portd=0x00; // limpa portd
porte=0x00; // limpa porte
if (conversao<=1)
LedTensaoBaixa = 1;
else
LedTensaoBaixa = 0;
if ((conversao<=4)&&(conversao>=1))
LedTensaoMedia = 1;
else
LedTensaoMedia = 0;
if ((conversao<=5)&&(conversao>=4))
LedTensaoAlta = 1;
else
LedTensaoAlta = 0;
}
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Fim do Programa *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
Exercícios:
Y0
Assuma que a fonte de corrente variável esta instalada na entrada AN0 através de
uma resistência de 250 ohms e que a sinal do PDT esta instalado na entrada AN1
também com uma resistência de 250 ohms. A velocidade da bomba não é variada
pelo uC, mas o controle de liga e desliga sim.
10.COMUNICAÇÃO SERIAL
Notem que neste frame existe um bit de start, 8 bits de dados, um bit de
paridade e um bit de parada. A paridade pode ser par ou ímpar. Quando a paridade
é par o bit de paridade é gerado de modo que o número de 1s resultante na palavra
mais o bit de paridade seja par.
Por exemplo, se a palvra 10001010 está sendo transmitida, ou recebida, o bit
de paridade deve ser 1, para que o conjunto palavra + bit de paridade tenha sempre
um número par de 1s. Se a paridade usada for ímpar o bit de paridade no exemplo
anterior será zero.
No processo de transmissão assíncrona, os dispositivos envolvidos no
processo de comunicação devem ter a mesma taxa de transmissão e recepção.
VCC) para os níveis de tensão da porta serial do computador padrão RS232 (-12
VCC e +12 VCC) e vice-versa.
EXEMPLO:
Neste exemplo esta sendo usada uma entrada analógica de 0 a 5V e o seu
valor é transferido através do RS232 a um computador. No computador pode-se
desenvolver um programa para poder trocar dados com o programa do PIC. Mas
também podemos usar o hiperTerminal que é umacessório do Windows para
comunicação serial. Basta ir a:
Iniciar\Programas\Acessórios\Comunicações\Hiperterminal
MICROCONTROLADORES PIC EM C
O programa exige que o operador digite uma letra “d” para que o PIC possa
transmitir a informação.
/********************************************************
* CEABRA
* Prof: Marco Antonio
* Exemplo 4: Conversão analógica digital e comunicação vía RS232
* Matéria: Eletrônica Digital
* Data: Outubro 2005
********************************************************/
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)
void main()
{
// configura microcontrolador
setup_adc_ports (RA0_RA1_RA3_analog);//Configura Vdd e Vss como Vref
setup_adc (adc_clock_div_32);
setup_counters (rtcc_internal, WDT_2304MS);
set_adc_channel (1);
setup_vref(VREF_LOW|6);
// configura os tris
set_tris_a(0b11011111); // configuração da direção dos pinos
de I/O
set_tris_b(0b00000011);
set_tris_c(0b11111101);
set_tris_d(0b00000000);
set_tris_e(0b00000100);
// inicializa os ports
porta=0x00; // limpa porta
portb=0x00; // limpa portb
portc=0x00; // limpa portc
portd=0x00; // limpa portd
porte=0x00; // limpa porte
MICROCONTROLADORES PIC EM C
Exercícios:
1) Olhando o help do CCS explicar detlalhadamente o programa feito no
exemplo.
2) Pesquisar e mostrar a diferencia entre o RS485 e RS232.
3) Montar o circuito do exemplo explicado neste capítulo.
MICROCONTROLADORES PIC EM C
/********************************************************
* CEABRA
* Prof: Marco Antonio
* Exemplo 3: Controle de nível num tanque
* Uma bomba é acionada quando o tanque esta vazio
* e quando este esteja cheio, a bomba desliga. Dois sensores
* são instalados, sensor de tanque cheio e tanque vazio.
* Materia: Eletrônica Digital
* Data: Outubro 2005
********************************************************/
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* ENTRADAS *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// As entradas devem ser associadas a nomes para facilitar a programação e
//futuras alterações do hardware.
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* SAÍDAS *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// AS SAÍDAS DEVEM SER ASSOCIADAS A NOMES PARA FACILITAR A
PROGRAMAÇÃO E
//FUTURAS ALTERAÇÕES DO HARDWARE.
void main ()
{
// configura CONFIG
setup_counters(RTCC_INTERNAL, WDT_2304MS);
// configura os TRIS
set_tris_a(0b11111111); // configuração dos pinos de I/O
set_tris_b(0b00000011);
set_tris_c(0b11111111);
set_tris_d(0b11111111);
set_tris_e(0b00000111);
// inicializa os ports
porta=0x00; // limpa porta
portb=0x00; // limpa portb
portc=0x00; // limpa portc
portd=0x00; // limpa portd
porte=0x00; // limpa porte
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Loop principal *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
while(TRUE)
{
RESTART_WDT();
Exemplo4:
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Programação em C - Recursos Básicos de programação *
* Exemplo 4 *
* *
* CENTRO DE TREINAMENTO - MOSAICO ENGENHARIA *
* *
* TEL: (0XX11) 4992-8775 SITE: www.mosaico-eng.com.br *
* E-MAIL: [email protected] *
**************************************
* VERSÃO : 1.0 *
* DATA : 05/06/2003 *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Descrição geral *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
MICROCONTROLADORES PIC EM C
// Este software está preparado para ler quatro botões e tocar o buzzer com
//duração variavel conforme a tecla pressionada, além de acender o led
//indicando a última tecla pressionada.
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* DEFINIÇÃO DAS VARIÁVEIS INTERNAS DO PIC *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Configurações para gravação *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Definições para uso de Rotinas de Delay *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Constantes internas *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//A definição de constantes facilita a programação e a manutenção.
#define t_filtro 20 // tamanho do filtro
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Definição e inicialização das variáveis *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//Neste bloco estão definidas as variáveis globais do programa.
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Definição e inicialização dos port's *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#use fast_io(a)
MICROCONTROLADORES PIC EM C
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Declaração dos flags de software *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
//A definição de flags ajuda na programação e economiza memória RAM.
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* ENTRADAS *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// As entradas devem ser associadas a nomes para facilitar a programação e
//futuras alterações do hardware.
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* SAÍDAS *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// AS SAÍDAS DEVEM SER ASSOCIADAS A NOMES PARA FACILITAR A
PROGRAMAÇÃO E
//FUTURAS ALTERAÇÕES DO HARDWARE.
MICROCONTROLADORES PIC EM C
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Tabela de Valores *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
byte const tabela[16] =
{16,32,32,48,64,80,96,112,128,144,160,176,192,208,224,240};
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Configuração do Microcontrolador *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// A rotina principal simplesmente limpa o WDT, pois toda a lógica do
// programa é tratada dentro das interrupções.
void main()
{
// configura microcontrolador
setup_adc_ports (no_analogs);
setup_counters(rtcc_internal , rtcc_div_8);
setup_timer_2 (t2_div_by_16,per,1);
// configura os tris
set_tris_a(0b11011111);
set_tris_b(0b11110000);
set_tris_c(0b11111111);
set_tris_d(0b11111111);
set_tris_e(0b00000111);
// inicializa os ports
porta=(0b00000000);
portb=(0b00000000);
portc=(0b00000000);
portd=(0b00000000);
porte=(0b00000000);
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Rotina principal *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
MICROCONTROLADORES PIC EM C
#int_rtcc
void trata_int_tmr0(void)
{
set_tris_b(0b00001111); // configura os pinos como
entrada para testar os botões
delay_cycles(4); // aguarda 4 ciclos de máquina para a
estabilização do portb
status_botoes = portb; // lê o status dos botoes, salva
em variável temporária
status_botoes = (status_botoes & 0x0f); // zera a parte alta do
registrador
set_tris_b(0b00000000); // configura os pinos como
saída para controle dos leds
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Tratamento do Botão 1 *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
}
else
{ // botão 1 liberado
filtro1 = t_filtro; // inicia o filtro do botão 1
botao1_press = 0; // marca que o botão foi liberado
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Tratamento do Botão 2 *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
}
else
{ // botão 2 liberado
filtro2 = t_filtro; // inicia o filtro do botão 2
botao2_press = 0; // marca que o botão foi liberado
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Tratamento do Botão 3 *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
}
else
{ // botão 3 liberado
filtro3 = t_filtro; // inicia o filtro do botão 3
botao3_press = 0; // marca que o botão foi liberado
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Tratamento do Botão 4 *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
}
else
{ // botão 4 liberado
filtro4 = t_filtro; // inicia o filtro do botão 4
MICROCONTROLADORES PIC EM C
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Atualiza Leds conforme botões pressionados *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
portb = status_leds; // atualiza os leds
if (status_leds == 0)
{
per = 0xff;
setup_timer_2 (t2_div_by_16,per,1);
disable_interrupts (INT_TIMER2);
buzzer = 0;
}
else
{
per = (tabela[status_leds]); // consulta tabela e inicializa
timer2.
setup_timer_2 (t2_div_by_16,per,1);
enable_interrupts (INT_TIMER2); // habilita interrupção de
timer2.
}
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Rotina de Tratamento de interrupção de TMR2 *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// Está interrupção só irá ocorrer quando alguma tecla estiver pressionada,
// o periodo de ocorrência depende do botão ou da conbinação de botões
pressionados,
// ela irá inverter o pino de I/O do buzzer a cada interrupção.
#int_timer2
void trata_int_tmr2(void)
{
if (buzzer != 0) // o buzzer está ligado ?
{
buzzer = 0; // sim, então desliga
}
else
{
buzzer = 1; // não, então liga
}
}
MICROCONTROLADORES PIC EM C
/********************************************************
* CEABRA
* Prof: Marco Antonio
* Exemplo 4: Conversaõ analógica digital e comunicação vía RS232
* Materia: Eletrônica Digital
* Data: Outubro 2005
********************************************************/
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)
void main()
{
// configura microcontrolador
setup_adc_ports (RA0_RA1_RA3_analog);//Configura Vdd e Vss como
Vref
setup_adc (adc_clock_div_32);
setup_counters (rtcc_internal, WDT_2304MS);
set_adc_channel (1);
// configura os tris
set_tris_a(0b11011111); // configuração da direção dos
pinos de I/O
set_tris_b(0b00000011);
set_tris_c(0b11111101);
set_tris_d(0b00000000);
set_tris_e(0b00000100);
MICROCONTROLADORES PIC EM C
// inicializa os ports
porta=0x00; // limpa porta
portb=0x00; // limpa portb
portc=0x00; // limpa portc
portd=0x00; // limpa portd
porte=0x00; // limpa porte
}
MICROCONTROLADORES PIC EM C
MICROCONTROLADORES PIC EM C
/********************************************************
* CEABRA
* Prof: Marco Antonio
* Exemplo 5: Uso dos LCDs
* Materia: Eletrônica Digital
* Data: Setembro 2005
********************************************************/
#zero_ram
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* SAÍDAS *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#bit rs = porte.0 // via do lcd que sinaliza recepção de dados ou
comando
#bit enable = porte.1 // enable do lcd
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Rotina que envia um COMANDO para o LCD *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void comando_lcd(int caracter)
{
rs = 0; // seleciona o envio de um comando
portd = caracter; // carrega o portd com o caracter
enable = 1 ; // gera pulso no enable
delay_us(1); // espera 3 microsegundos
enable = 0; // desce o pino de enable
return; // retorna
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Rotina que envia um DADO a ser escrito no LCD *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void escreve_lcd(int caracter)
{
rs = 1; // seleciona o envio de um comando
portd = caracter; // carrega o portd com o caracter
enable = 1; // gera pulso no enable
delay_us(1); // espera 3 microsegundos
enable = 0; // desce o pino de enable
return; // retorna
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Função para limpar o LCD *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void limpa_lcd()
{
comando_lcd(0x01); // limpa lcd
delay_ms (2);
return;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Inicialização do Display de LCD *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void inicializa_lcd()
{
comando_lcd(0x30); // envia comando para inicializar
display
delay_ms(4); // espera 4 milisengundos
return; // retorna
}
void main()
{
// configura microcontrolador
setup_adc_ports (no_analogs);
setup_counters (rtcc_internal, WDT_2304MS);
// configura os tris
set_tris_a(0b11011111); // configuração da direção dos
pinos de I/O
set_tris_b(0b00000011);
set_tris_c(0b11111101);
set_tris_d(0b00000000);
set_tris_e(0b00000100);
// inicializa os ports
// inicializa os ports
porta=0x00; // limpa porta
portb=0x00; // limpa portb
portc=0x00; // limpa portc
portd=0x00; // limpa portd
porte=0x00; // limpa porte
}
}