• Nenhum resultado encontrado

elt024-02-tiposdedados

N/A
N/A
Protected

Academic year: 2021

Share "elt024-02-tiposdedados"

Copied!
50
0
0

Texto

(1)

dados

Prof.MSc.Rodrigo Maximiano Antunes de Almeida

Universidade Federal de Itajubá

(2)

ˆ

Teórica:

ˆ

Local ⇒ Sala

ˆ

Horário ⇒ 15:45-17:35

ˆ

Laboratório:

ˆ

Local ⇒ Sala K.1.9 LMSII (laguinho)

ˆ

Horário ⇒ P1: 8:20-10:10, P2-10:10-12:00

ˆ

*Levar a placa

ˆ

Datas Importantes:

ˆ

Prova 01 ⇒ 31/08

ˆ

Prova 02 ⇒ 07/12

ˆ

Exame ⇒ 14/12

(3)

Referência circular (rev)

A função LerTemperatura() faz um teste: se o valor for maior que

um patamar chama a função EnviaSerial() com o código 0x30.

1

#include "serial.h"

2

char

LerTemperatura(

void

);

3

void

AjustaCalor(

char

val);

A função LerSerial() receber um valor e repassa para a função

AjustaCalor().

1

#include "temp.h"

2

char

LerSerial(

void

);

3

void

EnviaSerial(

char

val);

(4)

Referê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);

(5)

Referê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 arquivo vem aqui.

4

(6)

Referência circular(rev)

Solução: criar uma estrutura de controle para pré compilação.

#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

(7)

Construindo nosso stdio

ˆ

Criar a função printf para o LCD

ˆ

Salvar dentro da biblioteca stdio

ˆ

Reconhecer o nal da string

ˆ

Reconhecer quebra de linha

(8)

Construindo nosso stdio

1

void

printf(

char

msg[

16

])

2

{

3

char

i, j;

4

for

(i=

0

; i<

16

; i++)

5

{

6

if

(msg[i]==

0

)

//procura fim da string

7

{

8

return

;

9

}

10

else

11

{

12

EnviaDados(msg[i]);

13

}

14

}

15

}

(9)

Construindo nosso stdio

1

if

(msg[i]==

0

)

//procura fim da string

2

{

3

return

;

4

}

5

else if

(msg[i]=='\n')

//procura quebra de linha

6

{

7

EnviaComando(

0xC0

);

//segunda linha

8

}

9

else

10

{

11

EnviaDados(msg[i]);

12

}

(10)

Construindo nosso stdio

(11)

Construindo nosso stdio

1

#include "stdio.h"

2

#include "lcd.h"

3

4

static char

temp[

16

] =

"

"

;

5

static char

p=

0

;

(12)

Construindo nosso stdio

1

else if

((msg[i]=='\n')){

2

if

(linha==

2

){

3

EnviaComando(

0x01

);

//primeira linha

4

EnviaComando(

0x80

);

//primeira linha

5

for

(j=

0

;j<p;j++){

//envia temp p/ primeira linha

6

EnviaDados(temp[j]);

7

}

8

}

9

EnviaComando(

0xC0

);

//segunda linha

10

p=

0

;

//resta dados

11

for

(j=

0

;j<

16

;j++){

//limpa temp

12

temp[j] =

' ';

13

}

14

linha=

2

;

15

}

16

else

{

17

EnviaDados(msg[i]);

18

temp[p] = msg[i];

19

p++;

20

}

(13)

Tipos de dados em C

(14)

Tipos de dados em C

Tipo

Bits

Bytes

Faixa de valores

char

8

1

-128 à 127

int

16

2

-32.768 à 32.767

oat

32

4

3,4 x 10

-38

à 3,4 x 10

38

(15)

Conversão Binário, Decimal, Hexadecimal

ˆ

Os dados são sempre armazenados no formato binário

ˆ

Os bits tem signicados diferentes dependendo do tipo de dado

ˆ

Para números não inteiros existe perda de informação

1

float

x =

0

;

2

while

(x !=

4

)

3

{

4

printf(

"i"

);

//apenas para debug

5

x +=

0.4f

;

(16)

Conversã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.

(17)

Conversão Binário, Decimal, Hexadecimal

Exercicio 01) Converter os números

ˆ

18

ˆ

513

ˆ

73

ˆ

60

(18)

Conversão Binário, Decimal, Hexadecimal

Número 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

(19)

Conversão Binário, Decimal, Hexadecimal

ˆ

A representação de números negativos é feita através do MSB

ˆ

0 = positivo

ˆ

1 = negativo

(20)

Conversão Binário, Decimal, Hexadecimal

ˆ

Complemento de dois

ˆ

Denir tamanho da palavra

ˆ

Achar o representação em binário positiva com a mesma

magnitude

ˆ

Inverter todos os bits

(21)

Conversão Binário, Decimal, Hexadecimal

ˆ

Números fracionários (ponto utuante)

ˆ

São 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

(22)

Conversão Binário, Decimal, Hexadecimal

ˆ

Base Hexadecimal

ˆ

Possui 16 "unidades"diferentes.

ˆ

10 algarismos mais 6 letras

ˆ

Facilita escrita de valores binários

(23)

Conversão Binário, 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

(24)

Conversão Binário, Decimal, Hexadecimal

Exercicio 02) Converter os números

ˆ

18

10

- 10010

2

ˆ

513

10

- 1000000001

2

ˆ

73

10

- 1001001

2

ˆ

60

10

- 111100

2

ˆ

-15

10

- 1111001

2_8bits

(25)

Conversão Binário, Decimal, Hexadecimal

Exercicio 02) Converter os números

ˆ

como: 18

10

= 1-0010

2

ˆ

1

2

= 1

16

ˆ

0010

2

= 2

16

ˆ

logo :

(26)

Modicadores de tamanho e sinal

(27)

Modicadores de tamanho e sinal

Tipo

Bytes

Excursão máxima

unsigned char

1

0 à 255

signed char

1

-128 à 127

unsigned int

2

0 à 65.535

signed int

2

-32.768 à 32.767

long int

4

-2.147.483.648 à 2.147.483.647

unsigned long int

4

0 à 4.294.967.295

(28)

Modicadores de Acesso

(29)

Modicadores de Acesso

1

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

2

void

main(

void

) interrupt

0

3

{

4

while

(X!=X);

(30)

Modicadores de Acesso

Compilando o código anterior temos em assembler:

1

// Starting pCode block

2

S_Teste__main

code

3

_main:

4

.line

19

// Teste.c

while (X!=X);

5

(31)

Modicadores de Acesso

1

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

2

void

main(

void

) interrupt

0

3

{

4

while

(X!=X);

(32)

Modicadores de Acesso

1

S_Teste__main

code

// Starting pCode block

2

_main:

3

_00105_DS_:

4

.line

19

// Teste.c

while (X != X);

5

MOVLW

0x83

//primeira parte do endereço

6

MOVWF

r0x00

7

MOVLW

0x0f

//segunda parte do endereço

8

MOVWF

r0x01

9

MOVFF

r0x00, FSR0L

10

MOVFF

r0x01, FSR0H

11

MOVFF

INDF0, r0x00

//realiza primeira leitura

12

MOVLW

0x83

//primeira parte do endereço

13

MOVWF

r0x01

14

MOVLW

0x0f

//segunda parte do endereç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 igualdade

(33)

Modicadores de Acesso

Utilização de const:

1

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

2

//inicio do programa

3

void

main(

void

) interrupt

0

4

{

5

X =

3

;

6

}

A compilação resulta em erro:

(34)

Modicadores de Posicionamento

(35)

Modicadores de Posicionamento

ˆ

Existem dois modicadores de posicionamento

ˆ

near

ˆ

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ápido

(36)

Modicador de persistência

(37)

Modicador de persistência

ˆ

A persistência de uma variável pode ser assegurada com o

modicador static

ˆ

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

//cria um contador persistente que é

2

//incrementado a cada chamada de função

3

int

ContadorPersistente(

int

reseta){

4

char

variavel_persistente;

(38)

Modicador de persistência

1

//cria um contador persistente que é

2

//incrementado a cada chamada de função

3

int

ContadorPersistente(

int

reseta)

4

{

5

static char

variavel_persistente;

6

if

(reseta)

7

{

8

variavel_persistente =

0

;

9

}

10

else

11

{

12

return

(variavel_persistente++);

13

}

14

return

-

1

;

15

}

(39)

Operações Aritiméticas

(40)

Operações Aritiméticas

1

void

main (

void

)

2

{

3

char

var08;

4

int

var16;

5

long int

var32;

6

float

pont16;

7

double

pont32;

8

var8 =

var8 + var16;

// 1

9

var8 =

var8 + var8;

// 2

10

var16 = var8 * var8;

// 3

11

var32 = var32 / var16;

// 4

12

var32 = pont32 * var32;

// 5

13

pont16 = var8 / var16;

// 6

14

pont16 = pont32 * var32;

// 7

15

pont16 =

40

/

80

;

// 8

16

}

(41)

Função main()

(42)

Função 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ção

(43)

Função main()

ˆ

Como indicar o ponto de início de um programa depende do

compilador.

ˆ

Alocar main() em algum lugar disponível

ˆ

No vetor de reset colocar um pulo para a função main

ˆ

Para o SDCC isto é feito através do atributo interrupt 0 logo

após o nome da função.

1

void

main (

void

) interrupt

0

2

{

(44)

Funçã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 ser executada, também não existe a possibilidade

de retornar algum valor. Deve ser declarada como:

1

void

main (

void

) interrupt

0

2

{

3

/...

4

}

(45)

Função main()

1

void

main (

void

) interrupt

0

2

{

3

for

(;;)

4

{

5

//aqui entra o

6

//código principal

7

}

8

}

1

void

main (

void

) interrupt

0

2

{

3

while

(

1

)

4

{

5

//aqui entra o

6

//código principal

7

}

8

}

(46)

Rotinas de Tempo

(47)

Rotinas de Tempo

É muito comum necessitar que o microcontrolador que um tempo

sem fazer nada. Uma maneira de atingir esse objetivo é utilizar um

laço for.

unsigned char

i;

for

(i=

0

; i <

10

; i++);

Atenção!

(48)

Rotinas de Tempo

1

//código em assembler equivalente à for(i=0; i<10; i++);

2

MOVF

r0x00, W

//inicializa W com 0

(1 ciclo)

3

SUBLW

0x0a

//coloca o valor 10 (0x0a) no registro W (1 ciclo)

4

MOVWF

r0x00

//muda o valor de W para F

(1 ciclo)

5

_00107_DS_:

6

DECFSZ

r0x00, F

//decrementa F, se F>0 executa o próximo (1 ciclo)

7

BRA

_00107_DS_

//"pula" para o lugar _00107_DS_

(2 ciclos)

(49)

Rotinas 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 ∗ 10

9

x instruções.

(50)

Rotinas de Tempo

1

unsigned char

i, j, l;

2

for

(i=

0

; i <

34

; i++)

//3 + 34 * (30,003 + 3) = 1,020,207 instruções

3

{

4

for

(j=

0

; j <

100

; j++)

//3 + 100 * (297 + 3) = 30,003 instruções

5

{

6

for

(k=

0

; k <

98

; k++);

// 3 + 98 * (3) = 297 instruções

7

}

8

}

Referências

Documentos relacionados

Querido Jesus, eu peço-Vos que me consagreis, à minha família, amigos e nação para a Protecção do Vosso Precioso Sangue.Vós morrestes por mim e as Vossas Feridas

Convênio de colaboração entre o Conselho Geral do Poder Judiciário, a Vice- Presidência e o Conselho da Presidência, as Administrações Públicas e Justiça, O Ministério Público

As mudanças que se observam no mundo contemporâneo são de tal modo profundas, que inauguram a necessidade de repensar alguns dos nossos pressupostos teóricos para manter

Assim diante dos resultados foi possível verificar correlações positivas, porém não foi possível estabelecer nenhuma significância para a presente amostra, devido

PORTUGUÊS: Fonética e Fonologia; Divisão Silábica; Acentuação Gráfica; Emprego do hífen; Ortografia; Pontuação; Processos de Formação das Palavras; Estrutura das

Dispõe sobre o Processo de Seleção e cadastro reserva de Tutores Presenciais e a Distância, para atuar nos cursos de Pós Graduação Lato Sensu em Práticas

Os candidatos aprovados em Processo Seletivo exclusivo para Pessoa com Deficiência poderão ser convocados para assumir vaga de emprego não respeitando a classificação deste edital,

Nesse sentido, o livro de Mary Del Priori Sobreviventes e guerreiras: Uma breve história da mulher no Brasil de 1500 a 2000 convida seus leitores a refletir sobre a história