































































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
Microcontroladores PIC C
Tipologia: Notas de estudo
1 / 71
Esta página não é visível na pré-visualização
Não perca as partes importantes!
































































Iniciar o projetista no uso da linguagem C para sistemas dedicados baseados na família PIC 16CXXX.
O curso esta dividido em 3 partes:
Iniciação à Linguagem C Implementação da CCS para a linha microchip Exemplos práticos de hardware e software
A principal vantagem de se usar linguagens de alto nível (no nosso caso a linguagem C) esta na menor interação do projetista com o hardware, no que diz respeito ao controle do mesmo (ajuste de bancos de registradores, seqüências de inici- alização, ...). Desta forma o projetista dedica seu tempo basicamente à lógica do problema e não aos detalhes internos do chip.
Como exemplo vamos ver a seqüência de escrita na EEPROM do 16F84 (gravar no endereço 20H o valor 12H, pág. 27 do livro):
Em assembler: Em ‘C’
bcf STATUS,RP0 write_eeprom(0x20,0x12); movlw 20H movwf EEADR movlw 12H movwf EEDATA bsf STATUS,RP bcf INTCON,GIE bsf EECON1,WREN movlw 55H movwf EECON movlw 0AAH movwf EECON bsf EECON1,WR
Comentários são informações anexadas ao programa fonte (*) que permitem ao programador ou outros entenderem o significado do que esta sendo feito. É boa prática comentar todas as linhas, pois após um certo tempo, nem mesmo o criador do programa lembrará de tudo o que estava pensando no momento da escrita.
O compilador ignora tudo que estiver definido como comentário
(*) O programa fonte em C deve ter terminação “.C”
Exemplo: teste.c
Existem dois tipos de comentários:
Comentários que ocupam apenas 1 linha
Este tipo de comentário é iniciado com duas barras conjuntas: // Neste caso, tudo que estiver após as duas barras será ignorado pelo compilador.
Exemplo:
x = x + 2; // soma 2 à variável x
Comentários com múltiplas linhas
cia */.
Este tipo de comentário é iniciado com a seqüência /* e finalizado pela seqüên-
Neste caso, tudo que estiver ENTRE estas duas seqüências será ignorado pelo compilador. Ideal para excluir temporariamente trechos de código.
Exemplo:
x = x + 2; /* tempo++; a = SQRT(25); */ x = 0;
No exemplo acima, as linhas tempo++; e a=SQRT(25); serão ignoradas no momento da compilação.
São instruções para o compilador, e não para o programa que será gerado.
As diretivas informam, por exemplo, o processador para o qual o código deverá ser gerado, o valor do clock que será usado pela cpu,..).
As diretivas sempre começam com ‘ # ’.
Um bom exemplo é a diretiva que inclui no processo de compilação as defini- ções do chip.
#include <16F84.H>
A terminação .H indica um Header File da linguagem C, ou seja, um cabeçalho. Equivale ao P16F84.INC usado no assembler.
O compilador C não é um compilador de linha, como o assembler.
O compilador C procura o sinal de que a instrução ou o bloco de instruções já acabou.
Este sinal é o “ponto e virgula” para uma instrução ou o ‘ } ‘ para o bloco (mais tarde falaremos sobre blocos de instruções).
No exemplo abaixo, as duas maneiras são corretas, pois o ‘ ; ‘ é que sinaliza o fim da instrução.
x = x + 25; x = x + 25 ;
I.5.2 - Como escrever os nomes de variáveis, constantes e funções
Todo ‘label’ (nome ou identificador), seja de variável, constante ou função, deve começar por letra, ter no máximo 32 caracteres e não usar caracteres especiais ou de controle (! ? % ....). Nomes de funções e rotinas internas também não podem ser utilizados.
Corretas Incorretas
Teste 0local teste parte!dois TESTE ^
começa com número
12A caracter inválido (! ) x_2
IMPORTANTE: O compilador diferencia letras minúsculas de maiúsculas. Nos exemplos compilador.
acima, Teste, teste e TESTE são 3 variáveis diferentes para o
Uma boa prática diferentes de letras.
esta em diferenciar variáveis, labels e registros com tipos
Exemplo: PORTB registro da CPU TempoMs Rotina de tempo em ms quantos variável em RAM
I.5.3 - Atribuindo valores
A atribuição de valores é feita pelo sinal de igualdade,
tempo = 123;
aqui a variável tempo passa a ter o valor 123 decimal.
I.5.4 - IMPORTANTE Valores iniciais das variáveis
Devemos sempre ajustar os valores iniciais de cada variável do programa antes de usa-las, pois nada garante que estão em “0 “ no reset.
I.5.5 - Variáveis locais e variáveis globais
Existem duas maneiras principais para a alocação de variáveis em memória:
Variáveis Globais:
As variáveis globais tem “alcance” para todas as rotinas e funções existentes no programa. Isto significa que qualquer rotina ou função poderá utiliza-la.
Variáveis Locais:
As variáveis locais tem “alcance” apenas dentro das rotinas ou funções onde foram criadas. Isto significa que apenas a rotina ou função onde a mesma foi criada poderá utiliza-la.
Vamos ver um fragmento de código como exemplo:
char A,B,C; // A, B e C são variáveis globais, pois estão fora de // qualquer função ou rotina. main () { A = 0; // Faz A= Tempo(); // chama rotina Tempo Espera(); // chama rotina Espera }
Tempo() { char J; // cria uma variável chamada J. // Somente a rotina Tempo() poderá utiliza-la J = A; }
Espera() { char X; // cria uma variável chamada X. // Somente a rotina Espera() poderá utiliza-la X = A; X = J; // Erro: A variável J não existe para esta rotina }
A principal vantagem no uso das variáveis locais esta em que a memória RAM ocupada pela mesma será compartilhada por outras variáveis locais, permitindo um “aumento” no espaço de memória.
Exemplo: Função para dividir dois numeros. Se o divisor for “0”, retorna “0”
main( ) { ........... x = 100; // fax x = 100 y = getchar( ); // faz y = ao valor recebido via serial // para o programa o valor recebido é // indetermionado valor = DIVID (x,y); // chama a funcao DIVID e ao retornar atribui a // ‘valor’ o resultado da divisão if ( valor == 0 ) {... } // ação caso y = 0 .......... }
long int DIVID ( long int A , B) { if ( B == 0 ) return (0); // se B=0 retorna 0, else return ( A / B ); // senao retorna a divisão }
OBSERVAÇÃO:
Este programa da forma acima é apenas ilustrativo. A listagem apresentada ao final nos exemplos esta completa, com todos os detalhes para permitir a compilação.
I.6.3 - Variáveis como parâmetros
Outra facilidade da linguagem C esta na passagem de valores de uma rotina ou função para outra.
Estes valores são conhecidos por “parâmetros”
Como exemplo, temos o programa acima, onde enviamos dois números para a função que calcula a divisão.
Vamos ver neste item os tipos de expressão permitidas para valores numéricos e para a manipulação de caracteres.
Números Decimais: Não podem começar por ‘ 0 ’ (zero)
Exemplos: 123; 2; 14534; 3.14; ...
Números Octais: Devem começar por ‘ 0 ’ (zero) (Pouco utilizados) Exemplos: 045; 09;...
Números Binários: Devem iniciar por ‘ 0b ‘
Exemplo: 0b
Números Hexadecimais: Devem iniciar por ‘ 0x ‘
Exemplo: 0x32; 0xA9; ...
String de 1 caractere: Entre Apóstrofos ‘ ‘
Exemplo: ‘z’; ‘A’; ....
String de vários caracteres: Entre aspas “ “
Exemplo: “teste de escrita”
Define-se como matriz um grupo de dados que podem ser agrupados num mesmo nome, diferenciando-se apenas pela posição no grupo.
Como exemplo temos uma rua com várias casas. A rua seria nossa matriz, por exemplo, Rua Paraná. Cada casa tem um número que indica sua posição na rua (na matriz).
Exemplo: casa 32 da Rua Paraná
Poderíamos escrever Rua Parana[32]
Em C, a definição de uma variável ou de uma constante como matriz é feita apenas pela inclusão de seu tamanho entre colchetes [ ].
Exemplo:
Matriz para os 20 valores de temperatura lidos, variáveis tipo char:
char temperatura[20]; // reserva espaço de memória para // 20 bytes que indicarão a temperatura // O primeiro elemento é temperatura[0] // O último elemento é temperatura[19]
Para acessar os elementos da matriz basta escrever o nome da variável com o índice do valor desejado.
Exemplo:
valor = temperatura[12]; // o 13o^ elemento da matriz temperatura // é copiado para a variável valor.
O índice da matriz pode ser outra variável. Ex.: H = temperatura [contador];
O índice de acesso a matriz vai de 0 até tamanho-. No nosso exemplo, irá de 0 à 19.
Se voce tentar acessar um elemento de endereco maior que o existente, o compilador usara uma posição de RAM que provavelmente esta em uso por outra varia- vel. O compilador não tem condições de alertar sobre este erro.
Um dos pontos mais importantes do aprendizado da linguagem C esta na sua sintaxe, isto é, como o programa deve ser escrito.
Até agora vimos apenas teorias sobre variáveis, dados, e funções.
Veremos a partir de agora como tudo isto é integrado de forma a produzir um resultado útil.
Para tal vamos estudar as estruturas de montagem de programas e ver como se controla o fluxo de “ações” que o programa deve tomar.
Para facilitar o aprendizado não vamos nos preocupar agora com o PIC e nem com as funções criadas para o mesmo, mas apenas com a forma como escrevemos o programa em C.
I.10.1 - Blocos de declarações
Sempre que mais de uma instrução tiver de ser executada para uma certa rotina, as mesmas deverão estar contidas dentro de um BLOCO de declarações.
Um bloco tem início com a abertura de uma chave ‘ { ‘ e é finalizado pelo fecha- mento da chave ‘ } ‘.
Como um bloco não termina no fim da linha, mas sim ao fechar a chave, podemos escrever o mesmo de forma mais clara, colocando seus elementos em várias linhas e permitindo melhor colocação de comentários..
Exemplo 1: { x = 1; tempo = x * 2; }
Exemplo 2: { x = 1; // posso colocar um tempo = x * 2; // comentário para cada } // linha
Os dois exemplos acima realizam a mesma tarefa, mas o exemplo 2 é mais fácil de ser lido e posteriormente entendido.
Linguagem “C” para microcontroladores pic – www.mecatronicadegaragem.blogspot.com
Podemos então resumir numa tabela todas as combinações dos IF’s:
if (teste desejado) instrução para teste “0K”
if (teste desejado) { grupo de instruções para teste “0K” }
if (teste desejado) instrução para teste “0K” else instrução para teste “NÃ0 0K”
if (teste desejado) { grupo de instruções para teste “0K” } else instrução para teste “NÃ0 0K”
if (teste desejado) instrução para teste “0K” else { grupo de instruções para teste “NÃ0 0K” }
if (teste desejado) {
} else {
grupo de instruções para teste “0K”
grupo de instruções para teste “NÃ 0 0K”
I.10.2.1 - IF’s aninhados (embutidos um no outro)
Chamamos a estrutura de “IF’s aninhados” quando a instrução a ser executada para um teste (seja verdadeiro ou falso) é na verdade outro IF.
Vamos ver dois exemplos que ajudarão a esclarecer o assunto.
Exemplo 1: Observe os dois trechos de programa a seguir:
if ( X ) | if ( X ) if (Y) | { a = a * 2; | if (Y) else | a = a * 2; a = a * 4; | } | else | a = a * 4
No trecho da esquerda, o else refere-se ao if (Y), pois esta “mais próximo” deste. Somente se o if (Y) resultar falso é que a linha a = a * 4 será executada. Se o if (X) resultar falso , nenhuma operação será realizada.
No trecho da direita, o else refere-se ao if (X), pois o if (Y) esta dentro de um bloco, não sendo visível para o else. Se o if (X) resultar verdadeiro mas o if(Y) resultar falso , nenhuma operação será realizada.
Exemplo 2: Vários IF’s seqüênciais
if ( posição == 1) // Vê se posição = 1. peso = 1; // É 1. Faz peso = 1.
else if (posição == 2) // Não é 1. Vê se posição = 2. peso = 2; // É 2. Faz peso = 2.
else if (posição == 3) // Não é 2. Vê se posição = 3. peso = 4; // É 3. Faz peso = 4.
else if (posição == 4) // Não é 3. Vê se posição = 4. peso = 8; // É 4. Faz peso = 8.
else peso = 0; // Não é 4. Faz peso = 0.
I.10.4 - O condicional WHILE (enquanto)
O WHILE executa a instrução ou o bloco de instruções “enquanto” a condição de teste for verdadeira.
”Se logo no inicio do teste a condição resultar falsa, nada será executado”.
Sintaxe:
while ( teste ) instrução para teste verdadeiro
ou
while ( teste ) { ( grupo de instruções para teste verdadeiro) }
Vamos proceder novamente a soma dos números de 1 a 100 como no exemplo anterior.
i = 0; // nunca esquecer de inicializar soma = 0; // todas as variáveis do programa. while ( i < 101 ) // faça enquanto I< { soma = soma + 1; i++; /* como o WHILE apenas faz o teste devo incrementar a variável */ }
I.10.4.1 - Loop infinito com WHILE
while (true) { ( declarações executadas eternamente ) }
A condição booleana “true” sempre será verdadeira (true).
OBSERVAÇÃO:
As condições TRUE e FALSE já estão pré-definidas no compilador.
I.10.5 - O condicional DO / WHILE (faça ... enquanto)
O condicional DO / WHILE funciona de forma semelhante ao WHILE, exceto pelo fato de que
“pelo menos uma vez a instrução ou o bloco serão executados”.
Sua sintaxe é:
do instrução para teste verdadeiro while ( teste ) ;
ou
do { ( grupo de instruções para teste verdadeiro) } while ( teste ) ;