de
Microcontroladores PIC
Fabricantes de Microcontroladores
Existem diversos fabricantes de Microcontroladores no mercado mundial. Cada um
possui suas especialidades como velocidade de operao, custo/benefcio, perifricos, etc.
Dentre os principais fabricantes, podemos citar:
Atmel;
Dallas Semiconductor;
Intel;
Philips;
Microchip;
Hitachi;
Motorola;
Zilog.
Ciclo de Mquina
tambm chamado de Ciclo de Instruo. Como indica o prprio nome, o Ciclo de
Mquina o tempo gasto para efetuar uma instruo. Nos Microcontroladores PIC o Ciclo de
Mquina de 4 Ciclos de Clock.
Para que o programa escrito no Microcontrolador seja executado necessrio que seja
conectado ao mesmo um Oscilador. O Oscilador o componente que gerar pulsos de Clock
em um contador especial, denominado Contador de Programa. O Contador de Programa
aponta para cada posio da Memria de Programa, onde o Programa do Usurio gravado, a
fim de executar a instruo gravada nesta posio.
Dentre o bloco Memrias, destaca-se: Memria de Programa, onde est gravado todo
o programa do usurio; Memria RAM, utilizada para a manipulao de valores,
armazenamento de resultados de operaes matemticas e booleanas, etc. (todas as variveis
que so criadas pelo usurio so armazenadas na Memria RAM); dentre o bloco Memrias
temos os Registradores de Funes Especiais. Estes auxiliam na manipulao dos mdulos
internos do Microcontrolador. Cada mdulo de Comunicao, Timer, Conversor A/D, entre
outros, possui um ou mais registros de configuraes.
O C uma linguagem de alto nvel com uma sintaxe bastante estruturada e flexvel
tornando sua programao bastante simplificada;
O C compartilha recursos tanto de alto quanto de baixo nvel, pois permite acesso e
programao direta do microprocessador. Com isto, rotinas cuja dependncia do tempo
crtica, podem ser facilmente implementadas usando instrues em Assembly. Por
esta razo o C a linguagem preferida de boa parte dos programadores;
O C uma linguagem estruturalmente simples e de grande portabilidade. O compilador
C gera cdigos mais enxutos e velozes do que muitas outras linguagens;
Embora estruturalmente simples (poucas funes intrnsecas) o C no perde
funcionalidade, pois permite a incluso de uma farta quantidade de rotinas do usurio.
Os fabricantes de compiladores fornecem uma ampla variedade de rotinas pr-
compiladas em bibliotecas.
Toda funo deve ser iniciada por uma chave de abertura { e encerrada por uma chave
de fechamento };
Toda funo procedida de parnteses ( );
As linhas de cdigo so sempre encerradas por um ponto e vrgula;
A formatao dos programas completamente livre, mas temos por convenincia
manter a legibilidade;
Os comandos so executados na ordem em que foram escritos;
Os comentrios devem ser delimitados por /* no incio e */ no final.
Podem ser usados tambm os caracteres // para comentrios de uma linha.
Variveis
Todas as variveis e constantes usadas no programa devem ser definidas com um
nome e um tipo. Os dados bsicos podem ser de 8, 16 e 32 bits de comprimento, e devido as
caractersticas peculiares dos microcontroladores, variveis de 1 bit tambm podem ser
definidas.
Porm, o CCS no case sensitive. Ou seja. Se tentarmos declarar uma varivel com
o nome TESTE e outra como TesTe elas sero interpretadas pelo compilador como sendo de
mesmo nome.
Tipos de Variveis
Variveis de 1 bit: podem assumir apenas dois valores distrintos: 0 ou 1. No CCS
este tipo de varivel nomeado por int1 e short.
Variveis de 8 bits sem sinal: podem armazenar valores inteiros que vo de 0 a 256,
para o caso dos tipos unsigned int, unsigned int8 e byte.
Variveis de 8 bits com sinal: armazenam valores inteiros que vo de -127 at 128.
So os tipos: signed int e signed int8.
Varivel de 8 bits padro ASCII (manipulao de caracteres): char.
Variveis de 16 bits: long int, int16.
Varivel de 32 bits: int32.
Varivel de 32 bits para valores fracionrios: float.
Declarando Variveis
A forma de declarao de variveis a seguinte:
Tipo_da_varivel Nome_da_varivel;
Inicializando Variveis
Pode-se inicializar uma varivel no momento de sua declarao, ou em qualquer
instante do programa.
Variveis Locais: as variveis locais tem alcance apenas dentro das rotinas ou
funes onde foram criadas. Isto significa que apenas a rotina ou funo onde a
mesma foi criada poder utiliz-la.
Exemplo: 0b10101010
Exemplo: z; A; a; ....
Tipos de Operadores
Operador de Atribuio
A operao de atribuio a operao mais simples do C. Consiste de atribuir valor de
uma expresso a uma varivel. A sintaxe da operao de atribuio a seguinte:
identificador = expresso;
Operadores Aritmticos
Existem cinco operadores aritmticos em C. Cada operador aritmticos est
relacionado ao uma operao aritmtica elementar: adio, subtrao, multiplicao e diviso.
Precedncia de operadores
Quando mais de um operador se encontram em uma expresso aritmtica as
operaes so efetuadas uma de cada vez respeitando algumas regras de precedncia. Estas
regras de precedncia so as mesmas da matemtica elementar.
Os operadores de multiplicao (*), diviso (/) e mdulo (%) tem precedncia sobre os
operadores de adio (+) e subtrao (-). Entre operadores de mesma precedncia as
operaes so efetuadas da esquerda para a direita.
Operadores relacionais
Operadores relacionais verificam a relao de magnitude e igualdade entre dois
valores. So seis os operadores relacionais em C:
O resultado de uma expresso lgica sempre um valor numrico que pode variar
entre dois valores: uma expresso avaliada como verdadeira recebe o valor 1 e uma expresso
lgica avaliada como falsa recebe o valor 0.
Operadores lgicos
So trs os operadores lgicos de C: &&, || e !. Estes operadores possuem o mesmo
significado, respectivamente, dos operadores lgicos Booleanos AND, OR e NOT.
! expresso
Operadores Incrementais
Em programao existem instrues muito comuns chamadas de incremento e
decremento. Uma instruo de incremento adiciona uma unidade ao contedo de uma varivel.
Uma instruo de decremento subtrai uma unidade do contedo de uma varivel.
Estruturas Relacionais
Deciso de um bloco (if...)
A estrutura de deciso de um bloco permite que se execute (ou no) um bloco de
instrues conforme o valor de uma condio seja verdadeiro ou falso. O fluxograma desta
estrutura mostrado abaixo.
F bloco
if(condio)
bloco;
condio?
bloco 1 bloco 2
if(condio)
bloco_1;
else
Condio
F
1?
V
Condio
F
2?
bloco 1
V
Condio
F
3?
bloco 2
...
V
bloco 3
...
if(condio_1)
Bloco_1;
else if(condio_2)
Bloco_2;
...
Else
Bloco_N;
Estrutura switch...case
A estrutura switch...case uma estrutura de deciso que permite a execuo de um
conjunto de instrues a partir de pontos diferentes conforme o resultado de uma expresso de
controle. O resultado desta expresso comparado ao valor de cada um dos rtulos, e as
instrues so executadas a partir desde rtulo. A figura abaixo mostra o fluxograma lgico
desta estrutura.
expresso
rotulo 1
conjunto 1
rotulo 2
conjunto 2
...
rotulo N
conjunto N
rotulo D
conjunto D
switch(expresso)
...
default: conjunto_d;
Estruturas de Repetio
Estrutura do...while
Esta uma estrutura bsica de repetio condicional. Permite a execuo de um bloco
de instrues repetidamente. Sua sintaxe a seguinte:
do
bloco
}while(condio);
Esta estrutura faz com que o bloco de instrues seja executado pelo menos uma vez.
Aps a execuo do bloco, a condio avaliada. Se a condio verdadeira o bloco ser
executado novamente. Caso contrrio a repetio terminada. O fluxograma desta estrutura
mostrado na figura:
condio? V
Estrutura while
A estrutura de repetio condicional while semelhante a estrutura do...while. Sua
sintaxe a seguinte:
while(condio)
bloco
Esta estrutura faz com que a condio seja avaliada em primeiro lugar. Se a condio
verdadeira o bloco executado uma vez e a condio avaliada novamente. Caso a condio
seja falsa a repetio terminada sem a execuo do bloco. Observe que nesta estrutura, ao
contrrio da estrutura do...while, pode ocorrer do bloco de instrues no ser executado
nenhuma vez. Para isto basta que a condio seja inicialmente falsa.
bloco
Estrutura for
A estrutura for muito semelhante as estruturas de repetio vistas anteriormente,
entretanto costuma ser utilizada quando se quer um nmero determinado de ciclos. A contagem
dos ciclos feita por uma varivel chamada de contador. A estrutura for , as vezes, chamada
de estrutura de repetio com contador. Sua sintaxe a seguinte:
bloco
A instruo break.
Esta instruo serve para terminar a execuo das instrues de um lao de repetio
(for, do...while, while) ou para terminar um conjunto switch...case.
Manipulao de Funes
Funes de Biblioteca
Uma funo um sub-programa (tambm chamado de rotina). Esta funo recebe
informaes, processa e retorna outra informao. Por exemplo: podemos ter uma funo que
receba um valor numrico, calcule seu logaritmo decimal e retorne o valor obtido.
Para incluir uma biblioteca do compilador (que est na pasta include do compilador)
usa-se a diretiva:
O cdigo mostrado abaixo uma funo definida pelo usurio para calcular a mdia
aritmtica de dois nmeros reais:
No exemplo acima definimos uma funo do tipo float chamada media que recebe
dois argumentos tipo float: a e b. A mdia destes dois valores calculada e armazenada
na varivel med declarada dentro da funo media. A funo retorna, para o programa que a
chamou, um valor tambm do tipo float: o valor da varivel med. Este retorno de valor feito
pela instruo return que termina a execuo da funo e retorna o valor de med para o
programa que a chamou.
Definio de Funes
De modo formal, a sintaxe de uma funo a seguinte:
Bloco_de_instrues_da_funo
O tipo de retorno da funo especifica qual o tipo de dado retornado pela funo,
podendo ser qualquer tipo de varivel: int, float, etc. Se a funo no retorna nenhum valor
para o programa que a chamou devemos definir o retorno como void, ou seja, um retorno
ausente.
Vale notar que existe apenas um valor de retorno para funes em C. No podemos
fazer o retorno de dois ou mais valores. Porm isto no uma limitao sria, pois o uso de
ponteiros contorna o problema.
A chamada de uma funo termina com a instruo return que transfere o controle para
o programa que realizou a chamada da funo. Esta instruo tem duas finalidades: determina
o fim lgico da rotina e o valor de retorno da funo. O argumento de return ser retornado
como valor da funo.
Sintaxe:
[corpo de funo]
{ ...
...
Sintaxe:
...
...
[corpo de funo]
Em C, como em muitas outras linguagens, permitido que o usurio crie uma funo
em um arquivo e um programa que a chame em outro arquivo distinto. Esta facilidade permite a
criao de bibliotecas de usurio: um conjunto de arquivos contendo funes escritas pelo
usurio. Esta possibilidade uma grande vantagem utilizada em larga escala por
programadores profissionais.
Sintaxe:
...
...
Declarao de Vetores
Em C, um vetor um conjunto de variveis de um mesmo tipo que possuem um nome
identificador e um ndice de referncia.
tipo nome[tam];
onde: tipo o tipo dos elementos do vetor: int, float, char, etc. nome o
identificador do vetor. tam o tamanho do vetor, isto , o nmero de elementos que o vetor
pode armazenar.
Inicializao de Vetores
Assim como podemos inicializar variveis (por exemplo: int j = 3;), podemos inicializar
os vetores. A sintaxe para a inicializao dos elementos de um vetor :
onde: lista de valores uma lista de nmeros, separada por vrgulas, dos valores de
cada elemento do vetor.
nome_da_funo(nome_do_vetor)
...
Matrizes
Vetores podem ter mais de uma dimenso, isto , mais de um ndice de referncia.
Podemos ter vetores de duas, trs, ou mais dimenses, nestes casos, estes so chamados de
matrizes. Podemos entender um vetor de duas dimenses (por exemplo) associando-o aos
dados de uma tabela.
tipo nome[tam_1][tam_2]...[tam_N]={{lista},{lista},...{lista}};
onde: tipo o tipo dos elementos do vetor. nome o nome do vetor. [tam_1]
[tam_2]...[tam_N] o tamanho de cada dimenso do vetor. {{lista},{lista},...{lista}} so as listas
de elementos.
...
Strings
String uma das mais importantes formas de dados em C e usada para armazenar e
manipular textos como palavras, nomes e sentenas. String um vetor do tipo char terminado
pelo caracter NULL (\0), ou seja, string uma srie de caracteres armazenados em seqncia,
onde cada um ocupa um byte de memria, toda string terminada por um byte de valor zero
(\0). Cada caracter um elemento independente e pode ser acessado atravs de um ndice.
Funes para utilizao de diversos circuitos integrados como Relgio de Tempo Real,
Conversores D/A, Memrias Flash, Potencimetros Digitais, Mdulos de Comunicao
Ethernet, entre outros, tambm fazem parte do Pacote de Funes do CCS. Bibliotecas de
Funes Matemticas tambm esto inclusas.
Compilando os Programas
Para compilar o programa, basta acessar a Aba Compile. Um conjunto de opes
ser fornecido e, dentre elas, basta clicar no cone denominado Compile.
O PIC Wizard
CCS possui um Assistente de Configuraes denominado PIC Wizard. Ele nos
permite configurar vrios dos recursos e mdulos disponveis no Microcontrolador, tais como:
Freqncia de Operao, Interrupes, Comunicao, Timers, Conversor A/D, entre outros.
Isso tudo de uma maneira bastante intuitiva e de simples operao.
Nesse processo, sabemos que vamos medir a temperatura de uma Estufa. Sendo
assim, precisamos escolher um Sensor de Temperatura que se enquadre no processo,
respeitando caractersticas de temperatura do ambiente a ser monitorado. Assim, escolhemos
um sensor analgico e utilizamos um Mdulo Conversor A/D ou utilizamos um Sensor de
Temperatura Digital com comunicao SPI ou I2C, entre outros tipos. Como vamos medir
temperaturas relativamente baixas (prximas a 30 graus Celsius) podemos utilizar um sensor
de temperatura digital com comunicao SPI, o que muito comum no mercado. Como no
se consegue uma grande variao da grandeza fsica Temperatura em um pequeno intervalo
de tempo, no nosso exemplo medir a temperatura de 5 em 5 segundos j nos o suficiente.
Sendo assim, necessitamos de uma base de tempo que nos ajude a calcular este tempo de 5
segundos. Isso realizado a partir de um Mdulo Temporizador. A comunicao entre
Computador e MCU ser realizada a partir de um Mdulo RS232.
Com base no processo acima, devemos escolher um MCU que possua os Mdulos:
Temporizador (Timer), Comunicao Serial RS232 (USART Transmissor e Receptor
Universal Sncrono e Assncrono) e SPI/I2C (SPI, I2C ou SSP SPI + I2C).
Vamos dar nfase somente aos itens principais do CCS e que sero utilizados com
maior freqncia durante o curso. Tudo o que est relacionado neste tpico poder ser
aplicado a qualquer Microcontrolador PIC. Assim, fica de encargo do estudante e/ou
programador desfrutar de todas as outras opes e ferramentas do programa em questo.
No canto superior direito da Tela Inicial, na aba Project, clique no cone PIC Wizard.
Logo em seguida abrir uma tela com o nome Salvar Como. Nesta tela voc indicar
o nome do Projeto e onde sero salvos os arquivos gerados pelo CCS.
Logo aps indicar o diretrio dos arquivos, abrir uma nova janela como o nome PIC
Wizard. nela em que fazemos as principais configuraes do MCU. O PIC Wizard possui
ferramentas necessrias para efetuarmos boa parte das configuraes do MCU.
Na opo Oscilator Frequency insira o valor do Cristal a ser utilizado. No caso do Kit
de Desenvolvimento utilizado deixaremos o valor default de 20.000.000Hz (20 Mega Hertz).
Para o nosso exemplo, vamos escolher a opo High speed Osc (> 4mhz) e marcar
a opo Power Up Timer.
Na aba Code, visualizamos o cdigo em C gerado pelo PIC Wizard. Isto bastante
til, pois muitas vezes j temos um projeto em andamento e necessitamos alterar algumas das
configuraes do MCU. Caso no saibamos qual o cdigo a ser inserido, basta recorrermos
ao PIC Wizard e copiarmos o cdigo em questo.
Por default, a opo Use RS232 est marcada (habilita o hardware de comunicao
RS232). Caso no se queira utilizar a porta serial RS232 do PIC esta opo dever ser
desmarcada. O campo Baud indica a velocidade de transmisso e recepo de dados do
hardware. Existem diversas opes como: 9600, 19200, 38400 e 115200, entre outros. No
nosso caso utilizaremos o Baud de 115200. Atravs das opes Transmit e Receive,
selecionamos os pinos de transmisso (TX) e recepo (RX) de dados, respectivamente. Esses
so pinos especficos de comunicao do MCU. No caso do MCU em questo, os pinos de TX
Por default, a opo Use I2C est desabilitada (hardware I2C desabilitado). A
princpio no utilizaremos o hardware I2C. Portanto, deixaremos esta opo desmarcada.
Ressalto novamente que para visualizar o cdigo gerado basta clicar na aba Code.
Para realizarmos a leitura do nosso sensor de temperatura atravs da SPI temos que
configur-la. Isso feito a partir da opo SPI and LCD. Os parmetros de configurao da
SPI so mostrados na tela logo aps clicarmos na opo SPI and LCD. Feito isso, habilite a
opo Hardware SPI#1 e selecione a opo Master. Isso habilitar o Hardware SPI do
MCU e o mesmo trabalhar como Mestre, ou seja, ser responsvel por comandar o processo
de comunicao SPI, que no nosso exemplo ocorre entre sensor de temperatura e MCU. As
opes Spi Mode e Clock so fundamentais para que a comunicao entre MCU funcione
corretamente. Como estamos apenas em um exemplo de como se criar um projeto no
trataremos esta informao neste instante. Isso ser abordado em um tpico adiante
relacionado Comunicao SPI.
#include diretrio_do_arquivo\nome_do_arquivo.h.
Desta forma, se mudarmos o diretrio do projeto uma srie de erros poder ocorrer,
pois pode ser que o arquivo no exista no diretrio mencionado pela diretiva #include. Por
#include .\nome_do_arquivo.h
Todo o procedimento de como se criar um novo projeto no CCS est listado e ilustrado
neste captulo. E o mesmo procedimento poder ser seguido a fim de se configurar qualquer
outro MCU da famlia PIC.
Diversas caractersticas dos mdulos internos do PIC foram omitidas, pois este captulo
visa apenas apresentar o assistente de configuraes PIC Wizard e suas principais
ferramentas. Caractersticas exclusivas de cada mdulo e exemplos de outros mdulos
internos, que no foram mencionados neste captulo e que so possveis de serem
configurados pelo PIC Wizard, sero apresentados em tpicos posteriores.
importante que o estudante e/ou programador saiba que cada MCU possui as suas
especialidades como, por exemplo, quantidade de Timers de 8 bits e Timers de 16 bits
disponveis, nmero de entradas analgicas, tipos de comunicao, quantidade de
Entradas/Sadas, etc. Portanto, nem todos os mdulos disponveis num determinado MCU
sero possveis de serem configurados a partir do PIC Wizard. Quando houver a necessidade
de se utilizar um mdulo especfico do MCU que no seja configurvel pelo assistente de
configuraes PIC Wizard, o estudante e/ou programador dever recorrer aos Tpicos de
Ajuda do CCS.
de extrema importncia que o estudante tenha uma boa base terica da Linguagem
C, abordada em outros tpicos, e que compreenda o que for abordado em cada seo, pois
tpicos futuros dependero exclusivamente desses nossos primeiros e simples programas.
output_low(pino);
output_high(pino);
output_toggle(pino);
output_bit(pino,valor);
output_a(valor);
output_b(valor);
...
Input(pino);
Input_a();
Input_b();
...
Device: PIC16F877A
Fuses: High speed osc (>4MHz)
Oscilator Frequency: 20.000.000
void main()
//configuraes do MCU
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
while(true){
output_low(PIN_D4);
TPA Engenharia www.tpaengenharia.com.br 48
delay_ms(1000);
output_high(PIN_D4);
delay_ms(1000);
Existe uma funo que j inverte o valor do pino. Abaixo segue o cdigo do loop infinito
com esta funo:
while(true){
output_toggle(PIN_D4);
delay_ms(1000);
#include ".\nome_do_projeto.h"
#include <bootloader.h>
void main()
setup_adc_ports(NO_ANALOGS);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
while(true){
if(input(PIN_D0))
output_high(PIN_D4);
else
output_low(PIN_D4);
while(true){
TPA Engenharia www.tpaengenharia.com.br 50
output_bit(PIN_D4,input(PIN_D0));
Antes de incluir a biblioteca devemos definir os pinos do MCU para cada pino do
display LCD (RS, E, D4 ao D7) , incluir a biblioteca visor.h. Esta biblioteca deve ser inserida
na pasta do projeto a ser executado. Para se utilizar o display, deve-se executar as rotinas
lcd_ini() e liga_display() no programa principal.
#include ".\nome_do_projeto.h"
#include <bootloader.h>
#define lcd_type 2
#include ".\visor.H"
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
lcd_ini();
delay_ms(10);
liga_display();
lcd_pos_xy(3,1);
printf(lcd_escreve,"Hello World");
pos_linha(2);
TPA Engenharia www.tpaengenharia.com.br 53
printf(lcd_escreve,"From PIC16F877A");
delay_ms(3000);
limpa_linha(1);
limpa_linha(2);
pos_linha(1);
printf(lcd_escreve,"Bootloader no");
pos_linha(2);
printf(lcd_escreve,"pino RD0");
while(true){}
Entradas Analgicas
O PIC16F877A possui 8 Canais Analgicos multiplexados em um nico Conversor
Analgico/Digital de 10 bits. As tenses de referncia do conversor podem ser externas,
atravs de pinos especficos, ou internas (prpria alimentao do MCU). Para o caso de
referncia externa, esta deve respeitar os limites da alimentao que, no nosso caso, estar
entre 0 e 5volts.
Set_adc_channel(canal);
Read_adc();
A0
Units 0-1023
Internal 2-6us
Cdigo fonte:
TPA Engenharia www.tpaengenharia.com.br 54
#include ".\nome_do_projeto.h"
#include <bootloader.h>
#define lcd_type 2
#include ".\visor.H"
void main()
int16 conversao;
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
TPA Engenharia www.tpaengenharia.com.br 55
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
lcd_ini();
delay_ms(10);
liga_display();
delay_us(10);
while(true){
conversao = read_adc();
limpa_linha(1);
pos_linha(1);
printf(lcd_escreve,"AD: %04lu",conversao);
delay_ms(100);
}
TPA Engenharia www.tpaengenharia.com.br 56
Interrupes
So rotinas especiais que interrompem a execuo do programa para o tratamento de
determinados eventos. O programador no sabe o momento em que a interrupo ir ocorrer,
mas ele sabe o que a rotina realizar quando ela acontecer.
Para se usar uma determinada interrupo a mesma deve ser habilitada com o
comando: enable_interrupts(nome da interrupo);
enable_interrupts(GLOBAL);
disable_interrupts(nome da interrupo);
disable_interrupts(GLOBAL);
clear_interrupt(nome da interrupo);
#include ".\exemplo_curso.h"
#include <bootloader.h>
#define lcd_type 2
#include ".\visor.H"
int16 contador=0;
#int_EXT
EXT_isr()
contador++;
clear_interrupt(INT_EXT);
void main()
TPA Engenharia www.tpaengenharia.com.br 58
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
delay_ms(50);
lcd_ini();
delay_ms(10);
liga_display();
ext_int_edge( L_TO_H );
while(true){
pos_linha(1);
TPA Engenharia www.tpaengenharia.com.br 59
printf(lcd_escreve,"Contador:%04ld",contador);
#include ".\nome_do_projeto.h"
#include <bootloader.h>
#define X1 PIN_B1
#define X2 PIN_B2
#define X3 PIN_B3
#define Y1 PIN_B4
#define Y2 PIN_B5
#define Y3 PIN_B6
#define Y4 PIN_B7
#include ".\visor.h"
char tecla='N';
RB_isr()
output_high(X1);
output_low(X2);
output_low(X3);
if(input(Y1)){
tecla='1';
goto FIM;
if(input(Y2)){
tecla='4';
goto FIM;
if(input(Y3)){
tecla='7';
goto FIM;
if(input(Y4)){
tecla='*';
TPA Engenharia www.tpaengenharia.com.br 61
goto FIM;
output_low(X1);
output_high(X2);
output_low(X3);
if(input(Y1)){
tecla='2';
goto FIM;
if(input(Y2)){
tecla='5';
goto FIM;
if(input(Y3)){
tecla='8';
goto FIM;
if(input(Y4)){
tecla='0';
goto FIM;
TPA Engenharia www.tpaengenharia.com.br 62
}
output_low(X1);
output_low(X2);
output_high(X3);
if(input(Y1)){
tecla='3';
goto FIM;
if(input(Y2)){
tecla='6';
goto FIM;
if(input(Y3)){
tecla='9';
goto FIM;
if(input(Y4)){
tecla='#';
goto FIM;
}
TPA Engenharia www.tpaengenharia.com.br 63
FIM:
output_high(X1);
output_high(X2);
output_high(X3);
delay_ms(50);
clear_interrupt(INT_RB);
void main()
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
TPA Engenharia www.tpaengenharia.com.br 64
setup_vref(FALSE);
enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);
delay_ms(50);
lcd_ini();
delay_ms(10);
liga_display();
output_high(X1);
output_high(X2);
output_high(X3);
pos_linha(1);
while(true){
if(tecla!='N'){
if(tecla=='#'){
limpa_display();
pos_linha(1);
else{
printf(lcd_escreve," %c",tecla);
TPA Engenharia www.tpaengenharia.com.br 65
}
tecla='N';
Timer 1:
Internal
Resolution 1.6us (overflow 104ms)
Timer 1 overflow
Cdigo fonte:
#include ".\nome_do_projeto.h"
#include <bootloader.h>
#include ".\visor.H"
void main()
int16 conversao;
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
lcd_ini();
delay_ms(10);
liga_display();
TPA Engenharia www.tpaengenharia.com.br 67
set_adc_channel(0); // seleciona o canal A/D
delay_us(10);
while(true){
conversao = read_adc();
limpa_linha(1);
pos_linha(1);
printf(lcd_escreve,"AD: %04lu",conversao);
delay_ms(100);
Comunicao Serial
Para se estabelecer comunicao entre Computador e Microcontrolador atravs da
interface RS232, devemos inserir um circuito de interface entre eles.
Putc(dado)
Use RS-232
Baud 9600
Parity None
Transmit - C6
Receive - C7
Bits 8
Cdigo Fonte:
#include ".\nome_do_projeto.h"
#include <bootloader.h>
#int_RDA
RDA_isr()
int dado_recebido;
dado_recebido = getc();
void main()
int i=0;
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
putc('A');
TPA Engenharia www.tpaengenharia.com.br 70
putc(66);
printf("C");
while(true){
putc(i);
i++;
delay_ms(1000);
EEPROM
O PIC16F877A possui uma memria no voltil de 256 bytes do tipo EEPROM , ou
seja, que aps ser desligado os dados no so perdidos.
Write_eeprom(endereo,dado);
Read_eeprom(endereo);
A0
Units 0-1023
Internal 2-6us
#include ".\exemplo_curso.h"
#include <bootloader.h>
#define lcd_type 2
#include ".\visor.H"
#define POTENCIOMETRO 0
void main()
int16 valor;
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
TPA Engenharia www.tpaengenharia.com.br 72
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
delay_ms(50);
lcd_ini();
delay_ms(10);
liga_display();
set_adc_channel(POTENCIOMETRO);
while(true){
valor=read_adc();
if(input(GRAVAR)){
write_eeprom(8,valor/256);
write_eeprom(9,valor%256);
delay_ms(100);
pos_linha(1);
printf(lcd_escreve,"Atual:%04ld",valor);
TPA Engenharia www.tpaengenharia.com.br 73
pos_linha(2);
printf(lcd_escreve,"Gravado:%04ld",read_eeprom(8)*256+read_eeprom(9));
delay_ms(100);
Para acionar o LED basta colocar o pino conectado ao mesmo em nvel lgico alto
(1). Para deslig-lo colocamos o pino em nvel lgico baixo (0).
O circuito abaixo funciona bem com cargas de baixa potncia. No entanto, cargas
indutivas, como motores e rels, introduzem uma grande quantidade de rudos na linha de
alimentao. Por esta razo, utilizamos um Diodo em Anti-paralelo com a carga indutiva, afim
de minimizar os rudos provenientes das tenses reversas geradas no desligamento da carga.
Entre os tipos de sensores resistivos podemos citar dois tipos comuns: Termistores
(sensores de temperatura) e os LDRs (Resistor Dependente de Luz). Afim de simular um
Sensor do tipo Resistivo, comum utilizarmos de um Potencimetro Analgico.