Post on 04-Jul-2015
description
Tipos de dados, função main e tempo
Prof. Rodrigo Maximiano Antunes de Almeida
Universidade Federal de Itajubá
rodrigomax@unifei.edu.br
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 1 / 48
Teclado
Revisão
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 2 / 48
Dados Importantes
Teórica:Local ⇒ Sala I.2.1.11Horário ⇒ 15:45-17:35 (ter)
Laboratório:Local ⇒ Sala LEC I / LASERHorário ⇒
P1: 8:00-9:45 (qui) ELT025 (LASER)P2: 10:15-12:00 (qui) ELT025 (LASER)P3: 15:50-17:30 (qui) ELT025 (LECI)P1: 13:30-15:10 (ter) ELT802 (LECI)
Levar a placa + adaptador de tomadaDatas Importantes *:
Prova 01 ⇒ 17/09Prova 02 ⇒ 26/11Sub ⇒ 03/12
* Datas
Todas as datas estão sujeitas a alterações
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 3 / 48
Linguagem CReferência circular (rev)
A função LerTemperatura() faz um teste: se o valor for maior que umpatamar chama a função EnviaSerial() com o código 0x30.
1 #include "serial.h"
2 char LerTemperatura ( vo id ) ;3 vo id AjustaCalor ( char val ) ;
A função LerSerial() receber um valor e repassa para a funçãoAjustaCalor().
1 #include "temp.h"
2 char LerSerial ( vo id ) ;3 vo id EnviaSerial ( char val ) ;
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 4 / 48
Linguagem CReferência circular (rev)
#include “serial.h”
char LerTemperatura(void);void AjustaCalor(char val);
temp.h
#include “temp.h”
char LerSerial(void);void EnviaSerial(char val);
serial.h
#include “serial.h”
char LerTemperatura(void);void AjustaCalor(char val);
temp.h
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 5 / 48
Linguagem CReferência circular (rev)
Solução: criar uma estrutura de controle para pré compilação.
1 #ifndef TAG_CONTROLE
2 #define TAG_CONTROLE
3 // todo o conteúdo do a r qu i v o vem aqu i .
5 #endif //TAG_CONTROLE
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 6 / 48
Linguagem CReferência circular(rev)
#infdef TEMP_H #define TEMP_H #include “serial.h”
char LerTemperatura(void); void AjustaCalor(char val);#endif
temp.h
#infdef SERIAL_H #define SERIAL_H #include “temp.h”
char LerSerial(void); void EnviaSerial(char val);#endif
serial.h
#infdef TEMP_H
//tag já definida, //pula o conteúdo
#endif
temp.h
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 7 / 48
Linguagem CTipos de dados em C
Tipos de dados em C
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 8 / 48
Linguagem CConversão Binário, Decimal, Hexadecimal
Toda informação que é inserida num computador é armazenada emformato binário
Cada tipo de informação contém uma quantidade diferente de bits
Cada bit pode representar informações diferentes, mesmo dentro deuma mesma variável
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 9 / 48
Linguagem CTipos de dados em C
Tipo Bits Bytes Faixa de valores
char 8 1 -128 à 127int 16 2 -32.768 à 32.767�oat 32 4 3,4 x 10-38 à 3,4 x 1038
double 64 8 3,4 x 10-308 à 3,4 x 10308
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 10 / 48
Linguagem CConversão Binário, Decimal, Hexadecimal
Quando resolvemos codi�car uma informação num formato digital, eportanto �nito, sempre existe perda de
informaçãoresoluçãoamplitude
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 11 / 48
Linguagem CConversão Binário, Decimal, Hexadecimal
Exemplos:
1 f l o a t x = 0 ;2 whi le ( x != 4)3 {4 printf ( "i" ) ;5 x += 0.4 f ;6 }
1 char x = 0 ;2 whi le ( x < 200)3 {4 printf ( "i" ) ;5 x++;6 }
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 12 / 48
Linguagem CConversão Binário, Decimal, Hexadecimal
Conversão Binário-decimal
Dividir o número por 2
Anotar o valor do resto (0 ou 1)
Se o valor é maior que 0 voltar ao número 1
Escrever os valores obtidos através do passo 2 de trás para frente.
Apresentar o resultado
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 13 / 48
Linguagem CConversão Binário, Decimal, Hexadecimal
Exercicio 01) Converter os números
18
513
73
60
-15
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 14 / 48
Linguagem CConversão Binário, Decimal, Hexadecimal
Número 18:
182 = 9, resto 092 = 4, resto 142 = 2, resto 022 = 1, resto 012 = 0, resto 1
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 15 / 48
Linguagem CConversão Binário, Decimal, Hexadecimal
A representação de números negativos é feita através do MSB0 = positivo1 = negativo
Método de conversão: complemento de dois
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 16 / 48
Linguagem CConversão Binário, Decimal, Hexadecimal
Complemento de doisDe�nir tamanho da palavraAchar o representação em binário positiva com a mesma magnitudeInverter todos os bitsSomar um ao resultado
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 17 / 48
Linguagem CConversão Binário, Decimal, Hexadecimal
Números fracionários (ponto �utuante)São divididos em expoente, mantissa e sinalSinal ocupa apenas um bit, como nos inteirosA mantissa representa os algarismos signi�cativosO expoente representa a magnitude
Ponto �xo
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 18 / 48
Linguagem CConversão Binário, Decimal, Hexadecimal
Base HexadecimalPossui 16 "unidades"diferentes.10 algarismos mais 6 letrasFacilita escrita de valores bináriosFácil conversão bin-hex
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 19 / 48
Linguagem CConversão Binário, Decimal, Hexadecimal
Dec Bin Hex Dec Bin Hex
0 0000 0 8 1000 81 0001 1 9 1001 92 0010 2 10 1010 A3 0011 3 11 1011 B4 0100 4 12 1100 C5 0101 5 13 1101 D6 0110 6 14 1110 E7 0111 7 15 1111 F
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 20 / 48
Linguagem CConversão Binário, Decimal, Hexadecimal
Exercicio 02) Converter os números
1810 - 10010251310 - 100000000127310 - 100100126010 - 1111002-1510 - 11110012_8bits
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 21 / 48
Linguagem CConversão Binário, Decimal, Hexadecimal
Exercicio 02) Converter os númeroscomo: 1810= 1-00102
12 = 11600102 = 216
logo :
100102. = 1216.
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 22 / 48
Linguagem CModi�cadores de tamanho e sinal
Modi�cadores de tamanho e sinal
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 23 / 48
Linguagem CModi�cadores de tamanho e sinal
Tipo Bytes Excursão máxima
unsigned char 1 0 à 255signed char 1 -128 à 127unsigned int 2 0 à 65.535signed int 2 -32.768 à 32.767long int 4 -2.147.483.648 à 2.147.483.647unsigned long int 4 0 à 4.294.967.295short int 2 -32.768 à 32.767
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 24 / 48
Linguagem CModi�cadores de Acesso
Modi�cadores de Acesso
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 25 / 48
Linguagem CModi�cadores de Acesso
1 #define X (* ( near unsigned char *) 0xF83 )2 vo id main ( vo id )3 {4 whi le ( X!=X ) ;5 }
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 26 / 48
Linguagem CModi�cadores de Acesso
Compilando o código anterior temos em assembler:
1 // S t a r t i n g pCode b l o ck2 S_Teste__main code
3 _main :4 . line 19 // Teste . c wh i l e (X!=X) ;
6 RETURN
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 27 / 48
Linguagem CModi�cadores de Acesso
1 #define X (* ( v o l a t i l e near unsigned char *) 0xF83 )2 vo id main ( vo id )3 {4 whi le ( X!=X ) ;5 }
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 28 / 48
Linguagem CModi�cadores de Acesso
1 S_Teste__main code // S t a r t i n g pCode b l o ck2 _main :3 _00105_DS_ :4 . line 19 // Teste . c wh i l e (X != X) ;5 MOVLW 0x83 // p r im e i r a p a r t e do ende reço6 MOVWF r0x00
7 MOVLW 0x0f // segunda pa r t e do ende reço8 MOVWF r0x01
9 MOVFF r0x00 , FSR0L
10 MOVFF r0x01 , FSR0H
11 MOVFF INDF0 , r0x00 // r e a l i z a p r im e i r a l e i t u r a12 MOVLW 0x83 // p r im e i r a p a r t e do ende reço13 MOVWF r0x01
14 MOVLW 0x0f // segunda pa r t e do ende reço15 MOVWF r0x02
16 MOVFF r0x01 , FSR0L
17 MOVFF r0x02 , FSR0H
18 MOVFF INDF0 , r0x01 // r e a l i z a segunda l e i t u r a19 MOVF r0x00 , W
20 XORWF r0x01 , W
21 BNZ _00105_DS_ // f a z o t e s t e para i g u a l d a d e22 RETURN
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 29 / 48
Linguagem CModi�cadores de Acesso
Utilização de const:
1 #define X (* ( v o l a t i l e const near unsigned char *) 0xF83 )2 // i n i c i o do programa3 vo id main ( vo id )4 {5 X = 3 ;6 }
A compilação resulta em erro:
1 Teste . c : error 33 : Attempt to assign value to a constant ←↩variable (=)
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 30 / 48
Linguagem CModi�cadores de Posicionamento
Modi�cadores de Posicionamento
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 31 / 48
Linguagem CModi�cadores de Posicionamento
Existem dois modi�cadores de posicionamentonear
far
Não são padronizadas pela ISO C(99)Indicam ao compilador a região em que a variável deve ser colocada
near - região de acesso mais rápidofar - região de acesso normal
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 32 / 48
Linguagem CModi�cador de persistência
Modi�cador de persistência
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 33 / 48
Linguagem CModi�cador de persistência
A persistência de uma variável pode ser assegurada com o modi�cadorstatic
Padronizada pela ISO C(99)
Garante que não haverá perda de informação na variável
Uma região de memória é reservada apenas para a variável em questão
1 // c r i a um contado r p e r s i s t e n t e que é2 // inc rementado a cada chamada de função3 i n t ContadorPersistente ( i n t reseta ) {4 char variavel_persistente ;5 i f ( reseta ) { variavel_persistente = 0;}6 e l s e { re tu rn ( variavel_persistente++); }7 re tu rn −1;8 }
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 34 / 48
Linguagem CModi�cador de persistência
1 // c r i a um contado r p e r s i s t e n t e que é2 // inc rementado a cada chamada de função3 i n t ContadorPersistente ( i n t reseta )4 {5 s t a t i c char variavel_persistente ;6 i f ( reseta )7 {8 variavel_persistente = 0 ;9 }
10 e l s e11 {12 re tu rn ( variavel_persistente++);13 }14 re tu rn −1;15 }
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 35 / 48
Linguagem COperações Aritiméticas
Operações Aritiméticas
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 36 / 48
Linguagem COperações Aritiméticas
1 vo id main ( vo id )2 {3 char var8 ;4 i n t var16 ;5 long i n t var32 ;6 f l o a t pont16 ;7 double pont32 ;8 var8 = var8 + var16 ; // 19 var8 = var8 + var8 ; // 2
10 var16 = var8 * var8 ; // 311 var32 = var32 / var16 ; // 412 var32 = pont32 * var32 ; // 513 pont16 = var8 / var16 ; // 614 pont16 = pont32 * var32 ; // 715 pont16 = 40 / 80 ; // 816 }
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 37 / 48
Linguagem CFunção main()
Função main()
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 38 / 48
Linguagem CFunção main()
0x58 Testa A0x57 300x56 A recebe0x55 Limpa A
0x59 ...
0x8D Porta B0x8C Salva em0x8B 500x8A A recebe
0x8E ...
0x03 0x550x02 Pulo0x01 0x8A
0x04 ...
0x00 PuloEndereço Instrução
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 39 / 48
Linguagem CFunção main()
O como indicar o ponto de início de um programa depende docompilador.
Geralmente apenas a criação da função main já é su�ciente para ocompilador
O linker aloca a função main() em algum lugar disponível na memória
O linker atualiza o vetor de reset colocando um pulo para a funçãomain
1 vo id main ( vo id )2 {3 // aqu i e n t r a o cód igo do programa4 }
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 40 / 48
Linguagem CFunção main()
Atenção!
Para sistemas embarcados a função main é a primeira a ser executada,portanto não pode receber parâmetro nenhum. Como ela é a ultima a serexecutada, também não existe a possibilidade de retornar algum valor.Deve ser declarada como:
1 vo id main ( vo id )2 {3 // I n s i r a o cód igo aqu i .4 }
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 41 / 48
Linguagem CFunção main()
Geralmente os sistemas embarcados são feitos para seremcontinuamente executados
As rotinas devem ser cíclicas
O sistema só para quando desligado
Atenção!
Nesta situação utiliza-se loops in�nitos.
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 42 / 48
Linguagem CFunção main()
1vo id main ( vo id )2{3 f o r ( ; ; )4 {5 // aqu i e n t r a o6 // cód igo p r i n c i p a l7 }8}
1vo id main ( vo id )2{3 whi le (1 )4 {5 // aqu i e n t r a o6 // cód igo p r i n c i p a l7 }8}
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 43 / 48
Linguagem CRotinas de Tempo
Rotinas de Tempo
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 44 / 48
Linguagem CRotinas de Tempo
É muito comum necessitar que o microcontrolador �que um tempo semfazer nada. Uma maneira de atingir esse objetivo é utilizar um laço for.
1 unsigned char i ;2 f o r ( i=0; i < 10 ; i++);
Atenção!
Notar que não estamos utilizando os colchetes.
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 45 / 48
Linguagem CRotinas de Tempo
1 // cód igo em as s emb l e r e q u i v a l e n t e do : f o r ( i =0; i <10; i++) ;2 MOVF r0x00 , W // i n i c i a l i z a W com 0 ←↩
(1 c i c l o )3 SUBLW 0x0a // co l o c a o v a l o r 10 (0 x0a ) no r e g i s t r o W ←↩
(1 c i c l o )4 MOVWF r0x00 //muda o v a l o r de W para F ←↩
(1 c i c l o )5 _00107_DS_ :6 DECFSZ r0x00 , F // decrementa F , se F>0 execu ta o próx imo ←↩
(1 c i c l o )7 BRA _00107_DS_ //" pu l a " para o l u g a r _00107_DS_ ←↩
(2 c i c l o s )
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 46 / 48
Linguagem CRotinas de Tempo
São gastos 3 passos para inicialização, cada um de 1 ciclo.
Cada iteração 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 são necessárias 2 ∗ 109 ∗ xinstruções.
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 47 / 48
Linguagem CRotinas de Tempo
1 unsigned char i , j , l ;2 f o r ( i=0; i < 34 ; i++) //3+34*(30 ,003+3) = 1 ,020 ,207 i n s t r u ç õ e s3 {4 f o r ( j=0; j < 100 ; j++) //3+100*(297 + 3) = 30 ,003 i n s t r u ç õ e s5 {6 f o r ( k=0; k < 98 ; k++); // 3+98*(3) = 297 i n s t r u ç õ e s7 }8 }
ELT024 Tipos de dados, função main e tempo rodrigomax@unifei.edu.br 48 / 48