30 de octubre de 2017
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
Sobre o Material
Este material contém um roteiro de práticas de laboratório virtual usando os softwares ISIS
Proteus para simulação eletrônica e o MPLAB X junto com o compilador XC8 para codificação
e compilação de programa em linguagem C. Além disso, os procedimentos para prototipagem
estão declarados a cada prática e se estendem desde a instalação dos programas essenciais
até o desenvolvimento de cinco práticas avançadas, as quais envolvem uso dos periféricos de
conversor AC/DC, PWM, Timer, transmissão de dados sob o protocolo USART e rotina de
interrupção.
“Gente que gosta de você discorda de você quando é necessário, gente que te respeita discorda de
você quando necessário, um concorrente fraco te enfraquece, uma oposição frágil te fragiliza e te
deixa envelhecer. Preste atenção em quem discorda de você pois vai te ajuda a superar, transformar,
inovar e com isso não vamos sossegar em excesso, créditos ao professor por nem sempre concorda,
pois, o mar calmo nunca fez bom marinheiro. (Algumas ideias extraídas a partir de pensamentos
do filosofo Mario Sergio Cortella) ”.
Material didático em construção. Aponte qualquer erro ortográfico encontrado para elevar qua-
lidade deste conteúdo enviando mensagem para flavio.santiago.bispo@hotmail.com
2 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
3 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
2. Abra o MPLB X
5. Clique Next
4 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
7. Clique Next
5 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
6 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
Botões importantes
build and run project: Grava e executa qualquer arquivo modificado anteriormente
7 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
8 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
Wachtdog Timer
Code Protection
Oscillator Selection
Analise o Código a seguir, escreva o significado de cada configuração e discuta em sala qual é
sua efetiva aplicação em uma codificação:
Programa Esqueleto
#include <xc.h>
#include <pic16f873a.h>
int main()
{
return 0;
}
9 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
Nos Microcontroladores 16F, cada porta está associada a dois registros: TRIS e PORT.
Por exemplo: TRISB, PORTB, TRISD, PORTD.
TRIS significa Tri-State, determina a direção de cada pino GPIO. A lógica 1 em um bit
particular do registro TRIS faz com que o pino correspondente seja inserido, enquanto
a lógica 0 em um determinado bit faz a saída do pino correspondente.
Para um pino de saída (o bit TRIS é 0), a lógica 1 no registro PORT faz com que o
pino correspondente se torne Logic High (VDD) e Lógica 0 no registro PORT faz o
correspondente se tornar Logic Low (VSS).
O objetivo é fazer com que, uma vez definido o comportamento do pino como entrada e saída,
um bit do PORT adquira um estado lógico variante no tempo. Esse tempo é definido como 1
segundo. Logo, escreva o código abaixo para uma frequência de giro de relógio do dispositivo
em 20 MHz e explique
2. qual o PORT?
10 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
4. qual o TRIS?
#define _XTAL_FREQ
#include <xc.h>
#include <pic16f873a.h>
int main()
{
TRISB0 = 0;
while(1)
{
RB0 = 1;
__delay_ms(1000);
RB0 = 0;
__delay_ms(1000);
}
return 0;
}
11 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
O gravador conta também com um conector para programação ICSP (In-Circuit Serial Program-
ming), onde o microcontrolador pode ser programado diretamente no circuito onde ele está
montado, sendo que para isso são necessárias algumas adaptações no circuito.
Para reconhecimento do dispositivo, basta conectá-lo ao computador e gravador é reconhecido
pelo Windows automaticamente. Se o gravador não foi reconhecido automaticamente pelo seu
computador, os drivers podem ser baixados.
Quando o Windows detectar o gravador, o Windows automaticamente vai atribuir à ele uma
porta COM (serial) aleatória. Entretanto, o software de gravação não funciona adequadamente
com portas abaixo da COM5, e talvez seja necessário alterar essa porta manualmente. Exemplo:
Clique com o botão direito em Prolific USB-To-Serial Comm Port (COM14), e depois em PRO-
PRIEDADES:
Na tela de propriedades, selecione a aba Configurações da Porta (Port Settings), depois em AVA-
NÇADO(Advanced):
13 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
Selecione a porta COM de sua preferência (lembre-se que esta porta deve ser maior do que a
COM4) e anote esta informação, que será usada posteriormente no software de gravação. O
valor da porta COM da imagem é meramente ilustrativa.
14 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
Configure primeiramente a porta COM. No menu FILE, escolha a opção PORT, digi-
tando o número da porta serial que você configurou no painel de controle.
15 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
16 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
Se o configurador Code Protect estiver habilitado, ao final da gravação o Microbrn irá apresentar
um erro de leitura, pois o código está protegido. Efetuadas as configurações necessárias, clique no
botão PROGRAM para gravar o arquivo .HEX no microcontrolador.
17 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
Resets do PIC
http://www.hpspin.com.br/site1/programacao/resets.php
Por algum motivo, deseja-se reinicializar o MCU. Seja para restabelecer alguma condição inicial
ou seja porque a CPU parou de funcionar por um motivo desconhecido. Todo MCU pode ser
reinicializado de duas maneiras: desligando e religando a fonte de alimentação ou então usando
as funções de reset do mesmo.
Os MCU PIC possuem algumas funções de reset prevendo certas situações. São elas:
MLCR
Função de reset externo fornecida pelo pino MCLR. Durante a operação normal, esse pino deve
ser mantido em nível alto (+5V), conectado ao VDD através de um resistor de, por exemplo,
10K. Para efetuar o reset, deve-se aterrar esse pino manualmente, isto é, levá-lo ao nível 0V, por
exemplo, através de uma chave táctil. Esse procedimento fará com que a CPU comece a executar
as instruções a partir do vetor de reset, ou seja, no endereço 0x000 da memória de programa. O
reset no pino MCLR limpa alguns registradores de controle do MCU mas mantem intactos todos
os dados da memória de dados (RAM). Em C, a diretiva é escrita como:
18 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
Esse reset só acontece quando o circuito é ligado. É usado para aguardar a tensão de alimentação
subir a um ponto confiável antes da CPU começar a executar as instruções. Após um Power On
Reset, alguns registradores de controle serão inicializado mas os dados da memória de dados
(RAM) podem conter valores inesperados. O Power On Reset fará com que a CPU comece a
executar as instruções a partir do vetor de reset, ou seja, no endereço 0x000 da memória de
programa. Em C, a diretiva é escrita como:
O Brown-Out Reset é usado para reiniciar a CPU automaticamente quando a tensão de alimen-
tação cair abaixo de um nível seguro para a operação do circuito.O Brown-Out Reset deve ser
habilitado nos bits de configurações do MCU. Por exemplo, o Brown-Out é habilitado, via lin-
guagem C, com a diretiva
Se o Brown-Out estiver habilitado e a tensão cair abaixo do nível adequado haverá um reset
que fará com que a CPU comece a executar as instruções a partir do vetor de reset, ou seja,
no endereço 0x000 da memória de programa. Após o reset, alguns registradores de controle do
MCU serão reinicializados mas o conteúdo da memória de dados (RAM) será imprevisível. Em
alguns MCU os níveis de tensão seguros para a operação são fixos mas, em outros, podem ser
selecionados.
O que fazer com aquele programa que trava, não se sabe em que rotina, e torna necessário ligar e
desligar o circuito para que ele volte a funcionar? O WTD serve justamente para reiniciar a CPU
de tempos em tempos para certificar que o programa não parou de funcionar por algum motivo.
Seu funcionamento depende de um timer interno que, ao estourar a contagem, provoca o reset do
MCU. Esse tempo varia de acordo com condições de temperatura e a tensão de alimentação mas
fica, em média, em torno dos 18ms (milisegundos) no PIC16F628A. O WDT deve ser habilitado
ou desabilitado através dos bits de configuração.Em linguagem C, segue a escrita como
19 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
O reset pelo WDT mantem os dados da memória de dados (RAM) intactos mas alguns regis-
tradores de controle são reinicializados. Após o reset do WDT, a CPU começa a executar as
instruções a partir do vetor de reset, ou seja, no endereço 0x000 da memória de programa.
20 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
A referência de tensão ADC é selecionável por software para ser gerados internamente ou
externamente. São eles Vref + e o Vref −. A função CVref é destinada a comparação de
valor de referência com um outro que está sendo aplicado ao PIC e que pode ser configurado
pelo registrador CVRCON. Nada tem a ver com a estrutura do conversor A/D.
O ADC pode gerar uma interrupção, uma vez concluída uma conversão.
Configuração
O ADC não distingue entre tensões analógicas e digitais. Para evitar erros de medição ou
estragos no chip, os pinos devem ser configurados como entradas analógicas, antes de iniciar
a conversão. Atenção: O valor apresentado pelo ADC leva em conta, sempre, a referência
selecionada. Ou seja, quando a referência Vref + selecionada for VDD , por exemplo, a
conversão máxima 5V será representada pelo valor 1024, já quando a referencia menor de
21 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
É possível utilizar os pinos RA3 e/ou RA2 como entrada para diferentes tensões de referência,
a máxima conversão retornada como 1024 terá exatamente o valor inserido no pino RA3 ou
ainda a diferença entre RA3 e RA2, caso Vref − tenha sido selecionado também. De qualquer
maneira, é necessário observar os valores máximos e mínimos para trabalhar com tensões de
referência externas no PIC.
CONFIGURAÇÃO DO CANAL
Os bits CHS do registro ADCON0 determina qual canal estará conectado ao conversor.
A fonte e clock do conversor é selecionável através dos bits ADCS do registo ADCON0. São
quatro opções de clock possíveis: Fosc/2, Fosc/8, Fosc/32 e RC.
ADCON0
Atenção:
22 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
Para corretas conversões, o tempo de período de conversão (TAD ) deve ser garanti-
do, no mínimo, a 1, 6us.
000 = AN0
001 = AN1
010 = AN2
011 = AN3
100 = AN4
ADCON1
24 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
ADCON0bits.ADCS1 = 1;
DCON0bits.CHS2 = 0;
ADCON0bits.CHS1 = 0;
25 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
//estabilizar a tensão
//está em andamento
26 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
// CONFIGURAÇÕES
#include <xc.h>
#include <pic16f877a.h>
do
{
a = ADC_Read(0);
PORTB = a;
PORTC = a>>8;
__delay_ms(1000);
}while(1);
}
27 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
Resolução de questão
#include <xc.h>
#include<pic16f873a.h>
void main(void) {
long int a;
TRISA = 255;
TRISB = 0;
TRISC = 0;
do{
a = AC_read(0);
PORTB = a;
PORTC = a>>8;
__delay_ms(1000);
}while(1);
return;
}
28 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
Exercício:
Para preparar o PIC de modo a fazê-lo trabalhar com valores analógicos dos sensores, alguns
passos devem ser realizados. Para realizar a leitura dos dois sensores a cada ciclo de um pro-
grama principal, siga o mesmo raciocínio de escrita da questão 1 para escrita das ações nos
registradores.
Obs.: para ambas as entradas, admita um mesmo clock (Fosc/32), dados justificados à direita,
sem valor de tensão de referência e sem rotina de interrupção.
29 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
Debuging
Passos para Debug e visualização de eventos no simulador da IDE do MPLAB X.
Após compilar o código e obter êxito, é possível depurar o código passo-a-passo seguindo alguns
comandos básicos. Clique no ícone Debug >> Debug Main Project.
Uma janela irá aparecer para alterar a execução do programa MPLAB X para simulador.
30 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
Após alguns minutos, o código irá ser executado novamente em modo de simulação e aparecerá
na parte superior do programa um controlador de ações como mostrado na figura abaixo.
Assim que esta parte estiver habilitada, pressione o ícone pause.
Nesta ocasião é possível passar por todas as etapas do código clicando em step over ou quando
desejar analisar uma função, step into.
A fim de visualizar os eventos que estão ocorrendo a cada passo de simulação, é possível através
de fáceis passos ter disponível no IDE este auxílio. clique no ícone Windows >> PIC Memore
Views >> SFRs.
31 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
32 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
33 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
Interrupções
Via: http://www.arnerobotics.com.br/eletronica/
Microcontrolador_PIC_teoria_3.htm
Interrupção externa;
34 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
0 - Desabilitado
1 - Habilitado
0 - Desabilitado
1 - Habilitado
35 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
Exemplo de código:
https://docs.google.com/a/grupotiradentes.com/document/
d/1kjXbJdWfViw7o7KUi2pNif1wQY8s40ZeFepNOk8RF1Q/edit?usp=
sharing
#include<xc.h>
#include<pic16f873a.h>
#pragma config FOSC = HS
#define _XTAL_FREQ 20000000
#define saida PORTBbits.RB0
void interrupt ADC_int(){
long int conv = (ADRESH << 8) + ADRESL;
if (conv>500){
saida = 1;}
else {
saida = 0;
}
PIR1bits.ADIF = 0;
__delay_ms(1000);
ADCON0bits.GO_nDONE = 1;
}
void ADC_config(void){
ADCON0 = 10000001;
__delay_us(10);
ADCON1 = 10000000;
ADCON0bits.GO_DONE = 1;
}
void interr_config(){
PIE1bits.ADIE = 1;
PIR1bits.ADIF = 0;
INTCONbits.GIE = 1;
36 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
INTCONbits.PEIE = 1;
}
void main(){
TRISA = 255; TRISB = 0;
interr_config();
ADC_config();
while(1){}
}
0 - Desabilitado
1 - Habilitado
0 - Não ocorreu
1 - Ocorreu
Elabore um código que faça uso a interrupção via sinal externo através do pino
RB0/INT.
37 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
#include <xc.h>
#include<pic16f877a.h>
void main(void) {
TRISB = 1;
PORTB = 0;
INTCONbits.GIE = 1;
INTCONbits.PEIE = 1;
INTCONbits.INTE = 1;
INTCONbits.INTF = 0;
OPTION_REGbits.INTEDG = 1;
while(1){}
return;
}
0 - Desabilitado
38 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
1 - Habilitado
0 - Não ocorreu
Aplicação
39 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
Para gerar um sinal PWM com o PIC, nós utilizamos o T IM ER2 que é um temporizador de
8 bits (0 − 255). O T IM ER2 é usado como base de tempo para a modulação PWM com o
módulo CCP (compare/capture/PWM).
O período do PWM é especificado pelo registro P R2. Pode ser calculado pela seguinte fórmula:
40 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
P = (P R2 + 1) ∗ 4 ∗ T osc ∗ P rescaler
1
T osc =
F osc
EM que 4 significa um deslocamento de duas casas de algarismos binário para a esquerda do
resultado (P R2 + 1). Isso quer dizer que, na prática, o período pode ser definido com uma
faixa de 4 − 1024 dados como múltiplos de 4.
O duty cycle é configurado usando 10 bits: 8 MSB do registro CCP RXL e 2 adicionais
LSB localizados no registrador CCP 1CON : bits 5 e 4, em que esse X significa ou utilizar o
primeiro PWM (1) ou o segundo (2). O resultado é um número de 10 bits, presente na fórmula:
Exemplo: Calcular a frequência e duty cycle, sendo que o cristal é de 20M Hz, Prescaler
1 : 16, P R2 = 255, CCP R1L = 100.
P = (255 + 1) ∗ 4 ∗ 0, 05us ∗ 16
P = 819, 2us
Observação:
41 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
Veja que foi necessário deslocar CCP R1L (8 bits) para podermos ter 10 bits for-
matados. Deslocar dois bits para esquerda é a mesma coisa que multiplicar por 4.
O Duty Cycle pode atingir um resultado que compreende 0 % a 99, 6 %. Isso por
conta da relação abaixo:
quando os bits 5 e 4 do registro CCPXCON são 0. Isso significa que o valor do Duty
é sempre um múltiplo de 4.
00 = prescaler1 : 1
01 = prescaler1 : 4
1x = prescaler1 : 16
Usando os valores acima e utilizando um cristal de 20M Hz, a frequência e o duty cycle será:
1
T osc = = 0, 05us
20
P R2 = 200
P rescale = 1 : 1
P = (200 + 1) ∗ 4 ∗ 0, 05us ∗ 1
P = 40, 2us
1 1
F req = = = 0, 02487M Hz = 24, 87KHz
P 40, 2
CCP R1L = 50
10us
DutyCycle( %) = ∗ 100 = 24, 90 %
40, 2us
Questão a responder
43 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
void main()
{
PR2 = 200; //
CCPR1L = 50; //
TRISCbits.TRISC2 = 0; //
T2CONbits.T2CKPS1 = 0;//
T2CONbits.T2CKPS0 = 0;//
T2CONbits.TMR2ON = 1;//
CCP1CONbits.CCP1M3 = 1;//
CCP1CONbits.CCP1M2 = 1;//
while(1){} //
}
Exemplo: Construa um PWM capaz de fornecer uma saída de, aproximadamente, 1, 3kHz e
com sinal a 75 % de sua faixa, sabendo que o cistal aplicado a este circuito é de 20M Hz.
Agora, para o cálculo do Duty, temos que o registrador a ser utilizado enxerga a saída RC2,
conforme a figura abaixo, e que assume, como registrador de base de cálculo, o CCP R1L.
44 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
2. Planeje e edite um código para leitura de dado analógico e aplique essa mesma
informação na saída por meio do recurso de PWM.
https://1drv.ms/t/s!AsLeyQ9bNrmoga5F0Q9eM6dysO_PAg
https://1drv.ms/t/s!AsLeyQ9bNrmoga5EjK48zj_3eQLtEQ
45 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
Atividade 4) Timer
Via microcontrolandos.blogspot.com.br
A interrupção TMR1, se habilitado, é gerada por overflow, no qual o bit de flag é: TMR1IF
(P IR1 < 0 >). Esta interrupção pode ser ativado/desativado através do bit TMR1IE
(P IE1 < 0 >).
2. Como um contador.
No modo de Contador, ele incrementa em cada subida da entrada do relógio externo. Timer1
pode ser ativado / desativado através do bit TMR1ON (T 1CON < 0 >). Timer1 também
46 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
tem uma .entrada RESETïnterno TMR1GE, este RESET pode ser gerado por qualquer um dos
dois CCP módulos.
00 - 1:1
01 - 1:2
10 - 1:4
11 - 1:8
1 - Oscilador é habilitado
0 - Oscilador desligado
Caso T1OSCEN = 1:
Caso T1OSCEN = 0:
1 - Clock externo
0 - Clock Interno
47 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
1 - Habilitado
0 - Desabilitado
MODO TEMPORIZADOR
Modo de temporizador é selecionado por limpar o bit TMR1CS(T 1CON < 1 >). Neste
modo, o relógio de entrada para o temporizador é FOSC / 4. O bit de controle de sincronização,
T1SYNC(T 1CON < 2 >), não tem qualquer efeito, uma vez que o relógio interno está
sempre em sincronia.
16
BaseT emporal = P eriodoclock ∗P reescaler∗(2 −T M R1H : T M R1L)
int contagem;
void interrupt(){
contagem++;
TMR1L=0x2C;
TMR1H=0xCF;
PIR1.TMR1IF=0;
}
void main(){
INTCON.GIE=1;
INTCON.PEIE=1;
PIE1.TMR1IE=1;
TMR1L=0x2C;
TMR1H=0xCF;
T1CON=0b00100001;
while (1){
if(contagem==100){
48 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
portb.RB0=~portb.RB0;
}
Questão a responder
2. Use o código acima e escreva um novo código para leitura de dados de dois sensores
analógicos a cada 2 segundos.
Aplicação
Considere uma atividade com robô móvel de duas rodas em eixo diferencial como mostrado
abaixo. Para realizar o movimento do robô do ponto A para B utilize a aplicação de PWM pa-
ra as duas rodas. Use para modular a intensidade de cada PWM o sensor de posição angular
(potenciômetro).
49 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
5) Protocolo USART
O USART pode ser configurado como um sistema assíncrono de dupla direção (Full-duplex) ou
como um sistema síncrono de uma direção (half-duplex).
O bit SPEN (RCST A < 7 >) e os bits T RISC < 7 : 6 > tem que ser configurados a
fim de realizarem as tarefas RC6/T X/CK and RC7/RX/DT , respectivamente.
Os procedimentos a seguir tratam apenado uso do módulo para aplicações com comu-
nicação assíncrona.
Bit 7: CSRC - bit de seleção de fonte de clock. Não importa o valor binário.
0 - desabilita a transmissão
51 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
Bits < 2 : 0 > - Flags para frame, overrun error e nono bit recebido.
Realizar uma estrutura utilizando canos de PVC, galões de água, válvulas, sensores, microcontro-
ladores e outros periféricos para que se faça a geração da energia oriunda do descarte de esgoto
em condomínios. Cálculos de Timer0, baudrate para transmissão USART e PWM foram realiza-
dos com o intuito de que projeto tenha um melhor aproveitamento da energia cinética e elétrica.
52 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
Na programação dos PICs foi definido que o "Master" será o PIC16f887A responsável pela
conversão A/D e transmissão assíncrona via RX TX e o PIC16f873A foi definido como "Slave"
e responsável por receber essa transmissão assíncrona via RX TX do "Master" e converter em
PWM, o Slave também tem a função de realizar leitura nos sensores via interrupção por Timer.
Abaixo são mostrados, em ambiente de simulação, os esquemáticos de circuitos para este pro-
cesso.
53 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
54 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
#include <xc.h>
#include <pic16f877a.h>
void ADC_config()
{
ADCON0bits.ADCS = 0b10;
ADCON0bits.CHS = 0b000;
ADCON1bits.ADFM = 0;
}
void Interrupt_ADC(){
PIR1bits.ADIF = 0;
PIE1bits.ADIE = 1;
INTCONbits.GIE = 1;
INTCONbits.PEIE = 1;
ADCON0bits.ADON = 1;
}
unsigned int Entrada(unsigned char channel)
{
GO_nDONE = 1;
while(GO_nDONE);
return ((ADRESH<<8)+ADRESL);
}
//Variavel inteira sem sinal e caractere em C sem sinal
55 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
// enviando dados...
void UART_Write(char dado)
//Escrevendo em estrutura de caractere
{
while(!TRMT);
TXREG = dado;
}
char UART_TX_Empty()
{
return TRMT;
}
void UART_Write_Text(char *text)
//esccreve um texto que for colocado
//na função. É conseguido através do
//uso contínuo da função UART_Write ().
{
56 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
int i;
for(i=0;text[i]!=’\0’;i++)
UART_Write(text[i]);
}
// recebendo dados...
//A função (UART_Data_Ready) ele
//usa o bit de sinalizador RCIF
//que será definido quando a recepção
//de dados for concluída.
char UART_Data_Ready()
{
return RCIF;
}
char UART_Read()
//espera até que os dados
//de 8 bits do registro de
//recebimento tenha terminado
{
while(!RCIF);
return RCREG;
}
void main()
{
TRISA = 0xFF;
TRISB = 0x00;
ADC_config();
Interrupt_ADC ();
UART_Init(19200);
//UART_Write_Text ("E N G E N H A R I A
//M E C A T R O N I C A");
do
{
unsigned int a;
a = Entrada(0);
UART_Write(a>>8);
__delay_ms(100);
}while(1);
}
57 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
#include <xc.h>
#include <pic16f877a.h>
void PWM ()
{
PR2 = 0xFF;
//valor que pode ir de
//0 a 255 para dizer o
//período
TRISCbits.TRISC2=0;
T2CON = 0x4;
CCP1CON = 0xC;
}
//calculo da taxa de transferência e
//diz se vai ser low ou high baud rate
atribuído ao caractere
char UART_Init(const long int baudrate)
//Numero inteiro longo que não
//pode ser mudado por função
{
unsigned int x;
x = (_XTAL_FREQ - baudrate*64)/(baudrate*64);
if(x>255)
{
x = (_XTAL_FREQ - baudrate*16)/(baudrate*16);
BRGH = 1;
58 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
}
if(x<256)
{
SPBRG = x;
SYNC = 0;
SPEN = 1;
TRISC7 = 1;
TRISC6 = 1;
CREN = 1;
TXEN = 1;
return 1;
}
return 0;
}
// enviando dados...
void UART_Write(char dado)
//Escrevendo em estrutura de caractere
{
while(!TRMT);
TXREG = dado;
}
char UART_TX_Empty()
//Verificando o registrador de
//Transmissão se está vazio
{
return TRMT;
}
void UART_Write_Text(char *text)
//esccreve um texto que for colocado
//na função. É conseguido através do
//uso contínuo da função UART_Write().
{
int i;
for(i=0;text[i]!=’\0’;i++)
UART_Write(text[i]);
}
// recebendo dados...
//A função (UART_Data_Ready) ele usa
59 60
Flavio Bispo Laboratório de Microcontroladores e Aplicações 16F873A
char UART_Data_Ready()
{
return RCIF;
}
char UART_Read()
//espera até que os dados de 8
//bits do registro de recebimento
//tenha terminado
{
while(!RCIF);
return RCREG;
}
void main()
{
TRISB = 0x00;
UART_Init(19200);
PWM();
do
{
if(UART_Data_Ready())
CCPR1L = UART_Read();
__delay_ms(100);
while(1);
}
60 60