SlideShare ist ein Scribd-Unternehmen logo
1 von 34
Downloaden Sie, um offline zu lesen
ELT048 - SOE
Drivers
Rodrigo Almeida
Universidade Federal de Itajubá
Revisão
● Sistema de tempo real
● Requisitos temporais
Real time
● Capacidade de um
sistema em garantir
a peridiocidade de
uma tarefa
● Determinismo
Requisitos temporais
● Para implementar um sistema que trabalhe
com requisitos temporais:
1)Deve existir um relógio que trabalhe com uma
frequência precisa.
2)O kernel deve ser informado da frequência, ou
período, de execução de cada processo.
3)A soma dos tempos de cada processo deve
“caber” no tempo disponível do processador.
●
1a
condição:
● É necessário um timer que possa gerar uma
interrupção.
●
2a
condição:
● Adicionar as informações na estrutura do
processo
●
3a
condição:
● Testar, testar e testar.
● Em caso de falha:
– Chip mais rápido
– Otimização
Requisitos temporais
Rotina de Interrupção
//colocar no MCUinit.c na função isrVrti()
#include “kernel.h”
__interrupt void isrVrti(void){
KernelClock();
//limpar a flag de interrupção
CRGFLG = 0x80;
}
Rotina de Interrupção
//colocar no kernel.c
#define MIN_INT -30000
void KernelClock(void){
unsigned char i;
i = ini;
while(i!=fim){
if((pool[i].start)>(MIN_INT)){
pool[i].start--;
}
i = (i+1)%SLOT_SIZE;
}
}
//colocar no kernel.h
void KernelClock(void);
Exercício
● Montar um relógio binário onde cada led
pisca numa frequência diferente
1
2
3
4
1 segundo
2 segundos
4 segundos
8 segundos //Ligar o 1o led
PORTB = PORTB | 0x01;
//Desligar o 1o led
PORTB = PORTB & ~0x01;
//Piscar o 1o led
PORTB = PORTB ^ 0x01;
Driver
● Driver é uma abstração em software do
hardware da placa, suas funcionalidades,
opções e modos de funcionamento.
● É dependente do processador,dos
componentes conectados e das ligações
entre eles.
Driver
● Exemplo:
● Display de LCD:
– 16 colunas X 2 linhas
– Compatível com HD44780 (Hitachi)
● Dragon12
– Ligação em 4 bits
– Acesso à EN e RS
● MC9HCS12DG256
– Utilizada a porta K
● Rotinas de inicialização e comunicação
Rotina de inicialização do LCD
Esquemático LCD - Dragon12
LCD + Dragon 12 + HCS12
● Utilizar as portas do HCS12 conforme
ligação da Dragon12
● PORTK(6:2) → Data
● PORTK(1) → Enable
● PORTK(0) → RS (data/cmd)
● Montar as rotinas de acordo com o
datasheet do HD44780
● Comunicação em 4 bits
Rotinas de acesso ao LCD
● Referencia para implementação das rotinas
● http://www.evbplus.com/hcs12_9s12_resources
/app_notes.html
● Apresenta 4 funções
● void initLcd(void)
● void writeLine(char *string, int line)
● void writeLcd8(unsigned char data, unsigned char rs)
● void writeLcd4(unsigned char data, unsigned char rs)
● void lcdDelay(unsigned long constant)
Rotinas de acesso ao LCD
void writeLcd4(unsigned char data, unsigned char rs)
{
unsigned char hi, lo;
/* split byte into 2 nibbles and shift to line up
* with data bits in port K */
hi = ((data & 0xf0) >> 2) | (rs & 0x01) ;
lo = ((data & 0x0f) << 2) | (rs & 0x01) ;
/* do write pulses for upper, then lower nibbles */
PORTK = hi; // write with EN=0
PORTK = hi | ENBIT; // write with EN=1
PORTK = hi; // write with EN=0
PORTK = lo; // write with EN=0
PORTK = lo | ENBIT; // write with EN=1
PORTK = lo; // write with EN=0
/* allow instruction to complete */
lcdDelay(DELAY40US);
} // end writeLcd4()
Rotinas de acesso ao LCD
void writeLcd8(unsigned char data) {
unsigned char temp;
/* shift upper nibble to data bits in port K */
temp = (data >> 2); // rs is always 0
/* Now do the EN pulsing */
PORTK = temp; // write with EN=0
PORTK = temp | ENBIT; // write with EN=1
PORTK = temp; // write with EN=0
/* allow instruction to complete */
lcdDelay(DELAY40US);
} // end writeLcd8()
Rotinas de acesso ao LCD
void lcdDelay(unsigned long constant) {
volatile unsigned long counter;
for(counter = constant; counter > 0; counter--);
} // end lcdDelay()
Rotinas de acesso ao LCD
void LCD_init(void) {
/* initialise port */
DDRK = 0xff;
writeLcd8(0x30); // tell it once
lcdDelay(DELAY4_1MS);
writeLcd8(0x30); // tell it twice
lcdDelay(DELAY100US);
writeLcd8(0x30); // tell it thrice
// last write in 8-bit mode sets bus to 4 bit mode
writeLcd8(0x20);
/* In 4 bit mode, write upper/lower nibble */
writeLcd4(0x28, 0); // 4-bit, 2 lines, 5x7 matrix
writeLcd4(0x0c, 0); // disp on, cursor & blink off
writeLcd4(0x01, 0); // display clear
writeLcd4(0x06, 0); // disable display shift
} // end initLcd()
Rotinas de acesso ao LCD
void writeLine(char *string, int line) {
int i;
unsigned char instruction;
/* Set address in LCD module */
if( 1 == line)
instruction = 0xc0; // write bottom line
else
instruction = 0x80; // write top line
writeLcd4( instruction, 0); // rs=0 means command
/* blast out 16 bytes */
for( i = 0; i < LCDWIDTH; i++) {
writeLcd4( string[i], 1); // rs=1 means data
}
} // end writeLine()
Criação de um driver
● Para a criação de um driver basta
encapsular estas funções num conjunto
organizado e de fácil acesso.
● Headers e defines
● A mudança do driver não deve gerar
nenhuma alteração no código da aplicação.
● A criação de um driver deve se concentrar
na função e não nos recursos do
dispositivo.
Padronização
● A forma de uso de um drivers é
extremamente ligada a seu dispositivo.
● Padronizar os diversos tipos de drivers
envolve conceder concessões e inserir um
overhead que pode ser prejudicial ao
sistema
● No entanto isto permite construir um
sistema para gerenciamento dos mesmos
Padronização
● É possível separar as funções de um
dispositivo em 3 modelos
● Inicialização
● Execução de serviço/funcionalidade
● Retorno de informação
● Função de acesso ao driver
Padronização
● As funções do tipo inicialização são
executadas antes de utilizar o dispositivo.
● Podem tomar muito tempo
● Fazem parte do “boot” do sistema
Padronização
● As funções de execução de serviços são as
funções que realizam as operações do
dispositivo
● Escrever no LCD, gerar um sinal de PWM,
enviar uma informação via serial
● Em geral são executadas rapidamente
podendo ser sequenciadas num processo
sem impactos na velocidade de execução
Padronização
● As funções de retorno de informação
devolvem valores obtidos pelos dispositivos
● Leitura de uma tecla, recepção de um valor via
serial
● Estas funções são eventuais e não
determinísticas.
● Por esse motivo é uma boa pratica não esperar
que elas aconteçam.
Padronização
● Para simplificar a padronização foi criado
um modelo com:
● Uma função de inicialização do driver
● Um vetor com ponteiros de função com cada
função de execução
● Um sistema de callback para cada evento de
resposta do dispositivo
● Uma função que retorna uma struct do
driver
Padronização
Estruturas para a criação do driver
//Device Drivers Types (dd_types.h)
//ptr. de func. para uma função do driver
typedef char(*ptrFuncDrv)(void *parameters);
//estrutura do driver
typedef struct {
char drv_id;
ptrFuncDrv *drv_func;
ptrFuncDrv drv_init;
} driver;
//função de retorno do driver
typedef driver* (*ptrGetDrv)(void);
Drive genérico
● Desenvolvimento de um drive que altera o
valor da portaB (LED's)
Driver genérico
#ifndef drvGenerico_h
#define drvGenerico_h
#include "dd_types.h"
//lista de funções do driver
enum {
GEN_PORTB, GEN_END
};
//função de acesso ao driver
driver* getGenericoDriver(void);
#endif // drvGenerico_h
Driver genérico
//(drvGenerico.c)
// implementação do driver em struct
// apresenta todas as funções do driver
static driver thisDriver;
//lista de funções que o driver contém
static ptrFuncDrv this_functions[GEN_END];
Driver genérico
//(drvGenerico.c)
//funcionalidades implementadas
char changePORTB(void *parameters) {
PORTB = (char) parameters;
return FIM_OK;
}
//função para inicialização do hardware
char initGenerico(void *parameters) {
DDRB = 0xFF;
thisDriver.drv_id = (char) parameters;
return FIM_OK;
}
Driver genérico
//(drvGenerico.c)
//função para acesso ao driver
//deve inicializar a estrutura do driver
//e a lista de funções disponíveis
driver* getGenericoDriver(void) {
//função de inicialização
thisDriver.drv_init = initGenerico;
//funções do driver
this_functions[GEN_PORTB] = ChangePORTB;
//atualizando a referencia da lista
thisDriver.drv_func = &this_functions;
return &thisDriver;
}
Endereço da
função
Exercício
● Desenvolver um driver para o LCD
utilizando o modelo proposto

Weitere ähnliche Inhalte

Was ist angesagt?

Understanding Android Benchmarks
Understanding Android BenchmarksUnderstanding Android Benchmarks
Understanding Android Benchmarks
Koan-Sin Tan
 

Was ist angesagt? (20)

linux device driver
linux device driverlinux device driver
linux device driver
 
Advanced C - Part 1
Advanced C - Part 1 Advanced C - Part 1
Advanced C - Part 1
 
LAS16-403: GDB Linux Kernel Awareness
LAS16-403: GDB Linux Kernel AwarenessLAS16-403: GDB Linux Kernel Awareness
LAS16-403: GDB Linux Kernel Awareness
 
Linux Kernel Booting Process (1) - For NLKB
Linux Kernel Booting Process (1) - For NLKBLinux Kernel Booting Process (1) - For NLKB
Linux Kernel Booting Process (1) - For NLKB
 
Linux Internals - Part III
Linux Internals - Part IIILinux Internals - Part III
Linux Internals - Part III
 
Linux Internals - Part II
Linux Internals - Part IILinux Internals - Part II
Linux Internals - Part II
 
Spi drivers
Spi driversSpi drivers
Spi drivers
 
USB Drivers
USB DriversUSB Drivers
USB Drivers
 
Mastering Real-time Linux
Mastering Real-time LinuxMastering Real-time Linux
Mastering Real-time Linux
 
RISC-V-Day-Tokyo2018-suzaki
RISC-V-Day-Tokyo2018-suzakiRISC-V-Day-Tokyo2018-suzaki
RISC-V-Day-Tokyo2018-suzaki
 
C Programming - Refresher - Part II
C Programming - Refresher - Part II C Programming - Refresher - Part II
C Programming - Refresher - Part II
 
Understanding a kernel oops and a kernel panic
Understanding a kernel oops and a kernel panicUnderstanding a kernel oops and a kernel panic
Understanding a kernel oops and a kernel panic
 
Qemu JIT Code Generator and System Emulation
Qemu JIT Code Generator and System EmulationQemu JIT Code Generator and System Emulation
Qemu JIT Code Generator and System Emulation
 
Basic Linux Internals
Basic Linux InternalsBasic Linux Internals
Basic Linux Internals
 
TFLite NNAPI and GPU Delegates
TFLite NNAPI and GPU DelegatesTFLite NNAPI and GPU Delegates
TFLite NNAPI and GPU Delegates
 
Hardware Abstraction Layer
Hardware Abstraction LayerHardware Abstraction Layer
Hardware Abstraction Layer
 
Linux Device Tree
Linux Device TreeLinux Device Tree
Linux Device Tree
 
Linux Initialization Process (2)
Linux Initialization Process (2)Linux Initialization Process (2)
Linux Initialization Process (2)
 
Troubleshooting Linux Kernel Modules And Device Drivers
Troubleshooting Linux Kernel Modules And Device DriversTroubleshooting Linux Kernel Modules And Device Drivers
Troubleshooting Linux Kernel Modules And Device Drivers
 
Understanding Android Benchmarks
Understanding Android BenchmarksUnderstanding Android Benchmarks
Understanding Android Benchmarks
 

Ähnlich wie Desenvolvimento de drivers para sistemas embarcados

Projeto de uma controladora de drivers
Projeto de uma controladora de driversProjeto de uma controladora de drivers
Projeto de uma controladora de drivers
Rodrigo Almeida
 
Apresentação curso pic básico fbs eletrônica
Apresentação   curso pic básico fbs eletrônicaApresentação   curso pic básico fbs eletrônica
Apresentação curso pic básico fbs eletrônica
Fabio Souza
 
Clp completa
Clp completaClp completa
Clp completa
panelada
 

Ähnlich wie Desenvolvimento de drivers para sistemas embarcados (20)

Treinamento arduino (1).pptx
Treinamento arduino (1).pptxTreinamento arduino (1).pptx
Treinamento arduino (1).pptx
 
Projeto de uma controladora de drivers
Projeto de uma controladora de driversProjeto de uma controladora de drivers
Projeto de uma controladora de drivers
 
Pic slides
Pic slidesPic slides
Pic slides
 
Webinar: Porque o RTOS não faz o que eu quero?
Webinar: Porque o RTOS não faz o que eu quero?Webinar: Porque o RTOS não faz o que eu quero?
Webinar: Porque o RTOS não faz o que eu quero?
 
Microcontroladores pic lingc unicamp-150206140414-conversion-gate02
Microcontroladores pic lingc unicamp-150206140414-conversion-gate02Microcontroladores pic lingc unicamp-150206140414-conversion-gate02
Microcontroladores pic lingc unicamp-150206140414-conversion-gate02
 
Microcontroladores pic ling c unicamp
Microcontroladores pic ling c unicampMicrocontroladores pic ling c unicamp
Microcontroladores pic ling c unicamp
 
Programa final
Programa finalPrograma final
Programa final
 
Cartao referencia ccs
Cartao referencia ccsCartao referencia ccs
Cartao referencia ccs
 
Relatório final
Relatório finalRelatório final
Relatório final
 
Microcontroladores PIC.pptx
Microcontroladores PIC.pptxMicrocontroladores PIC.pptx
Microcontroladores PIC.pptx
 
Controle relés com Log, sensor hall e emergência
Controle relés com Log, sensor hall e emergênciaControle relés com Log, sensor hall e emergência
Controle relés com Log, sensor hall e emergência
 
Programa final
Programa finalPrograma final
Programa final
 
Interrupts and the timer
Interrupts and the timerInterrupts and the timer
Interrupts and the timer
 
V2 - Microcontroladores: a revolucao do arduino
V2 - Microcontroladores: a revolucao do arduinoV2 - Microcontroladores: a revolucao do arduino
V2 - Microcontroladores: a revolucao do arduino
 
Apresentação curso pic básico fbs eletrônica
Apresentação   curso pic básico fbs eletrônicaApresentação   curso pic básico fbs eletrônica
Apresentação curso pic básico fbs eletrônica
 
Ac16 conjunto de instruções v2
Ac16   conjunto de instruções v2Ac16   conjunto de instruções v2
Ac16 conjunto de instruções v2
 
MIPS Pipeline
MIPS Pipeline MIPS Pipeline
MIPS Pipeline
 
ARM
ARMARM
ARM
 
Clp completa
Clp completaClp completa
Clp completa
 
Webinar: Arquitetura de software para sistemas embarcados
Webinar: Arquitetura de software para sistemas embarcadosWebinar: Arquitetura de software para sistemas embarcados
Webinar: Arquitetura de software para sistemas embarcados
 

Mehr von Rodrigo Almeida

Segurança de sistemas: invasões, engenharia reversa e análise de virus
Segurança de sistemas: invasões, engenharia reversa e análise de virusSegurança de sistemas: invasões, engenharia reversa e análise de virus
Segurança de sistemas: invasões, engenharia reversa e análise de virus
Rodrigo Almeida
 
Acesso à memória e registros
Acesso à memória e registrosAcesso à memória e registros
Acesso à memória e registros
Rodrigo Almeida
 

Mehr von Rodrigo Almeida (20)

Embedded systems design @ defcon 2015
Embedded systems design @ defcon 2015Embedded systems design @ defcon 2015
Embedded systems design @ defcon 2015
 
Embedded systems development Defcon 19
Embedded systems development Defcon 19Embedded systems development Defcon 19
Embedded systems development Defcon 19
 
As diferentes engenharias
As diferentes engenhariasAs diferentes engenharias
As diferentes engenharias
 
Testing de software en instrumentos de pesar de funcionamiento no automatico ...
Testing de software en instrumentos de pesar de funcionamiento no automatico ...Testing de software en instrumentos de pesar de funcionamiento no automatico ...
Testing de software en instrumentos de pesar de funcionamiento no automatico ...
 
Seguridad de sistemas embebidos para el ámbito regulado - Alejandro Bertello ...
Seguridad de sistemas embebidos para el ámbito regulado - Alejandro Bertello ...Seguridad de sistemas embebidos para el ámbito regulado - Alejandro Bertello ...
Seguridad de sistemas embebidos para el ámbito regulado - Alejandro Bertello ...
 
Cryptology - Antônio Lacerda
Cryptology - Antônio LacerdaCryptology - Antônio Lacerda
Cryptology - Antônio Lacerda
 
Troca de contexto segura em sistemas operacionais embarcados utilizando de té...
Troca de contexto segura em sistemas operacionais embarcados utilizando de té...Troca de contexto segura em sistemas operacionais embarcados utilizando de té...
Troca de contexto segura em sistemas operacionais embarcados utilizando de té...
 
Troca de contexto segura em sistemas operacionais embarcados utilizando técni...
Troca de contexto segura em sistemas operacionais embarcados utilizando técni...Troca de contexto segura em sistemas operacionais embarcados utilizando técni...
Troca de contexto segura em sistemas operacionais embarcados utilizando técni...
 
Troca de contexto segura em sistemas operacionais embarcados utilizando técni...
Troca de contexto segura em sistemas operacionais embarcados utilizando técni...Troca de contexto segura em sistemas operacionais embarcados utilizando técni...
Troca de contexto segura em sistemas operacionais embarcados utilizando técni...
 
Definição de processos
Definição de processosDefinição de processos
Definição de processos
 
Ponteiros de Função
Ponteiros de FunçãoPonteiros de Função
Ponteiros de Função
 
Conceitos de ponteiros struct e buffers
Conceitos de ponteiros struct e buffersConceitos de ponteiros struct e buffers
Conceitos de ponteiros struct e buffers
 
Introdução aos sistemas operacionais embarcados
Introdução aos sistemas operacionais embarcadosIntrodução aos sistemas operacionais embarcados
Introdução aos sistemas operacionais embarcados
 
Segurança de sistemas: invasões, engenharia reversa e análise de virus
Segurança de sistemas: invasões, engenharia reversa e análise de virusSegurança de sistemas: invasões, engenharia reversa e análise de virus
Segurança de sistemas: invasões, engenharia reversa e análise de virus
 
Comunicação serial
Comunicação serialComunicação serial
Comunicação serial
 
Utilizando um Display de LCD
Utilizando um Display de LCDUtilizando um Display de LCD
Utilizando um Display de LCD
 
Leitura de teclas com arranjo matricial
Leitura de teclas com arranjo matricialLeitura de teclas com arranjo matricial
Leitura de teclas com arranjo matricial
 
Display de 7 segmentos multiplexados
Display de 7 segmentos multiplexadosDisplay de 7 segmentos multiplexados
Display de 7 segmentos multiplexados
 
Acessando os periféricos de um microcontrolador
Acessando os periféricos de um microcontroladorAcessando os periféricos de um microcontrolador
Acessando os periféricos de um microcontrolador
 
Acesso à memória e registros
Acesso à memória e registrosAcesso à memória e registros
Acesso à memória e registros
 

Kürzlich hochgeladen

Kürzlich hochgeladen (8)

ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdf
 
Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdf
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 

Desenvolvimento de drivers para sistemas embarcados

  • 1. ELT048 - SOE Drivers Rodrigo Almeida Universidade Federal de Itajubá
  • 2. Revisão ● Sistema de tempo real ● Requisitos temporais
  • 3. Real time ● Capacidade de um sistema em garantir a peridiocidade de uma tarefa ● Determinismo
  • 4. Requisitos temporais ● Para implementar um sistema que trabalhe com requisitos temporais: 1)Deve existir um relógio que trabalhe com uma frequência precisa. 2)O kernel deve ser informado da frequência, ou período, de execução de cada processo. 3)A soma dos tempos de cada processo deve “caber” no tempo disponível do processador.
  • 5. ● 1a condição: ● É necessário um timer que possa gerar uma interrupção. ● 2a condição: ● Adicionar as informações na estrutura do processo ● 3a condição: ● Testar, testar e testar. ● Em caso de falha: – Chip mais rápido – Otimização Requisitos temporais
  • 6. Rotina de Interrupção //colocar no MCUinit.c na função isrVrti() #include “kernel.h” __interrupt void isrVrti(void){ KernelClock(); //limpar a flag de interrupção CRGFLG = 0x80; }
  • 7. Rotina de Interrupção //colocar no kernel.c #define MIN_INT -30000 void KernelClock(void){ unsigned char i; i = ini; while(i!=fim){ if((pool[i].start)>(MIN_INT)){ pool[i].start--; } i = (i+1)%SLOT_SIZE; } } //colocar no kernel.h void KernelClock(void);
  • 8. Exercício ● Montar um relógio binário onde cada led pisca numa frequência diferente 1 2 3 4 1 segundo 2 segundos 4 segundos 8 segundos //Ligar o 1o led PORTB = PORTB | 0x01; //Desligar o 1o led PORTB = PORTB & ~0x01; //Piscar o 1o led PORTB = PORTB ^ 0x01;
  • 9. Driver ● Driver é uma abstração em software do hardware da placa, suas funcionalidades, opções e modos de funcionamento. ● É dependente do processador,dos componentes conectados e das ligações entre eles.
  • 10. Driver ● Exemplo: ● Display de LCD: – 16 colunas X 2 linhas – Compatível com HD44780 (Hitachi) ● Dragon12 – Ligação em 4 bits – Acesso à EN e RS ● MC9HCS12DG256 – Utilizada a porta K ● Rotinas de inicialização e comunicação
  • 12. Esquemático LCD - Dragon12
  • 13. LCD + Dragon 12 + HCS12 ● Utilizar as portas do HCS12 conforme ligação da Dragon12 ● PORTK(6:2) → Data ● PORTK(1) → Enable ● PORTK(0) → RS (data/cmd) ● Montar as rotinas de acordo com o datasheet do HD44780 ● Comunicação em 4 bits
  • 14. Rotinas de acesso ao LCD ● Referencia para implementação das rotinas ● http://www.evbplus.com/hcs12_9s12_resources /app_notes.html ● Apresenta 4 funções ● void initLcd(void) ● void writeLine(char *string, int line) ● void writeLcd8(unsigned char data, unsigned char rs) ● void writeLcd4(unsigned char data, unsigned char rs) ● void lcdDelay(unsigned long constant)
  • 15. Rotinas de acesso ao LCD void writeLcd4(unsigned char data, unsigned char rs) { unsigned char hi, lo; /* split byte into 2 nibbles and shift to line up * with data bits in port K */ hi = ((data & 0xf0) >> 2) | (rs & 0x01) ; lo = ((data & 0x0f) << 2) | (rs & 0x01) ; /* do write pulses for upper, then lower nibbles */ PORTK = hi; // write with EN=0 PORTK = hi | ENBIT; // write with EN=1 PORTK = hi; // write with EN=0 PORTK = lo; // write with EN=0 PORTK = lo | ENBIT; // write with EN=1 PORTK = lo; // write with EN=0 /* allow instruction to complete */ lcdDelay(DELAY40US); } // end writeLcd4()
  • 16. Rotinas de acesso ao LCD void writeLcd8(unsigned char data) { unsigned char temp; /* shift upper nibble to data bits in port K */ temp = (data >> 2); // rs is always 0 /* Now do the EN pulsing */ PORTK = temp; // write with EN=0 PORTK = temp | ENBIT; // write with EN=1 PORTK = temp; // write with EN=0 /* allow instruction to complete */ lcdDelay(DELAY40US); } // end writeLcd8()
  • 17. Rotinas de acesso ao LCD void lcdDelay(unsigned long constant) { volatile unsigned long counter; for(counter = constant; counter > 0; counter--); } // end lcdDelay()
  • 18. Rotinas de acesso ao LCD void LCD_init(void) { /* initialise port */ DDRK = 0xff; writeLcd8(0x30); // tell it once lcdDelay(DELAY4_1MS); writeLcd8(0x30); // tell it twice lcdDelay(DELAY100US); writeLcd8(0x30); // tell it thrice // last write in 8-bit mode sets bus to 4 bit mode writeLcd8(0x20); /* In 4 bit mode, write upper/lower nibble */ writeLcd4(0x28, 0); // 4-bit, 2 lines, 5x7 matrix writeLcd4(0x0c, 0); // disp on, cursor & blink off writeLcd4(0x01, 0); // display clear writeLcd4(0x06, 0); // disable display shift } // end initLcd()
  • 19. Rotinas de acesso ao LCD void writeLine(char *string, int line) { int i; unsigned char instruction; /* Set address in LCD module */ if( 1 == line) instruction = 0xc0; // write bottom line else instruction = 0x80; // write top line writeLcd4( instruction, 0); // rs=0 means command /* blast out 16 bytes */ for( i = 0; i < LCDWIDTH; i++) { writeLcd4( string[i], 1); // rs=1 means data } } // end writeLine()
  • 20. Criação de um driver ● Para a criação de um driver basta encapsular estas funções num conjunto organizado e de fácil acesso. ● Headers e defines ● A mudança do driver não deve gerar nenhuma alteração no código da aplicação. ● A criação de um driver deve se concentrar na função e não nos recursos do dispositivo.
  • 21. Padronização ● A forma de uso de um drivers é extremamente ligada a seu dispositivo. ● Padronizar os diversos tipos de drivers envolve conceder concessões e inserir um overhead que pode ser prejudicial ao sistema ● No entanto isto permite construir um sistema para gerenciamento dos mesmos
  • 22. Padronização ● É possível separar as funções de um dispositivo em 3 modelos ● Inicialização ● Execução de serviço/funcionalidade ● Retorno de informação ● Função de acesso ao driver
  • 23. Padronização ● As funções do tipo inicialização são executadas antes de utilizar o dispositivo. ● Podem tomar muito tempo ● Fazem parte do “boot” do sistema
  • 24. Padronização ● As funções de execução de serviços são as funções que realizam as operações do dispositivo ● Escrever no LCD, gerar um sinal de PWM, enviar uma informação via serial ● Em geral são executadas rapidamente podendo ser sequenciadas num processo sem impactos na velocidade de execução
  • 25. Padronização ● As funções de retorno de informação devolvem valores obtidos pelos dispositivos ● Leitura de uma tecla, recepção de um valor via serial ● Estas funções são eventuais e não determinísticas. ● Por esse motivo é uma boa pratica não esperar que elas aconteçam.
  • 26. Padronização ● Para simplificar a padronização foi criado um modelo com: ● Uma função de inicialização do driver ● Um vetor com ponteiros de função com cada função de execução ● Um sistema de callback para cada evento de resposta do dispositivo ● Uma função que retorna uma struct do driver
  • 28. Estruturas para a criação do driver //Device Drivers Types (dd_types.h) //ptr. de func. para uma função do driver typedef char(*ptrFuncDrv)(void *parameters); //estrutura do driver typedef struct { char drv_id; ptrFuncDrv *drv_func; ptrFuncDrv drv_init; } driver; //função de retorno do driver typedef driver* (*ptrGetDrv)(void);
  • 29. Drive genérico ● Desenvolvimento de um drive que altera o valor da portaB (LED's)
  • 30. Driver genérico #ifndef drvGenerico_h #define drvGenerico_h #include "dd_types.h" //lista de funções do driver enum { GEN_PORTB, GEN_END }; //função de acesso ao driver driver* getGenericoDriver(void); #endif // drvGenerico_h
  • 31. Driver genérico //(drvGenerico.c) // implementação do driver em struct // apresenta todas as funções do driver static driver thisDriver; //lista de funções que o driver contém static ptrFuncDrv this_functions[GEN_END];
  • 32. Driver genérico //(drvGenerico.c) //funcionalidades implementadas char changePORTB(void *parameters) { PORTB = (char) parameters; return FIM_OK; } //função para inicialização do hardware char initGenerico(void *parameters) { DDRB = 0xFF; thisDriver.drv_id = (char) parameters; return FIM_OK; }
  • 33. Driver genérico //(drvGenerico.c) //função para acesso ao driver //deve inicializar a estrutura do driver //e a lista de funções disponíveis driver* getGenericoDriver(void) { //função de inicialização thisDriver.drv_init = initGenerico; //funções do driver this_functions[GEN_PORTB] = ChangePORTB; //atualizando a referencia da lista thisDriver.drv_func = &this_functions; return &thisDriver; } Endereço da função
  • 34. Exercício ● Desenvolver um driver para o LCD utilizando o modelo proposto