curso de microcontroladores pic programa o em linguagem c
Download
Skip this Video
Download Presentation
Curso de Microcontroladores PIC Programação em linguagem C

Loading in 2 Seconds...

play fullscreen
1 / 42

Curso de Microcontroladores PIC Programação em linguagem C - PowerPoint PPT Presentation


  • 66 Views
  • Uploaded on

Curso de Microcontroladores PIC 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. Hardware mínimo.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'Curso de Microcontroladores PIC Programação em linguagem C' - zoie


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
introdu o
Introdução
  • O que é um microcontrolador?
  • Microcontrolador X microprocessador
  • Aplicações
  • PIC16F628A e PIC16F876A
slide5
Hardware mínimo
  • 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
slide7
Software mínimo

Inicialização

  • 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

Loop infinito

  • Leitura das entradas
  • Processamento dos dados
  • Atualização das saídas
slide8
Software mínimo

//---- Programa Esqueleto----

#include <16F876A.h>

#fuses XT

#use delay(clock=4000000)

#use fast_io(a)

#use fast_io(b)

#use fast_io(c)

voidmain(void){

set_tris_a (0b11111111);

set_tris_b (0xff);

set_tris_c (0xff);

while(true){

}

}

  • //---- Programa Esqueleto----
  • #include <16F628A.h>
  • #fuses INTRC_IO, NOMCLR
  • #use delay(clock=4000000)
  • #use fast_io(a)
  • #use fast_io(b)
  • voidmain(void){
  • set_tris_a (0b11111111);
  • set_tris_b (0xff);
  • while(true){
  • }
  • }
fun es de sa da tris
Funções de saída / tris

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

Output_float(pino)

Ex: Output_float(PIN_A4);

Output_drive(pino)

Ex: Output_drive(PIN_A5);

fun es de delay
Funções de delay

delay_ms(tempo em milisegundos);

delay_us(tempo em microsegundos);

delay_cycles(tempo em ciclos);

slide11
1ºEx: Hello World!

//---- 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)

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

}

}

  • //---- Programa Esqueleto----
  • #include <16F628A.h>
  • #fuses INTRC_IO, NOMCLR
  • #use delay(clock=4000000)
  • #use fast_io(a)
  • #use fast_io(b)
  • voidmain(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);
  • }
  • }
push button e o resistor de pull down
Push-button e o Resistor de Pull-down
  • 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.
fun es entrada digital
Funções entrada digital

Input(pino);

Ex: if(input(pin_a0)){

...

}

Input_x();

Ex: a = Input_a();

Input_state(pino);

Ex: estado = input_state(PIN_A2);

2 ex push button
2ºEx: Push-button

//-------- 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)

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

elseoutput_low(pin_a0);

}

}

  • //-------- Pisca LED ---------
  • #include <16F628A.h>
  • #fuses INTRC_IO, NOMCLR
  • #use delay(clock=4000000)
  • #use fast_io(a)
  • #use fast_io(b)
  • voidmain(void){
  • set_tris_a (0b11111110);
  • set_tris_b (0xff);
  • while(true){
  • if(input(pin_c4))
  • ouput_high(pin_a0);
  • elseoutput_low(pin_a0);
  • }
  • }
interrup o externa
Interrupção externa
  • 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.
fun es b sicas interrup o
Funções básicas: Interrupção
  • 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

Voidfuncao(){

código

}

3 ex interrup o externa
3ºEx: Interrupção Externa

#INT_RB

void piscaled(void)

{

if(input(pin_b0))

{

delay_ms(20);

if(input(pin_b0))

{

output_toggle(pin_a0);

}

}

}

/----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)

voidmain(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
Display LCD
  • #include
    • 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 lcd1
Display LCD
  • \f - Apaga todo o conteúdo do lcd e volta à posição (1,1)
  • \b – Volta 1 caractere no lcd
  • \n – pula uma linha
4 ex display
voidmain(void){

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

}

}

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

#define ligoutput_high

#define desoutput_low

#define seta output_bit

#define espdelay_ms

#define led pin_a0

#define bot pin_c4

#define bl pin_c7

convers o anal gico digital
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
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
sensor de temperatura lm35
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
5ºEx: Termômetro (LM35)

#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

voidmain(void){

floattemp = 0;

set_tris_a (0b11111111);

set_tris_c (0x01111111);

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

}

}

comunica o serial uart
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.
slide31
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”.

comunica o serial uart1
Comunicação Serial (UART)
  • 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());
8 ex uart tx
8ºEx: UART TX

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

voidmain(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 rx
8ºEx: UART RX

while(true){

if(kbhit()){

dado = getc(); printf(lcd_putc,"\fDado:\n%c",

dado);

}

}

}

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

#include

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

voidmain(void){

char dado;

set_tris_a(0b11111110);

set_tris_c(0b10111111);

lcd_init();

8 ex rx int recebimento
8ºEx: RX Int. recebimento

#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

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

short flag=1;

char dado=‘K’;

#INT_RDA

voidint_receber(void){

dado=getc();

flag=1;

}

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

}

}

}

timer
Timer
  • 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.
interrup o timer
Interrupção Timer
  • 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
11 ex timer 0
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;

unsignedintcont;

#INT_TIMER0

void trata_tmr0(void){

set_timer0(131+get_timer0());

if(++cont==125){

cont=0;

led=!led;

output_bit(pin_a0,led);

}

}

voidmain(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){

}

}

ad