Você está na página 1de 48

Tipos de dados, funo main e tempo

Prof. Rodrigo Maximiano Antunes de Almeida


Universidade Federal de Itajub

rodrigomax@unifei.edu.br

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

1 / 48

Teclado

Reviso

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

2 / 48

Dados Importantes

Terica:

Laboratrio:

Local Sala I.2.1.11 Horrio 15:45-17:35 (ter) Local Sala LEC I / LASER Horrio
P1: P2: P3: P1:

Datas Importantes *:

Levar a placa + adaptador de tomada Prova 01 17/09 Prova 02 26/11 Sub 03/12

8:00-9:45 (qui) ELT025 (LASER) 10:15-12:00 (qui) ELT025 (LASER) 15:50-17:30 (qui) ELT025 (LECI) 13:30-15:10 (ter) ELT802 (LECI)

* Datas
Todas as datas esto sujeitas a alteraes
ELT024 Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

3 / 48

Linguagem C

Referncia circular (rev)

A funo LerTemperatura() faz um teste: se o valor for maior que um patamar chama a funo EnviaSerial() com o cdigo 0x30.
1 #include 2 3

" serial .h" char LerTemperatura ( v o i d ) ; v o i d AjustaCalor ( char val ) ;

A funo LerSerial() receber um valor e repassa para a funo AjustaCalor().


1 #include 2 3

" temp .h" char LerSerial ( v o i d ) ; v o i d EnviaSerial ( char val ) ;

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

4 / 48

Linguagem C

Referncia circular (rev)

temp.h
#include serial.h char LerTemperatura(void); void AjustaCalor(char val);

serial.h
#include temp.h

temp.h
#include serial.h char LerTemperatura(void); void AjustaCalor(char val);

char LerSerial(void); void EnviaSerial(char val);

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

5 / 48

Linguagem C

Referncia circular (rev)

Soluo: criar uma estrutura de controle para pr compilao.


1 #ifndef 2 3 #define // t o d o

TAG_CONTROLE TAG_CONTROLE
o contedo do arquivo vem aqui .

5 #endif

/ /TAG_CONTROLE

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

6 / 48

Linguagem C

Referncia circular(rev)

temp.h
#infdef TEMP_H #define TEMP_H #include serial.h char LerTemperatura(void) void !"usta#alor(char val) #endif

serial.h
#infdef $E%&!L_H #define $E%&!L_H #include temp.h char Ler$erial(void) void Envia$erial(char val) #endif

temp.h
#infdef TEMP_H ''ta( ") definida* ''pula o conte+do #endif

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

7 / 48

Linguagem C

Tipos de dados em C

Tipos de dados em C

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

8 / 48

Linguagem C

Converso Binrio, Decimal, Hexadecimal

Toda informao que inserida num computador armazenada em formato binrio Cada tipo de informao contm uma quantidade diferente de bits Cada bit pode representar informaes diferentes, mesmo dentro de uma mesma varivel

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

9 / 48

Linguagem C

Tipos de dados em C

Tipo

char int oat double

Bits
8 16 32 64

Bytes
1 2 4 8

Faixa de valores

-128 127 -32.768 32.767 3,4 x 10-38 3,4 x 1038 3,4 x 10-308 3,4 x 10308

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

10 / 48

Linguagem C

Converso Binrio, Decimal, Hexadecimal

Quando resolvemos codicar uma informao num formato digital, e portanto nito, sempre existe perda de
informao resoluo amplitude

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

11 / 48

Linguagem C

Converso Binrio, Decimal, Hexadecimal

Exemplos:
1 2 3 4 5 6 }

float x = 0; w h i l e ( x != 4 )
{

printf ( "i" ) ; x += 0 . 4 f ;

1 2 3 4 5 6

char x = while (x
{

0; < 200)

printf ( "i" ) ; x ++;

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

12 / 48

Linguagem C

Converso Binrio, Decimal, Hexadecimal

Converso Binrio-decimal

Dividir o nmero por 2 Anotar o valor do resto (0 ou 1) Se o valor maior que 0 voltar ao nmero 1 Escrever os valores obtidos atravs do passo 2 de trs para frente. Apresentar o resultado

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

13 / 48

Linguagem C

Converso Binrio, Decimal, Hexadecimal

Exercicio 01) Converter os nmeros 18 513 73 60 -15

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

14 / 48

Linguagem C

Converso Binrio, Decimal, Hexadecimal

Nmero 18:
18 2 9 2 4 2 2 2 1 2

= 9, resto

= 4, resto = 2, resto = 1, resto = 0, resto

1 0 0 1

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

15 / 48

Linguagem C

Converso Binrio, Decimal, Hexadecimal

A representao de nmeros negativos feita atravs do MSB


0 = positivo 1 = negativo

Mtodo de converso: complemento de dois

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

16 / 48

Linguagem C

Converso Binrio, Decimal, Hexadecimal

Complemento de dois

Denir tamanho da palavra Achar o representao em binrio positiva com a mesma magnitude Inverter todos os bits Somar um ao resultado

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

17 / 48

Linguagem C

Converso Binrio, Decimal, Hexadecimal

Nmeros fracionrios (ponto utuante)

So divididos em expoente, mantissa e sinal Sinal ocupa apenas um bit, como nos inteiros A mantissa representa os algarismos signicativos O expoente representa a magnitude

Ponto xo

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

18 / 48

Linguagem C

Converso Binrio, Decimal, Hexadecimal

Base Hexadecimal

Possui 16 "unidades"diferentes. 10 algarismos mais 6 letras Facilita escrita de valores binrios Fcil converso bin-hex

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

19 / 48

Linguagem C

Converso Binrio, Decimal, Hexadecimal

Dec
0 1 2 3 4 5 6 7

0000 0001 0010 0011 0100 0101 0110 0111

Bin

Hex
0 1 2 3 4 5 6 7

Dec
8 9 10 11 12 13 14 15

1000 1001 1010 1011 1100 1101 1110 1111

Bin

Hex
8 9 A B C D E F

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

20 / 48

Linguagem C

Converso Binrio, Decimal, Hexadecimal

Exercicio 02) Converter os nmeros 1810 - 100102 51310 - 10000000012 7310 - 10010012 6010 - 1111002 -1510 - 11110012_8bits

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

21 / 48

Linguagem C

Converso Binrio, Decimal, Hexadecimal

Exercicio 02) Converter os nmeros como: 1810 = 1-00102


12 = 116 00102 = 216

logo : 100102 . = 1216 .

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

22 / 48

Linguagem C

Modicadores de tamanho e sinal

Modicadores de tamanho e sinal

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

23 / 48

Linguagem C

Modicadores de tamanho e sinal

Tipo

unsigned char signed char unsigned int signed int long int unsigned long int short int

Bytes
1 1 2 2 4 4 2

Excurso mxima

0 255 -128 127 0 65.535 -32.768 32.767 -2.147.483.648 2.147.483.647 0 4.294.967.295 -32.768 32.767

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

24 / 48

Linguagem C

Modicadores de Acesso

Modicadores de Acesso

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

25 / 48

Linguagem C

Modicadores de Acesso

1 #define 2 3 4 5 } {

X ( * ( near u n s i g n e d char * ) 0 xF83 ) v o i d main ( v o i d )

while

( X != X ) ;

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

26 / 48

Linguagem C

Modicadores de Acesso

Compilando o cdigo anterior temos em assembler:


1 2 3 4 6 //

S_Teste__main _main : . line RETURN

Starting

p C od e

code

block

19

//

Teste . c

while

( X!=X ) ;

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

27 / 48

Linguagem C

Modicadores de Acesso

1 #define 2 3 4 5 } {

X ( * ( v o l a t i l e near u n s i g n e d char * ) 0 xF83 ) v o i d main ( v o i d )

while

( X != X ) ;

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

28 / 48

Linguagem C

Modicadores de Acesso
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

S_Teste__main code _main : _00105_DS_ : . line 19 MOVLW 0 x83 MOVWF r0x00 MOVLW 0 x0f MOVWF r0x01 MOVFF r0x00 , FSR0L MOVFF r0x01 , FSR0H MOVFF INDF0 , r0x00 MOVLW 0 x83 MOVWF r0x01 MOVLW 0 x0f MOVWF r0x02 MOVFF r0x01 , FSR0L MOVFF r0x02 , FSR0H MOVFF INDF0 , r0x01 MOVF r0x00 , W XORWF r0x01 , W BNZ _00105_DS_ RETURN
ELT024

//

Starting

p C od e

block

//

Teste . c

while parte parte do do

( X != X ) ; endereo endereo

// p r i m e i r a // s e g u n d a

// r e a l i z a // p r i m e i r a // s e g u n d a

primeira parte parte do do

leitura endereo endereo

// r e a l i z a

segunda

leitura

// f a z

teste

para

igualdade
29 / 48

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

Linguagem C

Modicadores de Acesso

Utilizao de const:
1 #define 2 3 4 5 6 } // i n i c i o {

(*( do

v o l a t i l e c o n s t near u n s i g n e d char * ) 0 xF83 )

v o i d main ( v o i d )
X
= 3;

programa

A compilao resulta em erro:


1

Teste . c : error 3 3 : Attempt to assign value to a constant variable (=)

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

30 / 48

Linguagem C

Modicadores de Posicionamento

Modicadores de Posicionamento

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

31 / 48

Linguagem C

Modicadores de Posicionamento

Existem dois modicadores de posicionamento


near far

No so padronizadas pela ISO C(99) Indicam ao compilador a regio em que a varivel deve ser colocada
near - regio de acesso mais rpido far - regio de acesso normal

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

32 / 48

Linguagem C

Modicador de persistncia

Modicador de persistncia

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

33 / 48

Linguagem C

Modicador de persistncia

A persistncia de uma varivel pode ser assegurada com o modicador

static

Padronizada pela ISO C(99) Garante que no haver perda de informao na varivel Uma regio de memria reservada apenas para a varivel em questo
1 2 3 4 5 6 7 8 // c r i a um contador a persistente chamada que de

// i n c r e m e n t a d o

i n t ContadorPersistente ( i n t reseta ) { char variavel_persistente ; i f ( reseta ) { variavel_persistente = 0 ; } e l s e { r e t u r n ( variavel_persistente ++) ; } r e t u r n 1;

cada

funo

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

34 / 48

Linguagem C

Modicador de persistncia

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

// c r i a

um

contador a

persistente chamada

que de

// i n c r e m e n t a d o {

i n t ContadorPersistente ( i n t reseta )

cada

funo

s t a t i c char variavel_persistente ; i f ( reseta )


{ } { }

variavel_persistente

0;

else return
(

variavel_persistente ++) ;

r e t u r n 1;

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

35 / 48

Linguagem C

Operaes Aritimticas

Operaes Aritimticas

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

36 / 48

Linguagem C

Operaes Aritimticas

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

v o i d main
{

void )

char var8 ; i n t var16 ; l o n g i n t var32 ; f l o a t pont16 ; double pont32 ; var8 = var8 + var16 ; var8 = var8 + var8 ; var16 = var8 * var8 ; var32 = var32 / var16 ; var32 = pont32 * var32 ; pont16 = var8 / var16 ; pont16 = pont32 * var32 ; pont16 = 40 / 80;

// // // // // // // //

1 2 3 4 5 6 7 8

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

37 / 48

Linguagem C

Funo main()

Funo main()

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

38 / 48

Linguagem C

Funo main()

Endereo Instruo 0x00 P"lo 0x0# 0x8A 0x0! P"lo 0x03 0x55 0x0$ ... 0x55 0x56 0x57 0x58 0x59 0x8A 0x8B 0x8C 0x8D 0x8 Limpa A A recebe 30 Testa A

...
A recebe 50 Salva em Porta B

...

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

39 / 48

Linguagem C

Funo main()

O como indicar o ponto de incio de um programa depende do compilador.

Geralmente apenas a criao da funo main j suciente para o compilador

O linker aloca a funo main() em algum lugar disponvel na memria O linker atualiza o vetor de reset colocando um pulo para a funo main
1 2 3 4 }

v o i d main
{ // a q u i

void )
o cdigo do programa

entra

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

40 / 48

Linguagem C

Funo main()

Ateno!

Para sistemas embarcados a funo main a primeira a ser executada, portanto no pode receber parmetro nenhum. Como ela a ultima a ser executada, tambm no existe a possibilidade de retornar algum valor. Deve ser declarada como:
1 2 3 4 }

v o i d main
{ //

void )
o cdigo aqui .

Insira

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

41 / 48

Linguagem C

Funo main()

Geralmente os sistemas embarcados so feitos para serem continuamente executados As rotinas devem ser cclicas O sistema s para quando desligado
Ateno!

Nesta situao utiliza-se loops innitos.

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

42 / 48

Linguagem C

Funo main()

1 3 4 5 6 7

v o i d main for
{

void )

1 3 4

v o i d main
{

void )

2{

2{ (;;) // a q u i entra o

while (1)
// a q u i } entra o // c d i g o principal

5 6 7 8}

// c d i g o }

principal

8}

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

43 / 48

Linguagem C

Rotinas de Tempo

Rotinas de Tempo

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

44 / 48

Linguagem C

Rotinas de Tempo

muito comum necessitar que o microcontrolador que um tempo sem fazer nada. Uma maneira de atingir esse objetivo utilizar um lao for.
1 2

u n s i g n e d char i ; f o r ( i =0; i < 1 0 ; i++) ;

Ateno!

Notar que no estamos utilizando os colchetes.

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

45 / 48

Linguagem C

Rotinas de Tempo

1 2 3 4 5 6 7

// c d i g o

MOVF

em

r0x00
0 x0a

assembler ,

equivalente

do :

f o r ( i =0; 0

i <10;

i ++) ;

// i n i c i a l i z a // c o l o c a / / muda o o

W com 10

(0 x0a ) F no registro W

SUBLW MOVWF

(1 (1 (1

ciclo ) ciclo )

valor

r0x00
,

valor

de W p a r a

_00107_DS_ : DECFSZ r0x00 BRA


(1 (2 ciclo ) ciclos )

ciclo )

// d e c r e m e n t a // " p u l a " para

F, o

se

F>0

executa

prximo

_00107_DS_

lugar

_00107_DS_

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

46 / 48

Linguagem C

Rotinas de Tempo

So gastos 3 passos para inicializao, cada um de 1 ciclo. Cada iterao gasta 2 passos, um de 1 ciclo e um de 2 ciclos Para um PIC a 8 MHz cada ciclo gasta 0,5 us Se desejamos um tempo de x segundos so necessrias 2 109 x instrues.

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

47 / 48

Linguagem C

Rotinas de Tempo

1 2 3 4 5 6 7 8

u n s i g n e d char i , j , l ; f o r ( i =0; i < 3 4 ; i++) / / 3 + 3 4 * ( 3 0 , 0 0 3 + 3 )


{

= 1 ,020 ,207

instrues instrues

f o r ( j =0; j
{ }

<

100; <

j++)
98;

// 3+100*(297 + 3 ) = 3 0 , 0 0 3 // 3+98*(3) = 297

f o r ( k =0; k

k++) ;

instrues

ELT024

Tipos de dados, funo main e tempo

rodrigomax@unifei.edu.br

48 / 48