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

Linguagem C para microcontroladores, Notas de estudo de Engenharia Elétrica

Introdução

Tipologia: Notas de estudo

Antes de 2010

Compartilhado em 14/03/2009

lucas-assuncao-1
lucas-assuncao-1 🇧🇷

3

(4)

11 documentos

1 / 29

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
Introdução
VIDAL Projetos Personalizados
Eng. Vidal Pereira da Silva Júnior
Linguagem C para
microcontroladores
PIC
Parte I - Iniciação à linguagem C
VIDALVIDAL
Projetos Personalizados - (011) - 6451 - 8994 / 9378 - 0101 - www.vidal.com.br
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d

Pré-visualização parcial do texto

Baixe Linguagem C para microcontroladores e outras Notas de estudo em PDF para Engenharia Elétrica, somente na Docsity!

Linguagem ´C´

para

microcontroladores

PIC

Introdução

VIDAL Projetos Personalizados

Eng. Vidal Pereira da Silva Júnior

Parte I - Iniciação à linguagem C

VIDALVIDAL Projetos Personalizados - (011) - 6451 - 8994 / 9378 - 0101 - www.vidal.com.br

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:

w Iniciação à Linguagem C w Implementação da CCS para a linha microchip w 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 inicializaçã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 16F (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

Parte I - Iniciação à linguagem C

VIDALVIDAL Projetos Personalizados - (011) - 6451 - 8994 / 9378 - 0101 - www.vidal.com.br

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 compi- lador.

Exemplo:

x = x + 2; // soma 2 à variável x

ü Comentários com múltiplas linhas

Este tipo de comentário é iniciado com a seqüência /* e finalizado pela seqüência */. 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.

Parte I - Iniciação à linguagem C

VIDALVIDAL Projetos Personalizados - (011) - 6451 - 8994 / 9378 - 0101 - www.vidal.com.br

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ça- lho. 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 ;

Parte I - Iniciação à linguagem C

VIDALVIDAL Projetos Personalizados - (011) - 6451 - 8994 / 9378 - 0101 - www.vidal.com.br

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 especi- ais 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 começa com número teste parte!dois TESTE ^ 12A caracter inválido (! ) x_2

  • Exemplo de nome igual ao de função:

Não podemos criar uma variável ou uma rotina chamada SQRT, pois a função de cálculo de raiz quadrada já existe.

IMPORTANTE: O compilador diferencia letras minúsculas de maiúsculas. Nos exemplos acima, Teste, teste e TESTE são 3 variáveis diferentes para o compilador.

Uma boa prática esta em diferenciar variáveis, labels e registros com tipos diferentes de letras.

Exemplo: PORTB registro da CPU TempoMs Rotina de tempo em ms quantos variável em RAM

I.5.2 - 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.3 - 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.

Parte I - Iniciação à linguagem C

VIDALVIDAL Projetos Personalizados - (011) - 6451 - 8994 / 9378 - 0101 - www.vidal.com.br

I.5.4 - 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, permi- tindo um “aumento” no espaço de memória.

Parte I - Iniciação à linguagem C

VIDALVIDAL Projetos Personalizados - (011) - 6451 - 8994 / 9378 - 0101 - www.vidal.com.br

I.6 - Funções

Chamamos função um trecho de programa que realiza determinada opera- ção (função que lê teclado, função que escreve no display, ...) bem como as funções pré-definidas (SQRT, ABS, ACOS, ...).

Para evitar conflito, vamos chamar de ‘rotinas’ as funções escritas pelo proje- tista do software.

No exemplo abaixo, temos a função MAIN (falaremos dela depois) que é a rotina executada no reset do programa. A função MAIN chama uma ROTINA para ler teclas, e a rotina de ler teclas chama uma FUNÇÃO para calcular o valor absoluto da tecla.

main ( ) {



LeTeclas( );


}

LeTeclas( ) {



X = ABS(tecla_lida);


}

Pela nomenclatura normal, ‘LeTeclas’ seria chamada de função, mas preferi- mos chama-la de rotina, para diferenciar das funções pré-definidas.

I.6.1 - Funções especialmente desenvolvidas para os PIC’s

Na parte II, referente ao compilador da CCS, veremos quais as funções que existem para os PIC’s e como funcionam.

Parte I - Iniciação à linguagem C

VIDALVIDAL Projetos Personalizados - (011) - 6451 - 8994 / 9378 - 0101 - www.vidal.com.br

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

Vamos ver neste item os tipos de expressão permitidas para valores numéri- cos 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”

Parte I - Iniciação à linguagem C

VIDALVIDAL Projetos Personalizados - (011) - 6451 - 8994 / 9378 - 0101 - www.vidal.com.br

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

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 de acesso a matriz vai de 0 até tamanho-1. No nosso exemplo, irá de 0 à 19.
  2. Muito cuidado com o uso de matrizes, pois temos pouca memória RAM nos chips.

Parte I - Iniciação à linguagem C

VIDALVIDAL Projetos Personalizados - (011) - 6451 - 8994 / 9378 - 0101 - www.vidal.com.br

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 escre- vemos 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 fechamento 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.

Parte I - Iniciação à linguagem C

VIDALVIDAL Projetos Personalizados - (011) - 6451 - 8994 / 9378 - 0101 - www.vidal.com.br

Podemos então resumir numa tabela todas as combinações dos IF’s:

ü if (teste a realizar) instrução para teste “OK”

ü if (teste a realizar) { grupo de instruções para teste “OK” }

ü if (teste a realizar) instrução para teste “OK” else instrução para teste “NÃO OK”

ü if (teste a realizar) { grupo de instruções para teste “OK” } else instrução para teste “NÃO OK”

ü if (teste a realizar) instrução para teste “OK” else { grupo de instruções para teste “NÃO OK” }

ü if (teste a realizar) { grupo de instruções para teste “OK” } else { grupo de instruções para teste “NÃO OK” }

Parte I - Iniciação à linguagem C

VIDALVIDAL Projetos Personalizados - (011) - 6451 - 8994 / 9378 - 0101 - www.vidal.com.br

I.10.2.1 - IF’s aninhados (embutidos um no outro)

Chamamos a estrutura de “IF’s aninhados” quando a instrução a ser execu- tada 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.

Parte I - Iniciação à linguagem C

VIDALVIDAL Projetos Personalizados - (011) - 6451 - 8994 / 9378 - 0101 - www.vidal.com.br

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 der 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).

Parte I - Iniciação à linguagem C

VIDALVIDAL Projetos Personalizados - (011) - 6451 - 8994 / 9378 - 0101 - www.vidal.com.br

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

Parte I - Iniciação à linguagem C

VIDALVIDAL Projetos Personalizados - (011) - 6451 - 8994 / 9378 - 0101 - www.vidal.com.br