Manual do Usuário
Sistema Operacional McData
1.
SISTEMA OPERACIONAL ...................................................................................................... 1
1.1.
1.2.
2.
DEFINIÇÃO ........................................................................................................................... 1
CARACTERÍSTICAS ............................................................................................................... 1
COMPILAÇÃO ......................................................................................................................... 2
2.1.
2.2.
2.3.
2.4.
2.5.
DEFINIÇÕES E ARQUIVOS DO COMPILADOR............................................................................. 2
DIAGRAMA DE BLOCOS DE UMA COMPILAÇÃO .......................................................................... 3
ARQUIVOS DO USUÁRIO ........................................................................................................ 3
COMPILADOR C18................................................................................................................ 3
LINKER UTILIZADO ................................................................................................................ 4
3.
CRIANDO UM PROJETO NO MPLAB .................................................................................... 5
4.
FUNÇÕES .............................................................................................................................. 15
4.1.
4.2.
4.3.
4.4.
4.5.
4.6.
4.7.
4.8.
FUNÇÕES BÁSICAS DA APLICAÇÃO DO USUÁRIO ..................................................................... 15
FUNÇÕES DIGITAIS ............................................................................................................. 21
FUNÇÕES DO CONVERSOR ANALÓGICO DIGITAL (A/D) .......................................................... 25
FUNÇÕES DO CONVERSOR DIGITAL ANALÓGICO (D/A) .......................................................... 26
FUNÇÃO DO MÓDULO PWM ................................................................................................ 26
FUNÇÕES DA COMUNICAÇÃO SERIAL RS-232........................................................................ 27
FUNÇÕES DO RELÓGIO DE TEMPO REAL (RTC) ..................................................................... 32
FUNÇÕES DA MEMÓRIA SERIAL E2PROM............................................................................. 33
5.
BIBLIOGRAFIA ...................................................................................................................... 35
6.
EXEMPLO .............................................................................................................................. 36
Manual do Usuário – Sistema Operacional McData
I
1.
Sistema Operacional
1.1.
Definição
O sistema operacional McData, é um programa desenvolvido em linguagem C para o
controle do hardware da placa e configuração do microcontrolador. O objetivo é permitir ao
usuário a implementação de uma aplicação de mais alto nível a partir da utilização das funções
disponíveis no sistema operacional sem a necessidade do conhecimento dos componentes do
circuito.
1.2.
Características
A velocidade de processamento é de 10MIPS (10 milhões de instruções por segundo). A
memória de programa que o sistema ocupa é de 19% da memória total do microcontrolador que é
de 32kB. A memória RAM ocupada é de aproximadamente 17% da memória total de 3968bytes.
O sistema operacional utiliza os recursos do microcontrolador PIC18F452 e executa
basicamente duas tarefas: uma interrupção prioritária a cada 100us para controle das funções do
sistema operacional e a aplicação do usuário. A aplicação do usuário está subdividida no
programa principal e nas interrupções do usuário. Desta forma, o sistema operacional utiliza uma
interrupção de alta prioridade que interrompe qualquer processo do usuário a cada 100us. Isto
significa que o programa principal e as interrupções do usuário são periodicamente paralisados
para atender as necessidades do sistema operacional. A interrupção do sistema operacional
demanda entre 15us e 36,1us com um valor médio de 20us, de forma que os 80us restantes ficam
disponíveis para a aplicação e as interrupções do usuário. Sendo assim, o usuário deve levar este
fato em consideração no seu projeto e na análise de tempos e desempenho da aplicação.
Manual do Usuário – Sistema Operacional McData
1
2.
Compilação
Este capítulo descreve de forma resumida o que é um compilador e quais os arquivos
gerados e/ou necessários à criação de uma aplicação com o sistema operacional McData.
2.1.
Definições e Arquivos do Compilador
Compilador C
É um programa que converte arquivos fonte escritos em liguagem C com extensão “.c” para
arquivos objeto com extensão “.o”.
Compilador Assembler
É um programa que converte arquivos fonte escritos em liguagem assmebly com extensão
“.asm” para arquivos objeto com extensão “.o”.
Arquivo linker script
É um arquivo com extensão “.lkr” que contém algumas definições para divisão da memória
de dados (RAM) e a memória de programa (ROM). O linker utiliza este arquivo para saber onde
alocar o programa e as variáveis de RAM no microcontrolador.
Arquivo library
É um arquivo de biblioteca de funções com extensão “.lib”.
Arquivo header
É um arquivo com extensão “.h” que contém a prototipagem de funções e definição de
algumas constantes. É convertido pelo compilador C para um arquivo objeto para ser utilizado
pelo linker.
Linker
É um programa que associa todos os arquivos objeto, os arquivos library e os arquivos
linker script e gera alguns arquivos de saída, entre eles o arquivo para gravação no compilador
com extensão “.hex”.
Arquivo map
É um arquivo que contém informações da compilação como quantidade de RAM e memória
de programa utilizados.
Arquivo lst
É um arquivo que contém o programa em linguagem C e as respectivas instruções em
assembler do arquivo “.hex”.
Arquivo hex
É um arquivo que contém o código haxadecimal que deve ser gravado no microcontrolador.
2
2.2.
Diagrama de blocos de uma compilação
user01.c
fuses01.asm
header01.h
Compilador C
Assembler
Compilador C
user01.o
fuses01.o
header01.o
mcdata01.o
18f452.lkr
Linker
McData.lst
McData.hex
McData.map
O nome dado ao projeto no MPLAB irá definir o nome dos arquivos cuja extensão é “.lst”,
“.hex” e “.map”.
2.3.
Arquivos do Usuário
mcdata01.o
Biblioteca de funções e sistema operacional McData.
user01.c
Aplicação do usuário.
fuses01.asm
Configurações dos fusíveis do microcontrolador.
header01.h
Arquivo que contém a definição de constantes e prototipagem das funções da biblioteca
McData.
2.4.
Compilador C18
O compilador utilizado é o C18 versão V2.20 da Microchip para a família 18. A versão full
Manual do Usuário – Sistema Operacional McData
3
demo por 60 dias e os manuais do compilador podem ser encontrados na página:
http://www.microchip.com/
2.5.
Linker utilizado
O linker utilizado é o MPLINK versão 3.40 da Microchip.
4
3.
Criando um projeto no MPLAB
O capítulo a seguir descreve o procedimento padrão para a criação de uma projeto no
MpLab utilizando o compilador C18 da Microchip e o sistema operacional McData. No
procedimento a seguir partimos do princípio que o MpLab e o compilador C18 já se encontram
devidamente instalados no seu computador.
1. O primeiro passo é criar um diretório para o projeto. Todo e qualquer arquivo utilizado ou
gerado pelo sistema deverá ficar armazenado neste diretório. Neste exemplo criou-se o
diretório A:\McData.
2. Copie os arquivos mcdata01.o, user01.c, fuses01.asm e header01.h para este diretório.
3. No MPLAB selecione a opção Project Wizard conforme ilustração a seguir.
Manual do Usuário – Sistema Operacional McData
5
4. Selecione a opção Avançar na tela seguinte:
5. Selecione o microcontrolador da placa McData, neste caso o PIC18F452 e clique em
Avançar.
6
6. Selecione “Microchip C18 Toolsuite” na opção “Active Toolsuite“. Em seguida, selecione
“MPLINK Object Linker (mplink.exe)” na opção “Toolsuite Contents”. Por fim, selecione
Avançar.
7. Digite o nome do projeto no campo “Project Name”. Informe o diretório onde o projeto deve
ser criado (no nosso exemplo A:\McData) Pode-se utilizar o botão Browse caso necessário.
Depois de definir o nome do projeto e o diretório de trabalho selecione Avançar.
Manual do Usuário – Sistema Operacional McData
7
8. Ao visualizar a tela a seguir, selecione na janela da esquerda os quatro arquivos contidos
na pasta McData e clique em Add.
9. A tela com os 4 arquivos adicionados fica conforme o exemplo a seguir. Selecione a opção
Avançar.
8
10. A tela abaixo será exibida indicando que o projeto foi criado com sucesso.
11. Clicando em Concluir a tela abaixo deverá ser exibida.
Manual do Usuário – Sistema Operacional McData
9
12. Clique com o botão direito do mouse sobre a opção “Linker Scripts”. Será exibido o menu
mostrado abaixo. Com o botão esquerdo do mouse clique sobre a opção “Add Files”.
13. Será exibida a tela “Add Files to Project“. Selecione no diretório no qual o compilador C18
foi instalado o arquivo 18f452.lkr e clique na opção Abrir.
10
14. No menu “Project” do MpLab escolha a opção “Project/Build Options/Project”.
15. Ao visualizar a tela abaixo selecione a opção “Suit Defaults”. Neste momento, o campo
“Library Path” e “Linker Script Path” devem ser preenchidos automaticamente.
Manual do Usuário – Sistema Operacional McData
11
16. Selecione no campo “Include Path” o diretório do projeto utilizando o botão Browser e em
seguida clique em Avançar.
17. Selecione com o mouse a guia MPLAB C18 e a tela a seguir será exibida:
12
18. Selecionar no menu “Default storage class” a opção “Static”:
19. Clique em Aplicar e OK.
20. Finalmente, temos neste ponto o projeto criado e pronto para ser compilado. A aplicação
do usuário deverá ser escrita no arquivo user.c. Por enquanto, vamos compilar o arquivo
padrão apenas para verificar se todo o procedimento descrito anteriormente foi executado
com sucesso. Para isso selecione a opção “Project/Buid All”.
Manual do Usuário – Sistema Operacional McData
13
21. Após a compilação ser concluída deverá ser exibida a tela a seguir.
22. Este é o procedimento padrão que o usuário deverá adotar para criar um projeto utilizando
o sistema operacional McData. O diretório de trabalho pode ser alterado do drive A:\ para
qualquer outro drive. O importante é que todos os arquivos necessários ao projeto estejam
gravados no mesmo diretório.
14
4.
Funções
Este capítulo descreve todas as funções do sistema operacional McData. A fim de facilitar o
entendimento as funções foram divididas em oito grupos, definidos por sua utilização e os
periféricos do hardware da placa que estão relacionadas.
Algumas funções possuem um flag associado que indica que algum tipo de erro ocorreu
durante a execução da função. A sintaxe do flag é sempre a seguinte: “error_nome_da_função”,
por exemplo, a função digital_in_bit possui o flag error_digital_in_bit. Este flag é atualizado
sempre que a função é executada e pode ser testado pelo usuário logo após o retorno da função.
O flag valerá 1 quando um erro ocorrer e 0 no caso de sucesso. A declaração destes flags já está
contida no arquivo header01.h, de forma que o usuário não precisa se preocupar em adicionar
nenhum tipo de declaração no arquivo user.c.
4.1.
Funções básicas da aplicação do usuário
Este grupo de funções define a estrutura do programa uma vez que o usuário deve
escrever o código fonte de sua aplicação dentro de funções específicas contidas no arquivo
user01.c.
A aplicação do usuário consiste em um programa principal, função main_loop e no
tratamento de suas interrupções, funções int_timer_1ms, int_edge, int_change e int_count. Estas
funções são executadas na ocorrência de suas respectivas interrupções. No entanto, na
ocorrência de qualquer uma destas interrupções, o sistema operacional desvia o programa para
uma região onde são salvos os registradores de contexto assim como todo e qualquer flag
necessário para o correto funcionamento do microcontrolador. Desta forma, o usuário só precisa
preocupar-se com a sua própria aplicação, sendo transparente toda e qualquer configuração dos
registradores internos do microcontrolador.
O sistema operacional é executado dentro de uma interrupção de alta prioridade provocada
por um periférico interno do microcontrolador. Esta interrupção de alta prioridade, ou seja, o
sistema operacional, interrompe sempre a cada 100us a aplicação do usuário, seja durante a
execução da função main_loop seja durante a execução de qualquer outra função. Portanto,
mesmo as funções relativas às interrupções do usuário (int_timer_1ms, int_edge, int_change e
int_count) são interrompidas pelo sistema operacional. Isto deve-se ao fato do sistema
operacional McData definir as interrupções disponíveis para o usuário como interrupções da baixa
prioridade.
Para todas as interrupções (exceto a do próprio sistema operacional) existem funções que
podem ser utilizadas para habilitar ou inibir a ocorrência das mesmas.
O microcontrolador possui um recurso chamado watch dog timer (wdt) que nada mais é do
que um contador de tempo. Este contador está configurado para contar aproximadamente um
intervalo de tempo de 2,3 segundos. Ao final deste intervalo, o contador provoca um reset do
microcontrolador e conseqüentemente a reinicialização da aplicação. A aplicação deve
permanentemente zerar este contador em intervalos de no máximo 2,3 segundos. Este recurso é
uma segurança contra uma possível falha que pode travar o programa e paralisar a aplicação.
Para zerar o wdt, o usuário pode habilitar uma função do sistema operacional que zera
automaticamente o wdt ou utilizar a função ClrWdt() do compilador C18. O procedimento de zerar
o contador de wdt será chamado de limpar o wdt e o sistema operacional está configurado para
executá-lo automaticamente. Se o usuário desejar controlar manualmente o wdt, deve desabilitar
a função de zerar automaticamente e utilizar a função ClrWdt() do próprio compilador C18.
A seguir estão as características detalhadas destas funções.
Manual do Usuário – Sistema Operacional McData
15
auto_clrwdt_on
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
Habilita o sistema operacional a limpar o wdt automaticamente.
void auto_clear_clrwdt_on(void).
Não há.
Não há.
Não há.
O sistema operacional já está configurado para zerar o watch dog
timer automaticamente. A função só faz sentido se o usuário fez uso
anterior da função auto_clrwdt_off.
auto_clrwdt_on();
//Liga a limpeza automática do wdt
//pelo sistema operacional
auto_clrwdt_off
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
Desabilita a limpeza automática do wdt pelo sistema operacional.
void auto_clear_clrwdt_off(void).
Não há.
Não há.
Não há.
Não há.
auto_clrwdt_off();
//Desliga a limpeza automática do wdt
//pelo sistema operacional
ClrWdt();
//Limpa wdt
main_loop
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
Tratamento do programa principal do usuário.
void main_loop(void)
Não há.
Não há.
Não há.
O sistema operacional McData, executa esta função continuamente
e é interrompida pelas interrupções de usuário, caso estejam em
uso, e pela interrupção do sistema operacional. O usuário deve
escrever dentro desta função o programa principal da sua aplicação.
void main_loop (void)
//Programa principal
{
//Funções do programa principal
}
int_timer_1ms_on
Função:
Prototipagem:
Argumentos de entrada:
16
Habilita a ocorrência da interrupção de timer. Esta interrupção ocorre
a cada 1ms e o seu período de ocorrência não pode ser alterado
pelo usuário.
void int_timer_1ms_on(void)
Não há.
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
Não há.
Não há.
Na ocorrência da interrupção o sistema operacional executará a
função int_timer_1ms().
int_timer_1ms_on();
//Liga a interrupção de timer a
cada1ms
int_timer_1ms_off
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
Desabilita a ocorrência da interrupção de timer.
void int_timer_1ms_off(void)
Não há.
Não há.
Não há.
Não há.
int_timer_1ms_off();
//Desliga a interrupção de timer
int_timer_1ms
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
Tratamento da interrupção de timer com período de 1ms.
void int_timer_1ms(void)
Não há.
Não há.
Não há.
Se a interrupção de timer estiver habilitada o sistema operacional
McData executa a cada 1ms esta função. É nesta função que o
usuário deve escrever o tratamento da interrupção, ou seja, as
instruções que devem ser executadas a cada 1ms. O contexto e os
registradores internos do microcontrolador são salvos e atualizados
automaticamente pelo sistema operacional.
void int_timer_1ms(void);
//Tratamento da interrupção de 1ms
{
//Escrever o código do tratamento e criar variáveis locais caso
necessário
}
int_on_rising_edge
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
Habilita interrupção externa por borda de subida da entrada EDGE
da placa McData.
void int_on_rising_edge(void)
Não há.
Não há.
Não há.
Esta função habilita uma interrupção externa. Caso habilitada, na
ocorrência de uma borda de subida na entrada EDGE da placa
McData, o sistema operacional desviará a execução do programa
para a função int_edge().
int_on_rising_edge();
//Liga int. externa borda subida
Manual do Usuário – Sistema Operacional McData
17
int_on_falling_edge
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
Habilita interrupção externa por borda de descida da entrada EDGE
da placa McData.
void int_on_falling_edge(void)
Não há.
Não há.
Não há.
Esta função habilita uma interrupção externa. Caso habilitada, na
ocorrência de uma borda de descida na entrada EDGE da placa
McData, o sistema operacional desviará a execução do programa
para a função int_edge().
int_on_falling_edge();
//Liga int. externa borda descida
Int_edge_off
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
Desabilita interrupção externa por borda de subida ou descida da
entrada EDGE da placa McData.
void int_edge_off(void)
Não há.
Não há.
Não há.
Não há.
int_edge_off();
//Desliga int. externa por borda
int_edge
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
18
Tratamento da interrupção externa, seja por borda de subida ou
descida.
void int_edge(void)
Não há.
Não há.
Não há.
Esta função é executada pelo sistema operacional McData quando
uma interrupção externa ocorrer. O usuário deve escrever dentro
desta função o tratamento da interrupção, ou seja, as instruções que
devem ser executadas. O contexto e os registradores do
microcontrolador são salvos e atualizados automaticamente pelo
sistema operacional.
int_on_falling_edge();
//Liga int. externa na borda descida
void int_edge(void);
//Tratamento da interrupção externa
{
//Escrever o tratamento e criar variáveis caso necessário
int_edge_off();
//Desliga int. externa borda descida
//que neste exemplo só ocorre uma
//única vez
}
int_change_on
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
Habilita interrupção por mudança de estado da entrada CHANGE da
placa McData.
void int_change_on(void)
Não há.
Não há.
Não há.
Esta função habilita a interrupção de mudança de estado. Caso a
interrupção esteja habilitada, ao ocorrer uma mudança de estado na
entrada CHANGE da placa McData, o sistema operacional irá
executar a função int_change().
int_change_on();
//Liga int. de mudança de estado
int_change_off
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
Desabilita interrupção por mudança de estado da entrada CHANGE
da placa McData.
void int_change_off(void)
Não há.
Não há.
Não há.
Não há.
int_change_off();
//Desliga int. de mudança de estado
int_change
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
Tratamento da interrupção de mudança de estado.
void int_change (void)
Não há.
Não há.
Não há.
Esta função é executada pelo sistema operacional McData quando
uma interrupção de mudança de estado ocorrer. O usuário deve
escrever dentro desta função o tratamento da interrupção, ou seja,
as instruções que devem ser executadas. O contexto e os
registradores do microcontrolador são salvos e atualizados
automaticamente pelo sistema operacional.
int_change_on();
//Liga interrupção por mudança
//de estado
void int_change(void);
//Tratamento da interrupção
{
//Escrever o tratamento e criar variáveis caso necessário
}
Manual do Usuário – Sistema Operacional McData
19
int_count_on
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
Habilita interrupção de contagem de pulsos na entrada COUNT da
placa McData.
void int_count_on(unsigned int).
Número de pulsos que devem ser contados. É um número de 16 bits
do tipo unsigned int.
Não há.
Não há.|
Esta função habilita a interrupção de fim de contagem do número de
pulsos estabelecidos. No fim da contagem, ou seja, na borda de
subida do último pulso, o sistema operacional irá executar a função
int_count(). A contagem dos pulsos utiliza o periférico timer 0 do PIC
incrementado externamente pela entrada COUNT.
int_count_on(2000);
//Liga int. para contagem de 2.000
//pulsos
Int_count_off
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
Desabilita interrupção de contagem de pulsos na entrada COUNT da
placa McData.
void int_count_off(unsigned int)
Não há.
Não há.
Não há.
Não há.
int_count_off();
//Desliga int. de contagem de pulsos
int_count
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
20
Tratamento da interrupção de contagem de pulsos.
void int_count(void)
Não há.
Não há.
Não há.
Esta função é executada pelo sistema operacional McData quando a
contagem de pulsos chega ao fim, ou seja, na borda de subida do
último pulso. O usuário deve escrever dentro desta função o
tratamento da interrupção, ou seja, as instruções que devem ser
executadas. O contexto e os registradores do microcontrolador são
salvos e atualizados automaticamente pelo sistema operacional. Ao
tratar a interrupção, uma nova contagem é automaticamente
iniciada. Caso o usuário queira mudar o número da contagem deve
executar a função desliga_int_contagem e depois liga_int_contagem
novamente com a nova quantidade de contagem.
int_count_on(2000);
//Liga int para contar 2000 pulsos
void int_count(void);
//Tratamento da interrupção
{
//Escrever o tratamento e criar variáveis caso necessário
//Automaticamente o sistema operacional irá inicializar uma
//nova contagem de 2000 pulsos
}
4.2.
Funções Digitais
O conjunto de funções deste bloco permitem o acesso às entradas e saídas digitais, leds,
botões e buzzer da placa McData.
digital_in
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
Leitura das 8 entradas digitais.
unsigned char digital_in(void).
Não há.
Retorna em 8 bits o estado das entradas digitais.
Não há.
A variável que receberá o valor de retorno desta função deve ser do
tipo unsigned char cujo bit 0 é o estado da entrada digital 0, o bit 1 é
o estado da entrada digital 1 e assim sucessivamente até o bit 7.
entradas = digital_in();
//leitura das 8 entradas digitais
digital_in_bit
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
Leitura de uma entrada digital.
unsigned char digital_in_bit(unsigned char).
Número do bit da entrada digital que será lida. Este número é de 8
bits, não sinalizado e pode variar de 0 a 7, relativo ao número do bit
da entrada digital.
Retorna em 8 bits o estado da entrada digital. Se a entrada está em
nível lógico 0, retorna o número 0, senão, retorna o número 1.
O flag error_digital_in_bit indica sucesso se o argumento de entrada
é válido, ou seja, um número entre 0 e 7, senão, indica erro e o
argumento de saída é forçado em zero.
Não há.
estado = digital_in_bit(0);
//Leitura do estado da entrada digital 7
//flag error_digital_in_bit=0
digital_out
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Escrita na saídas digitais.
void digital_out(unsigned char).
Recebe valor de 8 bits que será carregado nas saídas digitais.
Não há.
Não há.
Manual do Usuário – Sistema Operacional McData
21
Observações:
Exemplo:
A saída digital 0 é atualizada com o conteúdo do bit 0 do argumento
de entrada e assim sucessivamente até o bit 7.
digital_out(0x80);
//As saídas vão para nível lógico 0
//exceto a saída 7 que vai para nível
//lógico 1
digital_out_bit_off
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
Força nível lógico 0 em uma saída digital.
void digital_out_bit_off(unsigned char).
Número da saída digital que irá para nível lógico 0. Este número é
de 8 bits, não sinalizado e pode variar de 0 a 7, relativo ao número
do bit da saída digital.
Não há.
O flag error_digital_out_bit_off indica sucesso se o argumento de
entrada é válido, senão, indica erro. Em caso de erro nenhuma saída
digital é alterada.
Não há.
digital_out_bit_off(7);
//Força nível lógico 0 no bit 7 da saída
//digital
//flag error_digital_in_bit=0
digital_out_bit_on
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
Força nível lógico 1 em uma saída digital.
void digital_out_bit_on(unsigned char).
Número da saída digital que irá para nível lógico 1. Este número é
de 8 bits, não sinalizado e pode variar de 0 a 7, relativo ao número
do bit da saída digital.
Não há.
O flag error_digital_out_bit_on indica sucesso se o argumento de
entrada é válido, senão, indica erro. Neste caso, nenhuma saída
digital é alterada.
Não há.
digital_out_bit_on(7);
//Força nível lógico 1 no bit 7 da saída
//digital
//O flag error_digital_in_bit=0
button
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
22
Leitura do estado de um botão.
unsigned button(unsigned char).
Número do botão que será lido. Este número é de 8 bits, não
sinalizado e pode variar de 1 a 4 referente às chaves SW1 a SW4 da
placa McData.
Retorna em 8 bits não sinalizados o estado do botão. Se o botão
estiver pressionado retorna o número 1, se solto retorna o número 0.
O flag error_button indica sucesso se o argumento de entrada é
válido, senão, indica erro e força o argumento de saída em zero.
Esta função já possui um filtro de 20ms para eliminar o ruído
Exemplo:
provocado pelo bouncing dos botões. No entanto, a função não trava
o sistema durante este intervalo pois é o próprio sistema operacional
da placa McData que checa o estado do botão.
if ( button(1) == 1 )
{
//Tratamento para botão 1 pressionado
}
led_on
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
Acende um dos leds da placa McData.
void led_on(unsigned char).
Número do led que irá acender. Este número é de 8 bits, não
sinalizado e pode variar de 1 a 4, relativo aos leds L1 a L4 da placa
McData.
Não há.
O flag error_led_on indica sucesso se o argumento de entrada é
válido, senão, indica erro e o estado dos leds não é alterado.
Não há.
led_on(4);
//Acende led 4
led_off
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
Apaga um dos leds da placa McData.
void led_off(unsigned char).
Número do led que irá apagar. Este número é de 8 bits, não
sinalizado e pode variar de 1 a 4, relativo aos leds L1 a L4 da placa
McData.
Não há.
O flag error_led_off indica sucesso se o argumento de entrada é
válido, senão, indica erro e o estado dos leds não é alterado.
Não há.
Led_off(4);
//Apaga led 4
buzzer_on
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
Liga o buzzer por tempo indeterminado.
void buzzer_on(void).
Não há.
Não há.
Não há.
Não há.
buzzer_on();
//Liga buzzer
buzzer_off
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Desliga o buzzer.
void buzzer_off(void).
Não há.
Não há.
Manual do Usuário – Sistema Operacional McData
23
Flag de erro:
Observações:
Exemplo:
Não há.
Não há.
buzzer_off();
//Desliga buzzer
beep
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
Emite um beep no buzzer.
void beep(unsigned char).
Tempo de duração do beep que é um número 8 bits, não sinalizado
e pode variar de 1 a 255.
Não há.
O flag error_beep indica sucesso se o argumento de entrada é
válido, senão, indica erro. Em caso de erro nenhum som é emitido
pelo buzzer.
Esta função utiliza uma base de tempo de 10ms, o que define que
em 255 o beep tocará durante 2550ms. A função não trava o
processamento durante este intervalo de tempo.
beep(8);
//Toca beep por 80ms
delay_100us
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
Delay em múltiplos de 100us.
void delay_100us (unsigned char).
Tempo de delay que é um número 8 bits, não sinalizado e pode
variar de 1 a 255.
Não há.
O flag error_delay_100us indica sucesso se o argumento de entrada
é válido, senão, indica erro. Em caso de erro nenhum delay é
executado e o programa retorna imediatamente após a chamada da
função.
Esta instrução só é finalizada ao final do tempo determinado, ou
seja, esta função paralisa o sistema durante sua execução. Esta
função limpa o wacth dog timer independentemente dele estar
configurado em automático ou manual.
delay_100us(20);
//Delay de 20 x 100us = 2ms
delay_10ms
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
24
Delay em múltiplos de 10ms.
void delay_10ms (unsigned char).
Tempo de delay que é um número 8 bits, não sinalizado e pode
variar de 1 a 255.
Não há.
O flag error_delay_10ms indica sucesso se o argumento de entrada
é válido, senão, indica erro. Em caso de erro nenhum delay é
executado e o programa retorna imediatamente após a chamada da
função.
Esta instrução só é finalizada ao final do tempo determinado, ou
seja, esta função paralisa o sistema durante sua execução. Esta
função limpa o wacth dog timer independentemente dele estar
configurado em automático ou manual.
delay_10ms(200);
//Delay de 200 x 10ms = 2s
Exemplo:
4.3.
Funções do Conversor Analógico Digital (A/D)
As funções a seguir são utilizadas para a aquisição de dados utilizando as entradas
analógicas da placa McData.
analog_in_8bits
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
Leitura de uma entrada analógica com 8 bits de resolução.
unsigned char analog_in_8bits(unsigned char).
Número da entrada analógica que irá ser lida. Este número é de 8
bits, não sinalizado e pode variar de 0 a 7, relativo as entradas
analógicas da placa McData.
Retorna em 8 bits não sinalizados o valor da conversão A/D da
entrada analógica.
O flag error_analog_in_8bits indica sucesso se o argumento de
entrada é válido, senão, indica erro e força o argumento de saída em
zero.
O sistema operacional converte a cada 2ms um canal, como a placa
possui 8 canais são necessários 16ms para a aquisição de todos os
canais, o que define uma frequência de amostragem de 62,5Hz por
canal.
aux=analog_in_8bits(0);
//Lê canal 0 da entrada analógica com
//8 bits de resolução
analog_in_10bits
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
Leitura de uma entrada analógica com 10 bits de resolução.
unsigned int analog_in_10bits(unsigned char).
Número da entrada analógica que irá ser lida. Este número é de 8
bits, não sinalizado e pode variar de 0 a 7, relativo as entradas
analógicas da placa McData.
Retorna em 16 bits não sinalizados o valor da conversão A/D da
entrada analógica.
O flag error_analog_in_10bits indica sucesso se o argumento de
entrada é válido, senão, indica erro e força o argumento de saída em
zero.
O sistema operacional converte a cada 2ms um canal, como a placa
possui 8 canais são necessários 16ms para a aquisição de todos os
canais, o que define uma frequência de amostragem de 62,5Hz por
canal.
aux=analog_in_10bits(0);
//Lê canal 0 da entrada analógica com
//10 bits de resolução
Manual do Usuário – Sistema Operacional McData
25
4.4.
Funções do Conversor Digital Analógico (D/A)
A função a seguir é utilizada para a geração de sinais analógicos na saída analógica da
placa McData.
analog_out
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
4.5.
Define o valor da tensão de uma das saídas analógicas em volts.
void analog_out(unsigned char, unsigned char).
Número da saída analógica e o respectivo valor de tensão. O
número da saída analógica é de 8 bits, não sinalizado e pode ser 1
ou 2. O valor da tensão é um número de 8 bits, não sinalizado e
pode variar entre 0 e 50 relativo à 0,0V e 5,0V.
Não há.
O flag error_analog_out indica sucesso se os argumentos de entrada
são válidos, senão, indica erro. Em caso de erro as saídas não são
alteradas.
A saída analógica varia de 0 a 5Vdc com passos de 0,1V. É por este
motivo que o argumento de entrada varia de 0 a 50. Esta saída é
gerada a partir de um PWM que está ligado a um filtro passa-baixa
com constante de tempo de 0,1s, o que define que a máxima
freqüência de amostragem destas saídas é de 2Hz.
analog_out(2,15);
//Saída 2 em 1,5V
Função do módulo PWM
As funções a seguir são utilizadas para definir a frequência e o duty-cycle das saídas PWM
da placa McData.
pwm_out
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
26
Atualiza o duty-cycle de uma das duas saídas PWM.
void pwm_out(unsigned char, unsigned int).
Número da saída PWM e o respectivo valor de duty-cycle. O número
da saída PWM é de 8 bits, não sinalizado e pode ser 1 ou 2. O dutycycle é um número de 16 bits, não sinalizado e pode variar de 0 a
1000.
Não há.
O flag error_pwm_out indica sucesso se os argumentos de entrada
são válidos, senão, indica erro. Em caso de erro as saídas não são
alteradas.
O argumento de entrada pode variar de 0 a 1000 pois o duty-cycle
do PWM pode ser ajustado de 0,1% em 0,1%. As saídas PWM
utilizam o periférico de hardware do microcontrolador. A freqüência
de trabalho é configurada pelas funções específicas de ajuste de
frequência.
pwm_out(2,500);
//Configura PWM 2 com 50% de duty//cycle
pwm_out_2500
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
Atualiza a freqüência das duas saídas PWM para 2500Hz.
void pwm_out_2500(void).
Não há.
Não há.
Não há.
Esta função não altera o duty-cycle das saídas.
pwm_out_2500();
//Configura freqüência do pwm
pwm_out_10000
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
Atualiza a freqüência das duas saídas PWM para 10000Hz.
void pwm_out_10000(void).
Não há.
Não há.
Não há.
Esta função não altera o duty-cycle das saídas.
pwm_out_10000();
//Configura freqüência do pwm
pwm_out_40000
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
4.6.
Atualiza a freqüência das duas saídas PWM para 40000Hz.
void pwm_out_40000(void).
Não há.
Não há.
Não há.
Esta função não altera o duty-cycle das saídas.
pwm_out_40000();
//Configura freqüência do pwm
Funções da comunicação serial RS-232
As funções a seguir são utilizadas na comunicação serial padrão RS-232 para enviar e
receber dados, definir a velocidade da comunicação e controlar o fluxo de dados.
As configurações da comunicação são: sem paridade, 8 bits de dados e 1 stop bit. Esta
configuração é denominada 8N1 e não pode ser alterada pelo usuário.
O controle de fluxo por hardware utilizado é o controle por RTS/CTS. A placa McData
implementa a conexão null modem, que trança os pinos de TXD com RXD e RTS com CTS no
circuito da placa. Isto implica que o cabo para interligação de um computador à placa McData não
precisa ser trançado. Para padronizar a simbologia, o sinal de CTS neste manual é o sinal de
entrada na placa McData utilizado pelo sistema operacional para detectar que o computador está
apto a receber dados ou, que está cheio e a placa não pode enviar dados. O sinal de RTS, é o
sinal de saída na placa McData, utilizado pelo sistema operacional para informar ao computador
que a placa está pronta para receber dados ou, que está com o buffer de recepção cheio,
travando o envio de dados pelo computador. O buffer para recepção de dados pelo sistema
Manual do Usuário – Sistema Operacional McData
27
operacional é de 16 bytes. O tamanho deste buffer de recepção não pode ser alterado pelo
usuário.
O sistema operacional da McData utiliza o periférico de USART do microcontrolador PIC
para implementar a comunicação.
buffer_rs232
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
Informa a quantidade de bytes no buffer de recepção da
comunicação RS-232.
char buffer_rs232t(void).
Não há.
Retorna o número de bytes no buffer. A variável que irá receber o
retorno desta função deve ser de 8 bits do tipo char.
O flag error_buffer_rs232 pode indicar duas situações de erros
diferentes. Na primeira situação um byte é recebido, porém, o buffer
de recepção está cheio. Neste caso o buffer é preservado mas o
byte recebido é perdido. A segunda situação é quando ocorre um
erro no frame. Neste caso todos os bytes do buffer são perdidos.
Sempre que a função é executada o flag de erro é atualizado para o
estado de sucesso. O sistema operacional muda automaticamente o
estado deste flag quando algum erro ocorre, ou seja, uma vez
detectado um erro, a função buffer_rs232 deve ser executada para
limpar o flag de erro e habilitar o sistema a detectar uma nova
situação de erro.
Não há.
if (error_buffer_rs232==0)
//Ocorreu algum erro na recepção?
{
//Não, comunicação sem erros
if(buffer_rs232()!=0)
//Há bytes recebidos no buffer?
{
data=read_rs232t(); //Sim, lê byte recebido
}
}
else
{
///Trata a ocorrência de erro na RS232
}
read_rs232
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
28
Lê o primeiro byte recebido que está no buffer de recepção da
comunicação RS-232.
char read_rs232t(void).
Não há.
Retorna o byte lido do buffer de recepção. A variável que irá receber
o retorno desta função deve ser de 8 bits do tipo char.
O flag error_read_rs232 indica erro se a função for executada e o
buffer estiver vazio. Neste caso o argumento de saída é forçado em
Observações:
Exemplo:
zero, senão, o flag indica sucesso e a função retorna o dado lido.
Quando um byte é recebido, ele é armazenado na próxima posição
livre do buffer de recepção, cuja capacidade é de 16 bytes. O
controle de fluxo por hardware, se estiver habilitado, afeta o
funcionamento desta função. Para maiores informações consultar as
funções flow_control_rs232_on e flow_control_rs232_off.
if(buffer_rs232()!=0)
//Há bytes recebidos no buffer?
{
data=read_rs232t();
//Sim, lê byte
}
write_rs232
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
Transmite um byte pela RS-232.
void write_rs232(char).
O dado a ser transmitido deve ser de 8 bits do tipo char.
Não há.
O flag error_write_rs232 indica erro se o byte não for transmitido.
Isto pode ocorrer se o usuário tentar enviar um novo dado antes de
finalizar a transmissão anterior ou se o controle de fluxo por
hardware estiver ligado e a placa detectar, através do sinal CTS, que
o computador não está pronto para receber novos dados.
A função write_rs232 não aguarda o fim da transmissão do byte.
Como não existe um buffer de transmissão o usuário deve garantir o
tempo entre as transmissões para enviar o próximo byte. O controle
de fluxo por hardware afeta o funcionamento desta função, ver as
funções flow_control_rs232_on e flow_control_rs232_off.
write_rs232(0x41);
//Envia o byte 0x41
If (erro_write_rs232==1)
//Ocorreu erro na transmissão?
{
//Sim, o byte não foi transmitido
}
flow_control_rs232_on
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Liga o controle de fluxo de dados por hardware do tipo RTS/CTS.
void flow_control_rs232_on(void).
Não há.
Não há.
Não há.
O controle de fluxo habilita o uso dos sinais CTS e RTS na recepção
e transmissão de dados influenciando no funcionamento das funções
read_rs232 e write_rs232. Se o buffer de recepção enche, o sinal de
RTS vai automaticamente para nível lógico 1 informando o
transmissor que a placa McData não está pronta para receber novos
dados. Nesta situação, se o usuário ler um byte do buffer com o
comando read_rs232, o sinal de RTS volta para 0 liberando o
transmissor a enviar mais dados. O sinal de CTS bloqueia o envio de
dados pela McData pois o receptor está ocupado.
Manual do Usuário – Sistema Operacional McData
29
Exemplo:
fllow_control_rs232_on();
//Liga controle de fluxo por hardware
//da RS-232
flow_control_rs232_off
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
Desliga o controle de fluxo por hardware dados pela RS-232.
void flow_control_rs232_off(void).
Não há.
Não há.
Não há.
A comunicação continua funcionando normalmente. O usuário pode
implementar o controle de fluxo utilizando as funções rst_on, rts_off
e cts_in.
flow_control_rs232_off();
//Desliga controle de fluxo por
//hardware da RS-232
rts_on
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
Força nível lógico 1 no pino de RTS.
void rts_on(void).
Não há.
Não há.
O flag error_rts_on indica erro se o usuário executar esta função
com o controle de fluxo por hardware ligado.
Utilizado pelo usuário para implementar o controle de fluxo
informando que a placa McData não pode receber dados.
rts_on();
//Envia sinal de RTS em 1
rts_off
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
Força nível lógico 0 no pino de RTS.
void rts_off(void).
Não há.
Não há.
O flag error_rts_off indica erro se o usuário executar esta função
com o controle de fluxo por hardware ligado.
Utilizado pelo usuário para implementar o controle de fluxo
informando que a placa McData está pronta para receber dados.
rts_off();
//Envia sinal de RTS em 0
cts_in
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
30
Leitura do sinal CTS.
unsigned cts_in(void).
Não há.
Retorna em 8 bits o estado do pino CTS. Se o pino estiver em nível
lógico 1 a função retorna o número 1, senão retorna o número 0.
Não há.
O usuário pode implementar o controle de fluxo utilizando esta
função.
Exemplo:
if (cts_in()==1)
{
write_rs232(0x01);
}
//CTS=1?
//Sim, a placa McData pode enviar
//Envia byte
rs232_2400
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
Configura o baud rate da RS-232 para 2400 bps.
void rs232_2400(void).
Não há.
Não há.
Não há.
O usuário deve obrigatoriamente configurar o baud rate da
comunicação antes de utilizar as funções read_rs232 e write_rs232.
rs232_2400();
//Configura baud rate p/ 2400bps
rs232_4800
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
Configura o baud rate da RS-232 para 4800 bps.
void rs232_4800(void).
Não há.
Não há.
Não há.
O usuário deve obrigatoriamente configurar o baud rate da
comunicação antes de utilizar as funções read_rs232 e write_rs232.
rs232_4800();
//Configura baud rate p/ 4800bps
rs232_9600
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
Configura o baud rate da RS-232 para 9600 bps.
void rs232_9600(void).
Não há.
Não há.
Não há.
O usuário deve obrigatoriamente configurar o baud rate da
comunicação antes de utilizar as funções read_rs232 e write_rs232.
rs232_9600();
//Configura baud rate p/ 9600bps
rs232_19200
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
Configura o baud rate da RS-232 para 19200 bps.
void rs232_19200(void).
Não há.
Não há.
Não há.
O usuário deve obrigatoriamente configurar o baud rate da
comunicação antes de utilizar as funções read_rs232 e write_rs232.
rs232_19200();
//Configura baud rate p/ 19200bps
Manual do Usuário – Sistema Operacional McData
31
4.7.
Funções do relógio de tempo real (RTC)
As funções a seguir são utilizadas para acessar e manipular os dados do relógio de tempo
real (RTC) da placa McData utilizando o barramento de comunicação I2C. A velocidade do clock
gerado pela placa McData é de 100KHz. O sistema operacional configura a placa McData para
trabalhar como Master na rede I2C. O relógio possui o endereço físico 0x00 nesta rede.
write_pcf8583
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
Escrita no relógio de tempo real PCF8583 da Philips pela rede I2C.
void write_pcf8583(void).
Os parâmetros de entrada desta função são seis variáveis de 8 bits
do tipo unsigned char: seg_relogio, min_relogio, hora_relogio,
dia_relogio, mes_relógio e ano_relógio. Estas variáveis estão
declaradas como globais do tipo extern no arquivo header01.h pois
já foram declaradas como globais no programa mcdata.o. Para
acertar o relógio, o usuário deve atualizar as seis variáveis
mencionadas e executar esta função.
Não há.
O flag error_write_pcf8583 é utilizado para indicar a ocorrência de
dois erros, primeiro, uma colisão no barramento I2C ou o segundo, o
não recebimento do sinal de acknowledge. Caso um dos dois erros
seja detectado, a função é imediatamente finalizada.
O ano deve ser um número de 0 a 3. O usuário deve utilizar esta
variável para atualizar os dois bits menos significativos do ano. Por
exemplo, se o ano é 2003, a variável ano_relogio deve valer 0x03,
se o ano é 2004, deve valer 0x00 e se o ano é 2005, deve valer
0x01, ou seja, sempre os dois bits menos significativos do ano. É
importante acertar corretamente o ano do relógio para que o mesmo
leve em consideração o ano bissexto. O ano bissexto é sempre
divisível por 4 e portanto os dois últimos bits valem sempre 0x00.
seg_relogio=0x15;
//Hora: 14:57:15
min_relogio=0x57;
hora_relogio=0x14;
dia_relogio=0x22;
//Data: 22/01/03
mes_relogio=0x01;
ano_relogio=0x03;
write_pcf8583();
//Acerta a data e hora do relógio
read_pcf8583
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
32
Leitura do relógio tempo real PCF8583 da Philips pela rede I2C.
void read_pcf8583(void).
Não há.
Os parâmetros de saída desta função são seis variáveis de 8 bits do
tipo unsigned char: seg_relogio, min_relogio, hora_relogio,
dia_relogio, mes_relógio e ano_relógio. Estas variáveis estão
declaradas como globais do tipo extern no arquivo header01.h pois
já foram declaradas como globais no programa mcdata.o do sistema
Flag de erro:
Observações:
Exemplo:
4.8.
operacional McData. O usuário pode utilizar as seis variáveis
mencionadas depois de executar a função read_pcf8583.
O flag error_read_pcf8583 é utilizado para indicar a ocorrência de
dois erros, primeiro, uma colisão no barramento I2C ou o segundo, o
não recebimento do sinal de acknowledge. Caso um dos dois erros
seja detectado, a função é imediatamente finalizada.
O ano deve ser um número de 0 a 3. O usuário deve utilizar esta
variável para atualizar os dois bits menos significativos do ano. Por
exemplo, se o ano é 2003, a variável ano_relogio deve valer 0x03,
se o ano é 2004, deve vale 0x00 e se o ano é 2005, deve valer 0x01.
read_pcf8583();
//Lê o relógio. Após a função as seis
// variáveis foram atualizadas e podem
// ser utilizadas
Funções da memória serial E2PROM
As funções a seguir permitem o acesso de leitura e escrita na memória serial E2PROM da
placa McData utilizando o barramento de comunicação I2C. Além da memória presente na placa
outras memórias podem ser conectadas neste barramento. As funções podem ser utilizadas para
acessar tanto a memória já existente como outra ligada externamente. A velocidade do clock
gerado pela placa McData é de 100KHz. O sistema operacional configura a placa McData para
trabalhar como Master na rede I2C. A placa McData liga os pinos A2, A1 e A0 da memória para
nível lógico 1, o que determina o endereço físico da memória E2PROM na rede. As memórias da
Microchip 24C256 terão o endereço 0x07 e as memórias da Atmel, que não possuem o pino de
endereçamento A2, terão o endereço físico 0x03 na rede I2C. Outras memórias conectadas ao
barramento I2C não podem ter o mesmo endereço da memória da placa ou do relógio cujo
endereço físico é 0x00. O usuário deve definir o endereço da memória escrevendo na variável
eeprom_address um número entre 0x01 e 0x07 (o endereço 0x00 já está reservado para o relógio
RTC). Por padrão, o sistema operacional está configurado para utilizar o endereço 0x03, ou seja,
por padrão, a placa utiliza a memória 24C256 da Atmel. Caso a placa McData esteja utilizando a
memória da Microchip o usuário deve alterar o endereço para 0x07.
write_eeprom
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Escrita de um byte na memória E2PROM 24C256 da placa ou do
barramento I2C.
void write_eeprom(unsigned int, unsigned char).
Dois parâmetros, o endereço do dado na memória e o próprio dado.
O endereço é uma variável de 16 bits do tipo unsigned int e o dado,
uma variável de 8 bits do tipo unsigned char.
Não há.
O flag error_write_eeprom é utilizado para indicar a ocorrência de
três erros, primeiro, uma colisão no barramento I2C, o segundo, o
não recebimento do sinal de acknowledge, ou o terceiro, o valor da
variável eeprom_address não é válido. Caso um dos erros seja
detectado, a função é imediatamente finalizada.
Antes de utilizar a função a variável global eeprom_address deve ser
Manual do Usuário – Sistema Operacional McData
33
Exemplo:
atualiza com um número de 0x01 a 0x07 relativo ao endereço físico
da memória na rede I2C. Por padrão, o sistema operacional utiliza o
endereço 0x03.
eeprom_address=0x03;
//Endereço físico da memória na rede
write_eeprom(0x1FF,0xB8); //salva o dado 0xB8 no endereço
//0x1FF da memória
read_eeprom
Função:
Prototipagem:
Argumentos de entrada:
Argumentos de saída:
Flag de erro:
Observações:
Exemplo:
Leitura de um byte da memória E2PROM 24C256 da placa ou do
barramento I2C.
void read_eeprom(unsigned int).
Variável de 16 bits do tipo unsigned int que define o endereço do
dado a ser lido da memória.
Não há.
O flag error_write_eeprom é utilizado para indicar a ocorrência de
três erros, primeiro, uma colisão no barramento I2C, o segundo, o
não recebimento do sinal de acknowledge, ou o terceiro, o valor da
variável eeprom_address não é válido. Caso um dos erros seja
detectado, a função é imediatamente finalizada.
Antes de utilizar a função a variável global eeprom_address deve ser
atualiza com um número de 0x01 a 0x07 relativo ao endereço físico
da memória na rede I2C. Por padrão, o sistema operacional utiliza o
endereço 0x03.
//declaração das variáveis
unsigned char dado;
//dado da E2PROM
//exemplo de uso da função
eeprom_address=0x03;
dado=read_eeprom(0x1FF);
34
//Endereço físico da memória na rede
//Lê o dado do endereço 0x01FF
5.
Bibliografia
1) Microchip. MPLAB® – C18 Compiler Libraries (Manual das bibliotecas de funções do
compilador);
2) Microchip. MPLAB® – C18 Compiler user’s guide (Manual do compilador);
3) Schildt, Herbert. C completo e total 3a. edição. Markron blooks.
A referências da Microchip podem ser encontradas no link:
http://www.microchip.com/1010/pline/tools/picmicro/code/mplab18/index.htm
Manual do Usuário – Sistema Operacional McData
35
6.
Exemplo
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
//
//
//
//
O exemplo é o arquivo ex01.c detalhadamente explicado;
É um exemplo completo com declaração de variáveis locais e globais do usuário;
São criados também flags para implementação da lógica de tratamento dos botões;
O programa utiliza a clear watch dog automático;
Na inicialização, as saídas digitais são forçadas para nível lógico zero
O byte do endereço 0x000 da E2PROM é lido e salvo no endereço 0x001
O relógio é atualizado para 14:57 do dia 22/01/03;
O controle de fluxo por hardware da RS232 é ativado, o baud rate é ajustado para
9600bps;
A freqüência do PWM é ajustada para 10kHz;
Todas as interrupções são habilitadas;
A contagem de pulsos é configurada para que ocorra a cada pulso;
Se for detectado algum erro na escrita da memória E2PROM, um beep longo será
emitido;
Dois beeps longos serão emitidos se ocorrer um erro na escrita do relógio;
A interrupção de 1ms implementa uma rampa nas saídas analógicas e nas saídas
PWM;
No tratamento das demais interrupções um beep de 80ms é emitido;
As 4 teclas invertem o estado dos respectivos leds e um beep de 80ms é emitido;
Com o led L1 aceso, o software copia o estado das entradas digitais para as saídas
digitais;
Com o led L1 apagado o software testa se as entradas analógicas são maiores que
2,5V. Em caso afirmativo acende os respectivos leds das saídas digitais;
Com o led L2 aceso o software testa a porta serial, enviando um byte e checando a
sua recepção. O programa ainda força os dois estados, um e zero, no pino RTS e
testa se os mesmos foram recebidos no pino CTS. Caso uma falha nestes testes seja
detectada o buzzer toca continuamente. Para que este teste funcione, o usuário deve
curto-circuitar o pino 2 com o pino 3 e o pino 7 com o pino 8 do conector DB9;
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
SOFTWARE DE USUÁRIO P/ PLACA MCDATA
*
*
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
// * ex01.C - SOFTWARE DE TESTE DA MCDATA
*
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
//
//
//
//
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
DEFINIÇÃO DO PROCESSADOR
*
*
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
#include <p18F452.h>
//
//
//
//
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
ARQUIVOS DE INCLUDE
*
*
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
#include <header01.h>
36
// Register definitions
//PROTOTIPAGEM DAS FUNÇÕES
//
//
//
//
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
CONSTANTES
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
*
*
*
//Nesta região devem ser declaradas constantes de programação
//
//
//
//
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
DECLARAÇÃO DE VARIÁVEIS GLOBAIS DE USUÁRIO
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
*
*
*
//Nesta região devem ser declaradas as variáveis glogais
static union {
struct {
unsigned
unsigned
unsigned
unsigned
unsigned
unsigned
unsigned
unsigned
unsigned
unsigned
} ;
}FLAGSbits;
F0:1;
F1:1;
F2:1;
F3:1;
F4:1;
F5:1;
F6:1;
F7:1;
F8:1;
F9:1;
//Registrador de flags de entrada
unsigned int
aux_cont=0,
contador=0;
//auxiliar p/ gerar rampas
unsigned char
tempo=0;
//auxiliar p/ gerar rampas
//
//
//
//
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
DEFINIÇÃO DE FLAGS
*
*
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
//Nesta região devem ser declaradas os flags
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
//
//
//
//
//
F_BOT1
F_BOT2
F_BOT3
F_BOT4
F_TESTE
F_FF1
F_FF2
F_FF3
F_FF4
F_RAMPA
FLAGSbits.F0
FLAGSbits.F1
FLAGSbits.F2
FLAGSbits.F3
FLAGSbits.F4
FLAGSbits.F5
FLAGSbits.F6
FLAGSbits.F7
FLAGSbits.F8
FLAGSbits.F9
//FLAG
//FLAG
//FLAG
//FLAG
//FLAG
//FLAG
//FLAG
//FLAG
//FLAG
//FLAG
1->BOTAO
1->BOTAO
1->BOTAO
1->BOTAO
DE TESTE
TRATADO 0->BOTAO
TRATADO 0->BOTAO
TRATADO 0->BOTAO
TRATADO 0->BOTAO
DA PLACA
NAO
NAO
NAO
NAO
TRATADO
TRATADO
TRATADO
TRATADO
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
ROTINAS DE USUÁRIO
*
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
*
*
*
*
//Nesta região devem ser escritas as rotinas do usuário
void testa_analog(void)
{
unsigned int aux;
//auxiliar p/ medidas do ad
aux=analog_in_8bits(0);
//Lê entrada analógica com 8 bits
if (aux>128) digital_out_bit_on(0);
else
digital_out_bit_off(0);
aux=analog_in_8bits(1);
//Lê entrada analógica com 8 bits
Manual do Usuário – Sistema Operacional McData
37
if (aux>128) digital_out_bit_on(1);
else
digital_out_bit_off(1);
aux=analog_in_8bits(2);
if (aux>128) digital_out_bit_on(2);
else
digital_out_bit_off(2);
//Lê entrada analógica com 8 bits
aux=analog_in_8bits(3);
if (aux>128) digital_out_bit_on(3);
else
digital_out_bit_off(3);
//Lê entrada analógica com 8 bits
aux=analog_in_8bits(4);
if (aux>128) digital_out_bit_on(4);
else
digital_out_bit_off(4);
//Lê entrada analógica com 8 bits
aux=analog_in_8bits(5);
if (aux>128) digital_out_bit_on(5);
else
digital_out_bit_off(5);
//Lê entrada analógica com 8 bits
aux=analog_in_8bits(6);
if (aux>128) digital_out_bit_on(6);
else
digital_out_bit_off(6);
//Lê entrada analógica com 8 bits
aux=analog_in_8bits(7);
if (aux>128) digital_out_bit_on(7);
else
digital_out_bit_off(7);
//Lê entrada analógica com 8 bits
}
//
//
*
//
//
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
LOOP DA APLICAÇÃO
*
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
void main_loop(void)
{
//LOOP DE USUARIO
// * * * * * * * * * * * * DECLARAÇÃO DE VARIÁVEIS LOCAIS DE USUÁRIO * * * * * * * * *
//Nesta região devem ser declaradas as variáveis locais do programa principal
unsigned char ee_dado;
unsigned int ee_end;
char data;
//dado da e2prom
//end da e2prom
//Variável para teste da serial
// * * * * * * * * * * * * * * * * * * * * Inicializações
* * * * * * * * * * * * * * *
//Nesta região devem ser feitas as inicializações do programa
digital_out(0X00);
//Inicia todas as saídas digitais em zero
eeprom_address=0x03;
//Endereço da e2prom na rede I2C para memória Atmel
//Memória Microchip deve ser 0x07
//lê byte da e2prom
//escreve byte na e2prom
//Ocorreu um erro na escrita na memória?
ee_dado=read_eeprom(ee_end);
write_eeprom(ee_end+1,ee_dado);
if (error_write_eeprom==1)
{
buzzer_on();
delay_10ms(100);
buzzer_off();
delay_10ms(25);
}
read_pcf8583();
min_relogio=0x57;
hora_relogio=0x14;
dia_relogio=0x22;
mes_relogio=0x01;
ano_relogio=0x03;
write_pcf8583();
38
//Liga beep
//Delay múltiplo de 10ms (1s)
//Desliga beep
//Delay múltiplo de 10ms (0,25s)
//Acerta relógio
//Data: 22/01/03
//Hora: 14:57
//Acerta relógio
if (error_write_pcf8583==1)
{
buzzer_on();
delay_10ms(100);
buzzer_off();
delay_10ms(25);
buzzer_on();
delay_10ms(100);
buzzer_off();
delay_10ms(25);
}
//Ocorreu um erro na escrita do relógio?
//Liga beep
//Delay múltiplo
//Desliga beep
//Delay múltiplo
//Liga beep
//Delay múltiplo
//Desliga beep
//Delay múltiplo
de 10ms (1s)
de 10ms (0,25s)
de 10ms (1s)
de 10ms (0,25s)
flow_control_rs232_off();
rs232_9600();
//Desliga controle de fluxo por hardware da Usart
//Configura baud Rate p/ 9600
pwm_out_10000();
//Configura frequência do pwm para 10KHz
int_timer_1ms_on();
int_count_on(1);
int_on_rising_edge();
int_change_on();
//Liga
//Liga
//Liga
//Liga
F_FF1=0;
F_FF2=0;
F_FF3=0;
F_FF4=0;
F_RAMPA=1;
//INICIA
//INICIA
//INICIA
//INICIA
//INICIA
interrupção
interrupção
interrupção
interrupção
1ms
de estouro de contagem a cada pulsos
de borda de subida
de borda de subida
FLAG
FLAG
FLAG
FLAG
FLAG
// * * * * * * * * * * * * * * * * * * * * * * Loop * * * * * * * * * * * * * * * * * *
while(1)
{
if (F_FF2==1)
{
F_TESTE=0;
write_rs232(0x55);
//Envia byte 0x55
delay_100us(20);
//Delay múltiplo de 0,1ms (2ms)
if(buffer_rs232()!=0)
//Há bytes recebidos no buffer?
{
data=read_rs232();
//Sim, lê byte recebido
}
else
{
F_TESTE=1;
//Indica erro
}
rts_on();
delay_100us(2);
if (cts_in()==0) F_TESTE=1;
//Liga rts
//Delay múltiplo de 0,1ms (0,2ms)
//Indica erro
rts_off();
delay_100us(2);
if (cts_in()==1) F_TESTE=1;
//desliga rts
//Delay múltiplo de 0,1ms (0,2ms)
//Indica erro
if (F_TESTE==1) buzzer_on();
else
buzzer_off();
//Liga buzzer após enviar byte sem erros
//Desliga buzzer após enviar byte sem erros
}
if (button(1)==1)
{
if (!F_BOT1)
{
F_BOT1=1;
if (!F_FF1)
{
F_FF1=1;
led_on(1);
}
else
{
//Botão pressionado?
//Sim
//Já tratou?
//Não, trata
//indica que já tratou o botao
//Já tratou?
//Seta flag
//acende led
Manual do Usuário – Sistema Operacional McData
39
F_FF1=0;
led_off(1);
}
buzzer_on();
delay_10ms(8);
buzzer_off();
//Limpa flag
//Apaga led
//Liga buzzer
//Delay múltiplo de 10ms (80ms)
//Desliga buzzer
}
}
else
{
F_BOT1=0;
//O botão foi solto, libera para tratar
}
40
if (button(2)==1)
{
if (!F_BOT2)
{
F_BOT2=1;
if (!F_FF2)
{
F_FF2=1;
led_on(2);
}
else
{
F_FF2=0;
led_off(2);
}
buzzer_on();
delay_10ms(8);
buzzer_off();
}
}
else
{
F_BOT2=0;
}
//Botão pressionado?
//Sim
//Já tratou?
//Não, trata
//indica que já tratou o botao
//Já tratou?
if (button(3)==1)
{
if (!F_BOT3)
{
F_BOT3=1;
if (!F_FF3)
{
F_FF3=1;
led_on(3);
}
else
{
F_FF3=0;
led_off(3);
}
buzzer_on();
delay_10ms(8);
buzzer_off();
}
}
else
{
F_BOT3=0;
}
//Botão pressionado?
//Sim
//Já tratou?
//Não, trata
//indica que já tratou o botao
//Já tratou?
if (button(4)==1)
{
if (!F_BOT4)
{
F_BOT4=1;
if (!F_FF4)
{
//Botão pressionado?
//Sim
//Já tratou?
//Não, trata
//indica que já tratou o botao
//Já tratou?
//Seta flag
//acende led
//Limpa flag
//Apaga led
//Liga buzzer
//Delay múltiplo de 10ms (80ms)
//Desliga buzzer
//O botão foi solto, libera para tratar
//Seta flag
//acende led
//Limpa flag
//Apaga led
//Liga buzzer
//Delay múltiplo de 10ms (80ms)
//Desliga buzzer
//O botão foi solto, libera para tratar
F_FF4=1;
led_on(4);
//Seta flag
//acende led
F_FF4=0;
led_off(4);
//Limpa flag
//Apaga led
}
else
{
}
buzzer_on();
delay_10ms(8);
buzzer_off();
//Liga buzzer
//Delay múltiplo de 10ms (80ms)
//Desliga buzzer
}
}
else
{
F_BOT4=0;
//O botão foi solto, libera para tratar
}
if (F_FF1==1) digital_out(digital_in());//Lê entradas digitais e copia para as saídas
//digitais
else
testa_analog();
///testa as analógicas
}
}
//
//
//
//
//
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
INTERRUPÇÃO DE TIMER DA APLICAÇÃO
*
* - OCORRE A CADA 1mS, O CONTEXTO JÁ FOI SALVO.
*
*
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
void int_timer_1ms(void)
//interrupção de timer de 1ms
{
//Nesta região devem deve estar o tratamento da interrupção
if (++tempo==10)
{
tempo=0;
//Contador chegou em 10?
if (F_RAMPA==1)
{
contador++;
if (contador==200) F_RAMPA=0;
}
else
{
contador--;
if (contador==0)
F_RAMPA=1;
}
//É rampa de subida?
pwm_out(1,contador);
pwm_out(2,contador);
//Atualiza Pwm 1 com rampa de valor máximo 200
//Atualiza Pwm 2 com rampa de valor máximo 200
aux_cont=(contador*50)/200;
analog_out(1,aux_cont);
analog_out(2,aux_cont);
}
//Calcula valor de 0 a 50 para escrever na saída
//Atualiza a saída analógica 1
//Atualiza a saída analógica 2
//Sim, inicia o contador
//sim, incrementa contador de rampa
//não, decrementa o contador de rampa
}
//
//
//
//
//
*
*
*
*
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
INTERRUPÇÃO EXTERNA DA APLICAÇÃO
- O CONTEXTO JÁ FOI SALVO.
- O FLAG DA INT JÁ FOI LIMPO
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
*
*
*
*
void int_edge(void)
//interrupção externa
{
//Nesta região devem deve estar o tratamento da interrupção
buzzer_on();
//Liga buzzer
delay_10ms(8);
//Delay múltiplo de 10ms (80ms)
buzzer_off();
//Desliga buzzer
Manual do Usuário – Sistema Operacional McData
41
}
//
//
//
//
//
*
*
*
*
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
INTERRUPÇÃO DE MUDANÇA DE ESTADO DA APLICAÇÃO
- O CONTEXTO JÁ FOI SALVO.
- O FLAG DA INT JÁ FOI LIMPO
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
*
*
*
*
void int_change(void)
//interrupção de mudança de estado
{
//Nesta região devem deve estar o tratamento da interrupção
buzzer_on();
//Liga buzzer
delay_10ms(8);
//Delay múltiplo de 10ms (80ms)
buzzer_off();
//Desliga buzzer
}
//
//
//
//
//
*
*
*
*
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
INTERRUPÇÃO DE CONTADOR EXTERNO
- O CONTEXTO JÁ FOI SALVO.
- O FLAG DA INT JÁ FOI LIMPO
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
void int_count(void)
//interrupção de contagem de pulso
{
//Nesta região devem deve estar o tratamento da interrupção
//Na borda de subida do 1º pulso, a interrupção ocorre
buzzer_on();
//Liga buzzer
delay_10ms(8);
//Delay múltiplo de 10ms (80ms)
buzzer_off();
//Desliga buzzer
}
42
*
*
*
*
*
Download

Manual do Usuário Sistema Operacional McData