Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Microcontroladores PIC, Notas de estudo de Mecatrônica

Microcontroladores PIC C

Tipologia: Notas de estudo

Antes de 2010

Compartilhado em 26/06/2010

ederson-lima-12
ederson-lima-12 🇧🇷

5

(2)

10 documentos

1 / 71

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
Linguagem “C” para microcontroladores pic – www.mecatronicadegaragem.blogspot.com
Linguagem ´C´
para
microcontroladores
PIC
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f
pf30
pf31
pf32
pf33
pf34
pf35
pf36
pf37
pf38
pf39
pf3a
pf3b
pf3c
pf3d
pf3e
pf3f
pf40
pf41
pf42
pf43
pf44
pf45
pf46
pf47

Pré-visualização parcial do texto

Baixe Microcontroladores PIC e outras Notas de estudo em PDF para Mecatrônica, somente na Docsity!

Linguagem ´C´

para

microcontroladores

PIC

Objetivo:

Iniciar o projetista no uso da linguagem C para sistemas dedicados baseados na família PIC 16CXXX.

Metodologia:

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

Parte I - Iniciação à linguagem C

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

I.2 - Comentários

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.

I.3 - Diretivas de 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.

I.4 - Indicador de fim de instrução

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.

  • Exemplos de definições:

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.

I.7 - Expressões numéricas e de string (caracteres)

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”

I.9 - Matrizes

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.

IMPORTANTE:

  1. O índice da matriz pode ser outra variável. Ex.: H = temperatura [contador];

  2. 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.

  1. Muito cuidado com o uso de matrizes, pois temos pouca memória RAM nos chips.

I.10 - Controle do programa em C

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 ) ;