You are on page 1of 46

Tipos de dados, funcao main() e rotinas de tempo

Rodrigo Almeida

Universidade Federal de Itajuba

rodrigomax@unifei.edu.br

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 1 / 46
Revisao

Revisao

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 2 / 46
Revisao

Dados Importantes
Teorica:
Local Sala I.2.1.11
Horario 4T12
Laboratorio (ELTP14):
Local Sala LEC II
Horario
P1: 5T12
P2: 5T34
P3: 6T12
P4: 6T34
Datas Importantes *:
Prova 01 05/04
Prova 02 21/06
Sub 05/07

* Datas
Todas as datas estao sujeitas a alteracoes

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 3 / 46
Revisao

Referencia circular (rev)

A funcao LerTemperatura() faz um teste: se o valor for maior que um


patamar chama a funcao EnviaSerial() com o codigo 0x30.

1 # include " serial . h "


2 char LerTempe ratura ( void ) ;
3 void AjustaCalor ( char val ) ;

A funcao LerSerial() recebe um valor e repassa para a funcao


AjustaCalor().

1 # include " temp . h "


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

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 4 / 46
Revisao

Referencia circular (rev)

temp.h

#include serial.h

char LerTemperatura(void);
void AjustaCalor(char val); serial.h

#include temp.h

char LerSerial(void);
void EnviaSerial(char val);
temp.h

#include serial.h

char LerTemperatura(void);
void AjustaCalor(char val);

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 5 / 46
Revisao

Referencia circular (rev)

Solucao: criar uma estrutura de controle para pre compilacao.

1 # ifndef TAG_CONTROLE
2 # define TAG_CONTROLE
3 // todo o c o n t e u d o do arquivo vem aqui .
4
5 # endif // T A G C O N T R O L E

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 6 / 46
Revisao

Referencia circular (rev)

temp.h
#ifndef TEMP_H
#define TEMP_H
#include serial.h

char LerTemperatura(void);
void AjustaCalor(char val); serial.h
#endif
#ifndef SERIAL_H
#define SERIAL_H
#include temp.h

temp.h char LerSerial(void);


void EnviaSerial(char val);
#ifndef TEMP_H #endif

//tag j definida,
//pula o contedo

#endif

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 7 / 46
Tipos de dados em C

Tipos de dados em C

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 8 / 46
Tipos de dados em C

Tipos de dados em C

Toda informacao que e inserida num computador e armazenada em


formato binario;
Cada tipo de informacao contem uma quantidade diferente de bits;
Cada bit pode representar informacoes diferentes, mesmo dentro de
uma mesma variavel.

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 9 / 46
Tipos de dados em C

Tipos de dados em C

Tipo Bits Bytes Faixa de valores


char 8 1 -128 a 127
int 16 2 -32.768 a 32.767
float 32 4 3,4 x 10-38 a 3,4 x 1038
double 64 8 3,4 x 10-308 a 3,4 x 10308

Dependendo....
... da arquitetura, do compilador e das configuracoes.

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 10 / 46
Tipos de dados em C

Conversao Binario, Decimal, Hexadecimal

Quando resolvemos codificar uma informacao num formato digital, e


portanto finito, sempre existe perda de
informacao
resolucao
amplitude

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 11 / 46
Tipos de dados em C

Conversao Binario, Decimal, Hexadecimal

Calcule quantas iteracoes possui cada loop:

1 float x = 0 ;
2
3 while ( x != 4 ) {
4 x += 0 . 4f ;
5 }

1 char x = 0 ;
2
3 while ( x < 200 ) {
4 x ++;
5 }

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 12 / 46
Tipos de dados em C

Conversao Binario, Decimal, Hexadecimal

Conversao Binario-decimal
Dividir o numero por 2
Anotar o valor do resto (0 ou 1)
Se o valor e maior que 0 voltar ao numero 1
Escrever os valores obtidos atraves do passo 2 de tras para frente.
Apresentar o resultado

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 13 / 46
Tipos de dados em C

Conversao Binario, Decimal, Hexadecimal

Exercicio 01) Converter os numeros


18
513
73
60
-15

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 14 / 46
Tipos de dados em C

Conversao Binario, Decimal, Hexadecimal

Numero 18:
18
2 = 9, resto 0
9
2 = 4, resto 1
4
2 = 2, resto 0
2
2 = 1, resto 0
1
2 = 0, resto 1

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 15 / 46
Tipos de dados em C

Conversao Binario, Decimal, Hexadecimal

A representacao de numeros negativos e feita atraves do MSB


0 = positivo
1 = negativo
Metodo de conversao: complemento de dois

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 16 / 46
Tipos de dados em C

Conversao Binario, Decimal, Hexadecimal

Complemento de dois
Definir tamanho da palavra
Achar a representacao em binario positiva com a mesma magnitude
Inverter todos os bits
Somar um ao resultado

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 17 / 46
Tipos de dados em C

Conversao Binario, Decimal, Hexadecimal

Numeros fracionarios (ponto flutuante)


Sao divididos em expoente, mantissa e sinal
Sinal ocupa apenas um bit, como nos inteiros
A mantissa representa os algarismos significativos
O expoente representa a magnitude
Ponto fixo

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 18 / 46
Tipos de dados em C

Conversao Binario, Decimal, Hexadecimal

Base Hexadecimal
Possui 16 unidadesdiferentes.
10 algarismos mais 6 letras
Facilita escrita de valores binarios
Facil conversao bin-hex

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 19 / 46
Tipos de dados em C

Conversao Binario, Decimal, Hexadecimal

Dec Bin Hex Dec Bin Hex


0 0000 0 8 1000 8
1 0001 1 9 1001 9
2 0010 2 10 1010 A
3 0011 3 11 1011 B
4 0100 4 12 1100 C
5 0101 5 13 1101 D
6 0110 6 14 1110 E
7 0111 7 15 1111 F

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 20 / 46
Tipos de dados em C

Conversao Binario, Decimal, Hexadecimal

Exercicio 02) Converter os numeros


1810 - 100102
51310 - 10000000012
7310 - 10010012
6010 - 1111002
-1510 - 111100012 8bits

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 21 / 46
Tipos de dados em C

Conversao Binario, Decimal, Hexadecimal

Exercicio 02) Converter os numeros


como: 1810 = 1-00102
12 = 116
00102 = 216
logo :
100102 . = 1216 .

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 22 / 46
Modificadores de variaveis

Modificadores de variaveis

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 23 / 46
Modificadores de variaveis

Modificadores de tamanho e sinal

Tipo Bytes Excursao maxima


unsigned char 1 0 a 255
signed char 1 -128 a 127
unsigned int 2 0 a 65.535
signed int 2 -32.768 a 32.767
long int 4 -2.147.483.648 a 2.147.483.647
unsigned long int 4 0 a 4.294.967.295
short int 2 -32.768 a 32.767

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 24 / 46
Modificadores de variaveis

Modificadores de Acesso

1 # define X (*( near unsigned char *) 0xF83 )


2 void main ( void ) {
3 while ( X != X ) ;
4 }

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 25 / 46
Modificadores de variaveis

Modificadores de Acesso

Compilando o codigo anterior temos em assembly:

1 // S t a r t i n g pCode block
2 S_Teste__main code
3 _main :
4 . line 19 // Teste . c while ( X != X ) ;
5
6 RETURN

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 26 / 46
Modificadores de variaveis

Modificadores de Acesso

1 # define X (*( volatile near unsigned char *) 0xF83 )


2 void main ( void )
3 {
4 while ( X != X ) ;
5 }

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 27 / 46
Modificadores de variaveis

Modificadores de Acesso
1 S_Teste__main code // S t a r t i n g pCode block
2 _main :
3 _00105_DS_ :
4 . line 19 // Teste . c while ( X != X ) ;
5 MOVLW 0x83 // p r i m e i r a parte do e n d e r e c o
6 MOVWF r0x00
7 MOVLW 0x0f // segunda parte do e n d e r e c o
8 MOVWF r0x01
9 MOVFF r0x00 , FSR0L
10 MOVFF r0x01 , FSR0H
11 MOVFF INDF0 , r0x00 // realiza p r i m e i r a leitura
12 MOVLW 0x83 // p r i m e i r a parte do e n d e r e c o
13 MOVWF r0x01
14 MOVLW 0x0f // segunda parte do e n d e r e c o
15 MOVWF r0x02
16 MOVFF r0x01 , FSR0L
17 MOVFF r0x02 , FSR0H
18 MOVFF INDF0 , r0x01 // realiza segunda leitura
19 MOVF r0x00 , W
20 XORWF r0x01 , W
21 BNZ _00105_DS_ // faz o teste para i g u a l d a d e
22 RETURN

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 28 / 46
Modificadores de variaveis

Modificadores de Acesso

1 # define PORTB (*( near unsigned char *) 0xF83 )


2
3 void main ( void ) {
4 unsigned char val ;
5
6 val = PORTB ;
7
8 // aguarda mudanca ;
9 while ( val != PORTB ) ;
10
11 // valor acabou de mudar
12 }

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 29 / 46
Modificadores de variaveis

Modificadores de Acesso

Utilizacao de const:

1 # define X (*( volatile const near unsigned char *) 0xF83 )


2 // inicio do p r o g r a m a
3 void main ( void )
4 {
5 X = 3;
6 }

A compilacao resulta em erro:

1 Teste . c : error 33 : Attempt to assign value to a constant -


variable (=)

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 30 / 46
Modificadores de variaveis

Modificadores de Posicionamento

Existem dois modificadores de posicionamento


near
far
Nao sao padronizadas pela ISO C(99)
Indicam ao compilador a regiao em que a variavel deve ser colocada
near - regiao de acesso mais rapido
far - regiao de acesso normal

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 31 / 46
Modificadores de variaveis

Modificador de persistencia

A persistencia de uma variavel pode ser assegurada com o


modificador static
Padronizada pela ISO C(99)
Garante que nao havera perda de informacao na variavel
Uma regiao de memoria e reservada apenas para a variavel em
questao

1 // cria um c o n t a d o r p e r s i s t e n t e que e
2 // i n c r e m e n t a d o a cada chamada de func~ ao
3 int C o n t a d o r P e r s i s t e n t e ( int reseta ) {
4 char v a r i a v e l _ p e r s i s t e n t e ;
5 if ( reseta ) { v a r i a v e l _ p e r s i s t e n t e = 0 ;}
6 else { return ( v a r i a v e l _ p e r s i s t e n t e ++) ;}
7 return -1 ;
8 }

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 32 / 46
Modificadores de variaveis

Modificador de persistencia

1 // cria um c o n t a d o r p e r s i s t e n t e que e
2 // i n c r e m e n t a d o a cada chamada de func~ ao
3
4 int C o n t a d o r P e r s i s t e n t e ( int reseta ) {
5 static char v a r i a v e l _ p e r s i s t e n t e ;
6
7 if ( reseta ) {
8 variavel_persistente = 0;
9 } else {
10 return ( v a r i a v e l _ p e r s i s t e n t e ++) ;
11 }
12 return -1 ;
13 }

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 33 / 46
Operacoes Aritimeticas

Operacoes Aritimeticas

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 34 / 46
Operacoes Aritimeticas

Operacoes Aritmeticas

1 void main ( void ) {


2 char var8 ;
3 int var16 ;
4 long int var32 ;
5 float pont16 ;
6 double pont32 ;
7 var8 = var8 + var16 ; // 1
8 var8 = var8 + var8 ; // 2
9 var16 = var8 * var8 ; // 3
10 var32 = var32 / var16 ; // 4
11 var32 = pont32 * var32 ; // 5
12 pont16 = var8 / var16 ; // 6
13 pont16 = pont32 * var32 ; // 7
14 pont16 = 40 / 80 ; // 8
15 }

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 35 / 46
Funcao main()

Funcao main()

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 36 / 46
Funcao main()

Funcao main()

Endereo Instruo
0x00 Pulo
0x01 0x8A
0x02 Pulo
0x03 0x55
0x04 ...

0x55 Limpa A
0x56 A recebe
0x57 30
0x58 Testa A
0x59 ...

0x8A A recebe
0x8B 50
0x8C Salva em
0x8D Porta B
0x8E ...

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 37 / 46
Funcao main()

Funcao main()

O meio de indicar o ponto de incio de um programa depende do


compilador.
Geralmente apenas a criacao da funcao main ja e suficiente para o
compilador
O linker aloca a funcao main() em algum lugar disponvel na memoria
O linker atualiza o vetor de reset colocando um pulo para a funcao
main

1 void main ( void )


2 {
3 // aqui entra o codigo do p r o g r a m a
4 }

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 38 / 46
Funcao main()

Funcao main()

Atencao!
Para sistemas embarcados a funcao main e a primeira a ser executada,
portanto nao pode receber parametro nenhum. Como ela nao e chamada
por nenhuma outra funcao, ela e a ultima a ser executada. Deste modo
nao existe a possibilidade de retornar nenhum valor. Deve ser declarada
como:

1 void main ( void )


2 {
3 // Insira o codigo aqui .
4 }

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 39 / 46
Funcao main()

Funcao main()

Geralmente os sistemas embarcados sao feitos para serem


continuamente executados
As rotinas devem ser cclicas
O sistema so para quando desligado

Atencao!
Nesta situacao utiliza-se loops infinitos.

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 40 / 46
Funcao main()

Funcao main()

1 void main ( void ) { 1 void main ( void ) {


2 for (;;) { 2 while ( 1 ) {
3 // aqui entra o 3 // aqui entra o
4 // codigo p r i n c i p a l 4 // codigo p r i n c i p a l
5 } 5 }
6 } 6 }

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 41 / 46
Rotinas de Tempo

Rotinas de Tempo

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 42 / 46
Rotinas de Tempo

Rotinas de Tempo

E muito comum necessitar que o microcontrolador fique um tempo sem


fazer nada. Uma maneira de atingir esse objetivo e utilizar um laco for.

1 unsigned char i ;
2 for ( i = 0 ; i < 10 ; i ++) ;

Atencao!
Notar que nao estamos utilizando os colchetes depois do for.

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 43 / 46
Rotinas de Tempo

Rotinas de Tempo

1 // codigo em a s s e m b l y e q u i v a l e n t e do : for ( i = 0 ; i<10 ; i ++) ;


2 MOVF r0x00 , W // i n i c i a l i z a W com 0 ( 1 ciclo )
3 SUBLW 0x0a // coloca 10 ( 0x0a ) no r e g i s t r o W ( 1 ciclo )
4 MOVWF r0x00 // muda o valor de W para F ( 1 ciclo )
5 _00107_DS_ : // label ( e t i q u e t a )
6 DECFSZ r0x00 , F // d e c r e m e n t a e se F>0 executa ( 1 ciclo )
7 BRA _00107_DS_ // " pula " para o lugar 0 0 1 0 7 D S ( 2 ciclos )

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 44 / 46
Rotinas de Tempo

Rotinas de Tempo

Sao gastos 3 passos para inicializacao, cada um de 1 ciclo.


Cada iteracao 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 sao necessarias 2 109 x
instrucoes.

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 45 / 46
Rotinas de Tempo

Rotinas de Tempo

1 unsigned char i , j, k;
2 for ( i = 0 ; i < 34 ; i ++) { // 3 + 34 ( 30 , 003 + 3 ) = 1 , 020 , 207
3 for ( j = 0 ; j < 100 ; j ++) { // 3 + 100 ( 297 + 3 ) = 30 , 003
4 for ( k = 0 ; k < 98 ; k ++) ; // 3 + 98 ( 3 ) = 297 i n s t r u c ~
oes
5 }
6 }

ECOP04 Tipos de dados, funcao main() e rotinas de tempo


rodrigomax@unifei.edu.br 46 / 46

You might also like