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

Documentos relacionados


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 Linguagem C para microcontroladores PIC Parte I - Iniciação à linguagem C VIDAL 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 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,RP0 bcf INTCON,GIE bsf EECON1,WREN movlw 55H movwf EECON2 movlw 0AAH movwf EECON2 bsf EECON1,WR Linguagem C para microcontroladores PIC Parte I - Iniciação à linguagem C VIDAL Projetos Personalizados - (011) - 6451 - 8994 / 9378 - 0101 - www.vidal.com.br 2 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 ; Linguagem C para microcontroladores PIC Parte I - Iniciação à linguagem C VIDAL Projetos Personalizados - (011) - 6451 - 8994 / 9378 - 0101 - www.vidal.com.br 5 I.5 - Definição de variáveis, constantes e identificadores Todas as variáveis e constantes usadas no programa devem ser devida- mente definidas, com um nome e um tipo. O mesmo vale para identificadores de funções e rotinas. Os dados básicos podem ser de 8, 16 e 32 bits de comprimento, e devido as características peculiares dos microcontroladores, variáveis de 1 bit também podem ser definidas. Vejamos alguns exemplos: Variáveis: tamanho exemplo faixa Ÿ variável de 8 bits: CHAR ( de 0 à 255) Ÿ variável de 16 bits: LONG INT ( de 0 à 65535) Ÿ variável de 1 bit: SHORT ( pode assumir 0 ou 1) Constantes: CONST define um ‘label’ para valores que não serão alterados pelo progra- ma: Exemplo: FLOAT CONST PI = 3.14; I.5.1 - Seqüência de declaração de variáveis e constantes Para se declarar uma variável temos a seguinte ordem das definições: Tipo Nome Exemplo: char tempo; // a variável ‘tempo’ é do // tipo char (0 à 255) Para se declarar uma constante temos a seguinte ordem das definições: Tipo CONST Nome = (valor) Exemplo: FLOAT CONST PI = 3.14; Um grupo de variáveis de mesmo tipo pode ser declarada na mesma linha. Exemplo: char i, j, k; // declara que i, j e k são do tipo char. Linguagem C para microcontroladores PIC Parte I - Iniciação à linguagem C VIDAL Projetos Personalizados - (011) - 6451 - 8994 / 9378 - 0101 - www.vidal.com.br 6 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_5 - 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. Linguagem C para microcontroladores PIC Parte I - Iniciação à linguagem C VIDAL Projetos Personalizados - (011) - 6451 - 8994 / 9378 - 0101 - www.vidal.com.br 7 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. Linguagem C para microcontroladores PIC Parte I - Iniciação à linguagem C VIDAL Projetos Personalizados - (011) - 6451 - 8994 / 9378 - 0101 - www.vidal.com.br 10 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: 0b10101010 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” Linguagem C para microcontroladores PIC Parte I - Iniciação à linguagem C VIDAL Projetos Personalizados - (011) - 6451 - 8994 / 9378 - 0101 - www.vidal.com.br 11 I.8 - Operadores lógicos e aritméticos básicos da linguagem C Temos aqui os principais operadores lógico-relacionais e aritméticos da linguagem C. Ÿ + Adição Ÿ ++ Incremento da variável indicada ( D++ é equivalente a D = D + 1) Ÿ - Subtração Ÿ -- Decremento da variável indicada ( X-- é equivalente a X = X - 1) Ÿ * Multiplicação Ÿ / Divisão (parte inteira para variáveis inteiras) Ÿ % Resto da divisão (divisão de inteiros) Ÿ ^ Exponencial Ÿ < Comparador lógico “menor que” Ÿ > Comparador lógico “maior que” Ÿ <= Comparador lógico “menor ou igual que” Ÿ >= Comparador lógico “maior ou igual que” Ÿ == Comparador lógico “igual a” (*) Ÿ != Comparador lógico “diferente de” Ÿ && AND lógico ou relacional (todas as condições verdadeiras) Ÿ || OR lógico ou relacional (uma das condições é verdadeira) Ÿ ! NOT lógico ou relacional (vê se a condição é TRUE ou FALSE) Ÿ & AND binário (bit a bit nas variáveis) Ÿ | OR binário (bit a bit nas variáveis) Ÿ ~ NOT binário (inverte o estado de cada bit da variável) (*) Se numa comparação usarmos ‘ = ‘, o compilador fará uma atribuição, gerando um programa errado logicamente. Exemplo correto: SE A == 5 ..... // Verifica se A é igual a 5 Exemplo errado: SE A = 5 ...... // Primeiro faz A igual a 5, e o // teste acaba dando verdadeiro O compilador não avisa deste erro. Cuidado ! Exemplo para inverter a variável X e escrever no portb: portb = ~ X; // operador NOT binário Exemplo para ver se o bit T0IF ainda não chegou a 1: if ( ! T0IF ) .... // Se T0IF NÃO (not) TRUE ( true = 1),.... Linguagem C para microcontroladores PIC Parte I - Iniciação à linguagem C VIDAL Projetos Personalizados - (011) - 6451 - 8994 / 9378 - 0101 - www.vidal.com.br 12 I.10.2 - Bloco IF (executa se a condição for verdadeira) Podemos entender o bloco IF como um teste simples. Temos duas opções básicas, sendo que a condição de teste deverá estar entre parênteses: - SE (teste = ok!) “executa esta(s) declaração(ões)” - SE (teste = ok!) “executa esta(s) declaração(ões)” SENÃO “executa esta(s) outras declaração(ões)” Temos vários formatos possíveis para o IF Ÿ IF simples, com apenas uma declaração caso o teste seja verdadeiro if ( A = 0 ) A = 10; // SE a variável A estiver zerada, atribui 10 // à mesma. Ÿ IF com mais de uma declaração caso o teste seja verdadeiro. Neste caso o grupo de declarações deverá estar num BLOCO, isto é, entre chaves ‘ { } ‘. if ( tempo > 10 ) { tempo = 0; contador = contador + 1; } Ÿ IF com exceção (se o teste falha, executa outra declaração ou bloco). Pode na exceção executar uma instrução apenas ou um bloco if ( teste = sim ) declaração individual ou bloco else declaração individual ou bloco da exceção Importante: A instrução (declaração) simples não precisa estar na mesma linha do IF ou do ELSE. (Ver item I.10.2.1, nos exemplos de IF’s aninhados). Linguagem C para microcontroladores PIC Parte I - Iniciação à linguagem C VIDAL Projetos Personalizados - (011) - 6451 - 8994 / 9378 - 0101 - www.vidal.com.br 15 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” } Linguagem C para microcontroladores PIC Parte I - Iniciação à linguagem C VIDAL Projetos Personalizados - (011) - 6451 - 8994 / 9378 - 0101 - www.vidal.com.br 16 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. Linguagem C para microcontroladores PIC Parte I - Iniciação à linguagem C VIDAL Projetos Personalizados - (011) - 6451 - 8994 / 9378 - 0101 - www.vidal.com.br 17 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 ) ; Linguagem C para microcontroladores PIC Parte I - Iniciação à linguagem C VIDAL Projetos Personalizados - (011) - 6451 - 8994 / 9378 - 0101 - www.vidal.com.br 20 I.10.5 - O condicional SWITCH O SWITCH testa a variável e conforme seu valor pula diretamente para o grupo de instruções conforme a cláusula CASE. Caso nenhuma das condições previstas nos vários CASE sejam satisfeitas, executa o bloco DEFAULT, se houver (não é obrigatório). Mesmo que apenas uma instrução seja usada para um certo CASE, sempre teremos um bloco ( entre chaves ‘ { } ‘ ) pois além da instrução a ser executada devemos incluir a instrução BREAK, que faz com que o programa vá imediatamente para o fim do SWITCH, continuando a partir dai. Caso o BREAK não seja colocado, o programa continuará pelo CASE logo abaixo do que foi chamado (ou no DEFAULT). Seu formato geral é: switch ( variável ) { case constante1 { ( instrução ou grupo de instruções ) break; } case constante2 { ( instrução ou grupo de instruções ) break; } . . . default: { ( instrução ou grupo de instruções para falso geral ) break; } } Linguagem C para microcontroladores PIC Parte I - Iniciação à linguagem C VIDAL Projetos Personalizados - (011) - 6451 - 8994 / 9378 - 0101 - www.vidal.com.br 21 Vamos ver um exemplo que faz o mesmo que o IF aninhado que vimos anteriormente. switch ( posição ) { case 1: // CASO posição = 1 .... { peso = 1; break; // sai do CASE. } case 2: { peso = 2; break; } case 3: { peso = 4; break; } case 4: { peso = 8; break; } default: // CASO posição NÃO seja 1, 2, 3 ou 4, { // executa este bloco peso = 0; break; } } Para ilustrar vamos escrever várias declarações em uma só linha. switch ( posição ) { case 1: { peso = 1; break; } // CASO peso=1, .... case 2: { peso = 2; break; } // CASO peso=2, .... case 3: { peso = 4; break; } case 4: { peso = 8; break; } default: { peso = 0; break; } } Linguagem C para microcontroladores PIC Parte I - Iniciação à linguagem C VIDAL Projetos Personalizados - (011) - 6451 - 8994 / 9378 - 0101 - www.vidal.com.br 22 I.12 - A função MAIN ( ) Todo programa em C deve ter uma função chamada MAIN ( ), que é a rotina que será executada quando o programa for chamado (em nosso caso após o reset da cpu ). Exemplo de um programa que nada faz, mas que teoricamente pode ser compilado: void main ( void) // a função MAIN não recebe ou devolve valores { } I.13 - Exemplos de programas simples Veremos neste item alguns programas pequenos e simples, sem função técnica específica, apenas para ilustrar os conceitos vistos até agora. Todos os conceitos vistos são genéricos para a linguagem C, servindo inclu- sive para usar em outros microprocessadores e computadores pessoais. Programa 1: Calcula a soma dos números de 1 a 100. char i; // variável i usada no loop (0 a 255) long int soma; // soma de 0 a 65535 void main( void) { for ( i = 0; i < 101; i++) soma = soma + i; } Linguagem C para microcontroladores PIC Parte I - Iniciação à linguagem C VIDAL Projetos Personalizados - (011) - 6451 - 8994 / 9378 - 0101 - www.vidal.com.br 25 Programa 2: Conta indefinidamente de 1 a 10. Sempre que chegar a 10 incrementa a variável X e recomeça. char i, x; // declarei que i e x são variáveis do // tipo char void main ( void) { i = 0; x = 0; // inicializei as variáveis while (1) // fica eternamente neste loop { i++; // incrementa i if ( i == 10 ) // vê se i = 10. { x++; // É. Incrementa x e faz i = 0. i = 0; } } } Programa 3: Incrementa indefinidamente a variável chamada PORTB ( na parte II veremos como executar no PIC ). char PORTB; // declarei que PORTB é variável do // tipo char (8 bits) void main ( void) { PORTB = 0; // inicio em 0 while (true) // fica eternamente neste loop { PORTB++; // incrementa PORTB } } ANEXO Temos a seguir um programa ilustrativo do que foi estudado até agora. Este programa foi compilado para o 16F84 e não de modo genérico porque o compilador sempre precisa saber a quantidade de RAM e de ROM disponível. Linguagem C para microcontroladores PIC Parte I - Iniciação à linguagem C VIDAL Projetos Personalizados - (011) - 6451 - 8994 / 9378 - 0101 - www.vidal.com.br 26 Listagem do programa “REGRAS.C” /* ********************************************************************************************** Programa demo para o compilador C da CCS. Compila blocos e instruções apenas para ver a compilação. Aqui já temos um exemplo de comentários em varias linhas ********************************************************************************************** */ // Cabeçalho inicial com diretivas de compilação #CASE // COMPILADOR CASE SENSITIVE. // Padrão da linguagem C #include <16F84.H> // Define processador // Necessário para informar a // quantidade de RAM e ROM disponível // ********************************************************************************************* // protótipos de rotinas void _while(void); // nao recebe e nao devolve void _do_while(void); // nao recebe e nao devolve parametros void _switch(void); // nao recebe e nao devolve parametros void _ifs(void); // nao recebe e nao devolve parametros void _for(char j); // recebe um char como parametro // mas nao devolve nada float quadrado(char q); // recebe char e deve devolver float // ********************************************************************************************* // constantes e variaveis char a,b,c,d,e; // variaveis de 8 bits long int aa,bb,cc,dd,ee; // variaveis de 16 bits float VarFloat; // variavel de 32 bits short Led; // Led será um pino de I/O float const PI = 3.14; // definicao de constante tipo float char Temperatura[20]; // definiçao de uma matriz de 20 elementos Linguagem C para microcontroladores PIC Parte I - Iniciação à linguagem C VIDAL Projetos Personalizados - (011) - 6451 - 8994 / 9378 - 0101 - www.vidal.com.br 27
Docsity logo



Copyright © 2024 Ladybird Srl - Via Leonardo da Vinci 16, 10126, Torino, Italy - VAT 10816460017 - All rights reserved