Professional Documents
Culture Documents
com Linguagem C
Uma Abordagem Prática e Objetiva
com Base no PIC18F4520
Capítulo 2
1. O PIC18F4520 possui três tipos de memória integrados. São elas: memória de programa
Flash-ROM, memória de dados RAM e memória não volátil EEPROM. A memória nesse
microcontrolador está dividida da seguinte forma:
Memória de programa (Flash-ROM): 32kx16
Memória RAM (de dados): 1536x8
Memória EEPROM: 256x8
2. Na localidade 0000h da memória de programa.
3. Até 31 chamadas.
4. A memória de dados do PIC18F4520 é implementada em memória SRAM e está dividida em 16
bancos de 256 localidades cada, com capacidade de armazenamento de 8 bits em cada
localidade.
5. É um tipo de acesso à memória em que não é necessário o chaveamento entre bancos para acessar
uma localidade de memória. O Access Bank, como é chamado, utiliza um segmento do banco 0 e um
segmento do banco 15 para formar um único banco de memória no qual podemos acessar tanto os
SFRs quanto os GPRs. O acesso à memória de dados via Access Bank não leva em consideração o
valor armazenado no registrador BSR.
6. Registrador BSR.
7. A memória EEPROM interna é classificada na arquitetura do PIC18F4520 como um periférico e
ocupa a faixa de endereços 00h - FFh.
3. O Power-up Timer (PWRT) provê um time-out típico de 72ms após o POR. Um circuito RC
interno é o responsável pela temporização. O PWRT é um recurso que precisa ser ativado e o
seu objetivo é manter o microcontrolador em Reset até que a tensão de alimentação esteja
estabilizada.
4. O Oscillator Start-up Timer é um circuito que provê um delay de 1024 ciclos de clock do oscilador
principal, após o Power-up Timer, antes de colocar o circuito oscilador em funcionamento. Isso
garante que o oscilador esteja estabilizado na sua partida, evitando travamento.
O Oscillator Start-up Timer só é invocado para os modos de funcionamento do oscilador XT, LP e
HS no POR ou quando o microcontrolador acorda após ter entrado no modo Sleep.
5. Quando o PLL está habilitado, a sequência time-out (temporização) que segue o POR é diferente
dos outros modos de funcionamento do oscilador. Uma parte do Power-up Timer é utilizada para
prover um time-out suficiente para o PLL estabilizar a frequência do oscilador principal. O delay
gerado para o PLL é de 2ms e ocorre após o Start-up Timer-out (OST).
1. Quando configurados como digitais, os pinos do PIC18F4520 são divididos em cinco grupos
chamados Ports de I/O, identificados como Port A, Port B, Port C, Port D e Port E. O Port A é
composto pelos pinos RA7:RA0. O Port B pelos pinos RB7:RB0. O Port C pelos pinos RC7:RC0.
O Port D pelos pinos RD7:RD0. O Port E pelos pinos RE3:RE0.
2. O registrador TRISx. O TRISA configura os pinos do Port A, o TRISB os pinos do Port B e assim
sucessivamente.
3. Eles são o elo entre o software e o hardware, ou seja, entre o programa e os pinos do
microcontrolador.
4. Significa que é preciso conectar uma fonte de alimentação externa no pino.
5. Porque os resistores de pull-up são implementados na pastilha de silício e por isso possuem uma
potência muito pequena. Qualquer sobrecarga de corrente pode queimá-los.
6. Pino RE3. Para ativar a função digital desse pino, é preciso desabilitar a função /MCLR.
7. Um Schmitt Trigger é um circuito comparador incorporado de realimentação positiva. Quando o
nível de tensão de entrada é maior que um limiar escolhido, a saída está em nível alto; quando a
entrada está abaixo de outro limiar, a saída está em nível baixo; quando a entrada se encontra
entre os dois limiares, a saída retém o valor anterior até a entrada se alterar suficientemente para
mudar o estado do Trigger.
8. Parallel Slave Port.
Capítulo 5
1. Um compilador executado em um computador que pode gerar códigos que são executados em
um diferente tipo de computador.
2. Um bloco de código escrito em linguagem Assembly contém um menor número de instruções,
sendo, consequentemente, executado mais rapidamente do que um bloco de códigos escrito em
linguagem C que executa a mesma tarefa.
3. Suporte para microcontroladores de 8 bits, MPLAB IDE, MPLAB SIM, MPASM, MPLAB ICD 2
(opcional se for utilizar um gravador/debugger compatível com o ICD 2).
4. Project Wizard. Clicar no menu Project/Project Wizard.
Capítulo 6
11. O arquivo cabeçalho disponibiliza ao projeto uma biblioteca de funções que podem ser utilizadas
quando solicitadas. Para incluir um arquivo cabeçalho no projeto deve-se utilizar a diretiva
#include.
#include <stdio.h>
A linha anterior inclui no projeto as funções prototipadas no arquivo cabeçalho stdio.h, dentre as
quais podemos citar a função printf().
12. tipo nome_da_função (lista_de_parâmetros)
{
//sequência de comandos
}
3. x = y = z = 20;
4.
Operador Ação
− Subtração
+ Adição
* Multiplicação
/ Divisão
% Resto da divisão
−− Decremento
++ Incremento
5. Deslocar os bits que representam o conteúdo de uma variável para a esquerda (<<) ou para a
direita (>>).
6. y=15 e x=16.
7.
Mais alta ++ --
* / %
Mais baixa + -
8.
Operador Ação
> Maior que
>= Maior ou igual a
< Menor que
<= Menor ou igual a
== Igual a
!= Diferente de
16. z = 000100002
17. O operador xor.
Exemplo:
x = 20;
y = x;
z = x^y;
18. Basta testar o bit mais significativo do valor. Se ele for '1', significa que o valor é negativo. Isso
pode ser feito com o operador lógico bit a bit &.
19.
char introd_nibble(char x) //função introd_nibble
{
char y; /*declaração de variável local não inicializada*/
y = (x & 0x0f) | 0b10100000; /*máscara nibble superior que introduz o nibble 1010 na parte alta de x */
return y; //retorna y
}
20. O bit mais significativo do valor.
21. Efetuar o deslocamento dos bits do conteúdo armazenado em uma variável para a esquerda (<<)
ou para a direita (>>).
22. x = 4;
y = x;
x <<= 2;
x += y;
30.
Mais alta () [] ->
! ~ ++ -- (tipo) * & sizeof
* / %
+ -
<< >>
<<= >>=
== !=
&
^
|
&&
||
?
= += -= *= /=
Menor ,
else comando2;
A seção inicialização é utilizada para atribuir um valor inicial à variável de controle do laço. A
seção condição é uma expressão relacional que será testada após a execução do comando
para determinar quando a repetição na execução do comando termina. A seção incremento
define como o conteúdo da variável de controle irá variar, determinando o número de vezes que a
execução do comando irá acontecer. O comando pode ser um único comando, um bloco de
códigos ou um comando vazio.
9. Se a expressão testada na seção condição for dada como falsa na entrada do laço, o comando
não será executado uma única vez.
Quando o laço while é executado, primeiramente é testada a condição que pode ser qualquer
expressão válida em C. Caso a expressão seja verdadeira, o comando é executado e, em
seguida, a expressão é novamente testada. O ciclo se repete até que a expressão se torne falsa,
quando então o laço é finalizado. É importante observar que, como a condição é testada no início
do laço, o comando pode não ser executado caso a expressão seja falsa no primeiro teste. O
comando pode ser um único comando, um bloco de códigos ou um comando vazio.
11. O comando while testa a expressão na entrada do laço enquanto o comando do-while testa a
condição na saída do laço. Ao contrário do comando while, quando o comando do-while dá a
expressão testada como falsa, o comando é executado uma vez.
12. Os comandos de desvio provocam um desvio incondicional no programa que fará com que o
processamento desvie para uma localidade da memória de programa fora da sequência de
execução. Exemplos: return, goto e break.
13. Uma vez que a função foi prototipada, ela pode ser definida no programa-fonte após a função
main() ou até mesmo ser editada em outro arquivo.
14. O comando return é utilizado quando é preciso retornar de uma função. Quando ele é executado,
ocorre um desvio incondicional e o programa retorna para o comando imediatamente após aquele
que fez a chamada à função que está sendo executada. De uma forma geral, a chamada a uma
função também provoca um desvio incondicional, porém o endereço de memória de programa
onde está armazenada a primeira instrução a ser executada após o retorno é guardado em uma
pilha. Quando o comando return é executado dentro da função, o endereço de retorno é retirado
da pilha e utilizado para que o microcontrolador encontre a próxima instrução que será
executada.
15. Com o advento da programação estruturada, o comando goto acabou caindo em desuso porque
ele possuía uma grande tendência de deixar o código ilegível à medida que ia crescendo. Sendo
a linguagem C de natureza estruturada, em qualquer aplicação, por maior e mais complexa que
ela seja, não é necessário o uso do comando goto. A base da programação estruturada é a
chamada à função, que não precisa do comando goto.
16. Ele pode ser utilizado para terminar uma cláusula case em um comando switch ou para finalizar
antecipadamente um laço de repetição. Quando o comando break é encontrado, o laço é
imediatamente finalizado e o programa prossegue para o comando imediatamente após o laço.
O comando break é utilizado, em tese, quando uma condição especial, sendo satisfeita, deva
provocar a saída imediata do laço.
17. O comando continue funciona de forma um pouco parecida com o comando break, com a
diferença de que o comando break força a saída do laço, enquanto o comando continue finaliza
apenas a iteração atual do laço.
4. 12 elementos, sendo 11 elementos utilizados para armazenar a string "Casa Blanca" mais um
elemento para armazernar o caractere terminação de string, o caractere '\0'.
5. Variável de ponteiro.
6. Sim. Para passar um vetor como parâmetro para uma função utiliza-se o nome do vetor. Quando
o nome do vetor é passado como parâmetro, o endereço do primeiro elemento do vetor é
passado como parâmetro. Vejamos a fração de código a seguir.
char *p; //declaração de variável de ponteiro
char vogal[10]; //declaração de vetor
p=vogal; //variável p recebe o endereço do primeiro elemento do vetor vogal
Na fração de código anterior é passado para a variável de ponteiro p o endereço inicial do vetor
vogal. A passagem do endereço inicial do vetor vogal para a variável p poderia também ser feita
pelo comando &vogal[0];. Em aplicações profissionais, no entanto, não é comum a utilização do
operador & para a passagem do endereço inicial de um vetor para uma variável de ponteiro.
Normalmente isso é feito utilizando o próprio nome do vetor.
7. Matriz.
8. Chamamos de adimensional um vetor que, na sua declaração, fica a cargo do compilador
calcular a sua dimensão. Se na declaração de um vetor inicializado o tamanho do vetor não for
especificado, o compilador cria um vetor grande o suficiente para conter todos os elementos
presentes na sua inicialização.
Vejamos o exemplo a seguir. São criados dois vetores, um chamado solar do tipo char
inicializado com a string "Hoje eh domingo" e outro de nome vogais do tipo char inicializado com
os caracteres 'A', 'B', 'C', 'D' e 'E'. Como a quantidade de elementos dos vetores não foi fornecida,
o compilador cria um vetor com capacidade de armazenar os dados de inicialização. No caso do
vetor solar o compilador aloca uma localidade de memória adicional para receber o caractere
terminador de string, o caractere null.
char solar[ ] = "Hoje eh domingo!"; //declaração de vetor inicializado
char vogais[ ] = {'A','B', 'C', 'D', 'E'}; //declaração de vetor inicializado
Capítulo 10
1. Do ponto de vista físico, uma string é representada na memória por um conjunto de caracteres
terminado pelo caractere null, representado na forma de caractere por '\0' e no código ASCII pelo
valor 0x00.
2. string.h
9. Todas as instruções de manipulação se strings que têm a memória de programa como destino
(*pgm) só funcionam quando o microcontrolador utiliza memória de programa externa. Elas não
funcionam para gravar dados na memória Flash ROM do microcontrolador. O microcontrolador
PIC18F4520 não tem suporte para memória de programa externa. Sendo assim, essas instruções
não surtirão o efeito desejado nesse microcontrolador.
10. strlen()
Capítulo 11
Capítulo 12
1.
4,5V< VDD < 5,5V
Entrada Mín Máx Nível Lógico
VIL (tensão de entrada baixa) 0V 0,8V 0
VIH (tensão de entrada alta) 2V VDD 1
Saída Mín Máx Nível Lógico
VOL (tensão de saída baixa) 0V 0,6V 0
VOH (tensão de saída alta) VDD - 0,7V - 1
2.
3. 20mA
4. 2V
5. Quando um LED é acionado por lógica positiva, é preciso aplicar nível lógico '1' para ele emitir.
Quando ele é acionado por lógica negativa, é necessário aplicar nível lógico '0' para ele emitir. A
forma como o hardware está implementado vai definir se o LED será acionado por lógica positiva
ou negativa.
6. 5x525 teclas.
7. 4 linhas + 4 colunas = 8 pinos
8.
'0' a 'F': caso uma tecla seja detectada como pressionada. Nesse caso, a função retorna,
no código ASCII, o valor da tecla pressionada.
'\0': caso nenhuma tecla esteja pressionada, a função retorna o caractere null.
'G': caso uma tecla tenha sido detectada como pressionada no último rastreamento, a
função retorna o caractere 'G'.
1. Display catodo comum e anodo comum. O nome catodo comum deriva do fato de que todos os
catodos de todos os LEDs estão interligados. Da mesma forma, o display anodo comum deriva
do fato de que todos os terminais anodo de todos os LEDs estão conectados.
2. Segmentos A, B, C, D, F, G.
3. A técnica consiste em conectar os segmentos de um display aos segmentos de mesmo nome dos
outros displays e, no caso do display catodo comum, aterrar apenas o catodo do display que
estará emitindo. Apenas um dos displays pode emitir de cada vez pelo fato de as linhas de dados
estarem multiplexadas. A solução para o problema resume-se no fato de que um LED piscando
em uma frequência acima de 50Hz faz com que a retina não consiga acompanhar a piscagem,
dando a impressão de que o LED esteja emitindo direto. Os displays emitirão, um de cada vez,
em uma frequência acima de 50Hz para termos a impressão de que todos os displays emitem
simultaneamente.
4. Nesse caso, cada display se mantém aceso durante 4ms e apagado durante 12ms. Isso significa
que o ciclo completo de atualização do display é de 16ms. Como o período de cada ciclo é de
16ms, a frequência de piscagem será de 1 / 16m = 62,5Hz, o suficiente para termos a impressão
de que todos os displays emitirão simultaneamente. É importante lembrar que em cada ciclo
(16ms) cada display só se mantém emitindo durante 4ms.
Capítulo 15
1. No início da década de 1970, descobriu-se que as moléculas do cristal líquido poderiam ser
giradas pela aplicação de uma tensão elétrica, tornando-o, desta forma, transparente ou opaco.
Essa descoberta deu origem ao display de cristal líquido.
2. LCD caractere e LCD gráfico.
3. RS (dado/instrução), R/W (escrita/leitura) e E (pulso de clock).
4. Pino E.
5. Instrução 38h.
6. ♦ Oito bits de dados
Uma linha de caracteres
Formato 5 x 7 mais cursor
Display e cursor desativados
Move cursor para a direita com entrada de um novo caractere
Mensagem não será deslocada com a entrada de um novo caractere
Capítulo 16
1. Podemos definir interrupção como um evento de hardware que provoca uma interrupção na
execução do programa e um desvio incondicional para que o evento seja tratado. Uma vez que o
evento foi tratado, o programa retorna ao ponto em que foi interrompido e a sua execução
continua. Podemos dizer que a interrupção é um desvio no programa provocado pelo hardware.
Em aplicações em que se deve tratar um determinado evento de hardware no momento da sua
ocorrência, a interrupção pode ser uma excelente saída.
2. É uma região de memória reservada para armazenar dados ou instruções do programa. Uma
seção pode ser criada na memória de dados ou na memória de programa. Além disso, é possível
atribuir um endereço estático para a seção de dados criada.
3. Cria uma seção de dados não inicializada na memória RAM.
4. O MPLAB® C18, por default, cria as variáveis temporárias utilizadas no programa principal na
seção de dados .tmpdata. Para alterar a seção de dados utilizada para as variáveis temporárias,
deve-se utilizar a sintaxe mostrada a seguir:
#pragma tmpdata nome_da_seção
nome_da_seção: é o nome da seção de dados que substitui a seção .tmpdata no arma-
zenamento de dados temporários.
5. A diretiva #pragma varlocate permite ao compilador otimizar código à medida que ela possibilita
a remoção de instruções de chaveamento de banco no acesso a dados armazenados na
memória RAM. A diretiva #pragma varlocate ajuda o MPLAB C18 a remover instruções de
chaveamento de banco de memória informando a ele a eventual localização de variáveis.
Lembre-se, no entanto, de que a diretiva #pragma varlocate somente deve ser utilizada com
variáveis cujos endereços já foram explicitamente especificados no código.
6. Podem ser definidos dois níveis de prioridade no tratamento de uma interrupção. Uma
interrupção pode ser definida como de alta ou de baixa prioridade.
7. Os níveis de prioridade no tratamento da interrupção são definidos pelo bit IPEN (RCON<7>).
Quando esse bit é setado, o PIC18F4520 utiliza os níveis de prioridade no tratamento da
interrupção, podendo cada interrupção ser configurada como de alta prioridade ou de baixa
prioridade. Quando o bit IPEN é apagado, o PIC18F4520 não utiliza as prioridades, desviando o
programa para o endereço 0008h da memória de programa quando ocorrer o evento que pode
dar origem a uma interrupção. No POR o bit IPEN é apagado, devendo ser setado por software
caso o programador queira utilizar os dois níveis de tratamento de interrupção.
Capítulo 17
1. Uma delas é a utilização de funções desenvolvidas para esta finalidade, as funções de delay. A
outra forma de medição de tempo é por meio dos módulos temporizadores.
2. TCI = 1/(Fosc/4) = 1/(8M/4)=500ns
3. A função Delay10TCYx() gera um delay, em segundos, de dez vezes o valor que lhe é passado
como parâmetro multiplicado pelo tempo correspondente ao ciclo de instrução. A forma geral de
declaração da função Delay10TCYx() é:
Delay10TCYx (valor)
1. Uma tensão é analógica quando para ir de um valor a outro de intensidade, a tensão elétrica
precisa passar por todos os pontos intermediários de intensidade entre os valores inicial e final.
Por outro lado, a tensão é digital quando normalmente é composta por apenas dois níveis,
representados pelos níveis lógicos '0' e '1'.
2. Transdutor.
3. PCM (Pulse Code Modulation).
4. É a quantidade de partes em que a tensão será dividida.
5. NB = Log101024/Log102 = 10 bits
6. A conversão de um sinal analógico em digital consiste em amostrar o sinal um número de vezes
em cada segundo e associar cada amostra ao valor correspondente à amplitude do sinal naquele
ponto. A amostragem é uma leitura no valor instantâneo da tensão de tempos em tempos.
Associar um valor proporcional à amplitude do sinal de tempos em tempos é um processo
conhecido como PAM (Pulse Amplitude Modulation).
7. A partir dos pulsos PAM é possível produzir pulsos PCM por meio de um processo conhecido
como quantização, que substitui cada pulso PAM por um conjunto de bits que represente aquele
valor.
8. Em 1928, H. Nyquist provou que um sinal analógico que tenha passado por um filtro passa-
-baixas (FPB) com frequência de corte Fc pode ser completamente reconstituído a partir de um
número de amostras 2 x Fc. Segundo Nyquist, um número maior de amostras seria inútil porque
as frequências acima que 2 x Fc já foram eliminadas pelo filtro.
9. Para garantir que a tensão de saída do filtro não sofra nenhuma queda significativa em relação à
tensão de entrada para qualquer frequência do sinal de entrada, o projetista deve obedecer à
fórmula a seguir, na qual a frequência máxima do sinal de entrada deve ser pelo menos dez
vezes menor que a frequência do filtro passa-baixas.
Fc
Fmáx ≤
10
10. Como o conversor A/D será de 10 bits, é preciso dividir a faixa de tensão em 1024 partes iguais
de tensão. Sendo assim, cada parte terá um valor de 2,048 / 1024 = 2mV.
A frequência de corte será de:
Fc = 10 x Fmáx
Fc = 10 x 25 = 250Hz
18. Treze canais de coversão, e apenas um deles pode ser ativado de cada vez.
19. O bit ADIE(PIE1<6>).
20. O módulo conversor A/D do PIC18F4520 pode funcionar no modo sleep desde que o clock
utilizado na conversão A/D seja gerado pelo circuito RC interno ao módulo conversor. Para
selecionar o clock gerado pelo circuito RC, é necessário fazer os bits ADCS2:ADCS0 = x11.
Quando o clock gerado pelo circuito RC é selecionado, o módulo conversor A/D aguarda um ciclo de
Capítulo 19
1. O PWM é um sinal digital com frequência fixa e com ciclo ativo variável.
2. É a parte do ciclo em que o sinal se mantém em nível lógico '1'.
3. Duty cycle é a relação entre o ciclo ativo e o período do sinal PWM e é diretamente proporcional
ao nível DC do sinal. O duty cycle é também adimensional e seu valor pode variar entre 0 e 1.
4. Fazê-lo passar por um filtro passa-baixas com frequência de corte pelo menos dez vezes menor
que a frequência do sinal PWM.
5. PR2 = [F(osc) / (F(PWM) × 4 × Prescaler do TMR2)] – 1
7.
FOSC b) Np = (PR2 + 1) × 4
a) PR 2 = −1
FPWM × 4 × (Pr escaler do TMR 2) Np = (63 + 1) × 4
8M Np = 256 passos
PR 2 = −1
31.250 × 4 ×1
PR2 = 63
Capítulo 20
1. Permitir a comunicação entre dispositivos onboard, ou seja, dispositivos que estão instalados na
mesma placa de circuito impresso.
2. Mestre e escravo. O mestre é o responsável pela geração do sinal do clock.
3. Condição START e condição STOP.
4. O barramento I2C permite que seja alterada a direção do fluxo dos dados durante uma trans-
missão em andamento sem que o dispositivo mestre precise antes finalizar a transmissão
corrente com uma condição STOP. Isso é permitido impondo uma condição Re-START no
barramento após o último byte transmitido. Alterar a direção do fluxo dos dados significa alterar
de um ciclo de leitura para um ciclo de escrita ou vice-versa.
5. O endereçamento pode ser efetuado com 7 bits ou com 10 bits de endereços.
6. O barramento I2C possui um recurso que permite ao dispositivo mestre endereçar todos os dis-
positivos escravos simultaneamente. Isso é feito por meio do endereçamento de chamada geral,
cujo uso pode ser interessante quando o dispositivo mestre desejar enviar dados para todos os
dispositivos escravos simultaneamente, um tipo de comunicação conhecido como broadcast.
7. O barramento I2C permite a conexão de vários dispositivos mestres no mesmo barramento de
forma que todos possam transmitir e receber informações, porém não simultaneamente. Isso
significa que apenas um dos dispositivos mestres pode assumir o controle do barramento de
cada vez. É importante observar também que cada dispositivo mestre gera o seu próprio sinal de
clock.
Capítulo 21
1. O barramento SPI é composto por três linhas: serial data out (SDO), serial data in (SDI) e serial
clock (SCK). Adicionalmente, um quarto sinal pode ser utilizado como chip select e pode
selecionar o dispositivo com o qual o mestre vai se comunicar caso existam vários escravos
conectados no barramento. Esse quarto sinal é o SS .
2. Sim. Um barramento SPI pode ter um mestre e vários escravos. Cada escravo será ativo por uma
linha de controle adicional chamada chip select. Apenas um dispositivo escravo pode estar ativo
de cada vez.
3. Os bits SSPM3:SSPM0(SSPCON1<3:0>) são os responsáveis por a configuração do dispositivo
operar como mestre ou como escravo, como mostrado a seguir.
0011 = SPI modo mestre, clock = saída do TMR2 / 2
1000 = SPI modo mestre, clock = Fosc / 64
0111 = SPI modo mestre, clock = Fosc / 16
0110 = SPI modo mestre, clock = Fosc / 4
Além disso, para ativar a interface SPI é necessário setar o bit SSPEN (SSPCON1<5>). A
polaridade do clock é configurada pelo bit CKP (SSPCON1<4>), ou seja, o bit CKP define se o
estado ocioso do clock será o nível alto ou o nível baixo. O estado ocioso é o nível lógico no qual
a linha de clock deve se manter quando nenhuma transmissão estiver em andamento. O bit CKE
(SSPSTAT<6>) define se a transmissão de cada bit ocorre na transição de ativo para ocioso ou
na transição de ocioso para ativo do sinal de clock. O bit CKE determina o momento em que o bit
deve ser amostrado no dispositivo escravo. O bit SMP (SSPSTAT<7>) define o momento em que
cada bit recebido será amostrado, se na metade ou se no final do time bit. Além disso, é
necessário configurar como entrada a linha SDI e como saída as linhas SDO, SS e SCK. A
fração de código a seguir mostra como configurar a interface SPI para operar como mestre, com
uma taxa de transferência de 125kbps, com o sinal de clock ocioso em nível alto, com a
transmissão do dado ocorrendo na transição de estado ocioso para ativo do sinal de clock e com
o bit de entrada sendo amostrado no fim do time bit.
4. 10Mbps.
5. Independente de o dispositivo mestre precisar enviar e/ou receber dados, é necessário escrever
no registrador SSPBUF para dar início a uma transmissão, aguardar a recepção ser finalizada e,
em seguida, efetuar a leitura do registrador SSPBUF, onde estará armazenado o byte recebido
na transmissão corrente.
6. É setado o bit de sinalização de final de transmissão, o bit SSPIF.
7. O MCP41010 é um potenciômetro digital implementado em circuito integrado com um valor
nominal de 10kΩ, fabricado pela Microchip Technology. O protocolo de comunicação utilizado na
comunicação com o MCP41010 é o SPI.
8. É possível, por meio de software, colocar o potenciômetro em um modo chamado shutdown, no
qual o terminal A do potenciômetro é desconectado do meio exterior, enquanto o cursor é unido
ao terminal B. O modo shutdown é conveniente quando o usuário deseja colocar o circuito em
modo de economia de energia.
Capítulo 22
14. Várias empresas fabricam um circuito integrado que permite ao microcontrolador interfacear com
o padrão RS-232. O que esse CI faz é converter os níveis de tensão correspondentes à lógica
TTL no padrão RS-232 e vice-versa.
15.
PIC18F4520
Taxa de transferência 110 a 1.250.000bps
Número de bits 8 ou 9
Bit de paridade Não suporta
Stop bit 1
Controle de fluxo Não suporta
16.
//inicializa USART
void Configura_UART (void)
{
TRISCbits.TRISC7 = 1; //configura pino RX como entrada
TRISCbits.TRISC6 = 1; //configura pino TX como entrada
TXSTA = 0b00100100; //transmissão habilitada<5>
//transmissão assíncrona<4>
//transmissão em alta velocidade<2>
RCSTA = 0b10010000; //porta serial habilitada<7>
//recepção contínua habilitada<4>
BAUDCON = 0b00000000; //TX ocioso em nível alto<4>
//gerador de baud rate de 8 bits<3>
SPBRG = 12; //9600bps
1. Podemos dividir o trabalho de compilar uma aplicação em C em três partes. São elas o
pré-processamento, a compilação e a linkedição.
O pré-processamento permite incluir no programa-fonte diversos comandos que não fazem parte
da linguagem C, mas são reconhecidos pelo compilador. Esses comandos são chamados dire-
tivas de compilação.
A compilação (ou pré-compilação) tem o objetivo de interpretar os comandos pertencentes à
linguagem C existentes no programa-fonte e gerar um bloco de códigos intermediário chamado
arquivo objeto.
A última etapa, de linkedição, combina os diversos arquivos objeto e arquivos biblioteca com o
link script para gerar o programa executável. Este último contém toda a aplicação representada
em linguagem de máquina.
2. O MPLAB C18 possui um módulo chamado MPLIB librarian, responsável pela criação de
arquivos biblioteca. O MPLIB combina os arquivos objeto gerados pelo MPASM assembler e pelo
MPLAB C18 em um único arquivo biblioteca. O arquivo gerado pelo MPLIB, cuja extensão é .lib,
pode ser utilizado como entrada para o MPLNK gerar o arquivo executável.
3. #if e #endif
4. A diretiva #error força o compilador a parar a compilação caso seja encontrada pelo pré-
-processador, além de emitir uma mensagem de erro. Sua principal finalidade é na depuração de
uma aplicação, ou seja, um processo que consiste em encontrar e eliminar erros em uma
aplicação.
5. Macro pode ser definida, de uma forma geral, como um padrão de entrada que deve ser
substituído por um padrão de saída, de acordo com um conjunto de regras. Dependendo do
contexto, o termo macro pode ter um significado um pouco diferente. Na linguagem C, pode-se
definir macro como uma porção de código que será substituída por outro identificador na fase de
pré-processamento.
6. O padrão C ANSI define um conjunto de macros que podem ser úteis em determinadas
situações. São elas: __DATE__, __TIME__, __LINE__, __FILE__ e __STDC__ que iniciam com
dois underlines e terminam com dois underlines.
__DATE__: retorna um ponteiro para uma string armazenada na memória de programa com
a data da última compilação.
__TIME__: retorna um ponteiro para uma string armazenada na memória de programa com
a hora da última compilação.
__LINE__: retorna um inteiro com o número da linha do programa-fonte de onde ela foi
chamada.
__FILE__: retorna um ponteiro para uma string armazenada na memória de programa com
o nome do programa-fonte, incluindo o caminho para chegar ao arquivo.
__STDC__: retorna um inteiro informando se o programa-fonte segue o padrão C ANSI.
10. As instruções estendidas são ADDFSR, ADDULNK, CALLW, MOVSF, PUSHL, SUBFSR e
SUBULNK.
11. O processamento tem início no vetor reset, ou seja, no endereço 0000h da memória de
programa. Antes da execução da função main() é executado um código de inicialização chamado
start-up code que começa com a inicialização dos registradores FSR1 e FSR2 para referenciar a
pilha stack software. Dependendo de como o start-up code é executado, uma função que
inicializa a seção de dados idata na memória de programa é chamada e, posteriormente, é
executado um loop infinito com chamadas à função main().
12. É possível executar um código específico imediatamente após o Reset, antes do start-up code.
Para isso é necessário editar o módulo de inicialização que será linkado com a aplicação e
adicionar o código de inicialização à função _entry(). Seis módulos de inicialização podem ser
utilizados no start-up code. São eles os objetos c018i.o, c018i_e.o, c018.o, c018_e.o, c018iz.o e
c018iz_e.o. Os módulos c018i.o e c018i_e.o inicializam a seção de dados idata, enquanto os
módulos c018.o, c018_e.o não.
13. A otimização tem o objetivo de reduzir o código resultante em uma determinada aplicação.
Podemos citar como exemplo de otimização as opções Duplicate-string merging, Branch
optimizations e Banking optimizer.