You are on page 1of 76

MICROCONTROLADORES Baseado no PIC18F4520

ARQUIVO 4 INTRODUO LINGUAGEM C


1

SOBRE ESTE MATERIAL


Este material para uso individual. Todos os direitos reservados. Proibida a distribuio total ou parcial deste material, por qualquer meio ou processo, sem a expressa autorizao do autor. Essas proibies aplicam-se tambm s caractersticas grficas da obra e sua editorao. A violao dos direitos autorais punvel como crime (art. 184 e pargrafos, do Cdigo Penal, cf. Lei no 6.895, de 17.12.80) com pena de priso e multa, conjuntamente com busca e apreenso e indenizaes diversas (artigos 102, 103 pargrafo nico, 104, 105, 106 e 107 itens 1, 2 e 3 da Lei no 9.610, de 19/06/98, Lei dos Direitos Autorais). Certos materiais contidos neste arquivo foram includos com a permisso da Microchip Technology Incorporated. Nenhuma distribuio, reimpresso ou reproduo do material citado pode ser feita sem o consentimento por escrito da Microchip Technology Inc.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

SUMRIO ARQUIVO 4

Especificadores de Tipo de Armazenamento de classe


Microcontroladores PIC18F4520 com Linguagem C Wagner da Silva Zanco

SUMRIO ARQUIVO 4

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

OBJETIVOS

Conhecer os elementos bsicos da Linguagem C. Classificar os diversos tipos de variveis em um programa escrito em C quanto ao seu escopo. Utilizar os qualificadores, modificadores de tipos de acesso e especificadores de tipo para alterar a forma como as variveis so acessadas na Linguagem C.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

Linguagem de mquina (dcada de 1940) Assembly (dcada de 1950) Fortran (dcada de 1950)

EVOLUO DAS LINGUAGENS DE PROGRAMAO

Basic (dcada de 1950)


Pascal (dcada de 1960) Cobol (dcada de 1960) Linguagem C (dcada de 1970) C++ (dcada de 1990) Visual Basic (dcada de 1990) Java (dcada de 1990)

PHP (dcada de 1990)


C# (dcada de 1990)
Microcontroladores PIC18F4520 com Linguagem C Wagner da Silva Zanco

LINGUAGENS DE PROGRAMAO MAIS UTILIZADAS NA ATUALIDADE


Alto nvel Aplicaes Windows e Web Java, PHP e C# Sistemas Embarcados Microcontroladores e DSPs Assembly e Linguagem C Controladores Lgicos Programveis - CLPs Ladder
Microcontroladores PIC18F4520 com Linguagem C Wagner da Silva Zanco

INTRODUO LINGUAGEM C
A linguagem C foi inventada por Dennis M. Ritchie no incio da dcada de
1970 no Laboratrios Bell.
Em 1983 o American National Standards Institute (ANSI) criou um comit que iria padronizar definitivamente a Linguagem C. Em 1989 foi publicado o padro ANSI X3.159-1989, Mais conhecido como C ANSI. Dentre os aperfeioamentos implementados, cinco palavraschaves(ou reservadas) se juntaram s 27 criadas por Dennis Ritchie, transformando a j muito popular linguagem C em uma das mais utilizadas linguagens de programao. As palavras reservadas includas no padro C ANSI foram enum, const, signed, void e volatile.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

PALAVRAS RESERVADAS DA LINGUAGEM C


auto break double else int long struct switch

case
char const continue default do

enum
extern float for goto if

register
return short signed sizeof static

typedef
union unsigned void volatile while

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

LINGUAGEM C, A PREFERIDA

Alm das palavras 32 reservadas do padro C ANSI cada compilador C possui as suas prprias palavras reservadas utilizadas em funes especficas.

Sendo considerada uma linguagem de nvel mdio, ao combinar elementos de linguagens de alto nvel com a funcionalidade da Linguagem Assembly, o C tornou-se a linguagem de programao preferida dos programadores profissionais.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

10

PRINCIPAL COMPONENTE DA LINGUAGEM C


O principal componente estrutural da linguagem C o que ns chamamos de funo. Uma funo formada por um conjunto de comandos que so agrupados em um ou mais blocos chamados de blocos de cdigo. A funo executa uma tarefa bem definida dentro do programa e pode fazer com que a sua aplicao tenha uma estrutura modular, o que essencialmente bem vindo quando desejamos desenvolver aplicaes complexas.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

11

FUNO DO PONTO DE VISTA LGICO Do ponto de vista lgico uma funo um bloco de comandos que executa
uma tarefa bem definida. A funo, quando executada, pode receber informaes necessrias para a correta execuo da tarefa que lhe foi atribuda, as informaes recebidas por uma funo so chamadas de parmetros formais. Ao final da execuo a funo pode retornar um valor.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

12

FUNO MAIN()
Um programa escrito em linguagem C deve ter pelo menos uma funo, que a funo main(). Vejamos o programa-fonte a seguir, editado no arquivo main.c.
void main(void) { }

A primeira linha do programa faz uma chamada funo main(), obrigatria em qualquer programa escrito em C. O void antes do main significa que esta funo no retorna nenhum valor. O (void) aps o main significa que a funo no est recebendo nenhum parmetro, que poderia ser um valor numrico, uma varivel, uma srting, um ponteiro para um endereo, etc. O caractere abre-chave { indica o incio da funo e o fecha-chave } o final. O programa-fonte main.c ser compilado com sucesso pelo MPLAB C18, embora ele no execute nenhuma tarefa propriamente dita.
Microcontroladores PIC18F4520 com Linguagem C Wagner da Silva Zanco

13

COMENTRIOS EM C
Um comentrio pode ser inserido de duas formas em um programa-fonte escrito em linguagem C:

Comentrio de linha simples


Comentrio de linhas mltiplas Comentrio de linha simples - Deve ser precedido pelos caracteres especiais //, e tratar como comentrio tudo que vier aps, at o fim da linha. O comentrio de linhas mltiplas - Deve sempre comear com os caracteres especiais /* e terminar com os */. Alm disso, ele poder conter vrias linhas.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

14

MEU PRIMEIRO PROGRAMA EM C


No programa-fonte main_02.c foi inserido um cabealho na forma de comentrio. O cabealho foi inserido no programa-fonte como um comentrio de linhas mltiplas. Veja no exemplo a seguir que existem seis comentrios de linha simples e um comentrio de linha mltipla.
/********************************************************************* Nome do arquivo: main_02.c Data: 11 de novembro de 2008 Versao: 1.0 Editor: MPLAB IDE: v8.20a Autor: Wagner Zanco *********************************************************************/ #include <stdio.h> //diretiva de compilao //******************************************************************** void main(void) //funo main { printf ("Seja bem-vindo!\n"); //envia para a UART O texto: Seja bem-vindo! While (1); //loop infinito //******************************************************************* }

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

15

MEU PRIMEIRO PROGRAMA EM C


A declarao #include <stdio.h> inclui no projeto o arquivo cabealho stdio.h que disponibiliza ao projeto uma biblioteca de funes que podem ser utilizadas quando solicitadas; dentre elas destacamos a funo printf(). A chamada funo printf() em main02.c o primeiro comando executado dentro da funo main(). A funo printf() envia para o dispositivo de sada padro do MPLAB IDE, a UART, a string "Seja bem-vindo!". Obs:. Para que a string passada /********************************************************************* Nome do arquivo: main_02.c comoparmetro para a funo Data: 11 de novembro de 2008 printf() aparecam na guia Uart 1 Versao: 1.0 Editor: MPLAB IDE: v8.20a da janela de sada do projeto Autor: Wagner Zanco necessrio que a UART esteja *********************************************************************/ #include <stdio.h> //diretiva de compilao ativada para a simulao. O //******************************************************************** arquivo 3 mostra como fazer isso. void main(void) //funo main
{ printf ("Seja bem-vindo!\n"); //envia para a UART O texto: Seja bem-vindo! While (1); //loop infinito //******************************************************************* }

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

16

Um arquivo cabealho identificado pela extenso .h. Eles so normalmente utilizados para a definio de variveis, constantes e funes que sero utilizadas na aplicao. Quando arquivo cabealho declarado entre os sinais < e >, o MPLAB C18 vai procur-lo no diretrio de procura da ferramenta de compilao configurado quando o projeto foi criado. O arquivo cabealho stdio.h se encontra no diretrio C:\MCC18\h. O comando while (1); faz o programa entrar em um loop infinito, s saindo dele aps a ocorrncia de um Reset no microcontrolador.
/********************************************************************* Nome do arquivo: main_02.c Data: 11 de novembro de 2008 Versao: 1.0 Editor: MPLAB IDE: v8.20a Autor: Wagner Zanco *********************************************************************/ #include <stdio.h> //diretiva de compilao //******************************************************************** void main(void) //funo main { printf ("Seja bem-vindo!\n"); //envia para a UART O texto: Seja bem-vindo! While (1); //loop infinito //******************************************************************* }

MEU PRIMEIRO PROGRAMA EM C

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

17

MEU PRIMEIRO PROGRAMA EM C


Observe que os dois comandos executados dentro da funo main() so terminados com o caractere ponto e vrgula. Essa uma exigncia da linguagem C, que determina a todos os comandos inseridos em uma funo que sejam terminados com o caractere ponto e vrgula. Quando o programa-fonte main_02.c for simulado e a funo printf() executada aparece na janela de sada do projeto, na guia "SIM Uart1", a mensagem mostrada na figura abaixo, enviada para a UART pela funo printf().

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

18

OUTRAS FUNES
Alm da funo main(), que obrigatria em toda aplicao desenvolvida em C, outras funes podem ser criadas e sero executadas quando forem chamadas.

De um modo geral, uma funo pode receber informaes necessrias para a sua execuo (parmetros formais) e retornar um valor no fim da sua execuo.
Vejamos a seguir a forma geral de definio de uma funo.

tipo nome_da_funo (lista_de_parmetros) { //sequncia de comandos }

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

19

OUTRAS FUNES
tipo nome_da_funo (lista_de_parmetros) { //sequncia de comandos }

tipo: o valor de retorno da funo. Uma funo pode retornar qualquer tipo de dado vlido em C ou no retornar valor nenhum. Para no retornar nenhum valor, tipo deve ser declarado como void. nome_da_funo: o identificador atribudo funo, ou seja, o nome da funo. lista_de_parametros: so informaes que a funo pode receber quando for chamada para que ela seja executada corretamente. Para no receber nenhum valor, lista_de_parametros deve ser declarada como void.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

20

BLOCO DE CDIGO
A funo constituda por uma seqncia de comandos compreendidos entres chaves, sendo eles executados quando a funo for chamada de algum lugar do programa.

Uma seqncia de comandos compreendidos entre chaves denominado um bloco de cdigo.


No se deve esquecer de que uma funo no poder ser chamada em um programa-fonte sem que ela tenha sido antes definida ou prototipada. Veja abaixo um exemplo de bloco de comandos.
{ comando1; comando2; comando3; }

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

21

BLOCO DE CDIGO
O bloco de cdigo a seguir configura os pinos do PIC18F4520 como digitais, configura os pinos de todos os Ports como sada, com exceo do pino RA1 que configurado como entrada. Alm disso, ele aplica nvel lgico '0' em todos os pinos configurados como sada. Esse bloco de cdigo ser executado nas aplicaes apresentadas ao longo do curso sempre que formos utilizar os pinos do PIC18F4520 como digitais.
{ TRISA = 0x02; TRISB = 0x00; TRISC = 0x00; TRISD = 0x00; TRISE = 0x00; ADCON1 = 0x0F; PORTA = 0; PORTB = 0; PORTC = 0; PORTD = 0; PORTE = 0; } //pino RA1 entrada e demais pinos do PORTA sada //PORTB sada //PORTC sada //PORTD sada //PORTE sada //configura os pinos dos PORTA e PORTE como digitais //limpa PORTA //limpa PORTB //limpa PORTC //limpa PORTD //limpa PORTE

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

22

BLOCO DE CDIGO
No exemplo a seguir, o bloco de cdigo ser executado se a expresso x = 10 for verdadeira. Se na varivel x estiver armazenado qualquer valor diferente de 10, o bloco de cdigo no ser executado.

Quando executado, o bloco de cdigo envia para a UART a string "A variavel x contem o valor 10!". Em seguida um comando de atribuio utilizado para setar o pino RB0.
Um bloco de cdigo, quando executado, todos os comandos que fazem parte dele so executados na ordem em que eles aparecem no bloco. O bloco de cdigo identificado como uma unidade lgica nica. No existe a possibilidade de no execuo de qualquer comando de um bloco de cdigo quando ele executado.
If (x ==10) { printf ("A variavel x contem o valor 10!\n"); PORTBbits.RB0 = 1; }

//envia para a UART uma string //pino RB0 = 1

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

23

TIPOS DE DADOS
A linguagem C possui cinco tipos bsicos de dados:
caractere (char) inteiro (int)

ponto flutuante (float)


ponto flutuante de preciso dupla (double) sem valor (void)

Um tipo de dado pode ser convertido em outro tipo pelos modificadores para que eles possam ser adaptados a determinadas situaes.
O padro C ANSI define quatro tipos de modificadores de dados. So eles signed, unsigned, long e short.

Disciplina: Linguagem de Programao

Wagner da Silva Zanco

24

O padro C ANSI especifica apenas a faixa mnima de cada tipo de dado e no o seu tamanho em bytes. Essa definio fica por conta do compilador.

TIPOS DE DADOS

As Tabelas a seguir mostram os tipos de dados e os respectivos tamanhos em bytes suportados pelo compilador MPLAB C18.
Type char (1,2) signed char unsigned char int unsigned int short Size 8 bits 8 bits 8 bits 16 bits 16 bits 16 bits -128 -128 0 -32.768 0 -32.768 Minimum Maximum 127 127 255 32.767 65.535 32.767

unsigned short
short long unsigned short long long unsigned long

16 bits
24 bits 24 bits 32 bits 32 bits

0
-8.388.608 0 -2.147.483.648 0

65.535
8.388.607 16.777.215 2.147.483.647 4.294.967.295

Nota 1: Um char normal sinalizado por default. 2: Um char normal pode ser no sinalizado por default via a opo k da linha de comando.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

25

TIPOS DE DADOS

Type float double

Size 32 bits 32 bits

Minimum exponent -126 -126

Maximum exponent 128 128

Minimum normalized 2-126 1,17549435e 38 2-126 1,17549435e 38

Maximum normalized 2128.(2 2-15) 6,80564693e + 38 2128.(2 2-15) 6,80564693e + 38

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

26

VALORES NEGATIVOS
Em um tipo de dado sinalizado (signed) o bit mais significativo dele representa o sinal, o qual ser nvel lgico '0' quando o valor for positivo e nvel lgico '1' quando o valor for negativo. Os demais bits representam o mdulo do valor se ele for positivo ou o mdulo do valor, em complemento de dois, se o valor for negativo. O valor do tipo char -210, por exemplo, representado na memria pelo valor em hexadecimal 0xFE. A figura abaixo ilustra a ideia.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

27

IDENTIFICADORES
Chamamos de identificador o nome atribudo a uma varivel, constante, funo, label e a outros elementos do sistema.

Um identificador pode conter letras, nmeros e o caractere alfanumrico underline _.


Existe um critrio a seguir quando vamos atribuir nome a um identificador. Ele deve comear com uma letra ou o caractere underline.

proibido na linguagem C um identificador iniciar com um valor numrico. proibido tambm utilizar palavras reservadas como identificador.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

28

VARIVEIS
Variveis so localidades de memria reservadas para armazenamento de dados que sero manipulados durante a execuo do programa, o que chamamos de tempo de execuo.
Quando uma varivel declarada necessrio informar o tipo de dado ela ir receber, ou seja, definir o tipo da varivel.

tipo lista_de_ variveis;

tipo um tipo de dado vlido em C, com exceo do tipo void.


lista_de_variveis o nome das variveis que sero declaradas. Se mais de uma varivel for declarada elas devem estar separadas por vrgula.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

29

VARIVEIS
Se as variveis forem declaradas dentro de uma funo, elas devem ser declaradas no incio da funo, antes de qualquer comando. Variveis declaradas dentro de uma funo so variveis locais.

int x; char y; unsigned int z = 54; float result; unsigned char valor, soma, rot;

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

30

TIPOS DE VARIVEIS QUANTO A SUA NATUREZA


Varivel global Varivel local
Uma varivel global quando ela declarada fora de qualquer funo, inclusive da funo main(). A varivel global se mantm ativa durante toda a execuo do programa. Uma varivel local quando ela declarada dentro de uma funo. A varivel local criada no memento da chamada da funo e destruda na sada da funo.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

31

VARIVEIS LOCAIS

Uma varivel local quando ela declarada dentro de um bloco de cdigo ou dentro de uma funo. As variveis locais, tambm conhecidas como variveis automticas, s so reconhecidas dentro do bloco de cdigo em que elas foram criadas. A varivel local deve ser declarada no incio do bloco, antes de qualquer comando e pode ser inicializada na hora da sua declarao.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

32

VARIVEIS LOCAIS
Quando o bloco de cdigo executado o compilador reserva espao de memria para a varivel, sendo ela destruda na sada do bloco, ou seja, quando o bloco termina de ser executado. O exemplo a seguir mostra como declarar variveis locais dentro de uma funo.

int soma (void) { unsigned int x = 10; unsigned int y = 20; unsigned int z; z = x + y; return z; }

//declarao de varivel local inicializada //declarao de varivel local inicializada //declarao de varivel local no inicializada //z recebe resultado da soma entre x e y //retorna o valor de z

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

33

VARIVEIS LOCAIS
Como a varivel local destruda na sada da funo possvel declarar variveis locais com o mesmo identificador em funes diferentes.

void funcao1 (void) { unsigned int x ; x = 10; }

//declarao de varivel local no inicializada //x recebe o valor 10

void funcao2 (void) { unsigned int x = 0; //declarao de varivel local inicializada x++; //x = x + 1 }

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

34

PARMETROS FORMAIS
Uma funo pode ser declarada com a possibilidade de receber informaes necessrias para a sua correta execuo quando ela for chamada. Variveis locais criadas lista_de_parmetros. nesse campo so chamadas de

Na hora em que a funo for chamada a varivel criada no campo lista_de_parmetros recebe o valor passado para a funo como um parmetro. A varivel x na definio abaixo um parmetro formal. Ela tem escopo local.
void func_01(char x) { //bloco de comandos }

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

35

PROGRAMA-FONTE MAIN_03.C
/********************************************************************* Nome do arquivo: main_03.c Data: 13 de novembro de 2008 Versao: 1.0 Editor: MPLAB IDE: v8.20a Autor: Wagner Zanco *********************************************************************/ #include <stdio.h> //diretiva de compilao //******************************************************************* //definio de funo void _parametros (unsigned char c) //funo _parametros { unsigned char y; //declarao de varivel local inicializada y = c + 25; //y = c + 25 printf("y = %u\n",y); //envia para a UART o valor de y } //******************************************************************* //******************************************************************* void main(void) //funo main { _parametros (15); //chamada funo com passagem de parmetro while (1); //loop infinito }//*******************************************************************

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

36

VARIVEIS GLOBAIS
Uma varivel global aquela que foi declarada fora de qualquer funo, inclusive da funo main(). A varivel global, aps ter sido criada, se manter ativa durante toda a execuo do programa, podendo ser utilizada em qualquer funo dentro do programa, at mesmo em funes que foram chamadas de arquivos diferentes daqueles em que as variveis globais foram criadas. necessrio ter cuidado com uma varivel global quando ela for manipulada em vrias partes diferentes do programa para que no ocorram efeitos colaterais, ou seja, o acesso a ela em uma parte do programa no pode provocar mau funcionamento em outra parte.

Esse problema pode ser facilmente resolvido com o uso de variveis locais em vez de variveis globais.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

37

PROGRAMA-FONTE MAIN_04.C

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

38

PROGRAMA-FONTE MAIN_04.C
/********************************************************************* Nome do arquivo: main_04.c Data: 13 de fevereiro de 2010 Versao: 1.0 Editor: MPLAB IDE Autor: Wagner Zanco *********************************************************************/ #include <stdio.h> //diretiva de compilao //******************************************************************* //variveis globais unsigned char x; //declarao de varivel global no inicializada unsigned char y; //declarao de varivel global no inicializada unsigned int z = 0; //declarao de varivel global inicializada //******************************************************************* void main(void) //funo main {

x = 20; //inicializa a varivel x com 20 y = 50; //inicializa a varivel x com 50 z = x * y; //z = x * 1 printf("z = %d\n",z); //escreve o vdeo while (1); //loop infinito }//*******************************************************************

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

39

EXECUTANDO A APLICAO

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

40

QUALIFICADORES ROM e RAM


Uma varivel global pode ser armazenada tanto na memria de dados quanto na memria de programa. Os qualificadores rom e ram no foram definidos no padro C ANSI, mas sim introduzidos pelo MPLAB C18 para permitir a criao de variveis tanto na memria de programa quanto na memria de dados. Os qualificadores rom e ram definiro se a varivel ser criada, respectivamente, na memria de programa ou na memria de dados. Quando no feita referncia a esses qualificadores a varivel ser criada na memria de dados. Esse o caso das variveis x, y e z no programa main_04.c, que foram criadas na memria de dados. O mesmo resultado seria obtido se elas tivessem sido declaradas da seguinte forma:
ram unsigned char x; ram unsigned char y; ram unsigned int z = 0; //declarao de varivel global no inicializada //declarao de varivel global no inicializada //declarao de varivel global inicializada

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

41

QUALIFICADORES ROM e RAM


Para criar essas mesmas variveis na memria de programa o identificador deve ser precedido do qualificador rom, como mostrado a seguir.
rom unsigned char x; rom unsigned char y; rom unsigned int z = 0; //declarao de varivel global no inicializada //declarao de varivel global no inicializada //declarao de varivel global inicializada

Para que uma varivel possa ser criada na memria rom ela deve ter escopo global, ou seja, deve ser declarada fora de qualquer funo.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

42

QUALIFICADORES FAR E NEAR


Os qualificadores far e near no foram definidos no padro C ANSI, mas introduzidos pelo MPLAB C18. O qualificador near informa ao compilador que a varivel criada na memria de dados ser acessada via Access Bank, ou seja, sem a necessidade de efetuar o chaveamento entre os bancos de memria. Se for utilizado o qualificador far em vez do near, o acesso varivel ser feito via endereamento direto utilizando registrador BSR, responsvel pelo chaveamento entre os bancos de memria. O Access Bank diminui a quantidade de instrues e, consequentemente, o tempo gasto para ler ou escrever na varivel.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

43

QUALIFICADORES FAR E NEAR


Testes efetuados no MPLAB C18 mostraram que no possvel declarar uma varivel global na memria de dados com o qualificador near, uma vez que o acesso a esse tipo de varivel feito, por padro, via endereamento direto, por meio do registrador BSR. O MPLAB C18 emitiria um erro se no programa-fonte main_04.c as variveis globais x, y e z fossem declaradas da seguinte forma:

ram near unsigned char x; ram near unsigned char y; ram near unsigned int z = 0;

//declarao de varivel global no inicializada //declarao de varivel global no inicializada //declarao de varivel global inicializada

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

44

QUALIFICADORES FAR E NEAR


Os qualificadores far e near associados ao identificador, quando a varivel for criada na memria de programa, tem um significado diferente daquele atribudo a eles com relao varivel criada na memria de dados. Na memria de programa, o qualificador near ordena ao compilador enderear a varivel global com 16 bits de endereos o que, na prtica, significa que a varivel ser alocada nos primeiros 64k de endereos da memria de programa. Caso o qualificador seja o far o endereamento ser efetuado com 24 bits de endereos. Isso significa que a varivel pode ser alocada em um endereo acima dos primeiros 64k de memria de programa. Como o PIC18F4520 s possui 32k de memria de programa, no existe a necessidade de declarar variveis globais na memria de programa utilizando o qualificador far.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

45

MODIFICADOR DE TIPO DE ACESSO CONST


O modificador de tipo de acesso const utilizado quando desejamos criar uma varivel e no permitir que o seu contedo seja alterado por algum elemento do sistema durante o tempo de execuo. Quando uma varivel declarada com o modificador const, aps a sua inicializao ningum pode alterar o seu contedo, mesmo que seja tentado, por exemplo, com um operador de atribuio. Nesse caso, o MPLAB C18 detecta o conflito e emite um erro em tempo de compilao.

const unsigned int x = 10;

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

46

MODIFICADOR DE TIPO DE ACESSO CONST


O programa-fonte a seguir no ser compilado corretamente. Veja que a varivel z foi declarada como const e a funo main() tenta atribuir um valor diferente a ela.
/********************************************************************* Nome do arquivo: erro_01.c Data: 13 de novembro de 2008 Versao: 1.0 MPLAB IDE: v8.20a Autor: Wagner Zanco *********************************************************************/ #include <stdio.h> //diretiva de compilao //******************************************************************* const unsigned int x = 10; //declarao de varivel global inicializada //******************************************************************* void main(void) //funo main { x = 20; //atribui a varivel x o valor 20 while (1); //loop infinito }//*******************************************************************

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

47

MODIFICADORES DE TIPO DE ACESSO VOLATILE


O modificador de tipo de acesso volatile utilizado quando uma determinada varivel poder ser alterada por algum elemento externo ao programa, sem que seja utilizado um comando de atribuio.

O comando de atribuio utilizado no programa para armazenar, por meio de uma instruo de programa, uma informao na varivel. Uma varivel que atualizada automaticamente por um relgio/calendrio um exemplo de uma varivel que deveria ser declarada com o modificador volatile.
Uma varivel que recebe de um conversor A/D pulsos PCM deve ser declarada como volatile, como mostra o exemplo a seguir.
volatile unsigne char receive_ad; //declarao de varivel atualizada que ser //atualizada pelo conversor A/D

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

48

MODIFICADORES DE TIPO DE ACESSO VOLATILE


Abra o arquivo cabealho p18f4520.h no MPLAB IDE, armazenado no diretrio C:\MCC18\h, e veja que os registradores PORTA, PORTB, PORTC, PORTD e PORTE foram declarados com o modificador volatile. Tomemos o exemplo do registrador PORTA, mapeado na memria RAM no endereo F80h. O microcontrolador pode receber informaes pelos pinos do Port A vindas de um dispositivo externo. Como o contedo do registrador PORTA pode ser alterado por um dispositivo externo quando os pinos do Port A estiverem configurados como pinos de entrada, o registrador PORTA teve de ser declarado com o modificador volatile. O mesmo raciocnio vale para os registradores PORTx associados aos outros Ports.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

49

ESPECIFICADORES DE TIPO DE ARMAZENAMENTO DE CLASSE


O padro C ANSI suporta quatro tipos de especificadores de tipos e classe de armazenamento, que definiro como as variveis sero acessadas na memria. So eles:

extern
static register

auto

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

50

ESPECIFICADOR DE TIPO EXTERN


O especificador extern utilizado na declarao da varivel quando ela for criada em um determinado arquivo e precisar ser acessada de um outro arquivo. O procedimento correto nesse caso : declarar a varivel em um arquivo. declar-la com o especificador extern no outro arquivo em que ela ser acessada. O compilador saber que a varivel foi declarada em outro arquivo por causa do especificador extern. O especificador extern s funciona quando a varivel declarada como global no arquivo de origem.
Microcontroladores PIC18F4520 com Linguagem C Wagner da Silva Zanco

51

ESPECIFICADOR DE TIPO EXTERN


Arquivo soma.c /******************************************************************** * Nome do arquivo: soma.c Data: 13 de novembro de 2008 Versao: 1.0 Editor: MPLAB IDE: v8.20a Autor: Wagner Zanco ********************************************************************* / void soma(void) //funo soma { extern unsigned char x;

Arquivo main_05.c /********************************************************************* Nome do arquivo: main_05.c Data: 13 de novembro de 2008 Versao: 1.0 Editor: MPLAB IDE: v8.20a Autor: Wagner Zanco *********************************************************************/ #include <stdio.h> //diretiva de compilao //******************************************************************* unsigned char x; /*declarao de varivel global no inicializada*/ //******************************************************************* void main(void) //funo main {

/*declarao de varivel externa*/

x += 20; //x = x + 20 } //******************************************************************

//sequncia de comandos x = 10; //x=10 soma( ); //chamada funo soma() printf ("x = %u\n",x); //envia para a UART o valor de x while (1); //loop infinito }//*******************************************************************

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

52

ESPECIFICADOR DE TIPO EXTERN


Crie um projeto no MPLAB IDE com o nome Project_02 e associe os arquivos main5.c e soma.c ao projeto.

A janela da rea de trabalho do projeto deve apresentar-se como a da figura abaixo.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

53

ESPECIFICADOR DE TIPO EXTERN


Crie um projeto no MPLAB IDE com o nome Project_02 e associe os arquivos main5.c e soma.c ao projeto.

A janela da rea de trabalho do projeto deve apresentar-se como a da figura abaixo.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

54

ESPECIFICADOR DE TIPO STATIC

Ao contrrio do extern, o especificador static pode ser utilizado tanto com variveis locais quanto com variveis globais.
Entretanto, como veremos nos prximos slaids, ele produz efeitos diferentes em cada um desses tipos de variveis.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

55

VARIVEIS LOCAIS STATIC


Quando uma varivel local declarada como static, o compilador alocar memria como se ela fosse uma varivel global. Em outras palavras, ela se manter ativa durante todo o tempo de execuo. Pelo fato da varivel ser do tipo local, ela s ser reconhecida dentro do bloco de cdigo no qual ela foi criada. O uso da varivel local static indicado em situaes em que a funo na qual ela foi declarada chamada vrias vezes em tempo de execuo, mas o seu contedo no deve ser perdido entre as chamadas. Uma varivel local static uma varivel local que retm o seu contedo entre chamadas.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

56

VARIVEIS LOCAIS STATIC

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

57

PROGRAMA-FONTE MAIN_06.C
/********************************************************************* Nome do arquivo: main_06.c Data: 14 de novembro de 2008 Versao: 1.0 Editor: MPLAB IDE: v8.20a Autor: Wagner Zanco *********************************************************************/ #include <stdio.h> //diretiva de compilao //******************************************************************* unsigned char x = 0; //declarao de varivel global inicializada //******************************************************************* //definio de funo char inc_y(void) //funo inc_y { static char y = 0; //declarao de varivel local static inicializada y++; //y = y + 1 return y; //retorna y }//******************************************************************* void main(void) //funo main { while(x < 10) //executa bloco de cdigo a seguir enquanto x < 10 { x = inc_y( ); //chamada funo com retorno de valor printf("x = %u\n",x); //envia para a UART o valor de x } while(1); //loop infinito }//*******************************************************************

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

58

EXECUTANDO A APLICAO

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

59

ESPECIFICADOR DE TIPO REGISTER


Esse especificador foi definido para ser utilizado com microprocessadores, que na poca no tinham memria RAM interna, mas tinham uns poucos registradores internos nos quais poderiam ser armazenados dados temporrios. Uma varivel declarada com o especificador register permite ao microprocessador utilizar os registradores internos para armazenar dados temporrios, o que pode aumentar a velocidade de algumas operaes, como clculos matemticos. Uma varivel declarada como register ser armazenada em um dos registradores internos da CPU.

register int temp;

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

60

ESPECIFICADOR DE TIPO AUTO

O especificador auto utilizado para dar a uma varivel escopo local. Isso no necessrio uma vez que o compilador, quando cria uma varivel, ele automaticamente atribui a ela escopo local.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

61

OVERLAY
O especificador overlay foi introduzido pelo MPLAB C18 em adio aos especificadores anteriores, definidos no padro C ANSI. No entanto, o especificador overlay s aplicado quando o compilador est operando no modo no estendido. O especificador overlay s pode ser aplicado a variveis locais, com exceo daquelas definidas como parmetros de funes. Vejamos o exemplo a seguir.
//******************************************************************* int funcao1(void) //funo funcao1 { overlay int x = 10; //declarao de varivel local inicializada return x; //retorna o valor de x }//******************************************************************* int funcao2(void) //funo funcao2 { overlay int y = 20; //declarao de varivel local inicializada return y; //retorna o valor de y }//*******************************************************************

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

62

OVERLAY
O MPLAB C18 tenta alocar o mesmo endereo na memria para as variveis locais x e y. Isso pode ser feito, uma vez que as variveis x e y no so ativadas simultaneamente. Quando uma varivel declarada com o especificador overlay ela alocada estaticamente, mas diferente da varivel static, uma varivel overlay inicializada todas as vezes em que a funo na qual ela foi criada chamada.
//******************************************************************* int funcao1(void) //funo funcao1 { overlay int x = 10; inicializada return x; //retorna o valor de x }//******************************************************************* int funcao2(void) //funo funcao2 { overlay int y = 20; inicializada return y; //retorna o valor de y }//******************************************************************* //declarao de varivel local //declarao de varivel local

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

63

OVERLAY
A vantagem de usar variveis declaradas com o especificador overlay que, pelo fato de serem estaticamente alocadas, em geral, um nmero menor de instrues exigido para acess-las. Isso pode fazer uma grande diferena quando vamos desenvolver aplicaes complexas que exigem uma grande quantidade de memria de programa disponvel.

Do mesmo modo, um nmero menor de localidades de memria de dados pode ser requisitado com o uso do especificador overlay em vez do especificador static, uma vez que algumas variveis podem ser sobrepostas na memria de dados pelo fato de no estarem ativadas simultaneamente.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

64

TYPEDEF
Esse comando permite que seja atribudo um novo nome a um tipo de dado. Ele no cria outro tipo de dado, apenas atribui um novo nome ao tipo de dado relacionado. Vejamos o exemplo a seguir.
typedef int inteiro;

O comando acima atribuiu um novo nome ao tipo de dado int. O identificador inteiro pode ser utilizado no programa-fonte em substituio ao tipo de dado int na declarao de uma varivel, por exemplo. A varivel criada continua sendo do tipo int. Aps a utilizao do especificador typedef, podemos fazer uso da sintaxe seguinte para declarar uma varivel do tipo int.
inteiro result;

A varivel result do tipo int. Apenas utilizamos o identificador inteiro para representar o tipo int. Isso foi possvel porque ns utilizamos o especificador typedef para atribuir um novo nome ao tipo de dado int.
Microcontroladores PIC18F4520 com Linguagem C Wagner da Silva Zanco

65

ATRIBUIO DE ENDEREO A UMA VARIVEL


Ao contrrio da linguagem Assembly, na qual frequentemente atribudo um endereo fixo varivel no momento da sua declarao, em C normalmente deixa-se essa tarefa a cargo do compilador.
A ferramenta responsvel pela atribuio do endereo varivel o linker editor. Ele o responsvel, entre outras coisas, pela criao do programa objeto. Por ora, saibamos apenas que a linguagem C permite que o programador atribua um endereo fixo varivel na sua declarao. Posteriormente aprenderemos a declarar variveis globais e locais atribuindo um endereo fixo a elas. Deixemos, no momento, essa tarefa a cargo do compilador.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

66

INICIALIZAO DE VARIVEIS E DE CONSTANTES


muito comum efetuarmos a inicializao de uma varivel na hora da sua criao. A inicializao de uma varivel pode ser feita depois que a varivel foi declarada, mas no se deve esquecer de faz-lo antes da varivel ser manipulada pelo programa. A forma geral de inicializao de uma varivel mostrada a seguir. tipo nome_da_varivel = constante A constante o valor que ser atribudo a varivel, podendo ser qualquer tipo de dado vlido em C, desde que a varivel o suporte. Vejamos os exemplos a seguir.
char ch = a; int mult = 100; float pont_flut = 126.67; //declarao de varivel inicializada //declarao de varivel inicializada //declarao de varivel inicializada

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

67

SISTEMAS DE NUMERAO SUPORTADOS PELO C 18


Decimal - YY
Hexadecimal 0xYY Octal OYY Binrio 0bYYYYYYYY ASCII Y

Y valor numrico

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

68

DIRETIVA #DEFINE
A diretiva de compilao #define pode ser utilizada para a declarao de constantes na Linguagem C. Sua funo associar um valor numrico a uma string. Vejamos o exemplo a seguir.
//******************************************************************* #define maximo 25 //******************************************************************* int funcao1(void) //funo funcao1

{
int x = maximo; //declarao de varivel local inicializada printf("x = %u\n",x); //envia para a UART o valor de x return x; //retorna o valor de x }//*******************************************************************

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

69

CONSTANTE STRING
Uma constante pode ser um valor numrico, um caractere ou uma string. Existe uma distino na representao de um caractere e de uma string. Um caractere representado entre apstrofos e uma string representada entre aspas. Sendo assim, 'A' um caractere, enquanto "A" uma string de um nico caractere. Vejamos o exemplo a seguir. Veja que a funo2(), quando for executada, envia para a UART a constante string, definida anteriormente.

#define string "Hoje e domingo!" //******************************************************************* void funcao2(void) //funo funcao1 { printf(string); //envia para a UART a constante string }//*******************************************************************

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

70

RESUMO SOBRE VARIVEIS


Variveis globais devem ser declaradas fora de qualquer funo, inclusive da funo main(). Uma varivel global pode ser acessada de qualquer parte do programa, inclusive de funes localizadas em arquivos diferentes daquele no qual ela foi criada. Uma varivel (local ou global) pode ser criada na memria de dados ou na memria de programa. O endereo de memria ocupado por uma varivel (local ou global) pode ser atribudo pelo programador ou pelo compilador. Uma varivel (local ou global) pode ser inicializada no momento da sua criao. O compilador no acessa uma varivel global criada na memria de dados via Access Bank. Sendo assim, ela no pode ser declarada com o qualificador near.
Microcontroladores PIC18F4520 com Linguagem C Wagner da Silva Zanco

71

RESUMO SOBRE VARIVEIS


Vrias variveis (local ou global) podem ser declaradas na mesma linha se forem do mesmo tipo. Uma varivel (local ou global) pode ser inicializada por um comando de atribuio na hora da sua declarao ou posteriormente.

Uma varivel pode ter o seu contedo alterado por algum dispositivo externo ao programa.
Uma varivel global pode ser escondida do resto do programa. Uma varivel (local ou global) pode ser inicializada com um determinado valor sem que o seu contedo possa ser alterado durante o tempo de execuo.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

72

RESUMO SOBRE VARIVEIS

Uma varivel local s reconhecida dentro do bloco de cdigo ou da funo em que ela foi declarada, sendo ela destruda na sada do bloco de cdigo. Uma varivel local static retm o seu contedo entre as chamadas da funo na qual ela foi declarada, porm continua escondida do resto da aplicao. Uma varivel global static s reconhecida dentro do arquivo no qual ela foi criada.

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

73

EXERCCIOS
1. Quais palavras reservadas foram adicionadas Linguagem C quando ela foi padronizada pelo C ANSI?

2. Um programa-fonte deve ter pelo menos uma funo. Qual?


3. O que representa a lista_de_parmetros na definio de uma funo? 4. O que bloco de cdigos?

5. Cite cinco tipos de dados vlidos em C. Quais os seus tamanhos aproximados, em bits, e a faixa mnima de valores?
6. Qual a funo do identificador? Como ele deve ser iniciado? 7. Qual a principal diferena entre uma varivel global e uma varivel local? 8. Qual o principal componente estrutural da linguagem C? Defina-o. 9. Como a funo tratada do ponto de vista lgico?
Microcontroladores PIC18F4520 com Linguagem C Wagner da Silva Zanco

74

EXERCCIOS
10. Um comentrio em C pode ser de dois tipos diferentes. Quais? Explique. 11. Qual o objetivo de se incluir um arquivo cabealho em um programa-fonte em C? 12. Qual a forma geral de declarao de uma funo em C? 13. Que modificadores permitem alterar um tipo bsico de dado em outros tipos de dados? 14. Defina varivel. 15. Qual a forma geral de declarao de uma varivel? 16. Qual a funo dos modificadores de acesso const e volatile? 17. Cite os quatro tipos de especificadores de armazenamento de classe. 18. Quando devemos utilizar o especificador extern? Qual o pr-requisito para que esse especificador funcione corretamente?
Microcontroladores PIC18F4520 com Linguagem C Wagner da Silva Zanco

75

EXERCCIOS
19. Qual o comportamento de uma varivel local declarada como static? 20. Existe diferena entre o comportamento de uma varivel local static e uma varivel global static? Explique. 21. Onde armazenada uma varivel declarada como register? Qual o objetivo de se declarar uma varivel como register? 22. Qual a funo do especificador auto? 23. O que uma constante? 24. Quais os sistemas de numerao suportados pelo MPLAB C18?

25. Explique a funo da diretiva #define.


26. O que diferencia uma string de um caractere?

Microcontroladores PIC18F4520 com Linguagem C

Wagner da Silva Zanco

76