Escolar Documentos
Profissional Documentos
Cultura Documentos
PRÁTICA LABORATORIAL
MATERIAL:
Item Quant. Descrição
1 01 Microcomputador com acesso à internet, software mikroC e PicsimLab.
METODOLOGIA: A rotina de programação é abrir o MikroC e configurar um novo projeto com o
microcontrolador PIC16F628A com clock de 4MHz e realizar a programação com o whatchdog
desabilitado
Após a programação, realizar a compilação e eliminar os erros.
Para executar o programa no PICSIMLAB basta abrir o programa e ir em file -> Load Hex e
abrir o arquivo com o nome da pratica que você salvou.
No próximo passo da pratica ativaremos o whatchdog e habilitaremos o reset no código
fonte para não ter estouro na contagem.
RESULTADOS E DISCUSSÃO: No experimento, verificamos a simulação sem e com o
whatchdog, sem o whatchdog mantem um loop infinito, e com o whatchdog tem um estouro no
tempo e a comutação do led reinicia. E posteriormente respondemos um questionário com
algumas perguntas recorrentes ao PIC.
a) Escrever qual deve ser o valor do resistor instalado em série com o pino Master Clear,
justificando a sua resposta.
O resistor precisa ser compatível com a corrente suportada na porta do
microcontrolador que deve ser menor que 80mA para não ocorrer o travamento do
mesmo. Segundo o datasheet do PIC16F628A, a tensão de operação varia de -0,3V a 14V.
Assim, devemos usar um resistor em série de 50 a 100Ω para aplicar um nível "baixo" ao
pino do MCLR, em vez de puxar esse pino diretamente para o VSS. Convencionalmente
utilizamos 1K Ω e trabalhamos com uma corrente bem baixa nesta porta.
b) Escrever qual é a vantagem do reset pelo pino Master Clear sobre o reset por corte de energia
na alimentação.
O reset pelo MCLR garante uma reinicialização mais rápida do PIC pois zera o contador
de programa. Enquanto o reset por corte de energia leva mais tempo para voltar a
funcionar pois esse tempo pode demorar de acordo com o modelo do PIC, e após a
inicialização que irá executar as instruções contidas no código.
c) Escrever o que acontece se não for inserido o resistor em série com a alimentação no pino
Master Clear.
O resistor pull-up garante que o sinal lido seja de nível alto (5v) enquanto o botão ou a
chave não forem pressionados. E caso seja pressionado, não feche um curto entre o
VCC e o GND.
e) Qual vantagem de utilizar o Whatchdog? Quais cuidados devem ser tomados ao habilitá-lo?
É um reset automatico quando algum contador chegar a um valor determinado de contagem a
alguns milissegundos. O microcontrolador entende como algum problema e o reset acontece
automaticamente.
CONCLUSÃO: Nesta pratica ficou claro a funcionalidade do whatchdog no PIC, e que ao habilita-
lo é preciso tomar cuidado com as parametrizações pois uma pausa prolongada ele pode
entender como uma falha na programação e reiniciar no meio do processo.
REFERÊNCIAS BIBLIOGRÁFICAS:
Microchip Technology Inc., PIC16F87XA, Data Sheet, http://ww1.microchip.com/downloads/
en/DeviceDoc/39582b.pdf
MikroElektronika d.o.o., https://www.mikroe.com/mikroc-pic
QUADRO DESCRITIVO DE PRATICA
C.H.: DATA:
PRATICA LABORATORIAL Nº: 919061-2
___2____h 06/07/2020
INTRODUÇÃO: Utilização do Timer0, entrada digital e de interrupção eterna no microcontrolador
PIC com display 7 segmentos.
OBJETIVOS: Familiarizar com o software de programação do microcontrolador, conhecer o
funcionamento da entrada e saída digital implementando com um display de 7 segmentos e com
uma interrupção externa.
MATERIAL:
Item Quant. Descrição
1 01 Microcomputador com acesso à internet, software mikroC e PicsimLab.
METODOLOGIA: A rotina de programação é abrir o MikroC e configurar um novo projeto com o
microcontrolador PIC16F877A com clock de 4MHz e realizar a programação com o whatchdog
desabilitado.
1 #define TRUE 1
#define FALSE 0
2 #define BT_ORDEM PORTA.RA1
unsigned char Vetor_const[] = {238,40,205,109,43,103,231,44,239,47};
3 char ordem = 0, flag =0;
unsigned int timer0cnt = 0;
4 int valor_contagem = 0;
5
void interrupt(){ //função para interrupção
6 if(INTCON.TMR0IF ==1){
timer0cnt++;
7 if(timer0cnt == 500){
if(ordem.f3 == FALSE)
8 valor_contagem++;
else
9 valor_contagem--;
if(valor_contagem > 9 &&ordem.f3 == FALSE)
10 valor_contagem = 0;
else if(valor_contagem < 0 &&ordem.f3 == TRUE)
11 valor_contagem = 9;
PORTB = vetor_const[valor_contagem];
12 RA0_bit = ~RA0_bit;
timer0cnt = 0;
13
}
14 INTCON.TMR0IF = 0;
INTCON.TMR0IE = 1;
15 TMR0 = 131;
}
}
void main() {
TRISA = 0b11111110;
TRISB = 0b00000000;
PORTA = PORTB = 0x00;
//REGISTROS DE INTERRUPÇÃO
INTCON = 0; //LIMPA O REGISTRO DE CONTROLE DE
INTERRUPÇÃO
INTCON.TMR0IE = 1; //HABILITA A INTERRUPÇÃO DO TIMER0
OVERFLOW
INTCON.TMR0IF = 0; //LIMPA O SINALIZADOR DE INTERRUPÇÃO DO
TIMER0
INTCON.GIE = 1; //HABILITA INTERRUPÇÃO GLOBAL
INTCON.INTF = 0; //LIMPA AS FLAGS DE INTERRUPÇÃO
while(1){
if(BT_ORDEM == 0 && flag == 0){
ordem.F3 = ~ordem.F3;
flag = 1;
}
else if (BT_ORDEM == 1)
flag = 0;
}
if(INTCON.TMR0IF ==1){
9 timer0cnt++;
if(timer0cnt == 500){
10 if(ordem.f3 == FALSE)
valor_contagem++;
11 else
valor_contagem--;
12 if(valor_contagem > 9 &&ordem.f3 == FALSE)
valor_contagem = 0;
else if(valor_contagem < 0 &&ordem.f3 == TRUE)
valor_contagem = 9;
PORTD = vetor_const[valor_contagem];
RA0_bit = ~RA0_bit;
timer0cnt = 0;
}
INTCON.TMR0IF = 0;
INTCON.TMR0IE = 1;
TMR0 = 131;
}
}
void main() {
TRISD = 0b00000000;
TRISB = 0b00001111;
PORTA = PORTB = PORTD = 0x00;
//REGISTROS DE INTERRUPÇÃO
INTCON = 0; //LIMPA O REGISTRO DE CONTROLE DE
INTERRUPÇÃO
INTCON.TMR0IE = 1; //HABILITA A INTERRUPÇÃO DO TIMER0
OVERFLOW
INTCON.TMR0IF = 0; //LIMPA O SINALIZADOR DE INTERRUPÇÃO DO
TIMER0
INTCON.GIE = 1; //HABILITA INTERRUPÇÃO GLOBAL
INTCON.INTE = 1; //habilita a interrupção
INTCON.INTF = 0; //LIMPA AS FLAGS DE INTERRUPÇÃO
while(1){
PORTB.RB7 = PORTB.RB6 = PORTB.RB5 = PORTB.RB4 = 1;
}
}
Antes da alteração da linha 1, ao ficar pressionado o botão S1, o programa já invertia seu sinal de
contagem de crescente para decrescente e vice-versa. Ao alterar o comando, a contagem inverte
sua ordem somente quando soltava o botão S1. Resumindo tudo isso, OPTION_REG.INTEDG=0
altera a contagem com a mudança de estado. E OPTION_REG.INTEDG=1 muda a contagem
após o pulso que é apertar e soltar o botão S1.
d) Sabendo que os temporizadores podem ser utilizados para diversas aplicações, descrever
uma aplicação para o Timer0.
O timer nos dá a opção de manipular o tempo de execução das instruções. Logo posso
definir em determinados períodos para minha rotina de sistema executar alguma instrução
em função deste temporizador. Um exemplo seria uma rampa PWM onde em
determinados segundos minha rotina formaria uma rampa de aceleração para partida de
algum motor.
e) Utilizando a fórmula do intervalo de chamada interrupção do TIMER0 vista na parte teórica
desse roteiro de prática, calcule e preencha a primeira coluna da Tabela 2 de acordo com os
parâmetros das demais colunas.
0,001 4 4 MHz 6
0,00051 2 4 MHz 0
0,00064 8 10 MHz 56
0,00050 4 8 MHz 6
CONCLUSÃO: Nesta pratica observamos o funcionamento do display de 7 segmentos e também
as interrupções externas para inverter a contagem. Um comando interessante foi o
OPTION_REG.INTEDG onde quando igual a 0, a inversão da contagem acontece só de
pressionar o botão, e quando está igual a 1, a contagem só inverte quando ocorre um pulso na
porta que apertar e depois soltar.
REFERÊNCIAS BIBLIOGRÁFICAS:
Microchip Technology Inc., PIC16F87XA, Data Sheet, http://ww1.microchip.com/downloads/
en/DeviceDoc/39582b.pdf
MikroElektronika d.o.o., https://www.mikroe.com/mikroc-pic
QUADRO DESCRITIVO DE PRATICA
C.H.: DATA:
PRATICA LABORATORIAL Nº: 919061-3
___2____h 10/07/2020
INTRODUÇÃO: Utilizar memoria EEPROM, sensor de temperatura e display LCD no
microcontrolador PIC
OBJETIVOS: Familiarizar com o software de programação do microcontrolador e visualizar o
funcionamento do botão de reset presente nos microcontroladores PIC para reiniciar o sistema
quando pressionado.
MATERIAL:
Item Quant. Descrição
1 01 Microcomputador com acesso à internet, software mikroC e PicsimLab.
METODOLOGIA:
Procedimentos experimentais
Quadro 1 - Sugestão para programação da prática 03 (entrada analógica com display LCD).
17
20
22 char texto_LCD[15];
23
29 RD0_bit = ~RD0_bit;
30 }
31 if (timer0cnt%2){
32 RA5_bit = ~RA5_bit;
33 }
37 }
38 }
39
40 void main() {
41 int a;
42
46
51
56 OPTION_REG.PS2 = 0; //
58 OPTION_REG.PS0 = 0; //
60
61 // Registros de Interrupção
66
68 delay_ms(100);
69
71 delay_ms(100);
72
75
76 while(1) {
78 delay_ms(200);
79 temperatura = (entradaAnalogica * 5.0 * 100.0)/1022.0;
80
82 {
83 RD1_bit = 1;
84 }else{
85 RD1_bit = 0;
86 }
87 FloatToStr(temperatura,texto_LCD);
88 Ltrim(texto_LCD);
89 Lcd_Cmd(_LCD_CLEAR);
90 Lcd_Out(1,1,"Temp.: ");
91 Lcd_Out(1,8,texto_LCD);
92 Lcd_Out(1,14," gC");
93 delay_ms(200);
94
95 PORTB.RB7 = 1;
96 }
97 }
a) Qual a função e o motivo de utilizar o transistor 2N2222? Por que utilizar um diodo ligado junto
ao relê? Qual o limite de tensão e corrente da carga que esse relê poderá acionar?
A função dele é acionar uma carga que consome mais de 25mA, pois este é o limite do
microcontrolador. Já o transistor pode suportar até 800mA, este transistor aciona o relê
que tem um limite de até 15ª (SRA-12VCD-CL)
c) Qual a resolução do conversor analógico / digital do PIC 16F877A? Com isso, qual é mínima
tensão de variação detectada por essa entrada?
É utilizado 10 bits de comprimento para a conversão analógico em digital. Para encontrar a
resolução basta dividir o fundo de escala (variação da tensão aplicada no pino) divido por
2^10 – 1
REFERÊNCIAS BIBLIOGRÁFICAS:
Microchip Technology Inc., PIC16F87XA, Data Sheet, http://ww1.microchip.com/downloads/
en/DeviceDoc/39582b.pdf
MikroElektronika d.o.o., https://www.mikroe.com/mikroc-pic
QUADRO DESCRITIVO DE PRATICA
C.H.: DATA:
PRATICA LABORATORIAL Nº: 919061-3
___2____h 26/06/2020
INTRODUÇÃO: Comunicação através da porta serial UART, I2C e controlar a rotação de um
motor através de uma saída PWM de um microcontrolador PIC.
OBJETIVOS:
MATERIAL:
Item Quant. Descrição
1 01 Microcomputador com acesso à internet, software mikroC e PicsimLab.
METODOLOGIA:
Inicialmente iremos trabalhar com a comunicação I2C com o CI “24C04” realizando escrita e leitura
de áreas de memória. E realizaremos uma comunicação serial RS-232.
Para isso seguiremos os seguintes procedimentos:
a) Vamos começar desenvolvendo a lógica através do software mikroC. Criar um projeto utilizando o
microcontrolador PIC 16F877A, com um clock de 4 MHz.
b) Ativar as bibliotecas do MikroC que serão necessárias para essa lógica: I2C e UART.
c) Observar a sugestão da lógica no Quadro 1. Compilar e realizar a simulação no PICSimLab utilizando a
placa McLab2.
Para realizar a comunicação serial, precisaremos de um outro software para gerar duas portas seriais
virtuais interconectadas. Utilizaremos o “VIRTUAL SERIAL PORTS EMULATOR” que pode ser baixado
gratuitamente pelo endereço: http://www.eterlogic.com/Downloads.html
No site há duas opções de instalação, uma para sistemas operacionais 32 bits e outra para sistemas
operacionais 64 bits.
Execute a opção de acordo com o seu sistema. Durante a instalação, avance as etapas e concorde com
os termos de instalação. No final será preciso reiniciar o computador.
Caso o seu sistema operacional seja o Linux, pode-se utilizar o programa tty0tty. Esse software pode
ser encontrado no endereço: https://github.com/lcgamboa/tty0tty/
Quadro 1 - Sugestão de programação para comunicação I2C.
1 //Vetor com valores constantes para os números do Display -> Catodo comum
2 unsigned char Vetor_Const_Disp[] = {63, 6, 91, 79, 102, 109, 125, 7, 127, 103}; //0,1,2,3,4,5,6,7,5,9
11 }
12
17 valor_contagem++;
18 else
19 valor_contagem--;
21 valor_contagem = 1;
23 valor_contagem = 10;
25 flag = 1;
27 }
31 }
32 }
33
34 void main() {
37 TRISC = 0b10000000;
39
41
46 OPTION_REG.PS2 = 0; //
48 OPTION_REG.PS0 = 0; //
50
51 // Registros de Interrupção
58
59 // Comunicação Serial
62
70 I2C1_Stop();
71
78 I2C1_Stop();
79
81 valor_contagem = ordem = 1;
82
84
while(1){
85
if (flag == 1){
86
I2C1_Start(); //Iniciar I2C
87
I2C1_Wr(0xA0); //Enviar o byte por I2C (endereço do dispositivo + Write)
88
I2C1_Wr(0x00); //Enviar o valor da posição de memória a ser escrita
89
I2C1_Wr(valor_contagem); //Escrever o valor atual do contador
90
I2C1_Wr(ordem); //Escrever o sentido da contagem
91
I2C1_Stop(); //Parar I2C
92
delay_ms(100); //aguarda 100ms
93
flag = 0;
94
95
temp[16] = ((valor_contagem-1)%100)/10 + 48;
96
temp[17] = (valor_contagem-1)%10 + 48;
97
98 UART1_Write_Text(temp);
99 UART1_Write(10); UART1_Write(13);
100 }
101
2ª parte:
Para trabalharmos com entrada analógica utilizaremos entrada (Port. 2) e a saída PWM do
microcontrolador PIC, faremos um processo de controle de temperatura. O valor da entrada analógica é
digitalizado e processado, gerando um sinal pela saída PWM para a placa Ponte-H, que receberá esse sinal e
será responsável por controlar a rotação do motor DC. Caso não tenha a Ponte-H com o motor, é possível
colocar um LED no pino da saída PWM e acompanhar a intensidade da iluminação do LED. Essas
informações poderão ser acompanhadas através de um dispositivo, recebendo esses dados via display LCD e
até mesmo uma comunicação serial.
12 flag = 1;
13 PORTD.RD7 = ~PORTD.RD7;
14 }
18 }
19 }
20
21 void main() {
24 TRISC = 0b10000000;
27
ADCON0 = 0b00001001; // Habilita A/D e seleciona a entrada AN1
28
ADCON1 = 0b00000100; // Seleciona apenas os pinos AN0, AN1 e AN3 como A/D
29
ADC_Init();// Inicializa o módulo conversor A/D
30
31 delay_ms(100);
33
38 OPTION_REG.PS2 = 0; //
40 OPTION_REG.PS0 = 0; //
42
43 // Registros de Interrupção
48
49 // Configuração do PWM
54 TRISC = 0x00; // 3. Configura o pino CCP1 como saída e limpe o bit TRISC
(feito inicio da função main)
55
T2CON = 0b00000100; // 4. TR2 settings- postscale 1:1, TMR2 ON, prescale 1:16
56
PIE1 = 0b00000100; // 5. Configura o módulo CCP1 para funcionar como PWM
57
58
PWM1_Init(3906); // Initializa módulo PWM1 em 3,906KHz
59
delay_ms(100);
60
61 current_duty = 16; // Valor inicial para current_duty
64
67
69
70 while(1) {
72 temperatura = (entradaAnalogica*999.0)/1022.0;
73
78
82 else
83 saida_PWM = 0;
84
85 if(saida_PWM > 255) // Bloqueia o valor em 100% (255) caso passe dos 255
86 saida_PWM = 255;
87
92 if(flag == 1){
93 UART1_Write_Text(temp);
94 UART1_Write(10); UART1_Write(13);
95 UART1_Write_Text(pwm_txt);
96 UART1_Write(10); UART1_Write(13);
97 UART1_Write(10); UART1_Write(13);
98 flag = 0;
99 }
100 PWM1_Set_Duty(saida_PWM); // Atribui a taxa atual ao PWM1
101 delay_ms(100);
102 }
103 }
b) Quantas portas PWM o PIC 16F877A possui? Qual a resolução (em bits)?
Possui 2 módulos PWM e sua largura de pulso é de 10 BITS
Pratica Parte 2:
REFERÊNCIAS BIBLIOGRÁFICAS:
Microchip Technology Inc., PIC16F87XA, Data Sheet, http://ww1.microchip.com/downloads/
en/DeviceDoc/39582b.pdf
MikroElektronika d.o.o., https://www.mikroe.com/mikroc-pic