Professional Documents
Culture Documents
Estrutura bsica de um microcontrolador; O PIC16F883; MPLAB IDE; Linguagem C; Manipulao de I/O; Timers; Interrupes; Conversor A/D; Comunicao Serial; Manipulao de memria EEPROM; Projeto Exemplo;
Exemplo:
fosc = 4MHz ciclo de mquina = fosc /4 = 4Mhz / 4 = 1Mhz tciclo = 1/1Mhz = 1s
Tipos de osciladores:
U1
1 2 3 4 5 6 7 10 9 21 22 23 24 RE3/MCLR/VPP RA0/AN0/ULPWU/C12IN0RA1/AN1/C12IN1RA2/AN2/VREF-/CVREF/C2IN+ RA3/AN3/VREF+/C1IN+ RC0/T1OSO/T1CKI RA4/T0CKI/C1OUT RC1/T1OSI/CCP2 RA5/AN4/SS/C2OUT RC2/CCP1/P1A RA6/OSC2/CLKOUT RC3/SCK/SCL RA7/OSC1/CLKIN RC4/SDI/SDA RC5/SDO RB0/AN12/INT RC6/TX/CK RB1/AN10/P1C/C12IN3RC7/RX/DT RB2/AN8/P1B RB3/AN9/PGM/C12IN2PIC16F883 RB4/AN11/P1D RB5/AN13/T1G RB6/ICSPCLK RB7/ICSPDAT 25 26 27 28 11 12 13 14 15 16 17 18
REXT
CEXT
U1
1 2 3 4 5 6 7 10 9 21 22 23 24 RE3/MCLR/VPP RA0/AN0/ULPWU/C12IN0RA1/AN1/C12IN1RA2/AN2/VREF-/CVREF/C2IN+ RA3/AN3/VREF+/C1IN+ RC0/T1OSO/T1CKI RA4/T0CKI/C1OUT RC1/T1OSI/CCP2 RA5/AN4/SS/C2OUT RC2/CCP1/P1A RA6/OSC2/CLKOUT RC3/SCK/SCL RA7/OSC1/CLKIN RC4/SDI/SDA RC5/SDO RB0/AN12/INT RC6/TX/CK RB1/AN10/P1C/C12IN3RC7/RX/DT RB2/AN8/P1B RB3/AN9/PGM/C12IN2PIC16F883 RB4/AN11/P1D RB5/AN13/T1G RB6/ICSPCLK RB7/ICSPDAT 25 26 27 28 11 12 13 14 15 16 17 18
C1
XTAL C2
So divididas em 3 tipos:
ROM > Memria de Programa RAM -> Memria de Dados EEPROM -> Memria de Armazenamento
Memria do tipo FLASH; Dividida em duas pginas; Vetor de reset; Vetor de interrupo;
Memria no voltil;
Usada para armazenar valores que no podem ser perdidos; Escrita e apagada eletricamente;
256 bytes;
Reset externo; Quando aplicado nvel baixo ocorre o reinicio do programa; Pino 1 RE3/MCLR
R1
10K
U1
1 2 3 4 5 6 7 10 9 21 22 23 24 RE3/MCLR/VPP RA0/AN0/ULPWU/C12IN0RA1/AN1/C12IN1RA2/AN2/VREF-/CVREF/C2IN+ RA3/AN3/VREF+/C1IN+ RC0/T1OSO/T1CKI RA4/T0CKI/C1OUT RC1/T1OSI/CCP2 RA5/AN4/SS/C2OUT RC2/CCP1/P1A RA6/OSC2/CLKOUT RC3/SCK/SCL RA7/OSC1/CLKIN RC4/SDI/SDA RC5/SDO RB0/AN12/INT RC6/TX/CK RB1/AN10/P1C/C12IN3RC7/RX/DT RB2/AN8/P1B RB3/AN9/PGM/C12IN2PIC16F883 RB4/AN11/P1D RB5/AN13/T1G RB6/ICSPCLK RB7/ICSPDAT 25 26 27 28 11 12 13 14 15 16 17 18
Co de guarda;
Contador de 8 bits;
Caractersticas:
Estruturada; Alto nvel (comparada ao Assembly); Facilidade de acesso ao hardware;
Portabilidade;
Curva de aprendizagem reduzida; Reutilizao de cdigo;
So Utilizados para:
Nomes dados a variveis, funes ou outros elementos; So compostos por caracteres alfanumricos ou numricos; Somente podem ser iniciados por uma letra ou _, nunca por nmero; Podem possuir at 32 caracteres;
Exemplo:
temperatura; _tempo1; velocidade_angular;
case do float
if
struct void
int
switch volatile
long
typedef while
register
union
return
unsigned
Tamanho em bits 8 8 32 0
signed
signed int variavel_x;
unsigned
unsigned int variavel_x
short
short int flag_x;
long
long int variavel_x;
Bases:
Declarao:
const #define int valor1 = 100; valor1 100
Declarao:
while(true) //loop infinito { printf(%d, valor++); //imprime o valor incrementado //da varivel na serial } }
Declaradas fora do corpo de qualquer funo; Todas as funes podem alterar ou usar o seu valor;
Exemplo:
int valor; //varivel global void verifica_valor(void) //funo para verificar o valor do ad lido { if(valor < 127) // se valor for menor que 127 RB0 = 1; //liga RB0 } void main() //funo principal { valor = read_adc(); //le valor do ad verifica_valor(); //chama funo para verificar valor }
Tipos:
Representado pelo caracter: =; Utilizado para atribuir um determinado valor a uma varivel.
Exemplo:
x = 10; y = x+3;
* / % ++ --
Subtrao
Multiplicao Diviso Resto de diviso inteira Incremento Decremento
operador % :
x = 5%2;
Operador ++;
x = 1; x++;
Operador --;
x = 10; x--;
OPERADOR && ||
NOT (NO)
x = x ^ y
x = x << y x = x >> y
x ^= y
x <<= y x >>= y
Utilizada para executar um comando ou bloco de comandos no caso de uma determinada condio ser avaliada como verdadeira.
Forma geral:
if(condio) comando;
Exemplo:
if(temperatura < setPoint) RELE = 1;
Utilizado quando h a necessidade de tomar uma ao caso a condio for avaliada como falsa.
Exemplo:
if (temperatura < setpoint) rele = 1; else rele = 0;
utilizado para a realizao de comparaes sucessivas de uma forma elegante, clara e eficiente.
switch(varivel) { case constante1: comandoA; . . . break; case constante2: comandoB; . . . break; . . . . . . default: comandoX; }
Exemplo
switch(caracter_recebido) { case 1: LED1 = 1; break; case 2: LED2 = 1; break; default: LED1 = 0; LED2 = 0; }
Estrutura de repetio mais utilizada, sendo muito poderosa na Linguagem C Forma geral:
for( inicializao;condio;incremento) comando; Ou for( inicializao;condio;incremento) { Comando1; Comando2; . . . ComandoN; }
Exemplo
for(x = 0;x <11;x++) { printf( %d x 10 = %d,x, x*10); }
Repete um comando ou um conjunto de instrues enquanto uma condio for avaliada como verdadeira. Forma geral:
while(condio) { comando1; comando2; ... comandoN; }
Exemplos
x = 0; while(x<10) { LED = 1; delay_ms(500); LED = 0; delay_ms(500); x++; }
while(1);
while(!RA0);
Exemplo
Funes so grupos de instrues que podem ser utilizados uma ou mais vezes sem a necessidade de repetir a digitao do cdigo;
Caractersticas de funes
programa fica mais legvel e melhor estruturado; Reutilizao de cdigo; Cada funo tem um nome nico; Os nomes de funes seguem as mesmas regras de nomenclatura para variveis; Podem ter qualquer nome exceto main.
Exemplo
int calcula_media(int A, int B) { int media; media = (A + B)/2; return media; }
output_low() output_low (PIN_B1); // coloca o pino RB1 em 0 output_high() Output_high (PIN_A0); // coloca o pino RA0 em 1 output_bit() Output_bit (pin_A0, 0);// coloca o pino RA0 em 0 output_x() output_b (0xFF); // escreve o valor 0xFF no PORTB input() x = input(PIN_A0); // l o estado do pino RA0 input_x() x = input_b(); // l o estado do PORTB
delay_cycles()
delay_us (1); // aguarda 1 us.
delay_us()
Delay_us (1); // aguarda 1 us.
delay_ms()
delay_ms (1); // aguarda 1 ms.
setup_adc_ports()
setup_adc_ports (AN0);//define RA0 como entrada analgica
set_adc_channel ()
set_adc_channel(2); //seleciona canal 2 para converso
read_adc ()
valor = read_adc(); //le o resultado da converso
adc_done ()
while (!adc_done()); //fica em loop at o fim da converso
#asm #endasm
Permite a incluso de cdigo assembly. Exemplo: #asm bsf PORTB,3 // estas duas instrues geram um pulso nop bcf PORTB,3 // no pino RB3. #endasm
#case
Ativa a distino entre caracteres maisculos/minsculos.
#define
Utilizado para substituir valores por identificadores ou at mesmo macro comandos.
Exemplo:
#define BT1 RB0 #define liga_led RC0 = 1
#include
Insere arquivos externos
Exemplo:
#include <16F883.h> #include "PIC16F883_SFR.h
#ROM
Armazena valores na EEPROM durante a gravao
Exemplo:
#rom 0x2100 = { 0x00, 0x25};
#fuses
Configura os fusveis de funcionamento Exemplo:
#fuses XT,NOMCLR,NOWDT,NOPROTECT,PUT,NOBROWNOUT,NOLVP
#ifdef
#endif
#INT_XXXX
Indica para o compilador que o trecho a seguir refere-se a uma rotina de interrupo
Algumas das interrupes reconhecidas so: INT_EXT (RB0/Int) INT_TIMER0 (Timer 0) INT_RB (RB4~7) INT_EEPROM (EEPROM interna) INT_AD (Conversor A/D interno) INT_DEFAULT (Caso entre na rotina de interrupo por engano)
#use delay
Informa o clock do sistema
Exemplo:
#use delay (clock=4000000)
#byte
Permite o acesso a posies de RAM (Registros e memria geral) pela indicao de seu endereo real
Exemplo:
#byte PORTB = 0x06
#bit
Usado para definir um identificador para um bit de uma varivel j definida. Exemplo:
int flags;
#bit ST_BT1 = flag.0
PIC Bsico 28 P
Hardware:
+ 5V
R1
10K 1 2 3 4 5 6 7 10 9 21 22 23 24
U1
RE3/MCLR/VPP RA0/AN0/ULPWU/C12IN0RA1/AN1/C12IN1RA2/AN2/VREF-/CVREF/C2IN+ RA3/AN3/VREF+/C1IN+ RC0/T1OSO/T1CKI RA4/T0CKI/C1OUT RC1/T1OSI/CCP2 RA5/AN4/SS/C2OUT RC2/CCP1/P1A RA6/OSC2/CLKOUT RC3/SCK/SCL RA7/OSC1/CLKIN RC4/SDI/SDA RC5/SDO RB0/AN12/INT RC6/TX/CK RB1/AN10/P1C/C12IN3RC7/RX/DT RB2/AN8/P1B RB3/AN9/PGM/C12IN2PIC16F883 RB4/AN11/P1D RB5/AN13/T1G RB6/ICSPCLK RB7/ICSPDAT 25 26 27 28 11 12 13 14 15 16 17 18
Esquema 1
U1
1 2 3 4 5 6 7 10 9 21 22 23 24 RE3/MCLR/VPP RA0/AN0/ULPWU/C12IN0RA1/AN1/C12IN1RA2/AN2/VREF-/CVREF/C2IN+ RA3/AN3/VREF+/C1IN+ RC0/T1OSO/T1CKI RA4/T0CKI/C1OUT RC1/T1OSI/CCP2 RA5/AN4/SS/C2OUT RC2/CCP1/P1A RA6/OSC2/CLKOUT RC3/SCK/SCL RA7/OSC1/CLKIN RC4/SDI/SDA RC5/SDO RB0/AN12/INT RC6/TX/CK RB1/AN10/P1C/C12IN3RC7/RX/DT RB2/AN8/P1B RB3/AN9/PGM/C12IN2PIC16F883 RB4/AN11/P1D RB5/AN13/T1G RB6/ICSPCLK RB7/ICSPDAT 25 26 27 28 11 12 13 14 15 16 17 18
R1
330R
D1
LED-RED
Esquema 2
+5V
R1
330R
U1
1 2 3 4 5 6 7 10 9 21 22 23 24 RE3/MCLR/VPP RA0/AN0/ULPWU/C12IN0RA1/AN1/C12IN1RA2/AN2/VREF-/CVREF/C2IN+ RA3/AN3/VREF+/C1IN+ RC0/T1OSO/T1CKI RA4/T0CKI/C1OUT RC1/T1OSI/CCP2 RA5/AN4/SS/C2OUT RC2/CCP1/P1A RA6/OSC2/CLKOUT RC3/SCK/SCL RA7/OSC1/CLKIN RC4/SDI/SDA RC5/SDO RB0/AN12/INT RC6/TX/CK RB1/AN10/P1C/C12IN3RC7/RX/DT RB2/AN8/P1B RB3/AN9/PGM/C12IN2PIC16F883 RB4/AN11/P1D RB5/AN13/T1G RB6/ICSPCLK RB7/ICSPDAT 25 26 27 28 11 12 13 14 15 16 17 18
D1
LED-RED
Desenvolva uma aplicao onde faa a leitura dos quatros botes e ligue os LEDS em cdigo binrio para indicar qual tecla foi pressionada.
Faa a leitura das 4 teclas usando a tcnica de DEBOUNCE de teclas. Os botes devero ter as seguintes funes: BT1 incrementa valor nos leds; BT2 decrementa valor nos leds; BT3 zera valor dos leds; BT4 inverte estado do RELE;
U1
1 2 3 4 5 6 7 10 9 21 22 23 24 RE3/MCLR/VPP RA0/AN0/ULPWU/C12IN0RA1/AN1/C12IN1RA2/AN2/VREF-/CVREF/C2IN+ RA3/AN3/VREF+/C1IN+ RC0/T1OSO/T1CKI RA4/T0CKI/C1OUT RC1/T1OSI/CCP2 RA5/AN4/SS/C2OUT RC2/CCP1/P1A RA6/OSC2/CLKOUT RC3/SCK/SCL RA7/OSC1/CLKIN RC4/SDI/SDA RC5/SDO RB0/AN12/INT RC6/TX/CK RB1/AN10/P1C/C12IN3RC7/RX/DT RB2/AN8/P1B RB3/AN9/PGM/C12IN2PIC16F883 RB4/AN11/P1D RB5/AN13/T1G RB6/ICSPCLK RB7/ICSPDAT 25 26 27 28 11 12 13 14 15 16 17 18
R1
330R
R2
330R
R3
330R
R4
330R
R5
330R
R6
330R
R7
330R
+5V
U1
1 2 3 4 5 6 7 10 9 21 22 23 24 RE3/MCLR/VPP RA0/AN0/ULPWU/C12IN0RA1/AN1/C12IN1RA2/AN2/VREF-/CVREF/C2IN+ RA3/AN3/VREF+/C1IN+ RC0/T1OSO/T1CKI RA4/T0CKI/C1OUT RC1/T1OSI/CCP2 RA5/AN4/SS/C2OUT RC2/CCP1/P1A RA6/OSC2/CLKOUT RC3/SCK/SCL RA7/OSC1/CLKIN RC4/SDI/SDA RC5/SDO RB0/AN12/INT RC6/TX/CK RB1/AN10/P1C/C12IN3RC7/RX/DT RB2/AN8/P1B RB3/AN9/PGM/C12IN2PIC16F883 RB4/AN11/P1D RB5/AN13/T1G RB6/ICSPCLK RB7/ICSPDAT 25 26 27 28 11 12 13 14 15 16 17 18
R1
330R
R2
330R
R3
330R
R4
330R
R5
330R
R6
330R
R7
330R
Desenvolva uma aplicao para que o valor no display seja incrementado ao apertar uma determinada tecla e decrementado quando pressionado outra e uma outra tecla para reiniciar o valor da contagem do display. O valor deve ir de 0 a 9.
Registradores associados:
Registradores associados:
Temporizador de 8 bits
Registradores associados:
O exemplo 4 exibe como usar o TIMER1 para criar uma base de tempo para um temporizador.
Utilize o TIMER0 para criar uma base de tempo para piscar um LED ou mais LEDs, faa o mesmo utilizando o TIMER2
obs.: Base de tempo de 1 segundo
O exemplo 5A exibe a forma de se tratar interrupo com base no fluxograma de tratamento e o exemplo 5B exibe uma forma utilizando os recursos do compilador para tratamento da interrupo. Os exemplos exibiro como usar a interrupo para a multiplexao de display de sete segmentos e os LEDS que esto ligados no mesmo barramento de dados usando a tcnica de varredura, ou seja, acenderemos um display por vez: primeiro o display 1, depois o display 2 e depois os LEDS e assim repetidamente. Para que no percebermos o liga e desliga dos displays trabalharemos com uma freqncia de varredura de aproximadamente 80 Hz, pois acima de 50 Hz temos a impresso de todos os displays ligados ao mesmo tempo.
Com base nos exemplos anteriores crie um contador de segundos usando o TIMER0 para a varredura dos displays e o TIMER1 para a base de tempo de um segundo. Utilize interrupes para esse processo. O contador deve ir de 0 a 59 e quando chegar em 60 deve-se reiniciar os displays e incrementar os LEDS.
Caractersticas
Conversor de 10 bits; 11 canais disponveis; Referncia interna; Referncia externa; Conversor por aproximaes sucessivas; Freqncia de converso ajustvel por software; Interrupo associada ao termino da converso.
Exemplo:
TRISA = 0b00000001; //pino RA0 como entrada ANSEL = 0b00000001; //pino RA0 funcionando como AN0
Clock
Resultado da converso
O exemplo 6 exibe como configurar o conversor A/D e como obter o resultado da converso. O Resultado da converso exibido nos LEDS e o valor de entrada analgica pode ser variado utilizando o POT1.
printf
Envia uma string(seqncia de caracteres) pela serial. Exemplo:
printf(hello world); //imprime na serial a string: hello world
putc
Envia apenas um caractere na serial.
Exemplo:
putc(f); //imprime na serial o caracter f
gets
L uma string da serial Exemplo:
char buffer[10]; //declara o vetor buffer para armazenamento da string gets(buffer); //aguarda a chegada de string na serial
Getc
L um caracter da serial
Exemplo:]
char c; c = getc(); //declara a varivel para armazenamento do caractere // atribui a c quando caracter disponvel na serial
Kbhit
Retorna verdadeiro (1) se chegar um caractere pela serial e falso(0) enquanto no houver caractere. Exemplo:
if(kbhit()) { c = getc(); } //se caracter na serial
//atribui o valor para c
O exemplo 7 exibe uma comunicao serial entre um computador e o microcontrolador. Neste exemplo ser enviado pela serial o valor de tenso sempre que houver a chegada do caractere T pela serial.
Desenvolva um sistema onde seja possvel ligar ou desligar cada LED independentemente atravs de comandos enviados pelo terminal do computador.
read_eeprom (endereo);
Exemplo:
#define END_VOLUME 10 //endereo
O exemplo 8 mostra como armazenar e ler valores na memria EEPROM. Ser armazenado o valor no display e quando reiniciar o microcontrolador este valor ser carregado no display novamente.
Desenvolva uma aplicao onde seja armazenado na EEPROM o valor de uma Varivel de 16 bits.
O exemplo exibe um controle de temperatura do tipo ON/OFF. Ser ajustado um valor de set point no display e o sistema controlar a sada para manter esta temperatura. Recursos utilizados:
Conversor A/D para leitura do sensor de temperatura; Interrupo; Varredura de displays; Leitura de teclas; Acionamento de rele.