














Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Apostila de microcontroladores
Tipologia: Notas de estudo
1 / 22
Esta página não é visível na pré-visualização
Não perca as partes importantes!















João Pessoa, 23 de Maio de 2010
Plano de Curso
**1. Evolução da Tecnologia e Surgimento dos microcontroladores;
2.1 - O que é um microcontrolador e onde se aplica;
2.2 - Diagrama de Blocos básico de um microcontrolador;
2.3 - Arquitetura e filosofia;
3. Memórias
3.1 - RAM
3.2 - ROM
**4. Tipos de PIC (quanto à memória de programa)
7.1 – Alimentação
7.2 – Circuitos Osciladores
8. Programação
8.1 – Assembler
8.2 - C
**9. Comandos Básicos
11.1 – acionando um led
11.2 – pisca – pisca com led e variando a frequência;
11.3 – Contador com Display de sete segmentos;
11.4 – Escrevendo em um LCD de 16x2;
11.5 – Usando um botão, para acionar um led;
**1. Evolução da Tecnologia e Surgimento dos microcontroladores;
2.1. O que é um microcontrolador e onde podemos encontrá-lo.
Def 1.: Podemos definir um microcontrolador com sendo um computador simplificado em um
único circuito integrado, utilizado no controle de processos lógicos. (Entende-se como
processo lógico o acionamento de leds, displays sete seguimentos, lcds, relés, sensores ...)
Def 2.: São circuitos integrados dotados internamente de um ULA (unidade lógica e
aritmética), uma unidade de controle e conjunto de periféricos (ex.: contadores,
temporizadores, portas I/O, memórias).
Aplicações:
Indústria Automobilística
i) Injeção Eletrônica; ii) Fechaduras Eletrônicas;
Empresas de Segurança
i) Alarmes; ii) Sensores de movimentação; iii) Cercas Elétricas;
Indústria de Telefonia
i) Celulares ii) Binas iii) Centrais Telefônicas
Robótica
i) Robôs para competição e de uso geral
Brinquedos
i) Bonecos ii) Aeromodelismo
Saúde
i) Equipamentos Médicos Hospitalares
2.2. Diagrama de Blocos básico de um microcontrolador
2.3. Arquitetura e filosofia
Def .: São as partes que constitui o microcontrolador e como as mesmas estão interligadas.
Von – Neuman (CISC) - Primeiras arquiteturas pensadas para computadores.
Harvard (RISC)
HARVARD VON - NEUMAN
As arquiteturas se diferenciam pela ligação da CPU com as memórias de dados e a de
programa, na arquitetura de Harvard, a CPU esta conectada as memórias por barramentos
separados o que permite o uso do conjunto de instruções (RISC), já na arquitetura de Von –
Neumann, a CPU esta conectada as memórias pelo mesmo barramento, isso demanda o uso
de conjunto de instruções complexas (CISC).
Obs.: Arquitetura do PIC 16F877,
encontra-se nos anexos.
3. Memórias (VER ANEXO II)
3.1 – RAM
As memórias RAM são memória de uso
temporário, voláteis os dados só
permanecem na memória enquanto está
ligada, quando a memória é desligada
todos os dados são perdidos.
3.2 - ROM
São memória de gravação permanente,
mesmo quando estão desligadas os
dados permanecem guardados.
Principais Características das memórias
de programa e dados do PIC 16F877:
Memória de Programa (Flash)
8k x 14 bits
Memória de dados (Ram)
368 bytes
Memória de dados (EEprom)
256 bytes
5. PC e a Pilha
PC é um registrador que aponta para o endereço da próxima instrução a ser executada.
O PC tem 13bits, com isso pode endereçar 8k de memória.
❹❸➀^ 㐄 ➅❸➆❹ ↇ↖ↆↇ∀ↇç↗∁
OBS.: A partir do PIC 16f84 o PC já possuía 13 bits, mesmo tendo uma memória de dados de
1k x 14 bits.
A pilha é um registrador de oito níveis, no qual são guardados os endereços de retorno das
rotinas de interrupções.
endereço 3 endereço 2 endereço 1
“Quando acontece a primeira interrupção, o endereço armazenado em PC vai para o primeiro
nível da pilha, se por acaso acontece uma segunda interrupção então novamente o endereço
que esta dentro do PC ocupa o primeiro nível da pilha e o endereço que antes ocupava o
primeiro nível desce para o segundo, quando a interrupção 2 acaba, o endereço que esta no
primeiro nível, é posto novamente no PC, que retorna para a posição em que havia parado na
primeira interrupção, daí o endereço 1 volta para o primeiro nível da pilhar e daí por diante...”
6. Interrupções
É uma parada de emergência na execução de uma rotina, que ocorre por um fato interno ou
externo e resulta na chamada de uma sub-rotina que começa ser executada e quando esta
acaba o microcontrolador volta a executar a rotina principal.
7. Polarização do Pic16F
8. Programação
8.1 – Assembler
É uma linguagem de baixo nível ou linguagem de máquina.
Vantagem: Código com o menor tamanho que se pode escrever;
Desvantagem: Cada microcontrolador tem seu conjunto de instruções; ( Condição Péssima )
8.2 – C
É uma linguagem de alto nível mais fácil de aprender em relação ao assembler.
Vantagem: facilidade no aprendizado e portável para outros microcontroladores;
Desvantagem: código maior do que se o mesmo fosse programado em assembler.
9. Comandos Básicos de:
Entrada
Tratamento a BIT Tratamento a PORTA input (PIN_D0) input _D() input (PIN_D0) input _D()
Saída
Tratamento a BIT Tratamento a PORTA output_low(PIN_D0) output_D(valor) output_high(PIN_D0) output_D(valor)
Loop
for(i=0; i>0; i++) for( ; ; ) loop infinito while(condição) while(1) ou while(true) loop infinito do{ } while(codição) switch / case
Condicional
if (condição){ }else{}
Atraso
delay_ms(1000) atraso em milisegundos delay_us(1000) atraso em microsegundos
10. Estrutura Básica de um programa em C
#include <16f877.h> // inclusão da Biblioteca do microcontrolador #fuses HS,NOWDT,NOPUT,NOBROWNOUT,NOLVP // Palavras de configurações do microcontrolador #use delay(clock=20000000) // Valor do clock
void main (){ // Corpo principal do programa comando 1 // comando 2 // Comandos comando 3 // }
Contador com Display de sete segmentos versão 2
#include <16f877.h> #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock=16000000) byte const tabela[]={ 0b10111111, 0b10000110, 0b11011011, 0b11001111, 0b11100110, 0b11101101, 0b11111101, 0b10000111, 0b11111111, 0b }; Void main(){ int t=500,valor = 0; while(true){ valor ++; if(valor>9) valor = 0; output_b (tabela[valor]); // apresenta o valor delay_ms(t); } }
Escrevendo em um LCD de 16x2;
#include <16f877.h> #include <regs_16f87x.h> #fuses HS,NOWDT,NOPUT,NOBROWNOUT,NOPROTECT,NOLVP #use delay(clock=20000000) #include <bib_LCD_16x2_all.c> void main (){ ini_lcd_16x2(); while(true){ printf(exibe_lcd,"\f PET ENGENHARIA \n ELETRICA IFPB"); delay_ms(3000);
printf(exibe_lcd,"\f OFERECE \n O MELHOR CURSO"); delay_ms(3000);
printf(exibe_lcd,"\f DE \nMICROCONTROLADOR"); delay_ms(3000); } }
Usando um botão, para acionar um led;
#include <16f877.h> #fuses hs,nolvp,nobrownout,nowrt #use delay(clock=20000000) void main(){ while(true){ if(!input(pin_a0)) { // se a0 for pressionado acende o led output_high(pin_d0); } if(!input(pin_a1)){ // se a0 for pressionado desliga o led output_low(pin_d0); } } }
Usando um sensor para acionar um led;
O código é semelhante ao anterior, a mudança acontece apenas no hardware, ao invés de
usarmos um botão na entrada iremos utilizar um sensor.
Escrevendo uma variável no LCD. (variável inteira)
#include <16f877.h> #include <regs_16f87x.h> #fuses HS,NOWDT,NOPUT,NOBROWNOUT,NOPROTECT,NOLVP #use delay(clock=20000000) #include <bib_LCD_16x2_all.c> int valor; void main (){ ini_lcd_16x2(); valor = 0; while(true){ printf(exibe_lcd,"\f teste %d",valor); delay_ms(100); valor++; }
}
Obs.: os LEDs e as chaves são baixo ativos.
Modo Padrão (mais simples)
#include <16F871.H #fuses HS,NOWDT,PUT,NOBROWNOUT,NOLVP #use delay(clock=4000000)
void main (void){ for(;;){ //loop infinito if(!input(PIN_A4)) output_low(PIN_D0); else output_high(PIN_D0);
if(!input(PIN_C0)) output_low(PIN_D1); else output_high(PIN_D1);
if(!input(PIN_C1)) output_low(PIN_D2); else output_high(PIN_D2);
if(!input(PIN_B0)) output_low(PIN_D3); else output_high(PIN_D3);
if(!input(PIN_E2)) output_low(PIN_D4); else output_high(PIN_D4); } }
Modo Direto
#include <16F871.H> // arquivo de definições do microcontrolador usado #fuses HS,NOWDT,PUT,NOBROWNOUT,NOLVP // bits de configuração
#use delay(clock=4000000) // informa ao sistema o frequência de clock, para temporização
// Endereços dos portais #byte PORTA=0x #byte PORTB=0x #byte PORTC=0x #byte PORTD=0x #byte PORTE=0x
// Entradas #bit CH_TMR0 = PORTA. #bit CH_TMR1 = PORTC. #bit CH_0 = PORTC. #bit CH_INT = PORTB. #bit CH_1 = PORTE.
// Saídas #bit LED0 = PORTD. #bit LED1 = PORTD. #bit LED2 = PORTD. #bit LED3 = PORTD. #bit LED4 = PORTD.
void main (void) { set_tris_d(0xE0); // configuração direcional: os 5 LSbits do portal D são saídas
for(;;){ //loop infinito if(!CH_TMR0) LED0 = 0; else LED0 = 1;
if(!CH_TMR1) LED1 = false; else LED1 = true;
if(!CH_0) LED2 = false; else LED2 = true;
if(!CH_INT) LED3 = false; else LED3 = true;
if(!CH_1) LED4 = false; else LED4 = true; } }
Modo Fixo
#include <16F871.H> // arquivo de definições do microcontrolador usado #fuses HS,NOWDT,PUT,NOBROWNOUT,NOLVP // bits de configuração
#use fixed_io(d_outputs = PIN_D0,PIN_D1,PIN_D2,PIN_D3,PIN_D4) // saídas da porta D. Os demais são entradas
#use delay(clock=4000000) // informa ao sistema o frequência de clock, para temporização
// Entradas #DEFINE CH_TMR0 PIN_A #DEFINE CH_TMR1 PIN_C #DEFINE CH_0 PIN_C #DEFINE CH_INT PIN_B #DEFINE CH_1 PIN_E
(^2) RA0/AN (^3) RA1/AN (^4) RA2/AN2/VREF- (^6) RA4/T0CKI (^7) RA5/AN4/SS (^8) RE0/AN5/RD (^9) RE1/AN6/WR (^10) RE2/AN7/CS
(^13) OSC1/CLKIN (^14) OSC2/CLKOUT
RC1/T1OSI/CCP2 16 RC2/CCP1 17 RC3/SCK/SCL 18
RD0/PSP0 19 RD1/PSP1 20
RB7/PGD 40
RB6/PGC 39
RB5 38
RB4 37
RB3/PGM 36
RB2 35
RB1 34
RB0/INT 33
RD7/PSP7 30
RD6/PSP6 29
RD5/PSP5 28
RD4/PSP4 27
RD3/PSP3 22
RD2/PSP2 21
RC7/RX/DT 26
RC6/TX/CK 25
RC5/SDO 24
RC4/SDI/SDA 23
(^5) RA3/AN3/VREF+
RC0/T1OSO/T1CKI 15
(^1) MCLR/Vpp/THV
U
PIC16F
D
LED-RED
void main (void) { set_tris_d(0xE0); // configuração direcional: os 5 LSbits do portal D são saídas
for(;;){ if(!input(CH_TMR0)) output_low(LED0); else output_high(LED0);
if(!input(CH_TMR1)) output_low(LED1); else output_high(LED1);
if(!input(CH_0)) output_low(LED2); else output_high(LED2);
if(!input(CH_INT)) output_low(LED3); else output_high(LED3);
if(!input(CH_1)) output_low(LED4); else output_high(LED4); } } Controlando o brilho do LED com o Módulo PWM
#include<16F877a.h> #device adc= #fuses HS,NOWDT,NOLVP,NOBROWNOUT #use delay(clock=20000000)
void main (void){
long int ciclo = 0;
setup_timer_2 (T2_DIV_BY_1,0xff,1); // 4 khz setup_ccp1 (ccp_pwm); set_pwm1_duty (0); while(1){ //loop infinito for(ciclo = 0;ciclo<=500;ciclo+=10){ set_pwm1_duty(ciclo); delay_ms(70); } for(ciclo = 500;ciclo>=0;ciclo-=10){ set_pwm1_duty(ciclo); delay_ms(70); } } }