Escolar Documentos
Profissional Documentos
Cultura Documentos
Pic C
Pic C
Programação em linguagem C
Introdução
O que é um microcontrolador?
Microcontrolador X microprocessador
Aplicações
PIC16F628A e PIC16F876A
Estrutura básica dos PICs usados
Características Elétricas
Clique para editar os estilos do texto mestre
Segundo nível
Terceiro nível
Quarto nível
Quinto nível
Hardware mínimo
GND e VDD: 2,2 a 5,5V (nos exemplos: 5V)
Loop infinito
Leitura das entradas
while(true){
}
}
Funções de saída / tris
O compilador é case insensitive!
Output_float(pino)
Output_high(pino);
Ex:
Ex: output_high(PIN_A0);
Output_float(PIN_A4);
Output_low(pino);
Ex: output_low(PIN_A1); Output_drive(pino)
Output_toggle(pino); Ex:
Ex: Output_toggle(PIN_A2); Output_drive(PIN_A5);
Output_x(dado);
Ex: Output_a(0b00010001);
Funções de delay
delay_ms(tempo em milisegundos);
delay_us(tempo em microsegundos);
delay_cycles(tempo em ciclos);
1ºEx: Hello World! //---- Programa Esqueleto----
#include <16F876A.h>
#fuses XT
//---- Programa Esqueleto---- #use delay(clock=4000000)
#include <16F628A.h>
#fuses INTRC_IO, NOMCLR #use fast_io(a)
#use delay(clock=4000000)
#use fast_io(b)
#use fast_io(c)
#use fast_io(a)
#use fast_io(b) #use fast_io(d)
void main(void){ #use fast_io(e)
set_tris_a (0b11111110);
set_tris_b (0xff); void main(void){
set_tris_a (0b11111110);
while(true){
ouput_high(pin_a0); set_tris_b (0xff);
delay_ms(500); set_tris_c (0xff);
output_low(pin_a0);
set_tris_d (0xff);
delay_ms(500);
set_tris_e (0xff);
}
}
while(true){
1ºEx: Hello World!
1ºEx: Hello World!
Push-button e o Resistor de Pull-
down
Ext_int_edge(parâmetros)
ex: ext_int_edge(L_TO_H)
Definição da interrupção:
#INT_RB
Void funcao(){
código
}
3ºEx: Interrupção Externa
/----Interrupção Externa----/
#INT_RB
#include <16F877A.h> void piscaled(void)
#fuses XT {
#use delay(clock=4000000) if(input(pin_b0))
#use fast_io(a) {
#use fast_io(b)
delay_ms(20);
#use fast_io(c)
if(input(pin_b0))
#use fast_io(d)
{
#use fast_io(e)
output_toggle(pin_a0);
}
void main(void){
}
set_tris_a (0b11111110);
set_tris_b (0xff);
}
set_tris_c (0xff);
set_tris_d (0xff);
set_tris_e (0xff);
ext_int_edge(L_TO_H);
enable_interrupts(GLOBAL|INT_RB);
while(true){
sleep();
}
Display LCD
• #include <lcdt.c>
• Biblioteca de comunicação com o LCD,
• lcd_init()
• Inicializa o LCD
• Lcd_gotoxy(posição x, posição y)
• Vai para a posição x,y do lcd. O canto superior esquerdo é a
posição (1,1)
• lcd_getc(posição x, posição y)
• Pega o caracter da posição x,y
• Printf(lcd_putc,”Mensagem”)
• Escreve a mensagem na tela a partir da posição atual.
Display LCD
\f - Apaga todo o conteúdo do lcd e volta à
posição (1,1)
\b – Volta 1 caractere no lcd
set_tris_c(0b01111111);
//--------- LCD lcd_init();
--------- printf(lcd_putc,"\fIS WEEEE!! ");
#include <16F877A.h>
printf(lcd_putc,"\n PICapturando");
#fuses XT lig(bl);
#use des(led);
delay(clock=4000000) for(i=0;i<6;i++){
seta(led,!input(led)); esp(400);
}
#use fast_io(a) while(true){
#use fast_io(b)
#use fast_io(c) if(input(bot)){
#use fast_io(d) printf(lcd_putc,"\f Feliz");
printf(lcd_putc,"\n :)");
#use fast_io(e) lig(led); lig(bl);
}else{
printf(lcd_putc,"\f Triste");
#include <lcdt.c> printf(lcd_putc,"\n :(");
des(led); des(bl)
#define lig output_high }
#define des output_low esp(200);
#define seta output_bit }
4ºEx: Display
Conversão Analógico -Digital
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,
(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.
Conversão AD
Setup_adc_ports(parâmetros)
Ex: setup_adc_ports(all_analog);
Setup_adc()
Setup_adc(adc_clock_internal)
Set_adc_channel()
Setup_adc_channel(0);
Read_adc()
Variavel=read_adc
5ºEx: ADC
Sensor de Temperatura : LM35
Para cada para cada grau de temperatura
a tensão de saída do LM35 é de 10 mV
5ºEx: Termômetro (LM35)
#include <16F877A.h>
setup_adc(ADC_CLOCK_INTERNAL);
#fuses XT setup_adc_ports(AN0);
#use delay(clock=4000000) set_adc_channel(0);
lcd_init();
#use fast_io(a) printf(lcd_putc, "Testando LCD");
#use fast_io(b) output_high(pin_c7);
#use fast_io(c)
#use fast_io(d) while(true){
temp=(float)read_adc()*5.0/
#use fast_io(e) (256.0*0.01);
printf(lcd_putc, "\fTemperatura:\n%f",
temp);
#include <lcdt.c> delay_ms(200);
}
void main(void){ }
float temp = 0;
set_tris_a (0b11111111);
set_tris_c (0x01111111);
Comunicação Serial (UART)
A UART é definida como um periférico de
comunicação entre dispositivos digitais. Este
módulo se baseia no protocolo RS-232, o mais
popular padrão de comunicação assíncrona, ou
seja, entre dispositivos com fontes de relógio
distintas. A grande maioria dos uCs possuem
este hardware integrado. Uma comunicação
síncrona permite uma taxa de transmissão mais
elevada, pois o instante da leitura do sinal é bem
definido devido à referência do relógio. O nosso
exemplo abordará a comunicação assíncrona.
Clique para editar os estilos do texto mestre
Segundo nível
Terceiro nível
Quarto nível
Quinto nível
Ex: putc(‘a’)
Variável = Getc();
Ex: if(kbhit());
8ºEx: UART TX
#include <16f628A.h>
#fuses INTRC_IO, NOMCLR
#use delay(clock=4000000)
#use fast_io(a)
#use fast_io(b)
void main(void){
char dado='a';
set_tris_a(0b11111111);
set_tris_b(0b11111011);
while(true){
if(input(pin_a0)){
delay_ms(20);
if(input(pin_a0)){
putc(dado++);
if(dado == 'h') dado =
'a';
delay_ms(200);
}}
}
8º Ex: UART TX
void main(void){
char dado;
set_tris_a(0b11111110);
set_tris_c(0b10111111);
lcd_init();
8º Ex: UART RX
8ºEx: RX Int. recebimento
#include <16f877A.h>
#fuses XT
#use delay(clock=4000000)
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64);
set_timerx(valor);
Ex: set_timerx(131);
enable_interrupts(parâmetros);
enable_interrupts(GLOBAL|INT_TIMER0);
#INT_timerx
short led;
unsigned int cont;
#INT_TIMER0
void trata_tmr0(void){
set_timer0(131+get_timer0());
if(++cont==125){
cont=0;
led=!led;
output_bit(pin_a0,led);
}
}
Clique para editar os estilos do texto mestre
Segundo nível
Terceiro nível
Quarto nível
Quinto nível
FIM