Microcontroladores
Prof. Eng. Derig Almeida Vidal
Mestre em Computação Aplicada, Engenheiro de Produção e Tecnólogo em Automática
Aula 08
Entrada e Saída
Prof. Derig Almeida Vidal, MsC
Analisando um programa simples
#include <16f628a.h> #use delay(clock=4000000)
#fuses HS,NOWDT,PUT,NOBROWNOUT,NOMCLR,NOLVP #use rs232(baud=2400, xmit=PIN_B2, rcv=PIN_B1) void main() { printf(“Ola"); delay_ms(1000); output_high(PIN_A0); }
#include
#include <16f628a.h>• Define o modelo do microcontrolador utilizado, incluindo assim uma série de comandos e variáveis pré-definidas neste microcontrolador.
• No exemplo, o microcontrolador escolhido é o PIC 16F628A.
#use
#use delay(clock=4000000)
• Define o clock do microcontrolador em Hz • No exemplo, o clock é de 4MHz ou 4000000Hz.
Prof. Derig Almeida Vidal, MsC
#fuses
• #fuses
HS,NOWDT,PUT,NOBROWNOUT,NOMCLR,NOLVP
Fuse Significado
LP Low power osc < 200KHz
XT Crystal osc <= 4MHz
HS High speed Osc (> 4MHz)
EC External clock with CLKOUT
NOWDT No Watch Dog Timer
WDT Watch Dog Timer
NOPUT No Power Up Timer
PUT Power Up Timer
PROTECT Code protected from reads
NOPROTECT Code not protected from reading BROWNOUT Reset when brownout detected
Prof. Derig Almeida Vidal, MsC
#fuses
Fuse Significado
NOBROWNOUT No brownout reset NOMCLR Master Clear pin used for I/O
MCLR Master Clear pin enabled
NOLVP No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
LVP Low Voltage Programming on B3(PIC16) or B5(PIC18)
INTRC Internal RC Osc
EC_IO External clock
INTRC_IO Internal RC Osc, no CLKOUT
EC External clock with CLKOUT
NOCPD No EE protection
CPD Data EEPROM Code Protected
Prof. Derig Almeida Vidal, MsC
#use
#use rs232(baud=2400, xmit=PIN_B2, rcv=PIN_B3) • A diretiva rs232 é utilizada para ordenar ao
compilador que gere um código para comunicação serial utilizando uma interface serial assíncrona padrão rs232.
• Os parâmetros são os seguintes (respectivamente): – Velocidade de comunicação em bps;
– Pino de saída dos dados transmitidos; – Pino de entrada dos dados recebidos.
Prof. Derig Almeida Vidal, MsC
Saída de dados (Serial) - printf()
• Cria uma saída formatada, geralmente utilizada para exibir dados das variáveis no LCD ou em uma saída serial.
• No Proteus podemos colocar um Terminal Virtual nesta saída e observá-la (lembrar de sincronizar a
Prof. Derig Almeida Vidal, MsC
Saída de dados (Serial) - printf()
• Exemplo:
int x,y; x = 10; y = 20;
printf(“o valor de x e %d e o valor de y e %d”,x,y);
• Exemplo:
float VAR1; int VAR2; long VAR3;
printf(lcd_putc, “\f TESTE %f”, VAR1);
printf(lcd_putc,”\fTESTE\n %lu %f”, VAR3, VAR1);
Prof. Derig Almeida Vidal, MsC
Saída de dados (Serial) - printf()
Saída de dados (Serial) - printf()
Especificadores de Formato
Especificador Tipo
%u Int ou Short %i ou %d Signed int
%lu Long ou int32 %li ou %ld Signed long
%X Int em hexadecimal
%f Float
%c Caractere
%s String
%e Float em notação científica %lx Long em hexadecimal
%% O símbolo %
%3u Int com 3 casas
Códigos de Barra Invertida
• Colocar todas as constantes caractere entre aspas funciona para muitos caracteres, mas alguns, como o retorno de carro, são impossíveis de serem inseridos em uma string a partir do teclado.
Prof. Derig Almeida Vidal, MsC
Códigos de Barra Invertida
Código Caractere Código ASCII
\yyy Constante Octal yyy
-\xyyy Constante hexadecimal
-\0 Nulo (null) 0
\a Campainha (BEL) 07h
\b Retrocesso (backspace) 08h
\t Tabulação horizontal (TAB) 09h
\n Nova linha (line feed) 0Ah
\v Tabulação vertical (vertical TAB) 0Bh
\f Avanço de formulário (form feed) 0Ch
\r Retorno de carro (Return) 0Dh
\” Aspas 22h
\’ Apóstrofo 27h
\\ Barra invertida “\” 5Ch
Prof. Derig Almeida Vidal, MsC
Exercício
1. Declare uma variável A do tipo float e a inicialize. Declare uma variável B do tipo float e a inicialize. Declare uma variável Soma do tipo float que receba o valor da soma de A+B. Ao final mostre “A soma de A (valor de A) + B (valor de B) é igual a (Valor de soma)”.
Prof. Derig Almeida Vidal, MsC
Exercício 01 - Resposta
#include <16f628a.h> #use delay(clock=4000000)
#fuses HS,NOWDT,PUT,NOBROWNOUT,NOMCLR,NOLVP #use rs232(baud=2400, xmit=PIN_B2, rcv=PIN_B1) void main(){ float A, B, Soma; A = 10.5; B = 1; Soma = A + B; printf("A soma de A (%f) + B (%f) é igual a (%f)",A,B,Soma); }
Prof. Derig Almeida Vidal, MsC
Exercício
2. Modifique o programa a seguir para exibir o valor das variáveis do programa (em Hexa) ao término de sua execução: long int x; int y,z; x = 0x1234; y = x; z = x>>8;
Prof. Derig Almeida Vidal, MsC
Exercício 02 - Resposta
#include <16f628a.h> #use delay(clock=4000000)
#fuses HS,NOWDT,PUT,NOBROWNOUT,NOMCLR,NOLVP #use rs232(baud=2400, xmit=PIN_B2, rcv=PIN_B1) void main(){ long int x; int y,z; x = 0x1234; y = x; z = x>>8;
printf("O valor de x = %lx o valor de y = %x e o valor de z = %x",x,y,z); }
Prof. Derig Almeida Vidal, MsC
Exercício 02 – Resposta 02
#include <16f628a.h> #use delay(clock=4000000)
#fuses HS,NOWDT,PUT,NOBROWNOUT,NOMCLR,NOLVP #use rs232(baud=2400, xmit=PIN_B2, rcv=PIN_B1) void main(){ long int x; int y,z; x = 0x1234; y = x; z = x>>8; printf("O valor de x = %lx",x); printf("\n\rO valor de y = %x",y); printf("\n\rE o valor de z = %x",z); }
Saída de dados
output_high e output_low
output_high()
• Ativa um determinado pino do microcontrolador. • Exemplo:
output_high(PIN_A0); output_high(PIN_B2);
output_low()
• Desativa um determinado pino do microcontrolador. • Exemplo: output_low(PIN_B5);
Exemplo
#include <16f628a.h> #use delay(clock=4000000) #fuses HS,NOWDT,PUT,NOBROWNOUT,NOMCLR,NOLVP void main(){ output_high(PIN_B0); delay_ms(3000); output_low(PIN_B0); delay_ms(3000); output_high(PIN_B0); }Prof. Derig Almeida Vidal, MsC
Saída de dados -
output_a() e output_b()
output_a()• Envia um byte para o PORT A • Exemplo:
output_a(VAR1); // envia VAR1 para PORTA
output_b()
• Envia um byte para o PORT B • Exemplo:
output_b(0xff); // liga todos bits de PORTB output_b(0x00); // desliga todos os bits de PORTB
Prof. Derig Almeida Vidal, MsC
Exemplo
#include <16f628a.h> #use delay(clock=4000000)
#fuses HS,NOWDT,PUT,NOBROWNOUT,NOMCLR,NOLVP void main(){
int saida = 0b00001000; // ativa apenas o pino B3
output_b(saida); delay_ms(3000);
saida = saida | 0b00000001; // ativa também o pino B0
output_b(saida); delay_ms(3000);
saida = saida & 0b11110111; // desativa o pino B3
output_b(saida); }
Prof. Derig Almeida Vidal, MsC
Exemplo
Prof. Derig Almeida Vidal, MsC
Entrada de dados - input()
input()
• Busca o estado de um pino • Exemplo:
int1 x;
Prof. Derig Almeida Vidal, MsC
Exemplo
#include <16f628a.h> #use delay(clock=4000000) #fuses HS,NOWDT,PUT,NOBROWNOUT,NOMCLR,NOLVP void main(){ int1 entrada; entrada = input(PIN_A0);(entrada==1) ? output_high(PIN_B0) : output_low(PIN_B0); }
Prof. Derig Almeida Vidal, MsC
Exemplo
Entrada de dados – input_a()
input_a()
• Busca um byte do PORT A • Exemplo:
int VAR1;
VAR1 = input_a(); input_b()
• Busca um byte do PORT B • Exemplo: int VAR1;
Exemplo
#include <16f628a.h> #use delay(clock=4000000) #fuses HS,NOWDT,PUT,NOBROWNOUT,NOMCLR,NOLVP #use rs232(baud=2400, xmit=PIN_A0, rcv=PIN_A1) void main(){int entrada;
entrada = input_b();
printf("O valor da entrada é: %u",entrada); }
Prof. Derig Almeida Vidal, MsC
Exemplo
Prof. Derig Almeida Vidal, MsC
Entrada de dados (Serial) - getchar()
getchar();
• Obtém os dados provenientes da entrada serial, previamente configurada.
• Exemplo: char y; y = getchar();
Prof. Derig Almeida Vidal, MsC
Exemplo
#include <16f628a.h> #use delay(clock=4000000)
#fuses HS,NOWDT,PUT,NOBROWNOUT, NOMCLR,NOLVP
#use rs232(baud=2400, xmit=PIN_B2, rcv=PIN_B1) void main(){
char y; y = getchar();
printf("O caractere informado e: %c",y); }
Prof. Derig Almeida Vidal, MsC
Exemplo
Prof. Derig Almeida Vidal, MsC
Delays
delay_us()
• Causa um atraso de tempo em milionésimos de segundos.
• Ex:
delay_us(500); // Atrasa 500us delay_ms()
• Causa um atraso de tempo em milésimos de segundos.
• Ex:
delay_ms(1000); // Atrasa 1 segundo
Prof. Derig Almeida Vidal, MsC
Exercícios
1. Acender um LED, esperar 1 segundo e desligar o LED.