Programa¸c˜
ao de sistemas embarcados
Rodrigo Almeida
Universidade Federal de Itajub´a
Conte´udo Program´atico
Conte´udo Program´atico
Aulas
1 Linguagem C, Hardware utilizado, Arquivos .c e .h, Diretivas de compila¸c˜ao
2 Tipos de dados em linguagem C, Opera¸c˜oes aritm´eticas, Fun¸c˜ao main(), Rotinas de tempo
3 Opera¸c˜oes com bits e dicas para debugar sistemas embarcados
4 Ponteiros e endere¸cos de mem´oria, Arquitetura e configura¸c˜ao do microcontrolador,
5 Programa¸c˜ao dos perif´ericos, acesso `as portas do microcontrolador, Barramento de Led’s
6 Display de sete segmentos, multiplexa¸c˜ao
7 Opera¸c˜ao com teclas em arranjo matricial, debounce por software, processo de varredura
8 Display LCD 2x16
9 Protocolos RS232 e SPI. Aplica¸c˜oes de rel´ogio de tempo real (HT1380) e leitura de dados de GPS com protocolo NMEA.
10 Leitura de valores anal´ogicos via conversores AD e utiliza¸c˜ao de sa´ıdas PWM.
11 Utiliza¸c˜ao de timers para contagem de tempo e reprodu¸c˜ao de sons com PWM.
12 Aplica¸c˜ao de interrup¸c˜oes para acesso a dispositivos de hardware. Utiliza¸c˜ao de watchdog para aumento de confiabilidade.
13 Modelos de arquiteturas de software dispon´ıveis para sistemas embarcados.
Conte´udo Program´atico
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
Conte´udo Program´atico
Referˆ
encias Bibliogr´
aficas
Notas de Aula de Programa¸c˜ao de Sistemas
Embarcados(https://sites.google.com/site/rmaalmeida/)
Programa¸c˜ao 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¸c˜ao. 1997. The art of Programming Embedded Systems, Ganssle, J. Academic Press, 1991
Sistemas Embarcados - Introdu¸c˜ao
Sistemas Embarcados - Introdu¸c˜ao
Sistemas Embarcados
Sistemas Embarcados - Introdu¸c˜ao
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ˆencia 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¸c˜ao serial padr˜ao RS-232
Sistemas Embarcados - Introdu¸c˜ao
Ambiente de Programa¸c˜
ao
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
Linguagem C
Linguagem C
Linguagem C
L´ogica de Programa¸c˜ao ´
e necess´aria para as pessoas que desejam trabalhar com desenvolvimento de programas e sistemas
permite definir uma sequˆencia natural de atividades com a inten¸c˜ao de atingir um objetivo
L´ogica de Programa¸c˜ao
´
E a t´ecnica de encadear pensamentos em uma sequˆencia l´ogica para atingir um determinado objetivo.
Linguagem C
Linguagem C
Firmware
Hardware
Sistema Operacional
Aplicação
Linguagem C
Linguagem C
Linguagem C
Linguagem C
Linguagem C
Indenta¸c˜
ao e padr˜
ao de escrita
Aten¸c˜ao
Detalhes do estilo n˜ao s˜ao importantes. A coerˆencia dentro do projeto sim. O estilo adotado ´e uma varia¸c˜ao do “K&R-1TBS”.
S´o muda a chave de abertura da fun¸c˜ao, que fica na mesma linha
Todo bloco deve ser aberto e fechado por chaves, mesmo que com apenas uma linha.
Porque escolher esse estilo?
1 Porque sim.
2 Economizar espa¸co no slide. 3 Porque sim.
Arquivos .c e .h
Arquivos .c e .h
Arquivos .c e .h
Arquivo de c´odigo (code)
terminado com a extens˜ao .c cont´em a implementa¸c˜ao do c´odigo ´e compilado gerando um arquivo .o
Arquivo de cabe¸calho (header)
terminado com a extens˜ao .h cont´em apenas defines e prot´otipos n˜ao ´e compilado
Arquivos .c e .h
Arquivos .c e .h
1 // e x e m p l o de c ´o d i g o u s a n d o o e s t i l o a d o t a d o 2 3 // v a r i ´a v e l u s a d a a p e n a s d e n t r o d e s t e a r q u i v o 4 s t a t i c c h a r t e m p ; 5 // v a r i ´a v e l q u e s e r ´a u s a d a t a m b ´e m f o r a do a r q u i v o 6 s t a t i c c h a r v a l o r ; 7 // f u n ¸c ~o e s u s a d a s d e n t r o e f o r a do a r q u i v o 8 v o i d M u d a D i g i t o (c h a r val ) { 9 v a l o r = val ; 10 } 11 c h a r L e r D i g i t o (v o i d) { 12 r e t u r n v a l o r ; 13 } 14 v o i d I n i c i a l i z a D i s p l a y s (v o i d) { 15 // c ´o d i g o da f u n ¸c ~a o 16 } 17 // f u n ¸c ~a o u s a d a a p e n a s d e n t r o d e s t e a r q u i v o 18 v o i d A t u a l i z a D i s p l a y (v o i d) { 19 // c ´o d i g o da f u n ¸c ~a o 20 }Arquivos .c e .h
Arquivos .c e .h
1 # i f n d e f V A R _ H 2 #d e f i n e V A R _ H 3 v o i d M u d a D i g i t o (c h a r val ) ; 4 c h a r L e r D i g i t o (v o i d) ; 5 v o i d I n i c i a l i z a D i s p l a y s (v o i d) ; 6 # e n d i f // V A R H Aten¸c˜aoN˜ao existe a fun¸c˜ao AtualizaDisplay()
A vari´avel “digito” s´o pode ser lida ou gravada pelas fun¸c˜oes MudaDigito() e LerDigito()
Diretivas de compila¸c˜ao
Diretivas de compila¸c˜ao
Diretivas de compila¸c˜ao
Diretivas de compila¸c˜
ao
As diretivas de compila¸c˜ao s˜ao instru¸c˜oes dadas ao compilador. Elas n˜ao s˜ao executadas.
As diretivas de compila¸c˜ao come¸cam com um sinal #, conhecido como jogo da velha ou hash.
Diretivas de compila¸c˜ao
#define
A diretiva #define ´e utilizada para que o c´odigo fonte seja modificado antes de ser compilado.
1 # d e f i n e C O N S T 15 2 v o i d m a i n (v o i d) { 3 p r i n t f (" % d ", C O N S T * 3) ; 4 } 5 6 // d e p o i s de c o m p i l a d o 7 v o i d m a i n (v o i d) { 8 p r i n t f (" % d ", 15 * 3) ; 9 // ´e p o s s ´ı v e l : p r i n t f ( " % d " , 45 ) ; 10 }
Diretivas de compila¸c˜ao
#define
Aten¸c˜ao!
Compila¸c˜ao condicional
Compila¸c˜ao condicional
#define
1 // f u n ¸c ~a o p a r a 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 v o i d M o s t r a S a i d a P a d r a o (v o i d) { 4 5 # i f d e f P A D R A O S e r i a l 6 c h a r * msg = " S E R I A L "; 7 # e l s e 8 c h a r * msg = " LCD "; 9 # e n d i f 10 p r i n t f ( msg ) ; 11 }Compila¸c˜ao condicional
#define
Op¸c˜oes de uso com o #define Resultado
na Tela 1 # i n c l u d e < s t d i o . h > 2 # d e f i n e P A D R A O S e r i a l 3 4 v o i d m a i n (v o i d) { 5 M o s t r a S a i d a P a d r a o () ; 6 } SERIAL 1 # i n c l u d e < s t d i o . h > 2 # d e f i n e P A D R A O LCD 3 4 v o i d m a i n (v o i d) { 5 M o s t r a S a i d a P a d r a o () ; 6 } LCD
Compila¸c˜ao condicional
#ifdef, #ifndef, #else e #endif
1 v o i d I m p r i m i r T e m p (c h a r v a l o r ) { 2 #i f d e f LCD 3 I m p r i m e _ L C D ( v a l o r ) ; 4 #e l s e 5 if ( v a l o r > 30) { 6 led = 1; 7 }e l s e{ 8 led = 0; 9 } 10 #e n d i f // L C D 11 } Funcionamento
No momento da compila¸c˜ao o pr´e-compilador ir´a verificar se a “tag” LCD foi definida em algum lugar. Em caso positivo o pr´e-compilador ir´a deixar tudo que estiver entre o #ifdef e o #else e retirar´a tudo que est´a entre o #else e o #endif.
Referˆencia circular
Referˆencia circular
Referˆ
encia circular
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) ;
Referˆencia circular
Referˆ
encia circular
#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);
Referˆencia circular
Referˆ
encia circular
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
Referˆencia circular
Referˆ
encia circular
Solu¸c˜ao: criar uma estrutura de controle para pr´e compila¸c˜ao.
#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