Você está na página 1de 30

Linguagem de Programação

Aplicações Avançadas de
Microprocessadores
AULA4

Profa. Ana T. Y. Watanabe


atywata@gmail.com.br
Linguagem de Programação

“O temor do SENHOR é o princípio do


conhecimento; os loucos desprezam
a sabedoria e a instrução.”
Provérbios 1:7
NHOR é odesprezam a sabedoria e a
Tópicos

• Enumerações
• Ponteiros
• Estruturas
• União
• Comando typedef
Enumerações: enum

Numa enumeração podemos dizer ao compilador quais os valores


que uma determinada variável pode assumir.

Forma Geral:
enum nome_do_tipo_da_enumeração {lista_de_valores} ;
Enumerações: enum
Exemplo:
enum dias_da_semana {segunda, terca, quarta, quinta, sexta,
sabado, domingo};

main (void)
{
enum dias_da_semana d1,d2;
d1=segunda; d2=sexta;
if (d1==d2)
{ printf ("O dia e o mesmo."); }
else { printf ("São dias diferentes."); }
return 0;
}
Enumerações: enum

 O compilador pega a lista que você fez de valores e associa,


a cada um, um número inteiro.

 Então, ao primeiro da lista, é associado o número zero, o


segundo ao número 1 e assim por diante.

 As variáveis declaradas são então variáveis int.


Enumerações: enum
Exemplo: (Gpio.c)
Eenum GPIO_PIN_TYPE {
INPUT_DIGITAL_PULLUP=0,
OUTPUT_DIGITAL
};
main (void)
{
enum GPIO_PIN_TYPE type;

switch (type)
{
case INPUT_DIGITAL_PULLUP: ...
case OUTPUT_DIGITAL: ...
}
}
ponteiros

 Os ints guardam inteiros, os floats guardam números com


ponto flutuante, char guardam caracteres e
ponteiros guardam endereço de memória!

 A variável ponteiro possui o endereço de algo para


poder acessar o conteúdo depois.

 A variável ponteiro pode armazenar endereços de tipos


diferentes.
ponteiros
 Forma Geral:
tipo_da ponteiro *nome_variavel ;

 Exemplo:

int *pt;
char *a;

*a = 0xff;

 IMPORTANTE: Estas variáveis não foram inicializadas


(como todas as variáveis em C). Eles apontam para um
lugar indefinido! Pode estar na região de memória onde
está o SO por exemplo!
ponteiros
 Exemplo de uso de ponteiros
char a;
char count=10;
char *pt;
pt=&count;

1) Para onde aponta o ponteiro pt?

2) Qual o conteúdo do ponteiro pt?

3) Como atribuir a variável “a “ o conteúdo do ponteiro pt?


ponteiros
 Como fazer cast de ponteiro??
Casts são modeladores que forçam a expressão a ser do
tipo especificado!

Forma gera: tipo(expressão)

void main()
{
int d, *p;
char *a, b;
// inicialização
a = &b;
p = (int*)a;
d = *((int *) a);
}
ponteiros
 Exemplo (Micros.h do JM60)

//Port A Data Register

#define GPIOA_DATA (*((volatile GPIO_DATA_TYPE *)0x00000000))

Volatile: modificador que diz ao compilador que a variável pode ser alterada
Volatile:
pelo microcontrolador sem que seja avisado.
ponteiros
 Exemplo: O que faz este exemplo?

int main ()
{
int x,*p;

x=13;
*p=x;
return(0);
}
structs (estruturas)

 Uma estrutura agrupa várias variáveis


numa só. Ex.: ficha pessoal como nome,
endereço, telefone,etc... Essa ficha seria
uma estrutura.

 Estrutura => agrupa um conjunto de


dados não similares, formando um novo
tipo de dados.
structs (estruturas)

 Forma Geral:
struct nome do tipo de estrutura
{
tipo_1 nome_1;
tipo_2 nome_2;
...
}variáveis_estrutura;
structs (estruturas)

 Exemplo:

struct ficha_pessoal
{
char nome [20];
long int telefone;
};

main (void)
{
struct ficha_pessoal ficha;
ficha.telefone = 3434399;
}
structs (estruturas)

 Exemplo: (Micro.h)

struct {
unsigned char bit0:1;
unsigned char bit1:1;
unsigned char bit2:1;
unsigned char bit3:1;
unsigned char bit4:1;
unsigned char bit5:1;
unsigned char bit6:1;
unsigned char bit7:1;
} bit;
structs (estruturas)
 Exemplo: (mc9s08jm60.h)
struct {
byte PTAD0 :1; /* Port A Data Register Bit 0 */
byte PTAD1 :1; /* Port A Data Register Bit 1 */
byte PTAD2 :1; /* Port A Data Register Bit 2 */
byte PTAD3 :1; /* Port A Data Register Bit 3 */
byte PTAD4 :1; /* Port A Data Register Bit 4 */
byte PTAD5 :1; /* Port A Data Register Bit 5 */
byte :1;
byte :1;
} Bits;

struct {
byte grpPTAD :6;
byte :1;
byte :1;
} MergedBits;
union (união)

 Uma declaração union determina uma única


localização de memória onde podem estar
armazenadas várias variáveis diferentes.

 A declaração de uma união é semelhante à


declaração de uma estrutura:

union nome_do_tipo_da_union
{ tipo_1 nome_1;
tipo_2 nome_2; ...
tipo_n nome_n;
} variáveis_union;
union (união)
Exemplo: micros.h
union DEF_LOWBYTE
{
unsigned char byte;
struct {
unsigned char bit0:1;
unsigned char bit1:1;
unsigned char bit2:1;
unsigned char bit3:1;
unsigned char bit4:1;
unsigned char bit5:1;
unsigned char bit6:1;
unsigned char bit7:1;
} bit;
} DATA_REG;
Comando Typedef

 Permite o programador definir um novo nome


para um determinado tipo.

 Forma Geral:
typedef antig_nome novo_nome

 Exemplo:
typedef int inteiro;

inteiro a;
Comando Typedef

Exemplo: (Gpio.h)

typedef enum { INPUT_DIGITAL = 0,


INPUT_DIGITAL_PULLUP,
OUTPUT_DIGITAL
} GPIO_PIN_TYPE ;

void Gpio__PinConfig(…,GPIO_PIN_TYPE type);


Comando Typedef
Exemplo: (Gpio.h para JM60)

typedef enum { PORT_A = 0,


PORT_B,
PORT_C,
PORT_D,
PORT_E,
PORT_F,
PORT_G,
NUM_OF_PORTS
}GPIO_PORT;;

void Gpio_PinConfig (GPIO_PORT port…);


Comando Typedef
Exemplo: (Gpio.h para ATMEGA 328-P)

typedef enum { PORT_B = 0,


PORT_C,
PORT_D,
NUM_OF_PORTS
}GPIO_PORT;;

void Gpio_PinConfig (GPIO_PORT port…);


Comando Typedef Typedef pode dar nome a tipos
complexos como as estruturas.
Exemplo: (Micro.h)
//union Low Byte bit definitions Bits 0 - 7
typedef union
{
unsigned char byte;
struct {
unsigned char bit0 :1;
unsigned char bit1 :1;
unsigned char bit2 :1;
unsigned char bit3 :1;
unsigned char bit4 :1;
unsigned char bit5 :1;
unsigned char bit6 :1;
unsigned char bit7 :1;
} bit;
} DEF_LOWBYTE;
Comando Typedef Typedef pode dar nome a tipos
complexos como as estruturas.
Exemplo: (Micro.h)
// Port Data and Direction Registers

typedef struct
{ volatile DEF_LOWBYTE DATA_REG;
volatile DEF_LOWBYTE DIRECTION_REG;
} GPIO_DATA_TYPE;
Como escrever uma estrutura do tipo GPIO_DATA_TYPE?

typedef struct
{
volatile DEF_LOWBYTE...

} GPIO_DATA_TYPE;
Como definir os dados/endereços dos
registradores?

Registers Address
dados/endereços dos registradores

 Exemplo (Micros.h do JM60)

//Port A Data Register

#define GPIOA_DATA (*((volatile GPIO_DATA_TYPE


*)0x00000000))
Dados/endereços dos registradores do
ATMEGA 328P
Registers Address
#define GPIOB_DATA (*((volatile GPIO_DATA_TYPE *)
0x00000023)) //Port B Data Register

...continuar!
Introdução à Linguagem C
Livro: Avr e Arduino
e
a partir da Pg. 67 até 100

AVR e arduino

Você também pode gostar