Você está na página 1de 12

Desenvolvimento de uma Agenda Eletrnica em um Microcontrolador PIC

Hermano Loureno Souza Lustosa, Frederico Luis Cabral


hermano_lustosa@yahoo.com.br, frluca@compuland.com.br

Resumo. Este artigo descreve o desenvolvimento de uma agenda eletrnica simples que funciona a partir de um microcontrolador PIC. So apresentados os detalhes do desenvolvimento, as explicaes referentes ao funcionamento dos dispositivos de entrada e sada de dados, bem como as ferramentas utilizadas no processo de desenvolvimento e os resultados obtidos atravs delas.

1. Microcontroladores
Como este artigo centrado no desenvolvimento de softwares para microcontroladores PIC, faz-se necessria a definio do termo microcontrolador. Um microcontrolador ou MCU (Micro Controler Unit) um dispositivo eletrnico programvel, tal como um microprocessador. A diferena principal entre MCUs e microprocessadores reside no fato de que os microcontroladores possuem internamente outros dispositivos que so necessrios para o seu funcionamento, tais como osciladores e memrias RAM e ROM. No caso dos microprocessadores, tais dispositivos esto em circuitos integrados externos. Essa integrao o motivo pelo qual os microcontroladores so conhecidos como: computadores em um chip. Pois, muitas vezes, todos os componentes fundamentais para o funcionamento dos mesmos esto contidos em uma nica pastilha de silcio. Outra grande diferena est na utilizao dos dois dispositivos. MCUs so produzidas com menor capacidade de processamento para serem utilizadas em tarefas de automao e controle junto a outros dispositivos eletrnicos como baterias, eletrodomsticos entre outros aparelhos. J microprocessadores so encontrados na maioria das vezes nos computadores, sendo o principal responsvel pelo processamento dos dados. 1.1. Microcontroladores PIC Os microcontroladores PIC so uma famlia de microcontroladores produzidos pela empresa Microchip. O modelo de microcontrolador para o qual o a agenda eletrnica foi desenvolvida o PIC 16F877A. 1.2. PIC 16F877A O PIC 16F877A um microcontrolador de arquitetura RISC (Reduced Instruction Set Computer). A arquitetura RISC caracterizada por possuir um conjunto menor de instrues em comparao com computadores que so baseados na arquitetura CISC (Complex Instruction Set Computer). Dessa forma, esse modelo possui apenas 35 microinstrues. Alm disso, microcontroladores PIC so feitos com base na arquitetura de Harvard, que consiste na separao da memria de dados e de instrues. Essa separao facilita a implementao do Pipelining. O Pipelining a possibilidade de
1

duas ou mais instrues serem executadas ao mesmo tempo, caso elas estejam em estgios diferentes de sua execuo. A execuo de uma instruo pode ser dividida, a grosso modo, em: a fase de busca dos operandos, e a execuo da operao propriamente dita. Com memrias diferentes para dados e comandos, possvel acessar mais facilmente as duas memrias ao mesmo tempo, e ter mais de uma instruo sendo executada em estgios diferentes. Esse paralelismo auxilia no desempenho do microcontrolador. O modelo 16F877A possu 8 kilobytes de memria para armazenar os programas. Essa memria utiliza a tecnologia flash, permitindo que os programas sejam gravados no PIC diversas vezes. A memria reservada para os dados, por sua vez, possui 368 bytes disponveis. Finalmente, esto disponveis tambm, 256 bytes na memria EEPROM. A EEPROM permite a gravao de dados de forma no voltil. Ou seja, os dados gravados nessa memria no so perdidos mesmo quando a alimentao eltrica interrompida. A EEPROM do PIC foi utilizada no projeto da agenda eletrnica como forma de armazenamento dos registros. O armazenamento dos registros ser tratado com mais detalhes em outras sees deste artigo. Para realizar a comunicao com o mundo exterior, o microcontrolador PIC 16F877A possui as portas A, B, C, D e E. As portas de A at D possuem 8 pinos, e a porta E possu apenas 3. Cada pino, de cada porta pode ser configurado como entrada ou sada atravs de registradores especficos. A figura 1 mostra o diagrama dos pinos do microcontrolador.

Figura 1. Diagrama de Pinos do Microcontrolador PIC 16F877A.

2. Programao de um microcontrolador PIC


Um microcontrolador PIC pode ser programado atravs do uso de linguagens de baixo de nvel, como o assembly, e at mesmo com linguagens de alto nvel como o C. Porm, mesmo com a utilizao de linguagens de alto nvel, certos detalhes de funcionamento do hardware do PIC devem ser entendidos, afim de que seja possvel program-lo corretamente. preciso tambm, desenvolver o programa dentro das limitaes impostas pelo microcontrolador. Um programa que necessite de mais de 386 bytes de memria, ou que ocupe mais de 8 Kb na memria do programa no ir funcionar caso o modelo escolhido seja o 16F877A.

Para programar um microcontrolador imprescindvel o uso de algumas ferramentas. A principal delas, a IDE (ambiente integrado de desenvolvimento), que deve ser capaz de compilar o cdigo fonte e transform-lo em um cdigo objeto executvel por um microcontrolador. Alm disso, necessria a utilizao de algum software que faa a gravao do programa na memria flash do microcontrolador. Opcionalmente, h a possibilidade do uso de um simulador, que permita a execuo de um programa feito para um microcontrolador, dentro de um software capaz de emular a execuo das instrues, os estados da memria e dos registradores, e at outros componentes externos ao microcontrolador, como displays, LEDs e teclados. No caso do projeto da agenda eletrnica, o desenvolvimento foi totalmente feito com a utilizao de um simulador. No foi produzido um circuito real utilizando o microcontrolador, ficando est etapa para projetos futuros. Mesmo assim, foi necessrio definir um modelo alvo, pois tanto a IDE utilizada quanto o simulador necessitam que o modelo de PIC em questo seja especificado. No caso do simulador, necessrios saber o modelo para que a simulao leve em conta suas caractersticas de funcionamento. No caso da IDE, o modelo define qual biblioteca padro dever ser importada dentro do cdigo do programa, para que as funes do microcontrolador possam ser utilizadas. Essa necessidade tambm justificada pelo fato de que a programao de microcontroladores PIC ocorre em um nvel mais baixo de abstrao, necessitando que o programador conhea alguns detalhes do hardware especficos de cada modelo de microcontrolador. 2.1. IDE CCS C COMPILER O CCS C COMPILER um ambiente integrado de desenvolvimento que permite a programao de microcontroladores PIC. Possui internamente trs compiladores, o PCB, o PCM e o PCH que servem para os modelos de PIC de 12 bits, 14 bits e 16 bits respectivamente. Ao criar um projeto, o usurio deve especificar qual modelo de microcontrolador ser a plataforma alvo do desenvolvimento. E a partir disso, a prpria IDE cria um arquivo de cabealho, adicionando a biblioteca padro do microcontrolador em questo. Como o projeto da agenda eletrnica tem como alvo o modelo 16F887A, a IDE criou um cabealho com o nome do projeto, e inclui dentro desse cabealho a referncia para a biblioteca padro do modelo que a 16F877A.H. A biblioteca padro de cada modelo possui a definio de diversas constantes que representam os pinos, registradores de uso especfico, assim como diversas funes que servem para realizar a entrada e sada de dados; escrever informaes na EEPROM; configurar os pinos de entrada e sada; entre outras utilidades. Algumas dessas funes sero tratadas nas sees seguintes. 2.1.1. Configurao das Portas e E/S de dados Como dito anteriormente, possvel configurar cada pino de cada porta como entrada ou sada de dados. Isto , o programador pode especificar qual ser o sentido da corrente que dever fluir em cada um dos pinos do PIC, e isso define se o pino ser utilizado para entrada de dados, ou para sada. Cada uma das portas possui atrelada a si um registrador de uso especfico chamado de Tris. No PIC 16F877A, existem os registradores: trisa, trisb, trisc, trisd e
3

trise. Os valores desses registradores devem ser configurados da seguinte forma. Primeiramente, cada um dos bits desses registradores representa um pino de suas respectivas portas, sendo o bit menos significativo o representante do pino 0, e o mais significativo, do pino 7 (no caso de portas com 8 pinos). O valor de cada bit deve ser alterado para 0, caso aquele pino seja utilizado para a sada de dados, ou para 1 caso sirva para a entrada de dados. O CCS C Compiler oferece dentro da biblioteca padro do modelo escolhido, funes que recebem por parmetro o valor que devem ser gravados nesses registradores. As funes tem o seguinte formato de nome: set_tris_x. Onde o x deve ser substitudo pela letra referente porta. E o valor, que pode ser especificado em binrio ou hexadecimal, deve ser o valor a ser gravado no registrador, de forma a configurar todos os pinos de acordo com as necessidades do projeto. Caso seja necessrio, por exemplo, configurar todos os pinos para a entrada de dados, basta passar como parmetro para funo o valor: 0b11111111. Para mudar os estados dos pinos, existem as funes output_high, e output_low, que colocam o valor de um pino em 1 e 0 respectivamente. Essas funes tem apenas um parmetro, que deve ser o pino cujo valor deve ser alterado. O CCS facilita o trabalho de programao, pois j possui constantes que representam cada um dos pinos. Os nomes das constantes levam em conta o seguinte padro: PIN[LETRA DA PORTA][NMERO DO PINO]. Dessa forma, a constante PINA0, representa o pino 0 da porta, assim como a constante PINB2, representa o pino 2 da porta B. Para fazer a leitura dos dados, existem as funes input_x. Sendo o x, a letra referente porta que ser lida. Por exemplo, a funo input_a usada para a leitura da porta A. Essas funes retornam um byte que representa o estado de cada um dos pinos da porta. Outra opo a utilizao da funo input, que funciona de forma similar s funes de sada de dados, pois recebe por parmetro o pino que ser lido. Essa funo retorna o valor do pino selecionado, que pode ser 1 ou 0. O microcontrolador PIC tem internamente um registrador ligado a cada porta. Os dados so escritos e lidos nos pinos, atravs da escrita e da leitura de dados nos registradores. Tudo que as funes citadas fazem fornecer uma abstrao para o acesso a esses registradores, e permitir assim, as operaes de entrada e sada. 2.1.2. Tratamento de interrupes Muitas vezes, necessrio que o microcontrolador responda rapidamente a um evento externo para, por exemplo, realizar operaes de entrada de dados. Nesses casos, necessrio interromper o fluxo de execuo do programa principal, e executar um trecho de cdigo especfico, definido pelo programador. O controle da execuo desse cdigo deve ser gerenciado pelo hardware, de forma que o programa pare automaticamente, execute o cdigo para responder ao evento, e depois retorne exatamente de onde parou. Para tal, os programadores utilizam funes para o tratamento dessas interrupes, permitindo que o microcontrolador responda a alguma evento. No caso do PIC, existem algumas interrupes disponveis. No projeto da agenda eletrnica, foi utiliza uma interrupo ligada a um dos timers do microcontrolador. De forma que quando o timer zerado, o prprio microcontrolador interrompe sua execuo, e executa o cdigo de tratamento da interrupo especificado. Caso a linguagem assembly fosse utilizada, seria necessrio escrever o endereo da funo de tratamento da interrupo, em uma faixa de endereos de memria
4

especfica, conhecida como vetor de interrupes. Alm disso, seria preciso codificar todo o cdigo de troca de contexto. A troca de contexto nada mais que o armazenamento dos valores contidos em todos os registradores especficos da CPU utilizados na execuo do cdigo principal em outros endereos de memria, e o carregamento do cdigo de tratamento da execuo. Aps a execuo da funo de interrupo, outra troca de contexto deve ocorrer, para restaurar os registradores com os valores salvos previamente. Sem isto, no seria possvel voltar a executar o cdigo do mesmo lugar em que ele estava no momento da interrupo. O CCS C COMPILER oferece uma forma automtica de tratamento de interrupes. Bastando apenas escrever uma funo, e colocar uma diretiva de preprocessador acima dela com o nome da interrupo. Com isso, todo o cdigo de troca de contextos gerado automaticamente pelo compilador. Poupando o programador desse trabalho. Tambm esto disponveis funes que habilitam e desabilitam as interrupes, permitindo um maior controle sobre as mesmas. 2.1.3. Escrita e Leitura da EEPROM Outro recurso importante o acesso memria EEPROM do microcontrolador. Como dito anteriormente, o modelo de microcontrolador utilizado no projeto da agenda eletrnica possui uma EEPROM com 256 bytes de capacidade. Essa memria usada para armazenar os registros da agenda de telefone e de lembretes. O acesso memria EEPROM feito atravs da utilizao de registradores especficos. De forma simplificada, para escrever algum dado, primeiramente preciso especificar o endereo de memoria no qual o valor ser escrito. Isso feito atravs do registrador EEADR, que recebe o endereo de memria em questo. Aps isso, o valor a ser escrito deve ser movido para o registrador EEDATA. Alm disso, outras aes so necessrias. preciso habilitar a escrita na EEPROM configurando o valor de um determinado bit no registrador EECON1, depois necessrio escrever uma sequncia de valores que funcionam como uma senha de acesso no registrador EECON2. E finalmente, existe uma microinstruo responsvel por escrever o valor de EEDATA no endereo de memria especificado por EEADDR. De forma anloga possvel ler os dados da EEPROM. EEADDR deve ser especificado com o endereo a ser lido, e aps a execuo da microinstruo responsvel pela leitura, o valor contido na EEPROM estar no registrador EEDATA. O CCS oferece duas funes que realizam as tarefas de escrita e leitura. So elas as funes: write_eeprom, e read_eeprom. A primeira recebe por parmetro o endereo de memria, e o valor a escrito. A segunda recebe apenas o endereo, e retorna o valor contido no mesmo. 2.2. O Real PIC Simulator O projeto da agenda eletrnica foi feito com a utilizao de um simulador de microcontrolador PIC. O simulador utilizado foi o Real PIC Simulator, que oferece no s a opo de executar o cdigo objeto gerado pelo CCS, como tambm a simulao de outros dispositivos que podem ser utilizados junto ao microcontrolador. Alguns deles so: Botes, Displays de 7 segmentos, Displays de LCD, teclados matriciais, entre outros componentes.

A utilizao do simulador relativamente simples. Basta especificar o modelo do controlador PIC, e acessar a aba Visual. Os componentes ficam disponveis na barra lateral, e podem ser adicionados ao projeto clicando e arrastando para a rea de trabalho do simulador. Cada componente possui algumas configuraes. A principal delas a especificao dos pinos do microcontrolador aos quais o componente est ligado. A CCS C COMPILER gera um arquivo com a extenso hex. Esse arquivo pode ser importado pelo REAL PIC SIMULATOR e executado como se estivesse em um microcontrolador PIC real. O simulador facilita o processo de desenvolvimento, pois permite que os programas sejam testados sem que seja necessrio grav-los em um microcontrolador toda vez que uma alterao for necessria.

3. Mdulos de Entrada e Sada de Dados


Antes do desenvolvimento dos mdulos principais da agenda eletrnica, foi necessrio criar os mdulos bsicos para a entrada e sada de dados. Como o a agenda eletrnica funciona diretamente sobre o hardware do PIC, no existindo um sistema operacional capaz de fornecedor uma camada de abstrao para o acesso aos recursos do microcontrolador, foi preciso desenvolver tambm as funes para a entrada e sada de dados. Os dispositivos de entrada e sada escolhidos para o projeto foram o Display de LCD e o keypad ou teclado matricial. Esses componentes fornecem todos os recursos utilizados pela agenda, pois possibilitam a entrada de dados (caracteres e nmeros), e permitem que eles sejam exibidos de forma prtica em uma tela de LCD. O funcionamento dos dispositivos, assim como as funes utilizadas para a comunicao com eles, sero detalhadas nas prximas sees. 3.1. O Display de LCD Existem basicamente dois tipos de display de LCD, os de caracteres e os grficos. O projeto da agenda eletrnica foi feito com a utilizao do primeiro tipo. Os displays possuem um controlador interno, e uma memria para armazenar os caracteres a serem exibidos. O controlador responsvel por gerenciar as funes do componente, assim como a sua memria interna. O modelo do controlador utilizado mais comumente o HD 44780. Esse modelo de controlador considerado um padro de fato, de tal forma que at mesmo o display virtual disponibilizado pelo REAL PIC SIMULATOR segue as especificaes desse controlador. O display de LCD utilizado possui oito pinos de dados, (DB0 at DB7), e trs pinos de controle: ENABLE, RS, RW, como pode ser visto na figura 2. Para realizar alguma operao no display, basta configurar os pinos RS e RW, assim como os pinos de dados, e ento enviar um sinal para o pino ENABLE para confirmar a execuo da operao. Por exemplo, para escrever um caractere na tela, preciso enviar o valor lgico 1 para o pino RS e o valor lgico 0 para o pino RW, e ento enviar o cdigo do caractere a ser escrito para os pinos de dados ( o mesmo cdigo do caractere na tabela ASCII). Aps isso, basta enviar um sinal para o pino ENABLE, e o caractere ser escrito na tela do display. Outras opes incluem as configuraes referentes ao nmero de linhas a ser utilizado (1 ou 2); o estado do cursor (habilitado ou desabilitado); a configurao da posio do cursor (o cursor pode ser movido para a esquerda ou para a direita). A partir
6

dessas funcionalidades, foram criadas funes dentro do mdulo de comunicao que permitem uma forma mais fcil de enviar informaes para o display. A primeira funo a ser desenvolvida foi a lcd_envia_byte. Essa funo recebe o valor de um byte e configura cada um dos pinos de dados do LCD com cada um dos bits respectivos do byte em questo. Ela chamada pelas outras funes do mdulo, como por exemplos, as funes lcd_escreve_char e escrever_lcd. A funo lcd_escreve_char, recebe um caractere e o mostra na tela. Caso seja um caractere de escape, como por exemplo: /n ou /f, a funo realiza a operao indicada pelo mesmo. Por exemplo, caso /n seja o caractere recebido, a funo move o cursor para a segunda linha do display, caso seja /f, a funo limpa todo o display e coloca o cursor na primeira posio. J a funo escrever_lcd, recebe uma cadeia de caracteres e para cada caractere chama a funo lcd_escreve_char. Essa funo serve apenas para realizar a exibio de um texto com vrios caracteres mais facilmente. O mdulo tambm possui a funo lcd_mov. Essa funo serve para mover o cursor na tela. Ela utilizada pelo mdulo do teclado para escrever os dados na tela, apaga-los, ou para manter o cursor na mesma posio caso a letra que o usurio precisa digitar ainda no tenha sido selecionada.

Figura 2. Diagrama de Pinos do Display de LCD.

3.2. O keypad ou Teclado Matricial Sem uma forma de realizar a entrada de dados, no seria possvel ao usurio, inserir os nomes e telefones da agenda, nem os lembretes a serem armazenados pelo microcontrolador. Para cumprir essa funo, o componente escolhido como dispositivo de entrada foi o keypad ou teclado matricial. Os teclados matriciais organizam as teclas em forma de uma matriz para economizar o nmero de pinos de entrada necessrio. Se fosse necessrio utilizar um pino do microcontrolador para cada tecla, o teclado matricial 4x4 (que possu 16 teclas) precisaria estar ligado a 16 pinos, ao invs de apenas oito. As figuras 3 e 4 apresentam a estrutura de um teclado matricial e o layout das teclas utilizadas respectivamente. Na figura 3: R1, R2, R3 e R4 representam as linhas, e C1, C2, C3 e C4 as colunas. Em um teclado matricial, as teclas de uma mesma linha esto todas ligadas a uma mesma entrada, e de forma similar, as teclas de uma mesma coluna esto ligadas a uma mesma sada. Quando uma tecla pressionada, o sinal presente no pino de entrada na linha em que a tecla est contida enviado para a o pino da coluna ao qual a tecla tambm est ligada. Por exemplo, caso a tecla que est na coluna C1 e linha R1 seja pressionada, o sinal na linha R1 ser enviado para a coluna C1.

Como todas as teclas de uma coluna esto ligadas a mesma sada, se as linhas de R1 at R4 forem todas alimentadas simultaneamente pelo valor lgico 1, no ser possvel descobrir qual a tecla foi pressionada. Pois, supondo que um sinal seja detectado, por exemplo, na coluna C1, ele pode ter sido gerado pelo pressionamento de qualquer tecla nessa coluna. Ou seja, tantos as teclas 1x1, 2x1, 3x1 ou mesmo 4x1 ao serem pressionadas iram enviar um sinal para o mesmo pino do PIC. Dessa forma, a utilizao de uma tcnica conhecida como varredura de teclado indispensvel para que seja possvel identificar exatamente qual tecla gerou o sinal. No projeto da agenda eletrnica, a varredura foi implementada da seguinte forma: primeiramente todos as linhas devem estar com o valor lgico 0. Ento, enviado um sinal para cada um das delas consecutivamente, de forma que, o sinal 1 enviando, e depois de alguns milissegundos ele retorna para 0, e ento a entrada seguinte recebe o sinal. Esse processo deve ser repetido de forma continua enquanto o usurio estiver realizando a entrada dos dados. Porm, apenas a varredura no capaz de detectar qual tecla foi pressionada. A verificao do pressionamento das teclas feito atravs da interrupo gerada pelo timer interno do microcontrolador. O PIC gera uma interrupo a cada 255 microssegundos, e a funo de tratamento da interrupo verifica se existe o valor lgico 1 em alguma das sadas do teclado. Caso haja, basta verificar qual coluna est sendo ativada naquele momento pela funo de varredura. Isto possvel, j que a interrupo ocorre de forma assncrona em relao varredura. Ou seja, a interrupo ir paralisar temporariamente a funo de varredura no momento em que ela estiver mandando o sinal para a leitura de uma linha qualquer. Como a interrupo ocorre diversas vezes em um intervalo de tempo de um segundo, caso a tecla seja pressionada, mesmo que rapidamente, seu pressionamento ainda poder ser facilmente detectado.

Figura 3. Estrutura do teclado matricial.

Figura 4. Layout do teclado.

3.2.1. Funes de Leitura e Modos de Entrada de Dados Duas funes principais foram desenvolvidas para realizar a leitura de dados do teclado. A primeira delas a key_scan, que paralisa o programa, e entra em um lao de repetio fazendo a varredura do teclado at que uma determinada tecla seja pressionada. Ao final, ela retorna a cadeia de caracteres que foi inserida pelo usurio at que a tecla de encerramento tenha sido pressionada. Essa funo tambm vai escrevendo no display de LCD medida que as teclas vo sendo pressionadas, para que o usurio possa ver o que foi digitado. A funo key_scan funciona com dois modos de entradas de dados. Ela recebe por parmetro qual deve ser o modo de entrada, que pode ser numrico ou alfanumrico. Uma vez que existem apenas 16 teclas disponveis, no h uma tecla para cada letra. Ento, para indicar qual caractere deve ser exibido, o usurio deve pressionar a mesma tecla mais de uma vez dentro de um intervalo de tempo, para que a letra seguinte seja escrita na tela. Para tratar esse modo de entrada de dados, foram criadas algumas funes auxiliares que fazem a verificao de qual tecla deve ser exibida na tela, de acordo com algumas condies. Primeiro, preciso verificar se a mesma tecla foi pressionada mais de uma vez. Caso tenha sido, verifica-se quantas vezes essa tecla j foi pressionada e incrementa-se esse valor ao caractere base da tecla (o caractere base aquele que aparece quando a tecla pressionada pela primeira vez). Como as variveis do tipo char da linguagem C utilizam a o cdigo binrio dos caracteres da tabela ASCII para representar cada uma das letras ou nmeros, possvel incrementar o valor das variveis para se obter o caractere seguinte na tabela. A tabela 1 mostra o mapa de caracteres por tecla, indicando a tecla e a quantidade de vezes que ela deve ser pressionada, para selecionar cada uma das letras do alfabeto. Alm disso, caso o usurio permanea algum tempo sem digitar nada, o cursor do LCD deve ser movido para direita, para indicar que aquele o caractere escolhido pelo usurio. A prpria funo de tratamento de interrupo faz a contagem do tempo transcorrido desde a ltima tecla pressionada, e se encarrega de andar com o cursor do LCD para direita depois de alguns segundos, permitindo a entrada de um novo caractere. Caso a funo key_scan esteja trabalhando em modo numrico, ela apenas escreve o nmero referente tecla pressionada. Esse modo de entrada utilizado pela agenda de telefones, no momento em que o nmero de telefone solicitado. Alm da key_scan, existe a funo key_scan_op, que serve para a leitura de apenas uma tecla. Essa funo no escreve o que foi digitado no display de LCD. Ela apenas permanece executando a varredura do teclado at que qualquer tecla seja pressionada. Aps isto, ela retorna o caractere pressionado pelo usurio. Essa funo utilizada na navegao pelos menus da agenda, j que a navegao no necessita que os caracteres digitados sejam exibidos na tela. 3.3. Mdulo de Armazenamento de Registros Alm de realizar a entrada e sada dos dados, a agenda eletrnica precisa armazenar as informaes inseridas pelo usurio. Os dados devem ser guardados para permitir sua posterior visualizao. Uma forma relativamente simples de armazenar dados oferecida pelo microcontrolador PIC sua memria EEPROM interna. O procedimento e as funes oferecidas pelo CCS C Compiler para o acesso da EEPROM foram explicadas em outra seo deste artigo. Assim sendo, nesta seo sero detalhadas apenas as
9

funes responsveis por salvar e recuperar os registros. Cada um dos bytes de cada registro foi gravado utilizando as funes bsicas de acesso memria EEPROM j especificadas.
Tabela 1. Mapa de caracteres por tecla.
Teclas
Nmero de Vezes que a tecla deve ser Pressionada

1 2 3 4 5 6 7 8 9

1 [espao] a d g j m p t w

2 b e h k n q u x

3 c f i l o r v y

4 d g j m p S w z

A EEPROM do PIC possui 256 bytes. Essa memria foi estruturada para facilitar escrita e recuperao dos registros. Primeiramente, essa memria tratada como um vetor bidimensional de 16x16 bytes. Cada uma das 16 linhas desse vetor representa um registro, e o primeiro byte de cada linha, possui um valor que especifica se o registro um nmero de telefone, ou um lembrete, ou mesmo se aquela linha est vazia, no contendo nenhum registro. A figura 5 demonstra como a EEPROM foi estruturada. O registro comea a ser armazenado a partir do segundo byte de cada linha. No caso dos registros telefnicos, que esto divididos em: Nome e Nmero de Telefone, foi preciso delimitar uma quantidade de bytes em cada linha para cada um dos itens. Os 8 bytes consecutivos a partir do segundo so reservados para o nome, e os ltimos 8 bytes so reservados para o nmero de telefone. Como cada caractere ocupa um byte, cada nome pode ter at 7 caracteres, e cada nmero de telefone pode ter 8 caracteres no mximo. Os lembretes, por sua vez, so registros nicos que ocupam os 15 bytes da linha. Consequentemente, cada lembrete deve possuir no mximo 15 caracteres. Para impedir que o usurio digite uma quantidade maior do que a permitida em alguns campos, um dos parmetros recebidos pela funo key_scan, a quantidade mxima de caracteres a ser lido. Quando o limite de caracteres alcanado, o cursor do display de LCD no avana mais, indicando que o limite foi atingindo. A figura 6 mostra como cada tipo de registro divido em cada uma das linhas. Quando a agenda eletrnica inicia, ela l o primeiro endereo de cada uma das linhas do vetor de 16x16, esses valores so armazenados em outro vetor na memria do microcontrolador. Como o primeiro valor de cada linha indica que tipo de registro est salvo nela, esse vetor utilizado pelas funes que salvam e recuperam os valores. Isto porque, as funes que recuperam lembretes e registros telefnicos, devem recuperar apenas os registros referentes aos seus prprios mdulos. Da mesma forma, as funes responsveis pelo armazenamento, devem procurar a primeira linha vazia disponvel para guardar o registro. Para representar os registros, duas estruturas foram declaradas. Uma para lembretes e outra para registros telefnicos. A partir delas, foram criadas as funes de
10

armazenamento e recuperao. As funes de armazenamento recebem uma varivel do tipo da estrutura especificada, e a armazena na EEPROM. E as funes de recuperao, recebem o endereo da linha em que o registro foi armazenado, e o retorna aps recuper-lo. As principais funes criadas nesse mdulo foram: gravar_tel e recuperar_tel para os registros telefnicos. E tambm: gravar_lembrete e recuperar_lembrete para os registros da agenda de lembretes. Essas funes so utilizadas nos mdulos principais para armazenar os registros na EEPROM, e recuper-los para futuramente exibi-los no display.

Figura 5. Mapa da EEPROM exibida no REAL PIC SIMULATOR. Os endereos das linhas e das colunas esto especificados em hexadecimal.
Nome do Contato
1 byte

Telefone 8 bytes Lembrete

7 bytes

1 byte

15 bytes

Figura 6. Estrutura dos tipos de registro.

4. Mdulos Principais
O desenvolvimento dos mdulos principais da agenda (a agenda de telefones e de lembretes) s foi possvel aps a concluso dos mdulos auxiliares para a entrada e sada de dados. Estando esses mdulos auxiliares funcionando, as funes dos mdulos principais no apresentam nenhuma outra grande complexidade. Para acessar as funes, menus foram implementados. Os menus exibem as funes da agenda, e permitem que o usurio navegue por elas atravs do pressionamento de teclas de navegao. Os menus seguem uma hierarquia simples, no primeiro nvel esto os acessos aos dois mdulos principais. Quando um desses mdulos selecionado, exibido um novo menu, em que so apresentados as funes oferecidas dentro daquele mdulo. Cada opo do menu exibida separadamente no display, e pode ser selecionada atravs do pressionamento da tecla #. Os menus tambm oferecem a opo de retorno ao nvel anterior, para que o usurio sempre tenha acesso a todas as funes.
11

4.1. Agenda de Telefones O mdulo da agenda de telefones possui duas funes bsicas. A primeira permitir ao usurio o armazenamento de um nmero de telefone junto ao nome do contato. A segunda disponibilizar a visualizao de todos os nmeros armazenados na memria para eventuais consultas. A funo de armazenamento solicita que o usurio informe primeiro o nome, e depois o nmero de telefone a ser armazenado. Esses dados so lidos pela funo key_scan e so ento salvos em uma varivel e passados funo responsvel pelo armazenamento na EEPROM. A funo de exibio verifica o vetor em que so armazenados os valores contidos na primeira clula de memria de cada linha da EEPROM. Essa funo recupera sucessivamente cada um dos registros telefnicos existentes na EEPROM e os exibe no display medida que o usurio seleciona cada um deles. A funo de exibio tambm permite a remoo de um registro atravs do pressionamento da tecla * no momento em que o este estiver sendo visualizado. 4.2. Mdulo de Lembretes A principal funo do mdulo de lembretes permitir que o usurio armazene uma pequena mensagem de at 15 caracteres e a recupere para a posterior visualizao. Este mdulo no possui muita diferena em relao ao mdulo de agenda de telefone. De tal forma que o cdigo dos dois bem parecido. Tanto a funo de armazenamento, quanto a funo de exibio so semelhantes. A diferena principal que os dados so armazenados na estrutura criada para representar os lembretes. Obviamente as funes de armazenamento e recuperao utilizadas neste mdulo so as referentes aos lembretes. Pois elas armazenam e recuperam os dados levando em conta a quantidade mxima que um lembrete pode ocupar na memria.

Referncias Bibliogrficas
C Compiler Reference Manual, endereo: http://www.ccsinfo.com/downloads/ccs_c_manual.pdf, Acesso em 12/11/2011. Pereira, F.(2003) PIC: Programao em C, Editora rica, 1 edio, So Paulo. Pereira, F. (2002) Microcontroladores PIC: Tcnicas Avanadas, Editora rica, 1 edio, So Paulo. PIC 16F87XA Data Sheet, endereo: http://ww1.microchip.com/downloads/en/DeviceDoc/39582b.pdf, Acesso em 12/11/2011. Souza, D. J. (1999) Desbravando o PIC, Editora rica, 4 edio, So Paulo.

12

Você também pode gostar