pic slides

42
Curso de Microcontroladores PIC Programação em linguagem C

Upload: rodrigo-martins

Post on 28-Jul-2015

313 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Pic slides

Curso de Microcontroladores PIC Programação em linguagem C

Page 2: Pic slides

Introdução

O que é um microcontrolador?

Microcontrolador X microprocessador

Aplicações

PIC16F628A e PIC16F876A

Page 3: Pic slides

Estrutura básica dos PICs usados

Page 4: Pic slides

Clique para editar os estilos do texto mestreSegundo nível Terceiro nível

Quarto nível Quinto nível

Características Elétricas

Page 5: Pic slides

GND e VDD: 2,2 a 5,5V (nos exemplos: 5V)

Pino MCLR em 5 V (em 0V reseta o uC)

Pinos OSC1 e OSC2 ligados a um cristal

O PIC16F628A dispensa o uso do MCLR e do cristal,

utilizando apenas a alimentação

Hardware mínimo

Page 6: Pic slides

Hardware mínimo

Page 7: Pic slides

Configuração dos pinos (entradas ou saídas)

Configuração dos periféricos utilizados

Declaração das variáveis da main()

Chamadas das funções iniciais

Inicialização

Leitura das entradas

Processamento dos dados

Atualização das saídas

Loop infinito

Software mínimo

Page 8: Pic slides

//---- Programa Esqueleto----#include <16F628A.h> #fuses INTRC_IO, NOMCLR#use delay(clock=4000000)  #use fast_io(a)#use fast_io(b) void main(void){ set_tris_a (0b11111111); set_tris_b (0xff);  while(true){  }}

//---- Programa Esqueleto----#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 (0b11111111); set_tris_b (0xff); set_tris_c (0xff);

while(true){

}}

Software mínimo

Page 9: Pic slides

O compilador é case insensitive!

Output_high(pino);

Ex: output_high(PIN_A0);

Output_low(pino);

Ex: output_low(PIN_A1);

Output_toggle(pino);

Ex: Output_toggle(PIN_A2);

Output_x(dado);

Ex: Output_a(0b00010001);

Funções de saída / tris

Output_float(pino) Ex: Output_float(PIN_A4);

Output_drive(pino) Ex: Output_drive(PIN_A5);

Page 10: Pic slides

delay_ms(tempo em milisegundos);

delay_us(tempo em microsegundos);

delay_cycles(tempo em ciclos);

Funções de delay

Page 11: Pic slides

//---- Programa Esqueleto----#include <16F628A.h> #fuses INTRC_IO, NOMCLR#use delay(clock=4000000)  #use fast_io(a)#use fast_io(b) void main(void){ set_tris_a (0b11111110); set_tris_b (0xff);  while(true){  ouput_high(pin_a0); delay_ms(500); output_low(pin_a0); delay_ms(500); }}

//---- Programa Esqueleto----#include <16F876A.h> #fuses XT#use delay(clock=4000000)  #use fast_io(a)#use fast_io(b)#use fast_io(c) #use fast_io(d) #use fast_io(e)  void main(void){ set_tris_a (0b11111110); set_tris_b (0xff); set_tris_c (0xff); set_tris_d (0xff); set_tris_e (0xff);

while(true){ ouput_high(pin_a0); delay_ms(500); output_low(pin_a0); delay_ms(500); }}

1ºEx: Hello World!

Page 12: Pic slides

1ºEx: Hello World!

Page 13: Pic slides

1ºEx: Hello World!

Page 14: Pic slides

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á zero, pois este está em 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.

Push-button e o Resistor de Pull-down

Page 15: Pic slides

Input(pino);

Ex: if(input(pin_a0)){

...

}

Input_x();

Ex: a = Input_a();

Input_state(pino);

Ex: estado = input_state(PIN_A2);

Funções entrada digital

Page 16: Pic slides

//-------- Pisca LED ---------#include <16F628A.h> #fuses INTRC_IO, NOMCLR#use delay(clock=4000000)  #use fast_io(a)#use fast_io(b) void main(void){ set_tris_a (0b11111110); set_tris_b (0xff);  while(true){  if(input(pin_c4)) ouput_high(pin_a0); else output_low(pin_a0); }}

//-------- Pisca LED ---------#include <16F877A.h> #fuses XT#use delay(clock=4000000)  #use fast_io(a)#use fast_io(b)#use fast_io(c) #use fast_io(d) #use fast_io(e)  void main(void){ set_tris_a (0b11111110); set_tris_b (0xff); set_tris_c (0xff); set_tris_d (0xff); set_tris_e (0xff);

while(true){ if(input(pin_c4)) ouput_high(pin_a0); else output_low(pin_a0); }}

2ºEx: Push-button

Page 17: Pic slides

2ºEx: Push-button

Page 18: Pic slides

Podemos engatilhar uma rotina específica dentro do nosso microcontrolador a partir de sinais externos ou mesmo eventos internos do microcontrolador, sendo esta uma forma mais eficiente de controlar as suas atividades já que desta forma não há perda de tempo ao se realizar a leitura do estado do pino a cada ciclo de trabalho.

Interrupção externa

Page 19: Pic slides

Enable_interrupts(parâmetros)

Ex: enable_interrupts(GLOBAL|INT_RB0)

Ext_int_edge(parâmetros)

ex: ext_int_edge(L_TO_H)

Definição da interrupção:

#INT_RB

Void funcao(){

código

}

Funções básicas: Interrupção

Page 20: Pic slides

3ºEx: Interrupção Externa/----Interrupção Externa----/

#include <16F877A.h>

#fuses XT

#use delay(clock=4000000)

#use fast_io(a)

#use fast_io(b)

#use fast_io(c)

#use fast_io(d)

#use fast_io(e)

 

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();

}

}

#INT_RBvoid piscaled(void){ if(input(pin_b0)){delay_ms(20);if(input(pin_b0)){output_toggle(pin_a0);}}}

Page 21: Pic slides

• #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

Page 22: Pic slides

\f - Apaga todo o conteúdo do lcd e volta à posição (1,1)

\b – Volta 1 caractere no lcd

\n – pula uma linha

Display LCD

Page 23: Pic slides

4ºEx: Display//--------- LCD ---------#include <16F877A.h> #fuses XT#use delay(clock=4000000)  #use fast_io(a)#use fast_io(b)#use fast_io(c) #use fast_io(d) #use fast_io(e) #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,"\fIS WEEEE!! "); printf(lcd_putc,"\n PICapturando"); 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); }}

Page 24: Pic slides

4ºEx: Display

Page 25: Pic slides

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 Analógico -Digital

Page 26: Pic slides

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

Conversão AD

Page 27: Pic slides

5ºEx: ADC

Page 28: Pic slides

Para cada para cada grau de temperatura a tensão de saída do LM35 é de 10 mV

Sensor de Temperatura : LM35

Page 29: Pic slides

#include <16F877A.h> #fuses XT#use delay(clock=4000000)

#use fast_io(a)#use fast_io(b)#use fast_io(c) #use fast_io(d) #use fast_io(e)

#include <lcdt.c>

void main(void){ float temp = 0; set_tris_a (0b11111111); set_tris_c (0x01111111);

5ºEx: Termômetro (LM35)

setup_adc(ADC_CLOCK_INTERNAL); setup_adc_ports(AN0); set_adc_channel(0); lcd_init(); printf(lcd_putc, "Testando LCD"); output_high(pin_c7); while(true){ temp=(float)read_adc()*5.0/(256.0*0.01);printf(lcd_putc, "\fTemperatura:\n%f", temp); delay_ms(200); }}

Page 30: Pic slides

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.

Comunicação Serial (UART)

Page 31: Pic slides

Clique para editar os estilos do texto mestreSegundo nível Terceiro nível

Quarto nível Quinto nível

Start bit: Avisa que a transferência de um dado será feita. Possui nível lógico zero.

Stop bit: Avisa que a transferência do dado foi finalizada. Possui nível lógico um.

Baud rate: Determina quantos bits estarão contidos em um segundo de comunicação.

Tempo de bit: É o tempo de duração de um bit, tem o valor 1/(baud rate).

Payload: É a carga de dados da comunicação, nesse caso o caractere “a”.

Page 32: Pic slides

use rs232(parâmetros)– Ex: #use rs232(baud=9600,rcv=PIN_C7,xmit=PIN_C6)

Putc(caracter)

Ex: putc(‘a’)

Variável = Getc();

Ex: caractere = getc();

Puts(mesagem) ou printf(“mensagem”)

Ex: puts(“mensagem feliz”)

Variável = Gets();

Ex: msg = gets();

Kbhit();

Ex: if(kbhit());

Comunicação Serial (UART)

Page 33: Pic slides

#include <16f628A.h> #fuses INTRC_IO, NOMCLR#use delay(clock=4000000)

#use rs232(baud=9600, rcv=pin_b1, xmit=pin_b2)

#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

Page 34: Pic slides

8º Ex: UART TX

Clique para editar os estilos do texto mestreSegundo nível Terceiro nível

Quarto nível Quinto nível

Page 35: Pic slides

8ºEx: UART RX#include <16F877A.h>#fuses XT#use delay(clock = 4000000)

#use fast_io(a)#use fast_io(b)#use fast_io(c)#use fast_io(d)

#define use_portb_lcd true#include <lcdt.c>

#use rs232(baud=9600 , rcv = pin_c7 , xmit = pin_c6)

void main(void){char dado;set_tris_a(0b11111110);set_tris_c(0b10111111);lcd_init();

while(true){ if(kbhit()){ dado = getc(); printf(lcd_putc,"\fDado:\n%c",dado); } }}

Page 36: Pic slides

8º Ex: UART RX

Page 37: Pic slides

#include <16f877A.h>#fuses XT #use delay(clock=4000000)

#use fast_io(a)#use fast_io(b)#use fast_io(c)#use fast_io(d) #use fast_io(e) #include <lcdt.c>

#use rs232(baud=9600, xmit=pin_c6, parity=N, rcv=pin_c7)

short flag=1;char dado=‘K’;

#INT_RDAvoid int_receber(void){ dado=getc(); flag=1;}

void main(void){ set_tris_a(0xff); set_tris_c(0b10111111);

lcd_init(); enable_interrupts(GLOBAL); enable_interrupts(INT_RDA);

while(TRUE){ if(flag){ printf (lcd_putc,"\f Dado: "); printf (lcd_putc,"\n %1c", dado); flag = 0; } }}

8ºEx: RX Int. recebimento

Page 38: Pic slides

Os Timers são periféricos responsáveis pela contagem de tempo, mas que também podem ser usados para contar pulsos de um sinal externo. São muito úteis quando se deseja um intervalo de tempo preciso entre eventos. Podem realizar o papel da função “delay_ms(X);”, mas permitindo que o programa trabalhe em outras atividades enquanto o tempo está sendo contado.

Timer

Page 39: Pic slides

setup_timer_x(parâmetros);

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

Define a função de tratamento de interrupção

Interrupção Timer

Page 40: Pic slides

11º Ex: Timer 0//----- Pisca LED ------ #include <16F877A.h> #fuses XT #use delay(clock=4000000)

#use fast_io(a) #use fast_io(b) #use fast_io(c) #use fast_io(d) #use fast_io(e)

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); } }

void main(void){ set_tris_a(0b11111110); set_tris_b(0b11111111); set_tris_c(0b11111111); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64); set_timer0(131); enable_interrupts(GLOBAL|INT_TIMER0); while(true){ } }

Page 41: Pic slides

Clique para editar os estilos do texto mestreSegundo nível Terceiro nível

Quarto nível Quinto nível

Page 42: Pic slides

FIM