Tipos de dados, fun¸c˜
ao main() e rotinas de tempo
Rodrigo Almeida
Universidade Federal de Itajub´a
rodrigomax@unifei.edu.br
Revis˜ao
Dados Importantes
Te´orica:
Local ⇒ Sala I.2.1.11 Hor´ario ⇒ 4T12
Laborat´orio (ELTP14):
Local ⇒ Sala LEC II Hor´ario ⇒ 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 est˜ao sujeitas a altera¸c˜oes
A fun¸c˜ao LerTemperatura() faz um teste: se o valor for maior que um patamar chama a fun¸c˜ao EnviaSerial() com o c´odigo 0x30.
1 # i n c l u d e " s e r i a l . h "
2 c h a r L e r T e m p e r a t u r a (v o i d) ; 3 v o i d A j u s t a C a l o r (c h a r val ) ;
A fun¸c˜ao LerSerial() recebe um valor e repassa para a fun¸c˜ao AjustaCalor().
1 # i n c l u d e " t e m p . h " 2 c h a r L e r S e r i a l (v o i d) ; 3 v o i d E n v i a S e r i a l (c h a r val ) ;
Revis˜ao
Referˆ
encia 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
Solu¸c˜ao: criar uma estrutura de controle para pr´e compila¸c˜ao. 1 #i f n d e f T A G _ C O N T R O L E 2 #d e f i n e T A G _ C O N T R O L E 3 // t o d o o c o n t e ´u d o do a r q u i v o v e m a q u i . 4 5 #e n d i f // T A G C O N T R O L E
Revis˜ao
Referˆ
encia circular (rev)
#ifndef TEMP_H #define TEMP_H #include “serial.h” char LerTemperatura(void); void AjustaCalor(char val); #endif temp.h #ifndef SERIAL_H #define SERIAL_H #include “temp.h” char LerSerial(void); void EnviaSerial(char val); #endif serial.h #ifndef TEMP_H //tag já definida, //pula o conteúdo #endif temp.h
Tipos de dados em C
Tipos de dados em C
Toda informa¸c˜ao que ´e inserida num computador ´e armazenada em formato bin´ario;
Cada tipo de informa¸c˜ao cont´em uma quantidade diferente de bits; Cada bit pode representar informa¸c˜oes diferentes, mesmo dentro de uma mesma vari´avel.
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....
Tipos de dados em C
Convers˜
ao Bin´
ario, Decimal, Hexadecimal
Quando resolvemos codificar uma informa¸c˜ao num formato digital, e
portanto finito, sempre existe perda de
informa¸c˜ao resolu¸c˜ao amplitude
Calcule quantas itera¸c˜oes possui cada loop: 1 f l o a t x = 0; 2 3 w h i l e ( x != 4) { 4 x += 0.4f; 5 } 1 c h a r x = 0; 2 3 w h i l e ( x < 200) { 4 x ++; 5 }
Tipos de dados em C
Convers˜
ao Bin´
ario, Decimal, Hexadecimal
Convers˜ao Bin´ario-decimal
Dividir o n´umero por 2
Anotar o valor do resto (0 ou 1)
Se o valor ´e maior que 0 voltar ao n´umero 1
Escrever os valores obtidos atrav´es do passo 2 de tr´as para frente. Apresentar o resultado
Exercicio 01) Converter os n´umeros 18 513 73 60 -15
Tipos de dados em C
Convers˜
ao Bin´
ario, Decimal, Hexadecimal
N´umero 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
A representa¸c˜ao de n´umeros negativos ´e feita atrav´es do MSB
0 = positivo 1 = negativo
Tipos de dados em C
Convers˜
ao Bin´
ario, Decimal, Hexadecimal
Complemento de dois
Definir tamanho da palavra
Achar a representa¸c˜ao em bin´ario positiva com a mesma magnitude Inverter todos os bits
Somar um ao resultado
N´umeros fracion´arios (ponto flutuante)
S˜ao 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
Tipos de dados em C
Convers˜
ao Bin´
ario, Decimal, Hexadecimal
Base Hexadecimal
Possui 16 “unidades”diferentes. 10 algarismos mais 6 letras Facilita escrita de valores bin´arios F´acil convers˜ao bin-hex
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
Tipos de dados em C
Convers˜
ao Bin´
ario, Decimal, Hexadecimal
Exercicio 02) Converter os n´umeros
1810 - 100102
51310 - 10000000012
7310 - 10010012
6010 - 1111002
-1510 - 111100012 8bits
Exercicio 02) Converter os n´umeros como: 1810= 1-00102 12 = 116 00102= 216 logo : 100102. = 1216.
Modificadores de vari´aveis
Modificadores de vari´
aveis
Tipo Bytes Excurs˜ao m´axima 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
Modificadores de vari´aveis
Modificadores de Acesso
1 # d e f i n e X (*(n e a r u n s i g n e d c h a r*) 0 x F 8 3 ) 2 v o i d m a i n (v o i d) { 3 w h i l e ( X != X ) ; 4 }Compilando o c´odigo anterior temos em assembly: 1 // S t a r t i n g p C o d e b l o c k 2 S _ T e s t e _ _ m a i n c o d e 3 _ m a i n : 4 . l i n e 19 // T e s t e . c w h i l e ( X != X ) ; 5 6 R E T U R N
Modificadores de vari´aveis
Modificadores de Acesso
1 #d e f i n e X (*(v o l a t i l e n e a r u n s i g n e d c h a r*)0 x F 8 3) 2 v o i d m a i n (v o i d) 3 { 4 w h i l e ( X != X ) ; 5 }3 _ 0 0 1 0 5 _ D S _: 4 . l i n e 19 // T e s t e . c w h i l e ( X != X ) ; 5 M O V L W 0 x 8 3 // p r i m e i r a p a r t e do e n d e r e ¸c o 6 M O V W F r 0 x 0 0 7 M O V L W 0 x 0 f // s e g u n d a p a r t e do e n d e r e ¸c o 8 M O V W F r 0 x 0 1 9 M O V F F r0x00 , F S R 0 L 10 M O V F F r0x01 , F S R 0 H 11 M O V F F INDF0 , r 0 x 0 0 // r e a l i z a p r i m e i r a l e i t u r a 12 M O V L W 0 x 8 3 // p r i m e i r a p a r t e do e n d e r e ¸c o 13 M O V W F r 0 x 0 1 14 M O V L W 0 x 0 f // s e g u n d a p a r t e do e n d e r e ¸c o 15 M O V W F r 0 x 0 2 16 M O V F F r0x01 , F S R 0 L 17 M O V F F r0x02 , F S R 0 H 18 M O V F F INDF0 , r 0 x 0 1 // r e a l i z a s e g u n d a l e i t u r a 19 M O V F r0x00 , W
Modificadores de vari´aveis
Modificadores de Acesso
1 # d e f i n e P O R T B (*(n e a r u n s i g n e d c h a r*) 0 x F 8 3 ) 2 3 v o i d m a i n (v o i d) { 4 u n s i g n e d c h a r val ; 5 6 val = P O R T B ; 7 8 // a g u a r d a m u d a n ¸c a ; 9 w h i l e ( val != P O R T B ) ; 10 11 // v a l o r a c a b o u de m u d a r 12 }Utiliza¸c˜ao de const: 1 # d e f i n e X (*(v o l a t i l e c o n s t n e a r u n s i g n e d c h a r*) 0 x F 8 3 ) 2 // i n i c i o do p r o g r a m a 3 v o i d m a i n (v o i d) 4 { 5 X = 3; 6 }
A compila¸c˜ao resulta em erro:
1 T e s t e . c : e r r o r 33: A t t e m p t to a s s i g n v a l u e to a c o n s t a n t ←-v a r i a b l e (=)
Modificadores de vari´aveis
Modificadores de Posicionamento
Existem dois modificadores de posicionamento
near far
N˜ao s˜ao padronizadas pela ISO C(99)
Indicam ao compilador a regi˜ao em que a vari´avel deve ser colocada
near - regi˜ao de acesso mais r´apido far - regi˜ao de acesso normal
A persistˆencia de uma vari´avel pode ser assegurada com o modificador static
Padronizada pela ISO C(99)
Garante que n˜ao haver´a perda de informa¸c˜ao na vari´avel Uma regi˜ao de mem´oria ´e reservada apenas para a vari´avel em quest˜ao 1 // c r i a um c o n t a d o r p e r s i s t e n t e q u e ´e 2 // i n c r e m e n t a d o a c a d a c h a m a d a de f u n ¸c ~a o 3 int C o n t a d o r P e r s i s t e n t e (int r e s e t a ) { 4 c h a r v a r i a v e l _ p e r s i s t e n t e ; 5 if ( r e s e t a ) { v a r i a v e l _ p e r s i s t e n t e = 0;} 6 e l s e { r e t u r n ( v a r i a v e l _ p e r s i s t e n t e ++) ;}
Modificadores de vari´aveis
Modificador de persistˆ
encia
1 // c r i a um c o n t a d o r p e r s i s t e n t e q u e ´e 2 // i n c r e m e n t a d o a c a d a c h a m a d a de f u n ¸c ~a o 3 4 int C o n t a d o r P e r s i s t e n t e (int r e s e t a ) { 5 s t a t i c c h a r v a r i a v e l _ p e r s i s t e n t e ; 6 7 if ( r e s e t a ) { 8 v a r i a v e l _ p e r s i s t e n t e = 0; 9 }e l s e{ 10 r e t u r n ( v a r i a v e l _ p e r s i s t e n t e ++) ; 11 } 12 r e t u r n -1; 13 }
Opera¸c˜oes Aritim´eticas
Opera¸c˜
oes Aritm´
eticas
1 v o i d m a i n (v o i d) { 2 c h a r v a r 8 ; 3 int v a r 1 6 ; 4 l o n g int v a r 3 2 ; 5 f l o a t p o n t 1 6 ; 6 d o u b l e p o n t 3 2 ; 7 v a r 8 = v a r 8 + v a r 1 6 ; // 1 8 v a r 8 = v a r 8 + v a r 8 ; // 2 9 v a r 1 6 = v a r 8 * v a r 8 ; // 3 10 v a r 3 2 = v a r 3 2 / v a r 1 6 ; // 4 11 v a r 3 2 = p o n t 3 2 * v a r 3 2 ; // 5 12 p o n t 1 6 = v a r 8 / v a r 1 6 ; // 6 13 p o n t 1 6 = p o n t 3 2 * v a r 3 2 ; // 7 14 p o n t 1 6 = 40 / 80; // 8 15 }
Fun¸c˜ao main()
Fun¸c˜
ao main()
0x58 Testa A 0x57 30 0x56 A recebe 0x55 Limpa A 0x59 ... 0x8D Porta B 0x8C Salva em 0x8B 50 0x8A A recebe 0x8E ... 0x03 0x55 0x02 Pulo 0x01 0x8A 0x04 ... 0x00 Pulo Endereço InstruçãoO meio de indicar o ponto de in´ıcio de um programa depende do compilador.
Geralmente apenas a cria¸c˜ao da fun¸c˜ao main j´a ´e suficiente para o compilador
O linker aloca a fun¸c˜ao main() em algum lugar dispon´ıvel na mem´oria O linker atualiza o vetor de reset colocando um pulo para a fun¸c˜ao main
1 v o i d m a i n (v o i d)
2 {
3 // a q u i e n t r a o c ´o d i g o do p r o g r a m a
Fun¸c˜ao main()
Fun¸c˜
ao main()
Aten¸c˜ao!
Para sistemas embarcados a fun¸c˜ao main ´e a primeira a ser executada,
portanto n˜ao pode receber parˆametro nenhum. Como ela n˜ao ´e chamada
por nenhuma outra fun¸c˜ao, ela ´e a ´ultima a ser executada. Deste modo
n˜ao existe a possibilidade de retornar nenhum valor. Deve ser declarada
como:
1 v o i d m a i n (v o i d)
2 {
3 // I n s i r a o c ´o d i g o a q u i .
4 }
Geralmente os sistemas embarcados s˜ao feitos para serem continuamente executados
As rotinas devem ser c´ıclicas
O sistema s´o para quando desligado
Aten¸c˜ao!
Fun¸c˜ao main()
Fun¸c˜
ao main()
1 v o i d m a i n (v o i d) { 2 for( ; ; ) { 3 // a q u i e n t r a o 4 // c ´o d i g o p r i n c i p a l 5 } 6 } 1 v o i d m a i n (v o i d) { 2 w h i l e(1) { 3 // a q u i e n t r a o 4 // c ´o d i g o p r i n c i p a l 5 } 6 }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 la¸co for.
1 u n s i g n e d c h a r i ; 2 for( i =0; i < 10; i ++) ;
Aten¸c˜ao!
Notar que n˜ao estamos utilizando os colchetes depois dofor.
1 // c ´o d i g o em a s s e m b l y e q u i v a l e n t e do : f o r ( i = 0 ; i<10 ; i + + ) ; 2 M O V F r0x00 , W // i n i c i a l i z a W c o m 0 ( 1 c i c l o ) 3 S U B L W 0 x 0 a // c o l o c a 10 ( 0 x 0 a ) no r e g i s t r o W ( 1 c i c l o ) 4 M O V W F r 0 x 0 0 // m u d a o v a l o r de W p a r a F ( 1 c i c l o ) 5 _ 0 0 1 0 7 _ D S _: // l a b e l ( e t i q u e t a ) 6 D E C F S Z r0x00 , F // d e c r e m e n t a e se F>0 e x e c u t a ( 1 c i c l o ) 7 BRA _ 0 0 1 0 7 _ D S _ // " p u l a " p a r a o l u g a r 0 0 1 0 7 D S ( 2 c i c l o s )
Rotinas de Tempo
Rotinas de Tempo
S˜ao gastos 3 passos para inicializa¸c˜ao, cada um de 1 ciclo. Cada itera¸c˜ao 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˜ao necess´arias 2 ∗ 109∗ x instru¸c˜oes.
1 u n s i g n e d c h a r i , j , k ; 2 for( i =0; i < 34; i ++) { // 3 + 34 ∗( 30 , 0 0 3 + 3 ) = 1 , 020 , 2 0 7 3 for( j =0; j < 100; j ++) { // 3 + 1 0 0 ∗( 2 9 7 + 3 ) = 30 , 0 0 3 4 for( k =0; k < 98; k ++) ; // 3 + 98 ∗( 3 ) = 2 9 7 i n s t r u ¸c ~o e s 5 } 6 }