Professional Documents
Culture Documents
SUMRIO ARQUIVO 4
SUMRIO ARQUIVO 4
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.
Linguagem de mquina (dcada de 1940) Assembly (dcada de 1950) Fortran (dcada de 1950)
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.
case
char const continue default do
enum
extern float for goto if
register
return short signed sizeof static
typedef
union unsigned void volatile while
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.
10
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.
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:
14
15
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 //******************************************************************* }
17
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.
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.
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.
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
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; }
23
TIPOS DE DADOS
A linguagem C possui cinco tipos bsicos de dados:
caractere (char) inteiro (int)
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.
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.
25
TIPOS DE DADOS
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.
27
IDENTIFICADORES
Chamamos de identificador o nome atribudo a uma varivel, constante, funo, label e a outros elementos do sistema.
proibido na linguagem C um identificador iniciar com um valor numrico. proibido tambm utilizar palavras reservadas como identificador.
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.
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;
30
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.
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
33
VARIVEIS LOCAIS
Como a varivel local destruda na sada da funo possvel declarar variveis locais com o mesmo identificador em funes diferentes.
void funcao2 (void) { unsigned int x = 0; //declarao de varivel local inicializada x++; //x = x + 1 }
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 }
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 }//*******************************************************************
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.
37
PROGRAMA-FONTE MAIN_04.C
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 }//*******************************************************************
39
EXECUTANDO A APLICAO
40
41
Para que uma varivel possa ser criada na memria rom ela deve ter escopo global, ou seja, deve ser declarada fora de qualquer funo.
42
43
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
44
45
46
47
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
48
49
extern
static register
auto
50
51
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 {
//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 }//*******************************************************************
52
53
54
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.
55
56
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 }//*******************************************************************
58
EXECUTANDO A APLICAO
59
60
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.
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 }//*******************************************************************
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
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.
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
66
67
Y valor numrico
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 }//*******************************************************************
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 }//*******************************************************************
70
71
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.
72
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.
73
EXERCCIOS
1. Quais palavras reservadas foram adicionadas Linguagem C quando ela foi padronizada pelo C ANSI?
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?
76