Você está na página 1de 34

Programação de sistemas embarcados

Rodrigo Almeida

Universidade Federal de Itajubá

rodrigomax@unifei.edu.br

ECOP04 Programação de sistemas embarcados rodrigomax@unifei.edu.br 1 / 34


Conteúdo Programático

Conteúdo Programático

ECOP04 Programação de sistemas embarcados rodrigomax@unifei.edu.br 2 / 34


Conteúdo Programático

Aulas

1 Linguagem C, Hardware utilizado, Arquivos .c e .h, Diretivas de compilação


2 Tipos de dados em linguagem C, Operações aritméticas, Função main(), Rotinas de tempo
3 Operações com bits e dicas para debugar sistemas embarcados
4 Ponteiros e endereços de memória, Arquitetura e configuração do microcontrolador,
5 Programação dos periféricos, acesso às portas do microcontrolador, Barramento de Led’s
6 Display de sete segmentos, multiplexação
7 Operação com teclas em arranjo matricial, debounce por software, processo de varredura
8 Display LCD 2x16
9 Protocolos RS232 e SPI. Aplicações de relógio de tempo real (HT1380) e leitura de dados
de GPS com protocolo NMEA.
10 Leitura de valores analógicos via conversores AD e utilização de saı́das PWM.
11 Utilização de timers para contagem de tempo e reprodução de sons com PWM.
12 Aplicação de interrupções para acesso a dispositivos de hardware. Utilização de watchdog
para aumento de confiabilidade.
13 Modelos de arquiteturas de software disponı́veis para sistemas embarcados.
14 Programação segura*

ECOP04 Programação de sistemas embarcados rodrigomax@unifei.edu.br 3 / 34


Conteúdo Programático

Dados Importantes
Teórica:
Local ⇒ Sala X.1.2.03
Horário ⇒ 3T12
Laboratório (ELTP14):
Local ⇒ Sala LEC II
Horário ⇒
P1: 3M23
P2: 3M45
P3: 6T12
Datas Importantes *:
Prova 01 ⇒ 28/08
Prova 02 ⇒ 25/09
Prova 03 ⇒ 04/12
Sub ⇒ 11/12

* Datas
Todas as datas estão sujeitas a alterações.

ECOP04 Programação de sistemas embarcados rodrigomax@unifei.edu.br 4 / 34


Conteúdo Programático

Referências Bibliográficas
Notas de Aula de ECOP04 (https://sites.google.com/site/rmaalmeida/)
Programação de Sistemas Embarcados. Almeida, R.M.A., Moraes, C.H.V,
Seraphim T.F.P., Elsevier 2016
Embedded systems: design and applications with the 68HC12 and HCS12.
BARRETT,Steven F; PACK, Daniel J., Prentice Hall, 2005
C completo e total. Herbert Schildt. Makron Books. 3a Edição. 1997.
The art of Programming Embedded Systems, Ganssle, J. Academic Press

ECOP04 Programação de sistemas embarcados rodrigomax@unifei.edu.br 5 / 34


Sistemas Embarcados - Introdução

Sistemas Embarcados - Introdução

ECOP04 Programação de sistemas embarcados rodrigomax@unifei.edu.br 6 / 34


Sistemas Embarcados - Introdução

Sistemas Embarcados

ECOP04 Programação de sistemas embarcados rodrigomax@unifei.edu.br 7 / 34


Sistemas Embarcados - Introdução

Hardware Utilizado

Kit de desenvolvimento PIC18F4520


1 display LCD 2 linhas por 16 caracteres
4 displays de 7 segmentos multiplexados
8 leds ligados ao mesmo barramento dos displays
16 mini switches organizadas em formato matricial 4x4
1 sensor de temperatura LM35C
1 resistência de aquecimento ligada a uma saı́da PWM
1 buzzer ligado a uma saı́da PWM
1 motor DC tipo ventilador a uma saı́da PWM
1 canal de comunicação serial padrão RS-232

ECOP04 Programação de sistemas embarcados rodrigomax@unifei.edu.br 8 / 34


Sistemas Embarcados - Introdução

Ambiente de Programação

Ferramentas a serem utilizadas:


IDE: MPLAB X - Mista
Compilador: SDCC 3.4.0 (win32) - GPL
Linker/Assembler: GPUtils 1.3.0 (win32) - GPL
Plugin MPLAB: Sdcc Toolchain - GPL

Cuidado
O processo de instalação exige certos cuidados. Referenciem pela apostila.

ECOP04 Programação de sistemas embarcados rodrigomax@unifei.edu.br 9 / 34


Linguagem C

Linguagem C

ECOP04 Programação de sistemas embarcados rodrigomax@unifei.edu.br 10 / 34


Linguagem C

Linguagem C

Lógica de Programação
é necessária para as pessoas que desejam trabalhar com
desenvolvimento de programas e sistemas
permite definir uma sequência natural de atividades com a intenção
de atingir um objetivo

Lógica de Programação
É a técnica de encadear pensamentos em uma sequência lógica para
atingir um determinado objetivo.

ECOP04 Programação de sistemas embarcados rodrigomax@unifei.edu.br 11 / 34


Linguagem C

Linguagem C

Aplicação

Sistema Operacional

Firmware

Hardware

ECOP04 Programação de sistemas embarcados rodrigomax@unifei.edu.br 12 / 34


Linguagem C

Linguagem C

Fonte: http://www.tiobe.com/tiobe-index/

ECOP04 Programação de sistemas embarcados rodrigomax@unifei.edu.br 13 / 34


Linguagem C

Linguagem C

Fonte: http://www.embedded.com/design/218600142

ECOP04 Programação de sistemas embarcados rodrigomax@unifei.edu.br 14 / 34


Linguagem C

Linguagem C

Fonte: https://embeddedgurus.com/barr-code/2018/02/c-the-immortal-programming-
language/

ECOP04 Programação de sistemas embarcados rodrigomax@unifei.edu.br 15 / 34


Linguagem C

Indentação e padrão de escrita

Atenção
Detalhes do estilo não são importantes. A coerência dentro do projeto sim.

O estilo adotado é uma variação do “K&R-1TBS”.


Só muda a chave de abertura da função, que fica na mesma linha
Todo bloco deve ser aberto e fechado por chaves, mesmo que com
apenas uma linha.

Porque escolhi esse estilo?


1 Porque sim.
2 Economizar espaço no slide.
3 Porque sim.

ECOP04 Programação de sistemas embarcados rodrigomax@unifei.edu.br 16 / 34


Arquivos .c e .h

Arquivos .c e .h

ECOP04 Programação de sistemas embarcados rodrigomax@unifei.edu.br 17 / 34


Arquivos .c e .h

Arquivos .c e .h

Arquivo de código (code)


terminado com a extensão .c
contém a implementação do código
é compilado gerando um arquivo .o
Arquivo de cabeçalho (header)
terminado com a extensão .h
contém apenas defines e protótipos
não é compilado

ECOP04 Programação de sistemas embarcados rodrigomax@unifei.edu.br 18 / 34


Arquivos .c e .h

Arquivos .c e .h

1 // exemplo de código usando o estilo adotado


2
3 // v a r i á v e l usada apenas dentro deste arquivo
4 static char temp ;
5 // v a r i á v e l que será usada também fora do arquivo
6 static char valor ;
7 // funç~ o es usadas dentro e fora do arquivo
8 void MudaDigito ( char val ) {
9 valor = val ;
10 }
11 char LerDigito ( void ) {
12 return valor ;
13 }
14 void I n i c i a l i z a D i s p l a y s ( void ) {
15 // código da funç~ ao
16 }
17 // funç~ a o usada apenas dentro deste arquivo
18 void At ua li z aD is pl a y ( void ) {
19 // código da funç~ ao
20 }

ECOP04 Programação de sistemas embarcados rodrigomax@unifei.edu.br 19 / 34


Arquivos .c e .h

Arquivos .c e .h

1 # ifndef VAR_H
2 # define VAR_H
3 void MudaDigito ( char val ) ;
4 char LerDigito ( void ) ;
5 void I n i c i a l i z a D i s p l a y s ( void ) ;
6 # endif // V A R H

Atenção
Não existe a função AtualizaDisplay()
A variável “digito” só pode ser lida ou gravada pelas funções
MudaDigito() e LerDigito()
Cuidado com o overhead de funções

ECOP04 Programação de sistemas embarcados rodrigomax@unifei.edu.br 20 / 34


Diretivas de compilação

Diretivas de compilação

ECOP04 Programação de sistemas embarcados rodrigomax@unifei.edu.br 21 / 34


Diretivas de compilação

Diretivas de compilação

ECOP04 Programação de sistemas embarcados rodrigomax@unifei.edu.br 22 / 34


Diretivas de compilação

Diretivas de compilação

As diretivas de compilação são instruções dadas ao compilador.


Elas não são executadas.
As diretivas de compilação começam com um sinal #, conhecido
como jogo da velha ou hash.

ECOP04 Programação de sistemas embarcados rodrigomax@unifei.edu.br 23 / 34


Diretivas de compilação

#define

A diretiva #define é utilizada para que o código fonte seja modificado


antes de ser compilado.

1 # define CONST 15
2 void main ( void ) {
3 printf ( " % d " , CONST * 3 ) ;
4 }
5
6 // depois de c o m p i l a d o
7 void main ( void ) {
8 printf ( " % d " , 15 * 3 ) ;
9 // é p o s s ı́ v e l : printf ("% d " , 45 ) ;
10 }

ECOP04 Programação de sistemas embarcados rodrigomax@unifei.edu.br 24 / 34


Diretivas de compilação

#define

Atenção!
A diretiva #define NÃO cria uma constante.

ECOP04 Programação de sistemas embarcados rodrigomax@unifei.edu.br 25 / 34


Compilação condicional

Compilação condicional

ECOP04 Programação de sistemas embarcados rodrigomax@unifei.edu.br 26 / 34


Compilação condicional

#define

1 // funç~
a o para a p r e s e n t a r d i s p o s i t i v o s e l e c i o n a d o
2
3 void M o s t r a S a i d a P a d r a o ( void ) {
4
5 # ifdef PADRAO Serial
6 char * msg = " SERIAL " ;
7 # else
8 char * msg = " LCD " ;
9 # endif
10 printf ( msg ) ;
11 }

ECOP04 Programação de sistemas embarcados rodrigomax@unifei.edu.br 27 / 34


Compilação condicional

#define
Resultado
Opções de uso com o #define
na Tela

1 # include < stdio .h >


2 # define PADRAO Serial
3
4 void main ( void ) { SERIAL
5 M o s t r a S a i d a P a d r a o () ;
6 }

1 # include < stdio .h >


2 # define PADRAO LCD
3
4 void main ( void ) { LCD
5 M o s t r a S a i d a P a d r a o () ;
6 }

ECOP04 Programação de sistemas embarcados rodrigomax@unifei.edu.br 28 / 34


Compilação condicional

#ifdef, #ifndef, #else e #endif

1 void ImprimirTemp ( char valor ) {


2 # ifdef LCD
3 Imprime_LCD ( valor ) ;
4 # else
5 if ( valor > 30 ) {
6 led = 1 ;
7 } else {
8 led = 0 ;
9 }
10 # endif // LCD
11 }

Funcionamento
No momento da compilação o pré-compilador irá verificar se a “tag” LCD foi definida em algum
lugar. Em caso positivo o pré-compilador irá deixar tudo que estiver entre o #ifdef e o #else e
retirará tudo que está entre o #else e o #endif.

ECOP04 Programação de sistemas embarcados rodrigomax@unifei.edu.br 29 / 34


Referência circular

Referência circular

ECOP04 Programação de sistemas embarcados rodrigomax@unifei.edu.br 30 / 34


Referência circular

Referência circular

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 LerT emperatu ra ( void ) ;
3 void AjustaCalor ( char val ) ;

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


AjustaCalor().

1 # include " temp . h "


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

ECOP04 Programação de sistemas embarcados rodrigomax@unifei.edu.br 31 / 34


Referência circular

Referência circular

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 Programação de sistemas embarcados rodrigomax@unifei.edu.br 32 / 34


Referência circular

Referência circular

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

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

ECOP04 Programação de sistemas embarcados rodrigomax@unifei.edu.br 33 / 34


Referência circular

Referência circular

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

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 conteúdo

#endif

ECOP04 Programação de sistemas embarcados rodrigomax@unifei.edu.br 34 / 34

Você também pode gostar