A maior rede de estudos do Brasil

Grátis
32 pág.
apostila uc pic- hands on

Pré-visualização | Página 3 de 6

seguintes abordarão apenas o PIC16f876A, por questões de total semelhança. Sempre que for escrever um novo programa que possa se basear no atual, copie o texto deste, clique em “Close All”, depois em “New” -> “Source File”. Cole o texto copiado. 
2º EXEMPLO: Push-button
 /---------- push-button ----------
 #include <16F876A.h> 
 #fuses XT
 #use delay(clock=4000000) 
 #use fast_io(a)
 #use fast_io(b)
 #use fast_io(c)
 void main(void){
 set_tris_a(0b11111110);
 set_tris_b(0xff);
 set_tris_c(0xff);
 
 while(true){
 if(input(pin_c4)) output_high(pin_a0);
 else output_low(pin_a0);
 }
 }
Explanação:
input(pin_c4); 
Realiza a leitura externa do nível lógico no pino mencionado e a retorna para o programa.
Figura 7 – Exemplo 2: hardware 16F876
Em uma entrada utilizada para ler um botão, deve-se usar um resistor ligado ao terra. Sem o resistor (chamado de pull-down), se o botão não estiver pressionado, o nivel lógico na entrada não será 0, pois este estará alta impedância. Esse estado pode ser denominado floating (flutuando), onde o sinal não tem um valor fixo, fica variando aleatoriamente em função de ruídos locais. 
Atenção ao ligar um push-button de 4 terminais no protoboard. Dois de seus terminais estão conectados aos outros dois. Portanto, se um dos terminais foi ligado à 5V, o outro terminal conectado à esse também estará em 5V, inviabilizando o uso do seu ramo no protoboard.
3º EXEMPLO: INTERRUÇÃO EXTERNA
Podemos engatilhar uma rotina específica dentro do nosso microcontrolador a partir de sinais externos ou mesmo eventos internos do microcontrolador. Neste exemplo trabalheremos com interrupções externas, que em resumo é a execução de determinada rotina quando houver uma mudança de estado em um pino pré-determinado, sendo esta uma forma mais eficiente de controlar as atividades do microcontrolador por eventos externos, já que desta forma não há perda de tempo ao se realizar a leitura do estado do pino a cada ciclo de trabalho . O hardware que utilizaremos a seguir é o mesmo do exemplo anterior ( push-button), exceto pelo fato que o botão deve estar conectado ao pino responsável por chamar interrupções externas , no caso do PIC16F876A é o pino rb0.
//--------INTERRUPÇÃO EXTERNA----------------------------------------
#include <16F628A.h> else
#fuses INTRC_IO, NOMCLR cont=0;
#use delay(clock=4000000) }}}
#use fast_io(a)
#use fast_io(b)
short int cont;
void main(void){
 cont=0;
 set_tris_a(0xff);
 set_tris_b(0b11111011);
 ext_int_edge(L_TO_H);
 enable_interrupts(GLOBAL);
 enable_interrupts(INT_RB);
 while(true){
 sleep();
 }}
#INT_RB
Void piscaled _int_ext(void)
{
 if(input(pin_b0))
{
delay_ms(20);
if(input(pin_b0))
{
output_bit(pin_a0,cont);
if(cont==0) 
cont=1;
Explanação:
ext_int_edge(L_TO_H); 
Esta função define que o microcontrolador entrará em interrupção quando o pino de interrupção externa em questão passar do estado 0 para 1( low to high).
enable_interrupts(GLOBAL);
Função responsável por habilitar qualquer tipo de interrupção que microcontrolador tenha, deve ser usada antes de habilitar qualquer interrupção especificamente.
enable_interrupts(INT_RB);
Especifica a interrupção que será usada, no caso interrupção externa por alteração de estado nos pinos RB que são responsáveis pelas interrupções externas.
4º EXEMPLO: Display LCD 2x16
//-------- LCD ---------
#include <16F876A.h> 
#fuses XT
#use delay(clock=4000000) 
 
#use fast_io(a)
#use fast_io(b)
#use fast_io(c) 
 
#include <lcdt.c>
#define lig output_high 
#define des output_low 
#define seta output_bit 
#define esp delay_ms 
#define led pin_a0
#define bot pin_c4
#define bl pin_c7
 
void main(void){
unsigned int i;
set_tris_a(0b11111110); 
set_tris_c(0b01111111);
lcd_init();
printf(lcd_putc,"\fCurso de uC PIC "); 
printf(lcd_putc,"\nPET-EngElet.Ufes”);
lig(bl); des(led);
for(i=0;i<6;i++){
 seta(led,!input(led)); esp(400);
}
while(true){
 if(input(bot)){
 printf(lcd_putc,"\f Feliz"); 
 printf(lcd_putc,"\n :)");
 lig(led); lig(bl);
 }else{
 printf(lcd_putc,"\f Triste"); 
 printf(lcd_putc,"\n :(");
 des(led); des(bl)
 }
 esp(200);
}
}
Explanação:
#include <lcdt.c> 
Inclusão da biblioteca do LCD. Esse arquivo deve estar na mesma pasta onde será salvo o programa que a utiliza. 
#define lig output_high 
Amarração entre duas entidades. Serve para aumentar a legibilidade do código. O compilador substitui a parte esquerda pela direita no momento da compilação do programa.
unsigned int i; 
Declaração da variável de 8 bits e sem sinal (0 – 255) chamada “i”.
lcd_init(); 
Inicialização da biblioteca do LCD. Essa função configura os pinos da porta B (menos o B0, que pode ser configurado na “main()”), e prepara o LCD para iniciar sua operação.
printf(lcd_putc,"\fCurso de uC PIC "); 
Função de impressão no LCD. Existem comandos especiais:
\f -> Limpa a tela toda e põe o cursor na primeira posição (1,1).
\n -> Põe o cursor no início da segunda linha.
\b -> Retorna o cursor uma posição.
Os caracteres são impressos sempre na posição corrente do cursor, que pode ser alterada pela função “lcd_gotoxy(x,y);”. A função “lcd_getc(x,y);” retorna o atual caractere que ocupa a posição informada.
	Como os canais B6 e B7 são utilizados para gravação e comunicação com o LCD, deve-ser usar dois resistores para aumentar a impedância de entrada dos terminais PGD e PGC do PICKit2. Sem tais resistores, o LCD e o PIC drenam, juntos, muita corrente do gravador, resultando numa distorção do sinal de gravação.
	O pino 3 do display é o sinal “V0”, que determina o contraste entre a parte escrita e o plano de fundo da tela. O potenciômetro deve ser regulado para obter-se uma boa visualização.
Figura 8 – Hardware Display LCD
5º EXEMPLO: Conversão A/D
No instante em que o programa usuário requisita ao módulo um processo de conversão A/D, o corrente valor de tensão na entrada especificada é convertido em um valor digital, para então ser manipulado pelo programa. Neste exemplo o uC será configurado para uma conversão de 8 bits, e o range de tensão a ser convertida será o padrão, ou seja, a própria alimentação do PIC (0–5V). Portanto, essa faixa será dividida em 256 partes iguais, e o resultado de uma conversão será o byte correspondente a parte em que se encontra a tensão convertida.
Figura 9 – Função de transferência da conversão A/D desse exemplo
//----- Voltímetro ------
#include <16F876A.h> 
#device adc=8
#fuses XT
#use delay(clock=4000000) 
 
#use fast_io(a)
#use fast_io(b)
#use fast_io(c) 
 
#include <lcdt.c>
#define esp delay_ms 
void main(void){
unsigned int digital;
float tensao;
set_tris_a(0b11111111); 
set_tris_c(0b01111111);
setup_adc_ports(ALL_ANALOG);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
lcd_init(); 
printf(lcd_putc,"\f Voltimetro "); 
printf(lcd_putc,"\nPET-EngElet.Ufes");
esp(2000); output_high(pin_c7);
while(true){
 digital=read_adc();
 tensao= 5.0*(float)digital/255.0;
 printf(lcd_putc,"\fT: %1.2f",tensao); 
 printf(lcd_putc,"\nD: %3u",digital);
 esp(500);
}
}
Explanação:
O PIC16F628A não tem conversor A/D.
#device adc=8
Configura a resolução da conversão. Pode ser observado na Figura 9 que a variação mínima que essa conversão pode reconhecer é de aproximadamente 20mV. Isso significa que um sinal de 10mV e outro de 15mV serão convertidos para o mesmo valor (0). Isso pode ser ruim para determinadas aplicações. Por exemplo, o sensor de temperatura LM35