Você está na página 1de 13

Anotações do curso

Microcontroladores: A eletrônica pode ser dividida em combinacionais e sequencial,


funcionam através de perfis de I/O
Um sistema computacional é a união das duas coisas, e que pode ser programado.
Aplicação:
-controle de motor, sensores, relógios, microondas, etc.
Software - comanda tudo, parte lógica.
firmware - programa para hardware mínimo, microcontroladores.
hardware - parte física
Arquitetura computacional
- controle (CPU); controle e execução do software
- Memória (Dados e programa); armazena programa e dados
- Dispositivos de entrada e saída e periféricos; interface com o mundo externo
- Barramentos
* de dados(data bus); aonde passa as informações
* de endereços (address bus); diz aonde quer armazena
* de controle (control bus); faz o controle,
* de programa (program bus); parecido com o de dados
Memória
Tipos de memória
*memória de programa (guarda o programa, sequência de comandos a serem executados)
EPROM
OTP(one time programming), programa uma vez só
ROM(Mask ROM)
FLASH(EEPROM de acesso rápido)
*memória de dados (valores e variáveis manipulados no programa)
RAM(volátil)
EEPROM(não volátil)
Arquitetura:
*Von-Neuman
*Harvard

Página 39 _ Arquitetura do PIC18f4550


os números perto das setas representam o número de bits do barramento
Os ports são os pinos
RAO=pin digital
An0= comparador analógico ou até conversor analógico
as chaves no kit selecionam qual função usar em cada um dos pinos
Pág 289 mostra o uso de cada uma das chaves, quais os pinos e chaves associadas.
Na parte superior há a indicação do Data Bus e Instruction Bus
Na parte inferior (BOR,HLVD<Timer 0,Timer 1 etc) são periféricos e estão conectados ao
data bus( de dados).
o PIC18F4550 permite a ligação via USB, 18F4520 ñ.
Oscilador
LP: Cristal, baixas frequências
XT: Cristal, frequências intermediárias
HS: Cristal, altas frequências
mais informações se encontram na pág 56
F=1/T (T=tempo em segundos)
Os capacitores junto ao cristal ajudam a estabilizar a vibração no cristal.
Registro= uma área de memória separada, cujo valor da área permite controlar os periféri
cos.

MODOS DE BAIXO CONSUMO


SLEEP: desliga o oscilador
IDLE: corta o clock somente da CPU
*Quanto menor a frequência, menor o consumo.
Total de 7 modos de operação selecionáveis durante a execução do programa.

CARACTERÍSTICAS ESPECIAIS
Power-on Reset
Power-up Timer
Brown-out Reset
Watchdog Timer; (ligado diretamente ao oscilador, é um contadorque atinge um valor
X e reseta)
Modo SLEEP
Code Protect
Faz-se alterações no bit fuse

A função getch serve p/ o programa esperar até que vc aperte um botão, senão ele fecha soz
inho e vc ñ ve nda
o fflush serve pra limpar a memória

char, floa e int no microcontrolador ñ significa inteiro, flutuante e caractere ma


s sim o tamanho em bits.
então vc pode somar a+b, pois eles podem armazenar 8bits cada(A e B se definidos c
omo char comportam 8bits)
signed significa que o 8º bit aponta o sinal, então ele tm uma faixa de valores defi
nidos
unsigned é ñ sinalizado, então ele tem uma faixa de valores maior, por não se saber o s
inal
long=32bits
e short serve pra diminuir o tamanho, sempre diminuindo em 8bits.

ponto flutuante em microcontrolador deve ser evitado

DECLARAÇAO DE VARIÁVEIS E CONSTANTES


*Varíaveis
[qualificadores] <tipo><nome>[=valor];
entre colchetes é opcional, entre maior e menor eh obrigatório
exemplo
unsigned int x=12345;
o se vc pegar só o int x ele irá reservar um espaço na memória para a variável x
no caso, ele pegará o valor 12345 e armazenará em um espaço da memória equivalente ao núme
ro de bits de um unsigned int(16 bits).
por isso deve-se olhar o valor e ver qual tipo de variável usar, qual a memória a se
r reservada para tal valor.
*constantes
const[qualificadores]<tipo><nome>[=valor];
const unsigned int y=12345;
VETORES E MATRIZES
conjunto de variáveis com mesmo identificador
Índice=4
Exemplo
int Z[4]={100,200,300,400};
o quatro indica a quantidade de valores
para puxar os valores deve-se usar o Z[x], como a seguir:
para 100-Z[0]
para 200-Z[1]
para 300-Z[2]
para 400-Z[3]
String: VETOR DE CARACTER
Declaração
char Empresa[]="Exsto Tecnologia"
entre aspas duplas o índice já é colocado automaticamente.
No final de todo string sem aspas é colocado um caracter nulo indicador de fim de
texto: 0x00
destrunchando em vetor fica:
Empresa[0]=E
Empresa[1]=X
Empresa[16]=0x00
Variáveis locais e globais
*locais: dizem respeito e um espoco em específico(função entre chaves)
*globais: servem para o programa inteiro
*pode haver variável A para várias funções locais, mas não pode haver mesmo nome de variáve
entre local e global
Variáveis locais
Só 'existem' dentro da função onde são usadas
fisicamente, estão na 'área rascunho'(área da memória de dados, não fixo)
Seu espaço é reutilizado por outras variáveis
Perde seu valor quando a função retorna
Variáveis Globais
Define-se no início
"Existem" para todas as funções do programa
São alocadas em endereço fixo
*Conflito de identificador: localxglobal, exemplo, variável global A e local A, o
compilador ñ vai saber de qual A está falando
Modificador static
Aplicável a variáveis locais
Valor é presentado na saída da função!
Alocada em endereço fixo
*não existem para as demais funções!
A global é vista por todos os escopos, a estatic só é vista por um determinado escopo
e ñ perde o valor

ATRIBUIÇÃO
sintaxe
<identificador>=<expressão>
Exemplo:
X=2;
X=y;
X=y+2;
X=getcUSART();
Operadores
+ (adição)
- (subtração)
* (multiplicação)
/ (divisão)
% (resto da divisão)
++ (incremento, +1)
- - (decremento, -1)
> (maior que)
>= (maior ou igual que)
< (menor que)
<= (menor ou igual que)
== (igual a)
!= (diferente de)
Relacionais
Operadores lógicos relacionais
&& (E;AND)
|| (OU;OR)
! (COMPLEMENTO;NOT)
Bit-a-bit
& (E;AND)
| (OU;OR)
^(OU-EXCLUSIVO(XOR))
~(COMPLEMENTO-NOT)
>> (DESLOCAMENTO A DIREITA)
<<(DESLOCAMENTO A ESQUERDA)
eXEMPLO: X=00010000 é igual a X=2
se X<<3(deslocou 3 vezes) então X=16
OPERADORES
Incremento e decremento
++ - -
Pré-incremento / pré-decremento
X= - -y;
X= ++z;
*Você subtrai/adiciona e depois armazena o valor
Pós-incremento / pós- incremento
X=y- -
X=Z++
*Você armazena o valor de X depois subtrai/adiciona esse valor.
BIBLIOTECA DE FUNÇÕES MATEMÁTICAS: math.h
*acos
*asin
*atan
*atan2
*ceil
*cos
*cosh
*exp
*fabs
*floor
*fmod
*frexp
*Idexp
*log
*log10
*mchptoieee
etc...
CUIDADOS COM OPERAÇÕES MATEMÁTICAS
Otimização de memória
*Escolha do menor tamanho que atenda a necessidade
*evite o uso de variáveis dos tipos float e double
*Cuidado com operações de variáveis de diferente tipos
*Cuidado com atribuição de valores fora da faixa de cada tipo
*Cuidado com resultados intermediários que extrapolam a faixa de valores

OBSERVAÇÃO: SE DURANTE O PROJETO APARECER FILE NOT FOUND É PQ VC Ñ INSTALOU NO LOCAL PAD
RÃO, DEVE-SE EXCLUIR PQ O COMPILADOR ACHA SOZINHO DPS
BUILD ALL PARA COMPILAR
PROGRAM PARA GRAVAR NO MICROCONTROLADOR
USA-SE O PROGRAMMER<ICD2 e dps RESET NO CANTO SUPERIOR DIREITO
Para gravar no módulo vai em PROGRAM
Não desconectar o USB para não perder o contato com o ICD2
ACESSO A I/O EM C
Os portais e seus pinos (assim como os demais registros de função especial) estão defi
nidos no arquivo P18F4550.h
Acesso aos bits:
PORTDbits.RD0=1;
X=PORTBbits.RB1;
Configuração de direção
TRISD=Ox0F; ou DDRD=0x0F
TRISDbits.TRISD2=o; ou DDRDbits.RD2
*melhorando o código com a diretiva #define
SINTAXE
#define<identificado> <texto>
Exemplo
#define TMAX 30
#define SW0 PORTBbits.RB0
#define LEDS PORTD
#define LED0 PORTDbits.RD0
#define VENTILADOR PORTDbits.RD1
#define ALARME PORTDbits.RD7
é a msm coisa que por exemplo LEDS=PORTD
TODO REGISTRO É MAIÚSCULO

ESTRUTURAS DE DECISÃO
Executam blocos de código baseado na avaliação do resultado de uma expressão como verdad
eiro ou falso.
IF
If-else
If-else-if
Operador ternário condicional
Switch
SINTAXE
if(<condição>) {
//bloco verdadeiro
}
*Exemplo:
if(temperatura>40){
VENTILADOR=1;
ALARME = 0;
}
else{
VENTILADOR = 0;
ALARME = 0;
}
*Exemplo de decisão If-else-if
if(temperatura<=40){
VENTILADOR = 0;
ALARME = 0;
}
else if(temperatura <=60){
VENTILADOR = 1;
ALARME = 0;
}
else{
VENTILADOR =1;
ALARME = 1;
}
*Exemplo de decisão If-&&
if(Valor>674 && Valor<898){
BAR0=0;
}
else (BAR0=1);

Operador ternário condicional


SINTAXE
VARIÁVEL=CONDIÇÃO?EXPRESSÃO1:EXPRESSÃO2
Equivale a:
If(<condição>){
variável = EXPRESSÃO1;
}
else{
variável = EXPRESSÃO2;
}
*Exemplos
x=(y==5)? 10:8;
Z=(faixa>5)? MedAltos(): MedBaixos();
PORTDbits.RD0 = (valor > 113) ? 1:0;

SWITCH (é como se fossem vários Ifs)


switch(<variável>){
case<valor1>:
<comandos>
break;
case<valor2>:
<comandos>
break;
case<valor3>:
<comandos>
break;
default:
<comandos>
break;
}
usa-se o default se todos os casos forem falsos

ROTINAS DE ATRASO
Tcy = 4.Tosc
Biblioteca: delays.h
ESTRUTURAS DE REPETIÇÃO
Objetivo: Repetir um trecho de código enquanto uma condição for verdadeira
*Do-While(faça-enquanto)
Primenrio executa o bloco, depois testa a condição
Executa o bloco de comando ao menos uma vez
*While (Enquanto)
Primeiro testa, depois executa o bloco
Pode não executar o bloco nenhuma vez
*For (Para)
A repetição do bloco acontece conforme contagem definida!
________________________________________________________________________________
______________________________________________
EXERCÍCIO 7, FAZENDO SIMULAÇÃO NO PC
PRIMEIRO DEVE-SE COMPILAR O PROGRAMA E IR EM WATCH E ADICIONAR OS PORTS USADOS E
AS VARIÁVEIS(COLOCAR OS VALORES EM BINÁRIO)
DPS ADICIONAR O STIMULUS EM DEBUGGER, STIMULLUS E NEW WORBOOK
ADICIONAR O PIN E COLOCAR ACTION TOGGLE
DPS ACHAR AS POSIÇÕES EM STEP IN E STEP OUT, SIMULANDO O SENSOR IDENTIFICANDO AS LAT
AS
________________________________________________________________________________
______________________________________________

ESTRUTURAS DE REPETIÇÃO
Sintaxe:
do{
[bloco]
}while(<condicao>);
*Exemplo:
do{
t=medirTemp();
}while(t<20);
Sintaxe:
while(<condição>){
[bloco]
}
*Exemplo:
while(!fimDeCurso){
motor=1;
}
motor=0;
Sintaxe:
for(<valor_inicial>;<valor_final>;<passo>){
[bloco]
*Exemplo
for(i=o;I<10;i++){
PORTD=~PORTD;
delay10KTCYx(200);
}
for(i=10;i;i--){
PORTD=~PORTD;
delay10KTCYx(200)
}
COMANDO BREAK
Aborta a execução de repetição
se vc usa break vc para a rotina em questão(no caso de um estopo, pula p/ o próximo)
*Exemplo
for(i=10;i>0;i--){
if(!CHAVE)break;
LED = 1;
Delay10KTCYx(20);
LED=0;
Delay10KTCYx(20);
}
LOOP INFINITOS
Para repetir um bloco de código indefinidamente
*VÁRIAS FORMAS DE FAZER
while(1){
[bloco]
}
for(;;){
[bloco]
}
*PARA "TRAVAR" O PROGRAMA:
while(1):
________________________________________________________________________________
____
REVISÃO: O FOR É INFINITO E O WHILE E DO-WHILE SÃO FINITOS, DEPENDEM DE UMA CONDIÇÃO
O BREAK PAUSA
O LOOP INFINITO É FEITO QUANDO SE QUER UM FUNCIONAMENTO CONTÍNUO
LATCbits.LATc1 (declaração, igual o PORT)
PORTBbits.RB0 (exemplo)
DDR Define os portais como saída(PORTA,PORTB,PORTC)
________________________________________________________________________________
____
A exclamação (!) significa negação
O tio (~) significa o inverso
void significa nulo, não volta nenhum valor
FUNÇÕES
Mesmo que subrotinas em Assembly
Síntaxe
<tipo> nome_da_funcao(<tipo><arg1>,<tipo><arg2>,...)
{
/*geralmente aqui temos uma declaração de variáveis*/
/*os comandos da função vem em seguida*/
return(<var>); /*retorna o parâmetro de saída/
}
Usa-se return quando o main ñ é do tipo void
return(z), no exemplo de z=a+b
o valor é armazenado em z
____________________________________________________
VOID NÃO RETORNA NADA
O exemplo abaixo ilustra uma função de início de código (função principal).
void main (void){
//***Declaração de variáveis
//***Programa (linhas de codigo)
}//***fim
____________________________________________________
se não colocar return não retorna nda
no caso, o resultado da soma de dois números Z=X+Y é um variável local e será perdida

sTEP IN - VC ENTRA NA FUNÇÃO


STEP OUT - VC SAI DA FUNÇÃO
STEP OVER - VC PASSA PELA FUNÇÃO
NA ABA VALUE DO WATCH OS VALORES QUE ESTÃO DE VERMELHO SÃO OS QUE FORAM MODIFICADOS
RECENTEMENTE
USANDO STEP IN E STEP OVER É POSSÍVEL NAVEGAR ATRAVÉS DOS CÓDIGOS E FUNÇÕES CONVERTIDOS EM
E ASSEMBLY APÓS A COMPILAÇÃO
DDR e TRISB tornam os portais como saída(são a msm coisa)
TEM A FUNÇÃO PORT TBM

INTERRRUPÇÃO
é a capacidade de parar o programa principal e atender um periférico
é a qualquer hora e depende do periférico, interrompe-se o programa a qualquer momen
to
*Dois níveis de interrupção
Alta prioridade
Baixa prioridade
A interrupção de alta prioridade interrompe o tratamento da interrupção de baixa priorid
ade
Prioridade pode ser habilitada ou não
SELEÇÃO DE PRIORIDADE
RCONbits.IPEN = 0 : sem prioridade
RCONbits.IPEN = 1 : com prioridade
sem prioridade todas tratadas como prioridade
HABILITAÇÃO GLOBAL SEPARADA
*com prioridade
INTCONbits.GIEH : habilita alta prioridade
INTCONbits.GIEL : habilita de baixa prioridade
*sem prioridade
INTCONbits.GIEH = GIE DO pic16
intconBITS.GIEL = PELE DO PIC16
Tanto eventos de alta como de baixa prioridade causam retorno ao modo normal
vetores de interrupção
Alta prioridade: 0008h
Baixa prioridade: 0018h

CADA INTERRUPÇÃO TEM 3 BITS ASSOCIADOS:


xxxxIF: Flag indicador de ocorrência
xxxxIE: Habilitação
0=desabilidado ; 1= habilitado
xxxxIP: Prioridade
0=baixa ; 1=alta
INT0 tem não tem bit de prioridade; é sempre de prioridade alta
ex: INT0IF
INT0IE:
INT0IP:
prioridade, ocorrência e habilitação
< < <
REGISTROS DE CONTROLE
INTCON
INTCON2
INTCON3
PIE1
PIE2
PIR1
PIR2
IPR1
IPR2
TODOS QUE COMEÇAM COM "P" SÃO REFERENTES A PERIFÉRICOS

INTERRUPÇÃO Ñ ESTÁ PREVISTA NO PADRÃO ANSI(NA LINGUAGEM C)


USO DE DIRETIVAS PARA LOCALIZAR AS ROTINAS DE TRATAMENTO NOS VETORES DE INTERRU
PÇÃO
A DIRETIVA INFORMA:
*QUAL ROTINA É ASSOCIADA A CADA INTERRUPÇÃO
*QUAIS REGISTROS DEVEM SER SALVOS (SALVAMENTO DE CONTEXTO)
A INICIALIZAÇÃO DE UMA INTERRUPÇÃO NO C18
CONFIGURAR PRIORIDADE
*RECONbits. IPEN
*CONFIGURAR A PRIORIDADE DE CADA PERIFÉRICO
*Através dos bits xxxIP
HABILITAR INTERRUPÇÕES DOS PERÍFÉRICOS
*Através dos bits xxxIE ou atrvés de funções
ativar as habilitações globais
*intconbits.gieh = alta prioridade
*intconbits.giel = baixa prioridade
Na RTI é nescessário
DETERMINAR QUAL INTERRUPÇÃO OCORREU
ZERAR O BIT INDICAR DE OCORRÊNCIA (FLAG)
*SALVAMENTO E RETORNO DE CONEXÃO SÃO FEITOS PELA DIRETIVA
É RECOMENDADO QUE AS RTI'S
SEJAM CURTAS E RÁPIDAS
EVITEM O USO DE ROTINAS DE ATRASO NA RTI
CHAME UM MÍNIMO DE OUTRAS ROTINAS (PILHA)
não fica chamando rotina dentro de rotina no programa toda hr pois pode "quebrar"
a pilha

PULL-UP = Tem o objetivo de evitar a flutuação no pino do microcontrolador, garantin


do o valor 1 na porta( pull-down garante 0)
Usar Nop ao invés de delay

_____________________________________________
O FOR É PRA SITUAÇÕES DETERMINADAS POR VC
WHILE É PARA VARIAÇÕES E TESTES NO PROGRAMA
_____________________________________________

DISPLAY DE CRISTAL LÍQUIDO


É uma memória, a mem, do LCD é visual e vc consegue enxergar oque está no endereço (é a úni
diferença)
há um microcontrolador dentro do lcd, temos que nos comunicar com ele através do mic
rocontrolador
*pinos do lcd
VSS, VDD, VO, RS, R/W, EN, D0, D1,D2,D3,D4,D5,D¨,D7, LED + e LED-
(D0,D1,D2...)barramento de 8 bits para enviar dados e comandos para o LCD, posso
enviar dados ou enviar comandos
há outro pino chamado RS, one podemos configurar se enviamos dado ou comando
comando ligo display
dado é o número
VDD no 5V
VSS é o terra
VO contraste
EN enable, habilitar a configuração feita, prepara-se tudo e dps habilita
RS se é dado ou comando
R/W no terra transformamos o LCD em elemento de escrita
tm tudo na pág 148 da apostila
HÁ 16 POSIÇÕES NO LCD E 2 LINHAS
VC CONFIGURA EM QUAL POSIÇÃO DA MEMÓRIA(QUE É VISÍVEL NO LCD) VC VAI COLOCAR ATRAVÉS DE UMA
TABELA
na tabela da 147 você pega o número da coluna e dps da linha, que corresponde ao val
or em decimal do valor binário .
comando > tabela
dados>asc|| e próprios
inicialização
ADC (CONVERSOR ANALÓGICO DIGITAL)
No PIC 18 há 13 canais, que funcionam como conversores analógico-digital.
Para transformar o sinal analógico em digital utiliza-se uma "régua" cujos valores d
e tensão correspondem a um valor na régua.
associa um nível analógico a uma palavra digital
pode-se dividir o espaço em 10bits ou 2^10, que equivale a 1024 espaços. É a resolução
Tempo de amostragem é o tempo gasto pelo microcontrolador para fazer a conversão de
analógico para digital
BIBLIOTECA
adc.h
a função OpenADC() Configura o ADC
a função SetChanADC() seleciona o canal do ADC
a função ConvertADC() Inicia o processo de conversão
a função BusyADC() Verifica se o ADC terminou a conversão, o programa fica parado aí ver
ificando se a conversão terminou
a função ReadADC() lê o resultado da última conversão
a função CloseADC() desativa o ADC

MÓDULO CCP
CAPTURA
Captura o valor do Time 1 nos seguintes eventos:
*1 transição de descida e, RB3/CCP1
*1 transição de subida em RB3/CCP1
*4 transições de subida em RB3/CCP1
*16 transições de subida em RB3/CCP1

COMPARAÇÃO
Compara CCP1H:CCp1L com TMR1H:TMR1L
Quando coincide:
Seta o Flag CCP1|F
Zera time 1 (opcional)
Força 0 ou 1 no pino RB3(opcional)
Dispara conversão do ADC(opcional)

Modos
PWM= geração de trem de pulsos)
Controle de Duty-cicle (10bits)
Base de tempo: Timer 2
Nível alto é controlado pelo DC(duty-cicle)
é interessante pq se eu fosse fazer a conversão do sinal analógico para digital eu iri
a variar a tensão, qto mais tempo eu estiver em nível alto maior será a tensão
varia de 0V a 5V por exemplo
é dado pela % do Tempo(período)

BIBLIOTECA pwm.h
funções pág 189

Teclado
Com 8 pinos é possível faz uma varredura com 16 teclas
é como uma batalha naval
0 1 0 0
0
0
0
1 x
x é a tecla pressionada
HABILITAR PULL-ups!
Interrupção por mudança de estado em PORTB
BIBLIOTECA DE FUNÇÕES
void OpenKeyboard(void)
char getKey(void)

PIC 18F1220
uTILIZANDO PROTOBOARD+MÓDULO

Utilizar 6 fios e um suporte para conectar na plaquinha de suporte do pic


checar o datasheet do microcontrolador para achar os pinos PGC,PGD,GND,VCC,VPP
cada um dos fios correspodem ao PGC,PGD,GND,VCC,VPP que serão ligados nos pinos do
microcontrolador