Curso de PIC 2011 (Apostila)



Comments



Description

Curso de Introduçãoaos Microcontroladores PIC Programa de Educação Tutorial em Engenharia Universidade Federal de Santa Maria João Otávio C. de Matos Thiago Dadalt Souto Santa Maria 16/08 à 19/08 de 2011 Capítulo 1 - Arquitetura de microcontroladores 1. O que é um microcontrolador? Um microcontrolador, comumente referenciado pela sigla uC, é um componente programável capaz de controlar sistemas eletrônicos. De modo geral, esse tipo de dispositivo pode ser encarado como um destes computadores com os quais estamos acostumados a lidar no dia-a-dia, entretanto, em menor escala. Essa comparação pode ser feita visto que todos os computadores, sejam simples desktops (computadores de mesa) ou robustos mainframes (computadores de grande porte destinados ao processamento de um vasto volume de informações), possuem um conjunto de características comuns que aparecem também entre os microcontroladores: Todo computador possui uma unidade central de processamento, CPU, responsável pela execução dos softwares (programas de computador); A CPU, por sua vez, precisa carregar, de algum lugar, o programa a ser executado. Em desktops, os softwares são carregados a partir do disco rígido da máquina, conhecido como HD, do inglês Hard Disk; Para o armazenamento temporário dos arquivos e programas que estão sendo executados no momento, existe a memória de acesso aleatório (Random Access Memory), conhecida como memória RAM ou memória de dados. O termo “acesso aleatório” (ou acesso randômico) refere-se à capacidade de acesso a qualquer posição da memória em qualquer momento, em oposição ao acesso seqüencial imposto por alguns dispositivos de armazenamento; Os computadores também possuem alguns dispositivos de entrada e saída, responsáveis pela interface entre o usuário e a máquina. No caso dos desktops, por exemplo, o mouse e o teclado representam dispositivos de entrada, enquanto o monitor e a impressora são dispositivos de saída. O HD, por sua vez, é considerado um dispositivo de entrada e saída, E/S, já que manipula tanto a entrada como a saída. A principal diferença entre os computadores comuns e os microcontroladores, de fato, está na potencialidade de cada um: computadores são máquinas de propósito geral, com a capacidade de execução de milhares de programas distintos; já os microcontroladores são dispositivos de propósito específico (dedicados), executando, normalmente, um único software. Além disso, existem outras especificidades que auxiliam na caracterização dos microcontroladores: Os microcontroladores são, de modo geral, “embutidos” no interior de outros dispositivos, normalmente produtos comercializáveis como calculadoras, telefones, máquinas de lavar roupas, relógios e equipamentos robóticos, para que possam controlar as funções e as ações desses produtos. Por esse motivo, muitas vezes os microcontroladores são chamados de controladores embarcados (ou controladores embutidos); Microcontroladores geralmente são dispositivos de baixa potência. Um desktop, por exemplo, é quase sempre ligado à rede, podendo consumir dezenas de watts de energia elétrica. Um uC alimentado por bateria, por sua vez, consome uma potência da ordem de miliwatts; Um uC normalmente é pequeno e barato. Os componentes são escolhidos de forma a minimizar o tamanho e baratear o dispositivo. Portanto, a partir das informações apresentadas, é possível esclarecermos uma discussão que normalmente surge entre aqueles que estão iniciando seus estudos em microcontroladores: a diferença entre microcontroladores e microprocessadores. O aspecto mais importante que difere um uC de um microprocessador é a sua funcionalidade. Para que um micropro1|P á gin a Capítulo 1 - Arquitetura de microcontroladores cessador possa ser usado, outros componentes devem-lhe ser adicionados, tais como memória e componentes para receber e enviar dados. Em resumo, isso significa que o microprocessador é o verdadeiro coração do computador (ou do uC). Por outro lado, o uC foi projetado para “ter tudo num só”, ou seja, o uso de microcontroladores não requer componentes externos, uma vez que todos os periféricos necessários já estão contidos nele. 1.1. Aspectos construtivos Conforme exposto, pode-se encarar um uC como um “computador em um chip”. Em outras palavras, um uC pode ser visto, externamente, como um circuito integrado TTL ou CMOS normal, mas internamente dispõe dos dispositivos típicos de um sistema microprocessado, contendo todos os circuitos necessários para realizar um completo sistema digital programável. Figura 1.1. Um microcontrolador pode ser visto como um “computador em um chip” Portanto, independentemente da empresa fabricante ou da família de microcontroladores escolhida, há elementos que se fazem presentes na arquitetura de qualquer uC, diferindo apenas em características como velocidade, capacidade de armazenamento, freqüência de operação, entre outras. Dessa forma, todo uC dispõe de: CPU, que, como mencionada anteriormente, é responsável por interpretar as instruções de programa; Memória de programa, na qual será feito o armazenamento das instruções de programa. Essa memória pode ser do tipo PROM (Programmable Read Only Memory ou Memória Programável Somente para Leitura), não permitindo a reprogramação do dispositivo, EEPROM (Eletrically Erasable Programmable Read Only Memory) ou flash (memória utilizada em pen drives), sendo que as duas últimas possibilitam regravação. Memória de dados ou RAM, utilizada para memorizar as variáveis utilizadas pelo programa. Essa memória é dita volátil, pois uma vez cessada a fonte de alimentação, os dados armazenados são perdidos, ao contrário do que ocorre com as memórias de programa citadas no item anterior; Dispositivos periféricos como temporizadores, conversores A/D e D/A, contadores, entre outros; Linhas de I/Os (entrada e saída) para controlar dispositivos externos ou receber informações de sensores, chaves, etc. A presença de todos esses elementos em um espaço extremamente pequeno dá ao projetista ampla gama de trabalho e enorme vantagem em usar um sistema microprocessado do tipo, onde em pouco tempo e com poucos componentes externos é possível fazer o que seria bastante trabalhoso com circuitos tradicionais. 1.2. Os microcontroladores PIC 2|P á gin a capazes de processar dados de 8. que será o dispositivo trabalhado durante as aulas. A subseção seguinte toma o datasheet dos modelos 16F87X da família PIC como exemplo. e a outra projetando uCs mais simples e baratos. e apresenta algumas funcionalidades interessantes do microcontrolador PIC 16F876. É erro de projeto superdimensionar o uC. atualmente existem duas linhas de pesquisas paralelas. RISC. A tensão de alimentação desses dispositivos varia entre 1. para aplicações elementares. bem como suas capacidades em termos de memória de programa e também suas respectivas pinagens. A letra F da sigla PICxxFxxx.Capítulo 1 . em geral. a propósito. Portanto. Afinal. no setor: uma delas criando uCs mais capazes. ao passo que a família PICxxCxxx não permite regravação (OTP).Arquitetura de microcontroladores Os microcontroladores PIC (PICmicro) correspondem a uma família de microcontroladores fabricados pela empresa norte-americana Microchip Technology Inc. Expostas as principais características dessa família de microcontroladores. com recursos de programação por memória flash. cada desperdício será multiplicado pelo número de equipamentos fabricados (às vezes milhões). pelo número de linhas de I/Os e pelo conteúdo do dispositivo. EEPROM e OTP (One Time Programmable – dispositivos dotados de memória PROM capazes de ser programados uma única vez). Tais modelos diferenciam-se. A família de microcontroladores PIC está disponível em uma ampla gama de modelos para melhor adaptar-se às exigências de projetos específicos. Tendo isso em vista. Família de microcontroladores PIC Modelo Memória de Programa Pinagem PIC10 12-bit palavra de programa De 6 a 14 pinos PIC12 12-bit palavra de programa 8 pinos PIC16 14-bit palavra de programa (até 8kB de memória de programa) De 8 a 64 pinos PIC18 128kB de memória de programa De 18 a 100 pinos Características mais detalhadas acerca de cada microcontrolador podem ser encontradas em seus respectivos datasheets (folhas de dados). Figura 1. A sigla PIC é oriunda de Programmable Interface Controller ou Controlador de Interface Programável.2. porém opostas..8 e 6 V. a fim de atender produtos de alta tecnologia como os novos celulares ou os receptores de TV digital.1. para que se possa determinar aquele que melhor atende às necessidades de determinado projeto. é importante que se justifique o porquê da escolha do PIC como ferramenta de estudo neste curso. faz referência à memória flash desses modelos. Os uCs da família PICxxFxxx podem ser regravados (memórias flash e EEPROM). é de fundamental importância um estudo prévio acerca dos microcontroladores. 16 e 32 bits. No caso de uma linha de produção. 3|P á gin a . Microcontrolador PIC da empresa Microchip Technology Inc. Esses microcontroladores possuem uma alta velocidade de processamento devido ao uso da arquitetura Harvard (o processador pode acessar simultaneamente a memória de programa e a memória de dados) e do seu conjunto reduzido de instruções. Tabela 1. A tabela abaixo apresenta as principais famílias de microcontroladores PIC. PIC16F87X – Características Conforme mencionado anteriormente. incluindo os modelos 16F873. PIC16F876 – Algumas funções características de microcontroladores Fora as características deste modelo de uC já vistas na tabela anterior. é que os microcontroladores PIC são extremamente didáticos. tendo em vista a grande quantidade de informações acerca dessa família de uCs que se encontra disponível tanto na literatura quanto na rede. Figura 1. O que acontece. Os dispositivos também apresentam uma memória flash de programa. Nesse caso. Convém observar.3. A menor delas é uma memória EEPROM e a maior é uma memória de dados volátil. que não necessitem de grande volume de dados manipulados ou de processamento em tempo real de alta performance. já que a memória de programa dos dispositivos 16F873 e 16F874 é de 4kB.3. 1. os modelos 16F874 e 16F877 levam vantagem.1. umas vez que são importantes em um estudo inicial sobre microcontroladores. O número de timers e de módulos PWM é o mesmo para todos os uCs. os quatro modelos apresentam a mesma faixa de freqüência de operação. cujas palavras de programa são de 14 bits.3. 16F874. assim como o conjunto de instruções. 16F876 e 16F877. em geral. 1. ao passo que nos outros dois modelos a memória é de 8kB. e modelos com as mais diversas características. de fato. a tabela abaixo. um conjunto RISC de 35 instruções. variando de 0Hz (DC) a 20MHz. Essa quantidade vasta de material desperta o interesse e facilita bastante o processo de aprendizado. antes de serem expostas as características específicas do modelo 16F876. extraída da página 3 do datasheet (em anexo). é interessante que algumas características específicas sejam citadas e detalhadas.Arquitetura de microcontroladores temos inúmeras empresas fabricantes de microcontroladores. Nas demais características. o datasheet utilizado refere-se aos microcontroladores PIC 16F87X. Tabela comparativa entre os modelos PIC 16F876X Como pode ser observado. Cada um dos microcontroladores apresenta duas memórias de dados com capacidades de armazenamento distintas. traz uma comparação entre cada um dos modelos acima citados. Portanto. no entanto. Vale observar que as características 4|P á gin a . que esta família de microcontroladores é indicada para aplicações mais simples.Capítulo 1 . o que varia é a capacidade de cada uC. a corrente de standby é de aproximadamente 1μA. No caso do PIC16F876. mas esse foi o uC escolhido pelo fato de ser o dispositivo a ser trabalhado durante as aulas do curso. Seguem. O temporizador WDT opera com um sinal de clock independente do sinal de clock do micro ou de qualquer componente externo. Por esse motivo introduziu-se o mecanismo de watchdog (cão de guarda). Tendo em vista as aplicações usuais dos microcontroladores. Em seguida.6mA a 3V e 4MHz – 20μA a 3V e 32kHz. o microcontrolador pára de trabalhar e mantém-se nesse estado até que alguém faça o reset. a eletrônica interna do uC gradualmente pára o seu funcionamento. seja um bug no próprio código do programa. pois este está gravado na memória flash. Esta problemática também pode causar alterações fatais no programa em si. observa-se que o reset pode ocorrer tanto no caso de funcionamento incorreto. o registro do WDT deve ser setado em “0” (instrução CLRWDT) sempre que estiver próximo de transbordar. esse zero não será escrito no registro. Caso ocorra o “bloqueio” do programa. 1. Brown-out Reset: quando a tensão de alimentação desce lentamente. há um grave perigo de que circuitos que trabalham a uma tensão superior comecem a trabalhar de forma descontrolada. Proteção de código executável: ativando esta função. algumas dessas características: Cerca de 1000 ciclos de programação: apesar de possuir uma memória do tipo flash como memória de programa. e o reset por brown-out acontece. O princípio de funcionamento do watchdog timer é bastante simples: se o temporizador WDT transbordar. antes de o microcontrolador parar a execução do programa. essa limitação não é de grande significância. 5|P á gin a .000.000 de ciclos de escrita na memória EEPROM de dados. O fato é que. o watchdog faz o reset do uC. A partir disso. Para que o micro não seja resetado em caso de funcionamento correto. Retenção de dados na memória EEPROM superior a 40 anos. e o micro será resetado. PIC 16F876 – Pinagem A figura abaixo traz o esquema de pinos do microcontrolador em estudo.Arquitetura de microcontroladores que serão mostradas não são exclusivas do modelo 16F876. portanto. são especificadas as funções de cada um dos pinos de acordo com o datasheet do dispositivo. o modelo PIC 16F876.2. os microcontroladores também podem apresentar uma falha ou um percalço em seu funcionamento. é feito o reset do uC e este começa a executar o programa desde o início. não é mais possível que a memória do uC seja lida. Baixo consumo: 0. passando a executar o programa desde o começo. evitando a duplicação do código em outro microcontrolador. Na verdade.3. Modo SLEEP ou modo de espera: modo de consumo reduzido de energia. típico de sistemas alimentados à bateria. Depois de um certo período de tempo. como no caso de funcionamento correto. é o que o microcontrolador reseta-se automaticamente. uma condição ambiental que exceda os limites de operação do uC ou uma instabilidade na alimentação do circuito. haverá o transbordo do temporizador WDT. Cerca de 10. o número de reprogramações deste modelo de PIC fica limitado em cerca de 1000 ciclos. quando isso acontece.Capítulo 1 . Watchdog Timer (WDT): o watchdog é um mecanismo que o microcontrolador usa para se defender contra possíveis “bloqueios” do programa. o que realmente ocorre. Como qualquer circuito eletrônico. Nesse caso. Capítulo 1 - Arquitetura de microcontroladores Figura 1.4. Esquema de pinos do microcontrolador PIC 16F876 Tabela 1.2. Relação ‘pino função’ para o microcontrolador PIC 16F876 Pino VDD (pino 20) VSS (pino 8 ou pino 19) Osc1 (pino 9), Osc2 (pino10) MCLR RA0 a RA5 (pinos 2 ao 7) – PORTA A RB0 a RB7 (pinos 21 ao 28) – PORTA B RC0 a RC7 (pinos 11 ao 18) – PORTA C Função Alimentação do microcontrolador (5V) Referencial de tensão (0V – terra) Ligação do circuito oscilador responsável pelo clock do microcontrolador Pino de reset - Ativado quando em nível baixo E/S bidirecional E/S bidirecional E/S bidirecional No entanto, conforme mostra a lista abaixo, alguns pinos do microcontrolador não se restringem a uma única função: RA0 a RA3 (pinos 2 ao 5) e RA5 (pino 7): entradas analógicas; RA2 (pino 4): referência de tensão negativa analógica; RA3 (pino 5): referência de tensão positiva analógica; RA4 (pino 6): entrada de clock para o TIMER 0; RB0 (pino 21): pino de interrupção externa; RB3 (pino 24): pino que sinaliza o modo LVP de programação, ou seja, programação em baixa voltagem (Low Voltage Programming). Utilizando este modo de programação do uC, a perda do pino 24 é inevitável, uma vez que ele deve ser usado exclusivamente para sinalizar ao circuito programador o modo LVP. Por esse motivo, na maioria das vezes o modo de programação adotado é o HVP (High Voltage Programming); RB4 a RB7 (pinos 25 ao 28): Pinos de interrupção por mudança de nível lógico; RB6 (pino 27): entrada de clock da programação serial; RB7 (pino 28): dados da programação serial; RC0 (pino 11): entrada de clock para o TIMER 1/saída do circuito oscilador para o TIMER 1; RC1 (pino 12): entrada do circuito oscilador para o TIMER 1/entrada do modo de captura do TIMER 1/saída do modo comparador do TIMER 1/saída de sinal PWM; RC2 (pino 13): entrada do modo de captura do TIMER 1/saída do modo comparador do TIMER 1/saída de sinal PWM; RC3 (pino 14): saída para os modos SPI e I²C de comunicação externa; RC4 (pino 15): entrada para o modo SPI de comunicação/E/S para o modo I²C; RC5 (pino 16): saída para o modo SPI de comunicação externa. 6|P á gin a Capítulo 1 - Arquitetura de microcontroladores Maiores detalhes acerca das funções de cada um dos pinos do microcontrolador podem ser encontradas em seu datasheet, conforme ilustra a tabela abaixo retirada da folha de dados referente aos modelos da família 16F87X. Figura 1.5. Tabela contendo informações acerca da pinagem do microcontrolador PIC 16F876 7|P á gin a Capítulo 1 - Arquitetura de microcontroladores 1.4. Algumas conexões importantes Independentemente da aplicação que será dada ao microcontrolador, do programa que será executado ou do ambiente onde será inserido, algumas conexões sempre são realizadas. Uma delas refere-se ao circuito responsável pela geração do sinal de clock do uC. Na prática, o clock é um sinal de onda quadrada que serve para determinar a freqüência de operação do circuito, sincronizando seus diversos componentes. Está relacionado, portanto, à velocidade de operação do microcontrolador. A geração do sinal de clock por meio de circuitos osciladores pode ser feita de quatro maneiras distintas, dependendo do uso. A configuração é setada via software de programação (conforme mostrado na Figura 1.6) e é aceita pelo uC durante sua gravação. A freqüência máxima de operação do microcontrolador deve ser escolhida de acordo com as funções que ele irá executar. Na grande maioria dos projetos, uma freqüência de operação de 4MHz é suficiente. Figura 1.6. Configuração da freqüência de operação do microcontrolador através da ferramenta de projeto PICWizard do software PCW A Figura 1.7 abaixo traz os possíveis modos de geração do sinal de clock do microcontrolador. Dentre as principais características do circuito oscilador RC, esquematizado na Figura 1.7(a), podem ser destacadas: Circuito mais simples e mais barato de ser implementado, quando comparado a outros tipos de osciladores; Utilização de um único pino para conexão (pino 9 – OSC1); Oscilador com pouca precisão de clock e com baixa estabilidade; Deve ser considerado em aplicações onde o tempo não é um fator muito importante e a economia é o objetivo principal; A freqüência de oscilação é baixa, inferior a 700kHz, e depende dos valores de , , , temperatura e tolerância. 8|P á gin a Já os circuitos osciladores que fazem uso de cristais ou ressonadores cerâmicos. XT (XTAL) e HS (High Speed). Assim como a configuração externa. também existe a possibilidade de configurar o oscilador RC interno do microcontrolador. (Fábio Pereira – Microcontroladores PIC – Programação em C – 7ª Edição).Arquitetura de microcontroladores VCC Circuito oscilador RC 9 Cext 10 C1 OSC1 9 XTAL OSC2 10 PIC16F876/873 Rext PIC16F876/873 Circuito oscilador por cristais ou ressonadores cerâmicos C2 (a) 5k Cext Rext 100k 20 pF (b) OSC1 Sinal de Clock Externo (c) 9 10 PIC16F876/873 Circuito externo de geração de clock Figura 1. A tabela abaixo mostra os valores típicos adotados para circuitos osciladores que utilizam cristais ou ressonadores.7.7(b). na maioria das vezes opta-se pelo uso de um oscilador externo. já que as rotinas de comunicação serial são muito afetadas pela imprecisão do clock. dessa forma. Embora a imunidade a ruídos e a economia de pinos seja uma vantagem do oscilador interno.3. Circuitos osciladores e geração externa de clock Além dessa configuração externa apresentada para o oscilador RC. a calibração desse circuito não é confiável e. a precisão e a estabilidade do sinal de clock gerado por esse circuito não é boa.Capítulo 1 . Tabela 1. Valores recomendados para o circuito oscilador Circuito XT XT XT HS HS LP LP XT XT XT Freqüência (componente) 455kHz (ressonador) 2MHz (ressonador) 4MHz (ressonador) 8MHz (ressonador) 10MHz (ressonador) 32kHz (cristal) 200kHz (cristal) 100kHz (cristal) 2MHz (cristal) 4MHz (cristal) Capacitor 47-100pF 15-33pF 15-33pF 15-33pF 15-33pF 68-100pF 15-33pF 100-150pF 15-33pF 15-33pF 9|P á gin a . representados pela Figura 1. podem ser divididos em três tipos básicos: LP (Low Power). a precisão é menor. o consumo de energia. o pino 9 (OSC1). Outra conexão que sempre realizaremos refere-se ao pino de reset do uC. O modo XT é o mais usado. dessa forma. MCLR. etc. são necessários um cristal oscilador de baixa freqüência (32kHz a 200kHz) e dois capacitores cujos valores são especificados na tabela acima. Essa configuração é normalmente empregada em aplicações que exigem baixa velocidade de processamento e baixo consumo de energia. No caso do modelo 16F876. os fatores normalmente avaliados são a velocidade de processamento. 10 | P á g i n a . A conexão entre o pino MCLR e o terminal deve ser feita através de uma resistência. A freqüência de oscilação. No entanto. cuja função é conservar a tensão do pino em nível lógico alto. Já no caso do ressonador cerâmico. O pino MCLR representa. conforme ilustra a Figura 1. Esse é o modo de maior consumo de energia. tendo em vista que utiliza cristais de baixa potência. Freqüências de oscilação acima de 4MHz (alta velocidade de processamento) exigem a configuração HS. No caso da configuração LP. por isso. Durante este curso. Ele deve ser ligado ao terminal positivo da fonte ( ) através de uma resistência.7(c). e menor sensibilidade a fatores externos.3). Ela pode ser implementada com um cristal oscilador ou com um ressonador cerâmico. o custo é menor. Além disso. A partir dos circuitos osciladores expostos. representa uma boa opção quando se deseja sincronizar vários microcontroladores alimentados pelo mesmo sinal de clock. O cristal apresenta uma precisão superior. Possui a desvantagem de utilizar muitos componentes e apresentar variações de freqüência com a temperatura. é alta e menos sensível a variações externas. e sua função é inicializar o microcontrolador a partir da posição zero de memória sempre que conectado à referência da alimentação ( ). no entanto necessita de dois capacitores conectados a ele. fazendo uso de um cristal oscilador de quartzo de 4MHz e dois capacitores de 22pF cada (indo ao encontro dos dados fornecidos pela Tabela 1. a configuração que iremos adotar é a XT. O valor dessa resistência deve estar entre 5 e 10kΩ. transistores. mas os dois capacitores são dispensados (embutidos no ressonador) e. como mostra a tabela acima. geradores de onda quadrada. verifica-se que a escolha de um deles depende da aplicação em questão. portanto. Todo PIC possui um pino de reset. uma possibilidade de resetar o microcontrolador manualmente. o uso de pinos (portas) e o custo dos componentes. Ainda assim. Optando por essa forma de geração de clock. a estabilidade a fatores externos.Capítulo 1 . este é o pino 1. Sua implementação pode ser feita através de um cristal oscilador ou de um ressonador cerâmico. custo elevado quando comparado a osciladores do tipo RC.Arquitetura de microcontroladores HS HS 4MHz (cristal) 10MHz (cristal) 15-33pF 15-33pF Esses osciladores possuem alta precisão e estabilidade e. apenas um pino do uC é usado. ainda existe a opção de um circuito que gere o clock do uC externamente. Este tipo de circuito pode ser feito a partir de portas lógicas. 8. no pino 8 ou 19. Esquema de conexões básicas do microcontrolador PIC 16F876 NOTA: Recomenda-se que todos os dispositivos previstos pelo software que utilizam pinos de E/S do microcontrolador sejam conectados. A figura abaixo resume essas conexões básicas vistas até aqui.9. ou seja. Configuração do pino MCLR Fora isso. o sistema poderá não funcionar corretamente.Arquitetura de microcontroladores VCC R 10k MCLR 1 PIC16F876/873 5k Figura 1. Caso contrário. tem-se também a alimentação do circuito.Capítulo 1 . Exemplo: Display LCD 11 | P á g i n a . no pino 20 e 5V 5k R 10k 22 pF 4MHz 5V 22 pF Figura 1. O compilador corresponde a um software (ou um conjunto de softwares) que traduz o código fonte escrito pelo programador (normalmente desenvolvido em uma linguagem com alto nível de abstração) para uma linguagem de mais baixo nível. o compilador CCS gera. É possível incluir. Código Fonte em C ou Assembly Arquivo . comumente opta-se pela programação em linguagem C que. a programação dos microcontroladores PIC pode ser feita tanto através da linguagem C de programação como através da linguagem Assembly. capaz de ser compreendida pelos circuitos que compõem o sistema computacional em questão.hex Editor de Texto Compilador ou Assembler Código em linguagem de máquina Figura 2.hex é gerado. Como programar um microcontrolador Para programar um microcontrolador.1 ilustra. ou seja. característica das linguagens de alto nível. na forma de um diagrama simplificado. “informar” ao micro quais as funções que devem ser executadas por ele. como.Fundamentos de Linguagem C 2. conforme mencionado a seguir: A linguagem C permite uma programação mais fácil e amigável ao usuário. A Figura 2. agrega inúmeras facilidades ao usuário.hex na linguagem Assembly). A linguagem C permite maior portabilidade.1. Linguagem C x Assembly Conforme mencionado na seção anterior. de forma simples e padronizada. Diagrama simplificado representando o processo de programação do uC 2.Capítulo 2 . Isso á bastante importante na hora de implementarmos alguma rotina mais complexa no uC. Entretanto.hex para a linguagem C) mostra-se um processo mais complexo do que a montagem (processo de geração do arquivo . No caso dos microcontroladores PIC. valores hexadecimais (arquivo . como o programador não participa desse processo de geração do arquivo hexadecimal. de tal forma que a compilação (processo de geração do arquivo . ao contrário da linguagem Assembly. o processo de programação do uC. por ser uma linguagem com maior nível de abstração. uma vez que um mesmo programa pode ser recompilado para um uC diferente com o mínimo de alterações.1. outro arquivo em C (biblioteca) para ser utilizado como parte do seu programa principal. faz-se uso de um compilador. A principal diferença entre essas duas linguagens de programação está na forma como o arquivo . a partir de um algoritmo implementado em linguagem C ou Assembly. por e12 | P á g i n a .hex) que serão escritos na memória de programa do microcontrolador. onde as instruções diferem muito entre os diversos tipos de microcontroladores. Em função das vantagens verificadas no uso da linguagem C para programar microcontroladores. o programador deve traduzir a solução escolhida para a linguagem de trabalho adotada (C ou Assembly. ETAPA 7: GRAVAÇÃO Após a realização de todos os testes de simulação. na hora de programar um microcontrolador costuma-se seguir algumas etapas típicas. No entanto.hex pode ser gravado no uC (dispositivo físico). neste caso). tendo em vista que tanto a memória de programa como a memória de dados possuem espaço suficiente. ETAPA 1: EXPOSIÇÃO DO PROBLEMA O programador deve descrever detalhadamente o problema a ser resolvido pelo programa. ETAPA 3: CODIFICAÇÃO DA SOLUÇÃO O programador deve elaborar uma descrição seqüencial. Metodologia de programação Em geral. caso ocorram erros. muitas vezes. ocupando mais espaço tanto na memória de programa como na memória de dados. passo a passo. na maioria das vezes. da solução escolhida. maior do que o código gerado por um montador (assembler).Fundamentos de Linguagem C xemplo. deve-se fazer a depuração em cada fragmento do código.Capítulo 2 . Assim. representar um aumento nos custos do sistema embarcado. corrigir os problemas. 13 | P á g i n a .2. com o objetivo de facilitar a organização e a documentação do projeto. Essas etapas são mostradas no fluxograma que segue. essa será a linguagem trabalhada dentro deste curso. uma vez que todos os exemplos apresentados serão implementados em C. já que o mesmo acostuma-se a trabalhar em alto nível. o programador não é “forçado” a conhecer as características referentes ao hardware do uC. considerando aplicações que não envolvem um alto nível de complexidade. a linguagem C ainda mostra-se mais apropriada. compromete a eficiência do programa e também o uso da capacidade de todos os periféricos internos ao micro. podendo. Outra desvantagem reside no fato que. dessa forma. Entre as desvantagens da linguagem C. ETAPA 5: DEPURAÇÃO Compilar o programa e. ETAPA 2: ANÁLISE DA SOLUÇÃO O programador deve elaborar as soluções que melhor resolvem o problema. programando em C. Isso. a inclusão da biblioteca necessária para o interfaceamento entre o uC e o display LCD. ETAPA 6: SIMULAÇÃO O programa gerado pelo compilador deve ser simulado através de um software que contenha o modelo do uC em estudo. tem-se um algoritmo ou fluxograma. destacam-se: O código gerado através da compilação é. 2. o arquivo . ETAPA 4: TRADUÇÃO DO CÓDIGO Através do algoritmo ou fluxograma elaborado. Para programas maiores. 967. Como exemplo de declaração de variáveis.438 O padrão ANSI C prevê. ainda. aqui serão apresentadas apenas aquelas ferramentas vistas como necessárias para que o programador iniciante tenha a capacidade de começar a desenvolver seus próprios projetos.147.3. conforme mostra a Tabela 2. byte signed int.294.535 0 a 4.483. boolean char signed char unsigned char int.768 a 32. no entanto.1.535 -32.Fundamentos de Linguagem C 2. int16 signed long int unsigned long int int32 signed int32 unsigned int32 float Tamanho em bits 1 8 8 8 8 8 8 16 16 16 32 32 32 32 Faixa de valores 0 ou 1 0 a 255 -128 a 127 0 a 255 0 a 255 -128 a 127 0 a 255 0 a 65. palavras que alteram o tamanho do conjunto de valores dos tipos básicos de dados da linguagem. O compilador CCS não suporta esse tipo de dado.648 0 a 4.1.294.1. o tipo double. Além disso. tal que sua declaração é feita conforme sintaxe abaixo: [tipo de dado] [nome da variável]. O compilador CCS possibilita o uso de quase todos os tipos de dados disponíveis no padrão ANSI C. alguns aspectos mais específicos relacionados a essa linguagem de programação serão trabalhados ao longo da resolução dos exemplos propostos. a palavra “double” continua entre as palavras reservadas da linguagem. e um estudo detalhado do mesmo exigiria uma dedicação exclusiva.767 0 a 65. Fundamentos de linguagem C de programação O objetivo desta seção é apresentar alguns aspectos básicos referentes à linguagem C de programação.18-38 a 3. tem-se: 14 | P á g i n a . focando a sua utilização na programação dos microcontroladores PIC. baseada nos compiladores CCS. Declaração de variáveis A linguagem C disponibiliza ao programador uma gama imensa de tipos de dados.295 -2. pode ser declarada como sendo de qualquer um dos tipos especificados na Tabela 2. unsigned byte long int.Capítulo 2 .648 a 2.1.483.295 1. int8. Uma vez que o assunto em questão é bastante amplo. que consiste em uma versão com capacidade de representação dobrada (64 bits) em relação ao tipo float. 2. Uma variável em C.967. Tabela 2. Todos os tipos de dados disponíveis por padrão no compilador CCS Tipo short int.147. ou seja. int1. signed byte unsigned int. portanto. principalmente em função do uso de modificadores.3. break. case constante2: 15 | P á g i n a .2.1. O formato geral da declaração switch é: switch (variável) { case constante1: comandoA.Fundamentos de Linguagem C int var. Opcionalmente. também é possível executar outro comando ou bloco de comandos no caso da condição ser avaliada como falsa. clara e eficiente quando comparada ao comando if.3. por sua vez. e a linguagem C dispõe de um excelente conjunto de comandos. não sendo obrigatória para o funcionamento do comando. Em C. 2.2. A linguagem C.. é preferível fazer uso da declaração switch. while e dowhile .} A cláusula else é opcional. As declarações de controle podem ser classificadas em duas categorias básicas: Declarações de teste condicional: são utilizadas para testar determinadas condições/variáveis e executar um código para cada caso. /*Declara o vetor “var” com 10 espaços de 8 bits cada*/ 2.2. Uma variável declarada desta forma é conhecida como vetor.Capítulo 2 . é possível também declarar uma matriz de valores utilizando []. 2. o comando if é utilizado para executar um comando ou bloco de comandos no caso de uma determinada condição ser avaliada como verdadeira. Comando if De um modo geral.2. Declarações de estrutura de repetição: são utilizadas para provocar a execução de um bloco de comandos enquanto uma determinada condição for verdadeira. {else comandoB. . Comando switch Em alguns casos. Declarações de controle As declarações ou comandos de controle são uma parte muito importante de uma linguagem de programação. A forma geral do comando if é: if (condição) comandoA. conforme mostra o exemplo abaixo. dispõe de dois tipos de declarações condicionais: o comando if e o comando switch. que permite a realização de comparações sucessivas de uma forma muito mais elegante. Nesse caso. como na comparação de uma determinada variável a diversos valores diferentes.. int var[10]. dispõe-se de três declarações de repetição: for.3. //Declara a variável “var” do tipo “int” Além disso. o comando if pode se tornar um pouco confuso ou pouco eficiente.3. 16 | P á g i n a . . Caso esta cláusula seja omitida.. o laço for permanecerá em execução. default: comandoZ. Caso a variável e a constante possuam o mesmo valor. Convém observar que cada seqüência de comandos da cláusula case é encerrada por uma cláusula break. é executado o comando ou bloco de comandos. .2. incremento) comando. . então os comandos especificados pela cláusula default são executados.. } O valor da variável é comparado com as constantes especificadas pela cláusula case. 2. Laço for O formato geral do laço for é: for (inicialização. então todos os comandos subseqüentes ao case especificado serão executados. } Cada uma das três seções distintas do comando for possui uma função distinta. em seguida a seção de incremento é executada e o laço é repetido (voltando a avaliar a condição de teste). condição.. Caso o valor da variável não encontre correspondentes nas constantes especificadas em cada uma das cláusulas case.. em seguida. até que seja encontrada uma outra cláusula break.Fundamentos de Linguagem C comandoB.3. finalizando o comando switch.. Condição: esta seção conterá a condição a ser avaliada para decidir pela continuidade ou não do laço de repetição.. .. ENQUANTO a condição for avaliada como verdadeira. a condição de teste é avaliada e caso seja verdadeira. ou for (inicialização. O funcionamento básico do comando é o seguinte: primeiramente a seção de inicialização do comando é executada. tal que: Inicialização: esta seção conterá uma expressão utilizada para inicializar a variável de controle do laço for... então os comandos seguintes àquela cláusula case serão executados. . incremento) { comando1.3. break. comando2.Capítulo 2 . condição. Incremento: esta seção pode conter uma ou mais declarações para incremento da variável de controle do laço.. ou do { comandoA.Fundamentos de Linguagem C 2. comandoB. no caso do comando do while o comando ou bloco de comandos é executado.3. no mínimo. no entanto.. Em anexo a esse documento. então o comando ou o bloco de comandos associado é executado e a condição é novamente avaliada. } while (condição).4. conforme mostra a forma geral deste comando: do comando while (condição). como as declarações de teste condicional e as declarações de estrutura de repetição.Capítulo 2 .. reiniciando o laço. 2. já que o mesmo aparece antes da avaliação da condição. uma vez que essas funções facilitam e agilizam bastante a programação do microcontrolador. Caso a condição seja falsa. 2. Laço while A forma geral do comando while é: while (condição) comando. uma vez. comando2. encontra-se uma tabela com as funções da linguagem C internas do compilador CCS. Funções internas do compilador CCS Além dos comandos tidos como tradicionais dentro do padrão ANSI C. Ou ainda: while (condição) { comando1. .3.3.. Programa exemplo – Pisca LED Para começar a compreender a programação em linguagem C para microcontroladores PIC. é apresentado abaixo um programa simples cujo objetivo é fazer piscar um LED a uma 17 | P á g i n a . } A filosofia de funcionamento do comando while é: primeiramente a condição é avaliada..2. O funcionamento do comando do while é bastante semelhante ao do comando while.4. Muitas dessas funções aparecerão com bastante freqüência durante a realização dos exemplos. . o comando ou bloco de comandos não é executado e o programa tem seqüência a partir da declaração seguinte ao bloco while. é de extrema importância o conhecimento de algumas funções internas (específicas) do compilador CCS. caso seja verdadeira. tem-se: 18 | P á g i n a .h> O comando #include é uma diretiva do compilador.1seg). Dessa forma. delay_ms(tempo). basta alterar esta linha do programa. que utilizam a seqüência de caracteres “/*” para iniciar o comentário e a seqüência “*/” para finalizar o comentário. BROWNOUT. } } Na primeira linha do programa acima aparece: //Programa Exemplo – Pisca LED Essa linha representa um comentário. qualquer texto escrito após “//” ou entre “/* */” não será traduzido pelo compilador.h” é um arquivo com as definições relativas ao processador-alvo. tempo=100.1seg e apagado durante //Programa Exemplo – Pisca LED #include <16F628. está determinando ao compilador que anexe ao programa o arquivo especificado: “16F628. o LED fica aceso durante 0. Desejando modificar o processador-alvo. para o qual o programa será compilado.Capítulo 2 . PUT. NOLVP. delay_ms(tempo).h”.Fundamentos de Linguagem C freqüência de 0. O “16F628. NOMCLR main() { int tempo. A linha seguinte traz: #include <16F628. tipos. NOWDT. (em um loop infinito. ou de múltiplas linhas. Os comentários podem ser de linha simples. Neste caso. Podemos verificar que o processador para o qual o programa foi escrito é o PIC 16F628. Em seguida. output_low(PIN_B0). while (true) { // Aqui vai o codigo output_high(PIN_B0). símbolos e funções úteis ao programa (bibliotecas). iniciados pelos caracteres “//”. Arquivos com a extensão “h” são chamados de arquivos de cabeçalho e são utilizados em C para definir variáveis. Os comentários são descrições inseridas no código-fonte pelo programador com o intuito de documentar/organizar o programa.h> #use delay(clock=4000000) #fuses INTRC_IO. em C.Fundamentos de Linguagem C #use delay(clock=4000000) A seqüência #use especifica uma diretiva interna do compilador. Como. NOWDT. NOMCLR Esta é uma diretiva que especifica o estado dos “fusíveis” da palavra de configuração do dispositivo (INTRC_IO. Em seguida. PUT. corresponde a uma declaração de variável. tem-se NOWDT. No caso. ou o corpo principal do programa. Uma função. os pinos RA6 e RA7 podem ser configurados para receber um sinal de clock externo (CLKIN e CLKOUT. é um conjunto de instruções que pode ser executado a partir de qualquer ponto do programa. Através desta operação. Uma vez que o tamanho da variável criada é de 8 bits. Estas opções variam conforme o modelo de PIC utilizado. é reservado um espaço de 8 bits na memória de programa destinado à variável tempo. Após INTRC_IO. a função main() é padronizada na linguagem C e é utilizada para definir a função principal. respectivamente). com os pinos RA6 e RA7 disponíveis para E/S. NOLVP. a geração do clock é interna. através do comando de atribuição tempo=100. Esse bloco será repetido enquanto a avalia19 | P á g i n a . NOWDT. No caso. NOMCLR). então os pinos RA6 e RA7 podem ser setados como pinos de E/S. A lista com os valores válidos para a determinação do estado de cada fusível pode ser verificada a qualquer momentos no menu VIEW > Valid Fuses do compilador. Este comando determina que o compilador crie uma variável do tipo inteiro int chamada tempo. tem-se: main() A declaração main() especifica o nome de uma função. o while() é um comando de controle utilizado na repetição de um determinado bloco de instruções. que indica o desligamento do watchdog (no watchdog timer). na seqüência. a variável tempo assume o valor 100 (observe que o valor da variável está situado dentro da faixa de valores permitida). int tempo. O primeiro comando. NOLVP. nesse caso. Em seguida. a diretiva determina ao compilador que considere o valor de ou para a freqüência de clock do uC. BROWNOUT. timer power-up ligado. Na próxima linha do programa. PUT. A primeira linha do bloco de comandos da função main() é: while(true) Conforme já visto anteriormente.Capítulo 2 . estamos selecionando pela ordem: oscilador de clock interno de 4MHz. O sinal de abertura de chave “{“ é utilizado para delimitar o início da função. e o sinal de fechamento de chave “}” indica o fim da função. No presente caso. BROWNOUT. reset por brown-out ligado. programação por baixa tensão desligada e MCLR interno (pino RA5 disponível como entrada). Esse valor é utilizado para geração dos códigos de atraso e outras rotinas que dependem de tempo. aparece: #fuses INTRC_IO. Na linha seguinte. a variável tempo só poderá assumir valores entre 0 e 255. No caso da família de microcontroladores PIC 16F62X. 20 | P á g i n a . ou seja. também é uma função interna do compilador. colocar em nível lógico “1” – 5V) um pino do microcontrolador. é o pino RB0 (da porta B) que será setado.Capítulo 2 . dessa forma. O último comando. irá gerar. nesse caso. até que o valor da contagem atinja ”tempo”. delay_ms(tempo). colocar em nível lógico “0” – 0V) um pino qualquer do micro. um atraso de 100ms no sistema. já que tempo=100ms. e é utilizada para resetar (ou seja. o atraso será de 100ms. Nesse caso. A próxima função a ser executada é: delay_ms(tempo) Essa também é uma função interna do compilador. o programa nunca sairá do bloco de instruções. É importante notar que “PIN_B0” é um símbolo predefinido para especificar o pino RB0. o pino RB0 (PIN_B0). Esse artifício de uso de uma condição que é sempre verdadeira é comumente usado no comando while() que inicia o programa a ser implementado no uC. para esse caso. Essa função é utilizada para setar (ou seja. e é utilizada para gerar um atraso de “tempo” milissegundos. A primeira instrução do comando while(). Esse símbolo está localizado no arquivo de cabeçalho do processador utilizado (para o caso em questão.Fundamentos de Linguagem C ção da condição especificada entre parênteses for verdadeira. novamente.h”). No caso em questão. o uC ficará apenas “contando”. uma vez que as aplicações normalmente requerem que o programa esteja sempre rodando. O comando seguinte. é uma chamada a uma função interna do compilador. Portanto. output_high(PIN_B0). output_low(PIN_B0). o arquivo “16F628. a avaliação é explicitamente verdadeira (true) e. Nele. O ISIS é um simulador de circuitos. É uma excelente ferramenta para aqueles que estão começando a trabalhar com PIC. Este mesmo código será utilizado para a simulação no ISIS. se haverá algum tipo de comunicação.Softwares 3. O PCWH é um compilador que possui bibliotecas próprias para serem utilizadas com a grande maioria dos PICs disponíveis no mercado. Softwares No presente curso de microcontroladores PIC utilizaremos dois softwares: ISIS 7 Professional 7. Vamos ver agora as principais funcionalidades deste software.1. 3. é possível escolher o dispositivo. O ícone do PIC Wizard fica na aba Project: Figura 3. ícone do PIC Wizard A tela inicial do PIC Wizard é a seguinte: 21 | P á g i n a . etc.7 SP2 (Labcenter Electronics).1. com suporte a utilização de microcontroladores da Microchip e da Atmel.1 PCWH Compiler O CCS C é o software onde escrevemos nosso código em C/C++ que deverá ser compilado para a utilização no microcontrolador. pois ele gera automaticamente o código com os parâmetros já definidos.Capítulo 3 . timers. 3.1 PIC Wizard O PIC Wizard é a maneira mais prática de iniciar um novo projeto. as portas que serão utilizadas. Nas seções subseqüentes veremos estes dois softwares com algum detalhe. a freqüência de oscilação. PCWH Compiler (CCS – Custom Computer Services). através de uma interface gráfica. 3. Vamos agora descrever as mais importantes delas. 3. e etc. À esquerda temos um lista com diversas opções para configuração do PIC. a principal utilidade do PIC Wizard é que ele gera o código baseado nos parâmetros escolhidos. Os dois tipos de comunicação disponíveis são RS-232 (Serial).1. a freqüência em que o dispositivo irá operar. e algumas configurações para o LCD.1.3 Timers Em timers é possível configurar os timers 0 (RTCC). Um WatchDog Timer é um dispositivo eletrônico temporizador que dispara um reset ao sistema se o programa principal.1. memórias externas. Como mencionado. Esses tópicos serão abordados em capítulos subseqüentes.1. deixar de fazer reset no WatchDog timer.1 Communications Em communications podemos habilitar a comunicação do PIC com outros microcontroladores. Outra configuração disponível é a do timer WTD (WatchDog).1. e de que forma se dará essa freqüência. e a comunicação I2C. 3. Tela inicial do PIC Wizard Nas partes destacadas em vermelho podemos escolher o dispositivo que será utilizado.Capítulo 3 .2 SPI e LCD Aqui ficam as configurações para o protocolo de comunicação SPI. 22 | P á g i n a . devido a alguma condição de erro. 1 e 2.Softwares Figura 3.2. com um computador.1. é que o programa já inclui as bibliotecas necessárias para sua utilização. São gerados diversos arquivos de saída.1.4 Analog Em analog é possível escolher quais portas do PIC serão disponibilizadas para a conversão A/D. podemos compilar o programa utilizando-se a tecla F9.1. o mais importante dele é o arquivo . entrada/saída. teclado 3x4. Existem opções como LCD driver. e que podem auxiliar no desenvolvimento de programas.pjt. que se saiba configurar todos os elementos por meio do programa em C. comunicações de protocolos diversos. drivers de dispositivos com tecnologia touch.hex. conversão A/D.1. como por exemplo. Utilizaremos esse arquivos na simulação dos nossos programas no ISIS Proteus. analógica ou sem uso.1.1. escolhe-se a resolução do conversor e a freqüência de operação deste.3. drivers. etc. também.6 Drivers Em drivers adiciona-se elementos que serão utilizados no projeto.3 Funções do compilador CCS Veremos agora funções que o compilador CCS disponibiliza. Os arquivos que serão gerados na compilação. serão armazenados na mesma pasta que foi escolhida para o arquivo . que é utilizado para encontrar erros no programa. RTCC. Uma das vantagens de adicionar um driver por aqui.1. Mas é necessário. portas para conversão A/D. Além disso. configurar manualmente essas portas para entrada. Timer 2. e etc.1 OUTPUT_LOW() Essa função coloca o pino especificado do microcontrolador em nível lógico baixo (0). Timer 1. É possível ainda. interrupções externas. Sintaxe: output_low(pino) 23 | P á g i n a . são mostradas nesta aba as portas que são reservadas para essas determinadas configurações. NOTA: É importante conhecer o recurso PICWizard.2 Compilador Depois de finalizado o código. colisão no barramento.5 Interrupts Em interrupts habilita-se as interrupções desejadas. 3.1.1.1. O compilador do PCWH ainda conta com um debugger.Softwares 3. entre elas.7 I/O Pins Conforme são habilitadas as configurações para o programa. 3. 3.1. 3. 3. principalmente para aqueles que são iniciantes na utilização dos microcontroladores PIC. 3.1. saída. memórias EEPROM.Capítulo 3 . Sintaxe: delay_us(n) n é uma variável inteira de 8 bits ou uma constante de 16 bits. Sintaxe: valor = input_A() valor = input_B() valor = input_C() 3.1. Sintaxe: output_A(valor) output_B(valor) output_C(valor) Nesse caso.3. Sintaxe: delay_ms(n) 24 | P á g i n a . 3.Softwares 3. o nível lógico do pino especificado será armazenado na variável res. Sintaxe: res = input(pino) Nesse caso. 3.3.1.Capítulo 3 .3 INPUT() Lê o estado lógico de um pino microcontrolador.1. valor é uma variável ou constante inteira de 8 bits.3.3.6 DELAY_US() Aguarda n microssegundos.7 DELAY_MS() Aguarda n milissegundos.5 INPUT_X() Lê um byte completo de uma determinada porta do microcontrolador.3.3.1.2 OUTPUT_HIGH() Essa função coloca o pino especificado do microcontrolador em nível lógico alto (1). 3. Sintaxe: output_high(pino) 3.1.1.4 OUTPUT_X() Escreve um byte completo em uma determinada porta do microcontrolador. 3.1. tal qual a ilustrada na Figura 3. A tela inicial do Proteus está mostrada na Figura 3. Para uma consulta mais completa acerca das funções disponíveis no compilador CCS. Para adicionar componentes. intitulada “Pick Devices”. Na simulação não é necessário alimentar o MCU ( e ). verifique o manual de instruções do mesmo. deve-se acender um LED no pino A0. 3. 3. Figura 3. Ambiente gráfico do Proteus Vamos utilizar o Proteus para montar um circuito simples para o funcionamento dos exemplos criados na seção anterior. clique no ícone “Component Mode”.3. Quando a contagem chegar a 0. Uma caixa.4. conectado ao pino B0 do microcontrolador.2 Exemplo 2 Criar um programa utilizando a linguagem C que faça contagem regressiva de 10 a 0 na porta B (na base binária).1.3. o LED deve piscar em 1Hz. e a seguir no ícone P. com os componentes disponíveis no programa irá aparecer. 3. piscar na freqüência de 2Hz. 25 | P á g i n a .1.2 Proteus No software ISIS Proteus pode-se simular o programa criado no PCWH.4.3. Quando chegar ao valor 5.4.4 Exemplos Nos exemplo a seguir.Capítulo 3 .1 Exemplo 1 Criar um programa utilizando a linguagem C que faça um LED. ambos marcados em vermelho na Figura 3. vamos criar e configurar um projeto utilizando o PICWizard.Softwares n é uma variável inteira de 8 bits ou uma constante de 16 bits. ou digitando-se alguma palavra-chave na caixa “Keywords”.Softwares Figura 3. Resistor de 10k . Os componentes que iremos utilizar para simular o programa criado para o exemplo 1 da seção anterior são: PIC16F876A.Capítulo 3 .4. 26 | P á g i n a .5. Caixa de escolha de dispositivos Os componentes a serem adicionados no projeto podem ser achados manualmente. O circuito deve ser montado conforme ilustrado na Figura 3. LED. 2 capacitores de 22pF. Cristal oscilador de 4MHz. Esse arquivo será utilizado pelo Proteus para simular o programa criado no CCS. Em “Program File”. Circuito do Exemplo 1 Para colocar o programa no microcontrolador.5.Softwares Figura 3.6 irá aparecer.Capítulo 3 . Figura 3. basta clicar no ícone de “Play”.hex.1 Atividade Prática Como atividade prática deste capítulo.2. simular no Proteus o programa criado para o Exemplo 2. no canta inferior esquerdo da tela. no formato . 3.6. A caixa intitulada “Edit Component” ilustrada na Figura 3. clique no ícone de uma pasta. 27 | P á g i n a . Encontre o arquivo gerado pelo compilador CCS. Caixa de edição do componente Feito isso. clique duas vezes no componente. 1. (a) (b) Figura 4.com/capecanaveral/6744/a_04_03. Pinagem do módulo LCD A pinagem dos módulos LCD depende muito do fabricante de cada um. um grande número de projetos usando módulos de displays de cristal líquido tem sido desenvolvido. e todo tipo de símbolos. Pinagem do LCD ACM1602B Abaixo. apresentamos a relação de pinos do LCD. utilizaremos o display da marca AZ Displays. É muito importante que o datasheet do dispositivo seja consultado antes de realizar as conexões. Sua capacidade de mostrar não apenas números. Estes módulos podem ser gráficos ou alfanuméricos. 4. Como exemplo. LCD alfanumérico (a) e gráfico (b) Neste curso. Datasheet: http://reocities. como também letras. 28 | P á g i n a . o torna muito mais versátil que o display de 7 segmentos. modelo ACM1602B.Capítulo 4 – Display LCD 4.1.pdf Consultando o datasheet deste dispositivo encontramos a seguinte disposição de pinagem: Figura 4. daremos atenção apenas aos LCDs alfanuméricos.2. e a função que cada um desses pinos desempenha no funcionamento do módulo. LCD (Liquid Crystal Display) Recentemente. os displays LCD possuem 8 pinos para a comunicação de dados. A tabela abaixo mostra a relação entre os pinos de cada um dos dispositivos. é comum fazer uso de apenas 4. Tabela 4.Capítulo 4 – Display LCD Tabela 4. Pino 1 2 3 4 5 6 7 8 9 10 11 12 13 14 + - 4. por default. B5.2. economizam-se pinos do microcontrolador.2. Relação ‘pino Nro. para a comunicação LCD-microcontrolador. Símbolo Vss Vdd Vo RS R/W E DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 BLBL+ função’ no LCD Função Terra +5V Ajuste do contraste do LCD Seleção do registrador Leitura/Escrita Habilitado Bit de dados 0 Bit de dados 1 Bit de dados 2 Bit de dados 3 Bit de dados 4 Bit de dados 5 Bit de dados 6 Bit de dados 7 Alimentação do Backlight Alimentação do Backlight + Conectando o LCD ao microcontrolador Em geral. dividindo os bytes em 2 nibbles enviados em série. reserva os pinos B0. B6 e B7. entretanto. Desta forma.1. B1. a conexão do PIC com o LCD fica da seguinte forma: 29 | P á g i n a . Conexão entre os pinos do uC PIC16F876A e do LCD Pino no uC PIC16F876A B0 B1 B2 B4 B5 B6 B7 Pino no LCD Enable (Pino 6) RS (Pino 4) R/W (Pino 5) D4 (Pino 11) D5 (Pino 12) D6 (Pino 13) D7 (Pino 14) No software Proteus. o compilador. Ao habilitarmos o módulo LCD utilizando-se o PICWizard. B2. B4. C> Esse comando diz ao compilador para inserir as funções que serão utilizadas para o interfaceamento do LCD com o PIC. e apresenta algumas funções específicas. o seguinte comando: #include <LCD. Conexão do uC com o display LCD 4.C que permite a utilização do módulo.3.3. para inserir o driver do módulo LCD. A sintaxe para utilização dessa função é: lcd_putc(“TEXTO”) PRINTF() Essa função é utilizada para mostrar no display uma variável do código. As funções disponíveis para manipular o LCD são as seguintes: LCD_PUTC() Essa função é utilizada para mostrar um texto qualquer na tela do LCD. Ao utilizarmos o PICWizard. “%d”. O compilador CCS possui um driver chamado LCD. variável) Além dessas duas funções temos ainda os comandos: /f – limpa a tela do LCD. no início do código gerado. vemos. A sintaxe para utilização dessa função é: printf(lcd_putc.Capítulo 4 – Display LCD Figura 4. Utilizando o módulo LCD O módulo LCD é uma forma eficaz de exibir informações que são processadas no microcontrolador. 30 | P á g i n a . é como se estive conectado ao referencial terra. 5V no pino do microcontrolador quando o botão for pressionado. apresentar uma nota de abertura no LCD. Devem-se indicar no LCD quantas vezes o botão foi pressionado. ou seja. deve-se conectar este botão a uma fonte de tensão cc de 5v a fim de que haja nível lógico 1. Atividade prática Nesta atividade. Além disso. deve haver nível lógico zero no pino do microcontrolador. com uma frase a escolha. será conectado um botão (push-button) junto a um pino do microcontrolador. 31 | P á g i n a . Quando o botão não estiver pressionado. Quando este valor chegar a 5.Capítulo 4 – Display LCD /n – nova linha. acende-se um LED conectado a outro pino do microcontrolador e reinicia-se a contagem. ou seja. Além disso. 4.4. 1. realizam todas as suas operações internas usando circuitos e grandezas digitais. Por exemplo.1. a velocidade e outros. ou seja.1. 5. e seu valor é então transformado em uma quantidade digital por um conversor analógico-digital (ADC). é medida. 3. é utilizado para a informação ser processada. quantidade analógica. Diagrama de uma conversão A/D e D/A A variável física a ser medida é a temperatura. A Erro! Fonte de referência não encontrada. como os microcontroladores. onde a temperatura. mostra o diagrama de blocos para um sistema de controle de temperatura. a posição. nesse caso. e sua influência no processo. Conversão A/D A grande maioria das variáveis físicas com as quais temos que lidar são analógicas. a temperatura pode ser mostrada em um display LCD.1. uC) D/A Figura 5.Capítulo 5 – Conversão A/D 5. são essas variáveis que queremos monitorar. A/D Sistema Digital (Por exemplo. Sistemas digitais. A saída digital gerada pelo computador é enviada ao conversor D/A. A saída analógica do transdutor. 32 | P á g i n a . pode ser utilizada para que um atuador seja acionado. já em forma de variável elétrica. 4. podem assumir qualquer valor dentro de um espectro contínuo de valores. Características do Conversor A/D Vamos ver agora algumas características comuns aos conversores A/D. ser digitalizada. Geralmente. que a converte para seu valor analógico de tensão ou corrente correspondente.1. A saída de um transdutor é uma corrente ou uma tensão proporcional ao valor da variável física que está sendo monitorada. Exemplos de quantidades analógicas são a temperatura. relacionando estas características com o PIC16F876A. Resolução A especificação mais importante de um conversor A/D é a sua resolução. um microcontrolador. ou ainda. 5. primeiramente. a pressão. O sistema digital. Qualquer informação que tenha de entrar em um sistema digital precisa. 2. O transdutor é um dispositivo que converte uma variável física em uma variável elétrica. operar e controlar em um sistema. é colocada na entrada de um conversor A/D que converte a entrada analógica numa saída digital. ou seja. Por exemplo. chamado ADC clock.Capítulo 5 – Conversão A/D A resolução especifica o quão precisamente um conversor A/D mede sinais analógicos de entrada. Os conversores A/D mais comuns possuem resolução de 8. para uma temperatura de 50°C. Tempo de Aquisição Quando um canal ADC é selecionado. Temperatura. e poderiam medir com uma precisão de 5/1024 = 4. os 5 V seriam quebrados em 1024 divisões. que quanto maior a resolução de um ADC. 5. Para impedâncias menores. O tempo que leva para esse capacitor ser carregado com a tensão na entrada do canal ADC é chamado de tempo de aquisição. o tempo de aquisição é de . Depois que uma entrada analógica é selecionada.8 mV. 5.1. o tempo de aquisição diminui. 33 | P á g i n a . então. O módulo de conversão A/D do PIC16F876A possui cinco canais. 10 ou 12 bits. chamado holding capacitor. Se nosso ADC fosse de 10 bits. AN3 e AN4. O multiplexador pode conectar a entrada do ADC à qualquer um dos canais disponíveis. maior a sua precisão. podemos efetuar a conversão A/D de três transdutores diferentes. este tempo de aquisição deve ser aguardado para que a conversão possa ser efetuada. AN2. Neste caso extremo. Este também é o tempo necessário para que um bit da conversão A/D seja gerado. Isso significa que podemos entrar com mais de um sinal analógico no nosso microcontrolador. O tempo de aquisição depende de vários fatores: Impedância da fonte. A impedância máxima recomendada para fontes analógicas é . a tensão no canal de entrada é armazenada em um capacitor interno.4. O modelo de PIC que trabalhamos neste curso possui um conversor A/D com resolução de 10 bits. 256 valores. Podemos ver então. podemos representar valores. Canais ADC O módulo ADC de um microcontrolador é conectado à vários canais (channels) via multiplexador.2. 5.1. entretanto. Os canais são numerados de 0 a 4: AN0. um ADC de 8 bits quebrará os 5V em 256 divisões e poderá medir com precisão 5/256 = 19 mV. O conversor A/D requer para que uma conversão de 10 bits seja efetuada.1. EXEMPLO: Com 8 bits.3. Clock do ADC O módulo ADC requer um clock para realizar as conversões. O período de tempo do clock do ADC é chamado . do sistema. AN1. Se temos uma tensão de entrada no nosso ADC que varia de 0 a 5 V. esse valor é de . EXEMPLO: Digamos que nossa CPU está operando com um cristal oscilador externo de 20MHz. garantindo a velocidade da conversão. . Fonte do ADC Clock Operação 20 MHz VS Frequências de Operação Frequência do Dispositivo 5 MHz 1. . Esse valor deve ser o menor possível.25 MHz 333. .33 kHz 34 | P á g i n a . temos um valor típico . Existem sete possibilidades: .1. RC interno. . Quando escolhemos como fonte do clock do ADC o RC interno. Esse valor pode ser derivado do clock da CPU. A fonte do clock do ADC é selecionável por software. podendo variar de . o período de operação é: Temos que: de Este valor satisfaz o nosso mínimo.Capítulo 5 – Conversão A/D O valor mínimo é encontrado no datasheet de cada dispositivo (A/D Conversion Requirements). mas não deve ser menor que o valor mínimo encontrado no datasheet. Vamos escolher o prescaler de Nossa freqüência de operação é: Logo. Tabela 5. dividindo-se por um fator de divisão adequado. chamado . No caso do PIC16876A. . operação no modo sleep. Em outras palavras. Tensão de referência 5. A configuração default da tensão de referência é quando éo e éo .2. então.5. efeito do reset na conversão A/D e interrupções do módulo ADC.1. a tensão de referência determina uma faixa de valores possíveis para a entrada analógica. Tensão de Referência A tensão de referência do ADC especifica o mínimo e o máximo valores de tensão de uma entrada analógica.Capítulo 5 – Conversão A/D A Tabela 5. Os canais são numerados de 0 a 4: AN0. Podemos mudar a tensão de referência para obtermos uma maior precisão na leitura dos dados analógicos. que o módulo de conversão A/D do PIC16F876A possui cinco canais. 35 | P á g i n a . AN1. se utilizarmos esta configuração.2. não precisamos utilizar dois pinos extras do PIC. podendo deixá-los disponíveis para outros propósitos. Conversão A/D no PIC16F876A Vamos ver agora algumas características da conversão A/D próprias do dispositivo que estamos utilizando. O especifica a menor tensão de entrada analógica enquanto especifica a maior tensão. Vimos. Desta forma.1 relaciona valores de com valores para a freqüência de operação do dispositivo. AN2. AN3 e AN4. Nesta seção vamos ver quais pinos do PIC16F876A são reservados para a conversão A/D. Existem duas tensões de referência. As células destacadas em verde contêm valores que não são aceitáveis para 5. Figura 5. e . A conversão de uma entrada analógica resulta em um número digital correspondente de 10 bits. Se a interrupção não estiver habilitada. 5. Pinagem do PIC16F876A Como vemos na Figura 5.2. 5. 5. A conversão do valor analógico resulta em um número digital correspondente de 10 bits.1. 4. e a interrupção do módulo ADC está habilitada. Efeitos do reset Um reset do dispositivo força o módulo ADC a ser desligado. 3. que é armazenado em um registrador específico do microcontrolador. Vamos ver estas funções em detalhe nesta seção. esses canais correspondem aos pinos 2.3. e os dados continuam disponíveis para leitura. 5. Quando a conversão é finalizada. o dispositivo retorna do modo sleep. o clock do ADC deve derivar do oscilador RC interno do microcontrolador. Operação no modo sleep A conversão A/D tem a característica de ser capaz de operar quando o MCU é colocado no modo sleep. a instrução sleep fará a presente conversão ser abortada e o módulo ADC desligado. Com esta função habilitamos o conversor A/D e determinamos o clock de conversão. A sintaxe para a utilização desta função é: setup_ADC(opções) 36 | P á g i n a . Funções do Compilador CCS O compilador CCS tem funções específicas para serem utilizadas na conversão A/D.1.2. Neste caso. Qualquer um destes pinos pode ser utilizado como entrada de um sinal analógico para que seja efetuada a conversão A/D. Se a fonte do clock for outra opção que não a do RC interno.2. e qualquer conversão é abortada.3. o módulo ADC é desligado. 5 e 7.Capítulo 5 – Conversão A/D Figura 5. SETUP_ADC() Esta função configura o conversor A/D interno do microcontrolador.3. 2 e 4 do módulo ADC. 3 e 4. Habilita os canais 0. Utiliza como fonte do clock do ADC o RC interno. Divide o clock externo por 16.3. 1. determina como a tensão na porta A2. Habilita todos os canais do módulo ADC. além de configurar os valores de referência desejados para a conversão A/D. determina como o terra. Habilita os canais 0. 2. A sintaxe para utilização desta função é: 37 | P á g i n a . antes de efetuar a conversão A/D.3.3.4. Divide o clock externo por 8. Em valor. 1.2. e como a tensão na porta AN3 Habilita os canais 0 e 1 do módulo ADC. 0. determina como o terra. A sintaxe para utilização desta função é: setup_ADC_ports(opções) As opções disponíveis para o PIC16F876A são as seguintes: OPÇÃO NO_ANALOGS ALL_ANALOG AN0_AN1_AN3 AN0 AN0_AN1_AN2_AN4_VSS_VREF AN0_AN1_VSS_VREF AN0_AN1_AN4_VREF_VREF FUNÇÃO Desabilita todos os canais ADC. 5. Para o PIC16F876A temos as seguintes opções: OPÇÃO ADC_OFF ADC_CLOCK_DIV_2 ADC_CLOCK_DIV_4 ADC_CLOCK_DIV_8 ADC_CLOCK_DIV_16 ADC_CLOCK_DIV_32 ADC_CLOCK_INTERNAL FUNÇÃO Desabilita o módulo ADC. Divide o clock externo por 32. 1 e 3 do módulo ADC. e como a tensão na porta A3. SET_ADC_CHANNEL() Seleciona um canal do módulo ADC para entrada de um sinal analógico. 5.Capítulo 5 – Conversão A/D As opções variam de acordo com o modelo de PIC utilizado e podem ser encontradas no header file de cada dispositivo. Divide o clock externo por 2. e como a tensão na porta AN3 N0_AN1_AN4_VREF_VREF (Habilita os canais 0. colocamos o número do canal do qual será efetuada a conversão A/D. READ_ADC() Esta função efetua a conversão A/D. 5. A sintaxe para utilização desta função é: set_ADC_channel(valor) Lembremos que após a seleção de um canal do módulo ADC é necessário que se aguarde o tempo de aquisição. Habilita apenas o canal 0 do módulo ADC. SETUP_ADC_PORTS() Esta função configura as entradas analógicas do conversor A/D interno. Divide o clock externo por 4. 1 e 4 do módulo ADC.3. a faixa de valores em que o sensor pode operar é de 2°C até 150°C. o LM35 pode ser alimentado com uma fonte (4V à 20V). Apenas efetua a leitura da conversão A/D. a faixa de valores em que o sensor pode operar é de -55°C até 150°C. LM35 – Sensor de Temperatura Vamos utilizar como transdutor de temperatura.4(b). A resistência é dada por: A tensão de saída. cuja tensão de saída é linearmente proporcional a escala Celsius de temperatura. Inicia a conversão A/D e realiza a leitura. Apenas efetua a conversão A/D.4(a) e 5. No primeiro caso. (a) (b) Figura 5. A Erro! Fonte de referência não encontrada. Fator de linearidade: 10 mV/°C O LM35 pode operar na faixa de temperatura de -55°C até 150°C. No segundo caso. Aplicações típicas do sensor de temperatura LM35 Como vemos nas Figuras 5. O LM35 é um circuito integrado sensor de temperatura. .Capítulo 5 – Conversão A/D valor = read_ADC(opções) As opções disponíveis no PIC16F876A são as seguintes: OPÇÃO ADC_START_AND_READ ADC_START_ONLY ADC_READ_ONLY 5. e como são feitas as conexões. FUNÇÃO Este é o padrão quando nada é especificado. conforme as conexões indicadas na figura acima. mostra duas aplicações típicas deste sensor. ou com fontes simétricas. Uma variação de 1°C é proporcional à 10mV.4.4. o circuito integrado LM35 – Precision Centigrade Temperature Sensor. apresenta os seguintes valores: 38 | P á g i n a . cuja leitura provém do sensor de temperatura LM35. Aplicação Prática Vamos agora criar um termômetro simples. Montar o circuito no Proteus como o mostrado na Figura 5.Capítulo 5 – Conversão A/D 5.5.5. e o valor obtido é colocado em °C em um LCD. Figura 5. Circuito no Proteus para projeto do termômetro digital 39 | P á g i n a .5. e o pino AN0 para fazer a conversão A/D. Utilizar no projeto um clock externo utilizando um cristal de 10MHz. ou seja. Recepção de dados pelo canal serial (RS232). 6. Foi utilizado o preescaler de 2. Escrita completada em memória externa EEPROM. o valor numérico do registrador do tipo timer é incrementado de conta um fator de divisão do clock chamado de preescaler. ou seja. Estamos interessados na interrupção do TIMER0 neste capítulo. O tempo de estouro é. A origem do clock do timer pode ser externa. Alguns dos eventos que podem causar desvio na execução do programa são: Interrupção externa através do pino RB0/INT. Overflow do TIMER0. Timers Timers são registradores que. o registrador do timer tem uma largura de 8 bits e opera com clock de referência igual ao clock da CPU. O período deste clock é de 1us. 40 | P á g i n a . Tempo de estouro O tempo de estouro de um timer pode ser determinado pelos parâmetros de configuração do microcontrolador. com um oscilador independente. por exemplo. cada vez que ocorrer um overflow no RTCC. 2MHz. Final de conversão analógica.Timers 6. Interrupções Uma interrupção é uma função que existe em microcontroladores que permite. definir o que acontecerá em cada interrupção. então armazena de 0 a 255. Nesta função cabe ao programador. ou seja. O registrador timer pode ter um valor inicial qualquer. o prescaler é igual a 2. Podemos determinar o tempo de estouro da seguinte forma: O clock interno do PIC é quatro vezes menor que o externo. em número de bits. Nesse momento. Entretanto. causar um desvio na execução do programa. o clock de referência do timer é de 1MHz. Veremos como utilizar as interrupções nas seções subseqüentes. é a largura do registrador do timer. Quando o timer atinge o seu valor máximo – definido pelo número de bits – afirma-se que o timer estourou (ocorre o overflow). possuem um número definido de bits. uma função é chamada dentro do programa.2.Capítulo 6 . Ou seja. Suponha que o microcontrolador PIC possui um clock externo de 8MHz (cristal oscilador). o valor do registrador se torna zero novamente e a contagem reinicia. através de um evento externo. assim como outros. ou mesmo tomado como referência ao clock do microcontrolador. Esse conceito é extremamente importante no projeto de sistemas embarcados. Como o timer0 é um registrador de 8 bits. 256 us. Final de envio de dados pelo canal serial (RS232).1. 256 valores. desviando-se da função main. portanto. Em que 6. 6. Timers do PIC16F876A O PIC16F876A possui três registradores de Timer diferentes. Ou seja.Timers 6.5. 6. Ele pode ser utilizado como tempo de base para um PWM. Selecione o PIC16F876A e a freqüência do oscilador de 8MHz. TIMER2 O módulo de TIMER2 é um temporizador de 8 bits com um prescaler e um postscaler. O princípio de funcionamento do COP é bastante simples.Capítulo 6 .3. Seleção de clock externo ou interno. é um circuito de vigilância. se o postscaler for 2.3. A principal finalidade deste temporizador é garantir que a CPU está funcionando e executando o programa adequadamente. resetando a CPU e fazendo com que o programa seja executado desde o início. 6. No entanto. 41 | P á g i n a . Eles são nomeados TIMER0. 6. TIMER1 e TIMER2. Já o postscaler divide a saída de overflow do temporizador. tais instruções serão executadas periodicamente e o cão de guarda não terá tempo suficiente para resetar a CPU. Isso significa que ele pode operar nesses dois modos distintos. se o programa estiver operando corretamente. TIMER1 O módulo TIMER1 é um contador/temporizador de 16 bits. Abra o PICWizard e siga os passos já vistos nos capítulos anteriores.1. Configuração dos timers pelo PICWizard É possível configurar os timers do microcontrolador de maneira eficiente e prática pelo PICWizard. Desta forma. provavelmente a execução da função de reset do watchdog será interrompida.4. Escrita/Leitura.3. o programador deve inserir uma função no programa que periodicamente reinicie a contagem deste temporizador. Por exemplo. No TIMER0 o prescaler é dividido com o Watchdog. Watchdog O Watchdog (cão de guarda). possibilitando uma recuperação da atitude falha em que se encontrava. será necessário que o temporizador estoure duas vezes para indicar um overflow. Como existe um tempo para que ocorra o estouro do temporizador de watchdog. Ele consiste basicamente num temporizador que provoca o reset da CPU do microcontrolador após um overflow deste temporizador. 6. Já vimos que o prescaler divide o clock do temporizador. o prescaler só pode ser utilizado para um dos dois. também conhecido como COP (Computer Operating Properly). se o programa vier a falhar por qualquer motivo. TIMER0 O módulo TIMER0 apresenta as seguintes características: Registrador de 8 bits.3.2. permitindo que ele atinja o final de sua contagem.3. Ela está diretamente ligada ao valor do preescaler.Timers 6. temos a opção de configuração do Watchdog Timer. TIMER1 e TIMER2. Uma resolução de significa um prescaler igual a 1. e assim por diante. A seguinte função main será gerada pelo CCS: Vemos que com a configuração do TIMER0.1.1. Configuração do TIMER0 Vamos primeiramente configurar o TIMER0. A resolução do timer representa o menor tempo de overflow que podemos obter com a frequência utilizada. o PICWizard já fornece o período de overflow do TIMER0. 42 | P á g i n a .Capítulo 6 . O PICWizard mostra que a freqüência de operação do TIMER0 será de 2MHz (que são os 8MHz do clock externo divididos por 4). da forma representada na Figura 1. TIMER0. Após configurarmos o TIMER0. o código automaticamente habilitou esse módulo e utilizou a função RTCC_DIV_2 para representar um prescaler igual a 2. Figura 6. uma resolução de representa um prescaler igual a 2. Podemos ver também que ao selecionarmos a resolução desejada. clique em OK. Tela de configuração dos Timers Na tela de configuração dos timers.5. Na mesma tela de configuração dos timers da Figura 1 temos a configuração do WDT (Watchdog Timer). Figura 6. Para habilitar o WDT.Capítulo 6 . A seguinte função main será gerada pelo CCS: 43 | P á g i n a .2.2. Feito isso. clique em OK. desmarque a caixa “Not used”. Configuração do WDT Após configurarmos o Watchdog da forma representada na Figura 2.Timers 6. Configuração do Watchdog A configuração do Watchdog é bastante simples.5. em destaque na Figura 2. basta selecionar o tempo de overflow do temporizador de watchdog. } Vemos que agora. temos a função setup_wdt(WDT_18MS). Veremos as funções referentes ao WDT na seção 1. setup_spi(SPI_SS_DISABLED). setup_comparator(NC_NC_NC_NC).3. que apenas significa que o WDT está habilitado. e configurado para um overflow após . Habilitação da interrupção do RTCC 44 | P á g i n a . setup_timer_1(T1_DISABLED).Timers void main() { setup_adc_ports(NO_ANALOGS). “Timer 0 overflow (using RTCC name)”.Capítulo 6 . A tela mostrada na Figura 3 aparecerá. Habilitação da interrupção do RTCC Vamos agora configurar a interrupção do TIMER0.1). Para isso. setup_vref(FALSE). setup_adc(ADC_OFF). setup_timer_2(T2_DISABLED.3. setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2). abra o PICWizard e na esquerda clique em interrupts.6. Marque a primeira opção disponível. diferentemente do código gerado anteriormente.5. Nela estão contidos todos os eventos de interrupção que podem causar desvios no programa. 6. Figura 6. setup_wdt(WDT_18MS).0. setup_timer_1(T1_DISABLED).1. ou seja. enable_interrupts(INT_RTCC). O código que será gerado terá a seguinte forma: void { RTCC_isr(void) } void main() { setup_adc_ports(NO_ANALOGS). SETUP_RTCC() Os nomes TIMER0 ou RTCC podem ser utilizados indiscriminadamente. Habilitando-se um daqueles eventos. 6. cabe ao programador definir o que irá haver dentro dessa função. SETUP_TIMER_0(). O WDT não precisa estar habilitado.1). o PICWizard criará uma função para o tratamento dessa interrupção.Capítulo 6 . setup_timer_2(T2_DISABLED.0. setup_adc(ADC_OFF). Qualquer um evento da lista da Figura 3 funciona da mesma forma. Para outros modelos de microcontroladores. Lembramos que as interrupções não estão restritas ao RTCC. cada vez que houver overflow do Timer 0. Como foi dito anteriormente. Essas funções são usadas para configurar o TIMER0. 6. } Vemos que o programa gerou um código com uma função anterior à função main. setup_comparator(NC_NC_NC_NC). setup_spi(SPI_SS_DISABLED). essa função será chamada. enable_interrupts(GLOBAL). setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2).Timers Após configurar-se o Timer 0 (RTCC) da mesma forma que fizemos anteriormente. Funções do compilador CCS Vamos ver agora em detalhe as funções disponíveis no compilador para a manipulação dos timers no PIC16F876A.6. Sintaxe: setup_timer_0(modo) setup_rtcc(modo) Os modos podem ser uma das seguintes constantes: 45 | P á g i n a .6. clique em OK. a função RTCC_isr(void). consulte o manual do compilador. ou mais de um. setup_vref(FALSE). Essa é a função de interrupção do RTCC. 2.6. 6. Sintaxe: setup_timer_2(modo. 6.Timers MODO RTCC_INTERNAL RTCC_EXT_L_TO_H RTCC_EXT_H_TO_L RTCC_DIV_2 RTCC_DIV_4 RTCC_DIV_8 RTCC_DIV_16 RTCC_DIV_32 RTCC_DIV_64 RTCC_DIV_128 RTCC_DIV_256 FUNÇÃO Timer 0 com clock interno Timer 0 com clock externo sensível à borda de subida Timer 0 com clock externo sensível à borda de descida Preescaler igual a 2 Preescaler igual a 4 Preescaler igual a 8 Preescaler igual a 16 Preescaler igual a 32 Preescaler igual a 64 Preescaler igual a 128 Preescaler igual a 256 As constantes que configuram o preescaler podem ser unidas a constantes de configuração do timer 0 por um operador OR (|).per. O modo pode ser uma das opções abaixo: 46 | P á g i n a .6. SETUP_TIMER_1() Configura o TIMER1.Capítulo 6 . per é uma variável inteira de 8 bits.ps) Em que modo é uma variável ou constante inteira de 8 bits. Sintaxe: setup_timer_1(modo) Os modos podem ser uma das seguintes constantes: MODO T1_DISABLED T1_INTERNAL T1_EXTERNAL T1_EXTERNAL_SYNC T1_CLOCK_OUT T1_DIV_BY_1 T1_DIV_BY_2 T1_DIV_BY_4 T1_DIV_BY_8 FUNÇÃO Desliga o Timer 1 Timer 1 com clock interno Timer 1 com clock externo assíncrono Timer 1 com clock externo síncrono Ativa a saída externa de clock Preescaler do Timer 1 igual a 1 Preescaler do Timer 1 igual a 2 Preescaler do Timer 1 igual a 4 Preescaler do Timer 1 igual a 8 As constantes que configuram o preescaler podem ser unidas a constantes de configuração do timer 0 por um operador OR (|). SETUP_TIMER_2() Configura o TIMER2. e os é um número entre 1 e 16.3. a cada dois overflows. necessários para gerar uma interrupção. será gerada uma interrupção. SETUP_WDT() Essa função configura o funcionamento do WDT.6.Timers MODO T2_DISABLED T2_DIV_BY_1 T1_DIV_BY_2 T1_DIV_BY_4 FUNÇÃO Desliga o Timer 1 Timer 1 com clock interno Timer 1 com clock externo assíncrono Timer 1 com clock externo síncrono O parâmetro per é utilizado para especificar um período de contagem para o TIMER2. 6. Isto significa que ser programado . no timer 0 do PIC16F876A de 8 bits. O parâmetro ps é utilizado para especificar um valor para o pós-divisor do timer 2. Por exemplo. A contagem do temporizador inicia em 0 e cada vez que ele chegar a uma contagem igual ao valor per. Sintaxe: setup_wdt(modo) Em que modo é uma variável ou constante inteira de 8 bits.6.5. Sintaxe: set_rtcc(valor) set_timer_0(valor) set_timer_1(valor) set_timer_2(valor) O valor a ser escrito depende do tipo de temporizador e do modelo de PIC utilizado.6.Capítulo 6 . Sintaxe: Valor Valor Valor Valor = = = = get_rtcc() get_timer_0() get_timer_1() get_timer_2() O valor retornado pela função depende do tipo de temporizador e do modelo do PIC em questão. Os modos disponíveis são: 47 | P á g i n a .6. 6. o valor máximo que pode ser utilizado é 256. 6.4. SET_TIMERX() Modifica o conteúdo de um timer interno. o temporizador será reiniciado. GET_TIMERX() Lê o conteúdo de um timer interno. O número programado em ps será igual ao número de reinícios do TIMER2. O programa deve ser compilado e simulado no Proteus. Sintaxe: restart_wdt() Essa função deve ser utilizada periodicamente para resetar ou reiniciar a contagem do watchdog.6. 6. overflow em 36ms Prescaler ligado ao watchdog. overflow em 576ms Prescaler ligado ao watchdog.7.Capítulo 6 . overflow em 18ms Prescaler ligado ao watchdog. overflow em 288ms Prescaler ligado ao watchdog. utilizando o timer 0 do microcontrolador.Timers MODO WDT_18MS WDT_36MS WDT_72MS WDT_144MS WDT_288MS WDT_576MS WDT_1152MS WDT_2304MS FUNÇÃO Prescaler ligado ao watchdog. O cronômetro deve apresentar um botão de disparo e deve estar no formato . overflow em 2304ms 6. RESTART_WDT() Reinicia a contagem do watchdog. overflow em 1152ms Prescaler ligado ao watchdog. overflow em 144ms Prescaler ligado ao watchdog. 48 | P á g i n a . overflow em 72ms Prescaler ligado ao watchdog.7. impedindo que ele provoque um reset da CPU. Atividade prática Crie um programa que funcione como um cronômetro. é um sinal digital. muitos microcontroladores hoje em dia incluem PWM on-chip.Pulse Width Modulation) é uma técnica utilizada no controle de circuitos analógicos com um processador de saídas digitais. como ilustrado na Figura 7. FONTE PWM CARGA Figura 7.1. o duty cycle de uma onda quadrada é modulada para codificar o nível de um sinal analógico específico. PWM Vemos ainda. desde medições e comunicações até controle de potência e conversão. PWM A modulação por largura de pulso (PWM . O PWM. Fazendo o controle digital de circuitos analógicos. pela Figura 7. Além disso. O transistor TBJ poderia ser ainda qualquer tipo de chave que possa ser controlada por tensão. ou a fonte DC está totalmente aplicada. um PWM é um modo de codificar digitalmente sinais analógicos. ou desligada.1. tornando sua utilização muito simples. ainda assim. Matematicamente: 49 | P á g i n a .1. pois em um dado instante de tempo.Capítulo 7 .PWM 7. Através da utilização de contadores de alta-resolução. que o PWM apenas controla o chaveamento. PWM é empregada em uma enorme variedade de aplicações. Superficialmente. os custos do sistema e o consumo de energia podem ser drasticamente reduzidos. O duty cycle do PWM determina a relação entre o período de tempo que a chave fica ligada e o período total da comutação. 2. dependendo da configuração adotada essa resolução não será atingida. Esses canais podem também ser utilizados no modo comparação e captura. respectivamente. O período ( ) do PWM no PIC16F876A é controlado diretamente pelo TIMER2. a resolução para ajuste do período depende do prescaler do TIMER2.3. clique em Others. na janela à esquerda. 7. conforme mostrado na Figura 7. As outras duas formas de onda representam sinais PWM com duty cycles de 10% e 90%.2 mostra três sinais PWM distintos. CCP1 e CCP2. Vamos agora configurar o PWM utilizando-se o PICWizard.PWM On = Nível Alto Off = Nível Baixo DT DT DT T Figura 7. Note-se ainda que o postscale não possui influência nos períodos do PWM.Capítulo 7 . porém o valor médio da tensão da forma de onda varia em função do duty cycle. No entanto. cada uma deles com resolução máxima de 10 bits. e. Abra o PICWizard. O duty cycle poderá ser regulado de 0% a 100% com uma resolução máxima de 1024 pontos. em 50% do período T ele está em nível lógico alto e 50% do período ele está em nível lógico baixo. isto é. e como este varia entre 0 (quando ) e 1 (quando ) temos que a tensão média pode variar entre 0 e . 50 | P á g i n a . PWM no PIC16F876A Esse modelo de PIC possui dois canais de PWM. O pulso da onda PWM apresenta tensão fixa. Na janela Others é possível configurar o PWM. PWM para diferentes duty cycles A Figura 7. Dessa forma.1. após realizar as configurações usuais. A primeira delas mostra um PWM com um duty cycle de 50%. estudaremos apenas o caso do PWM. A tensão média aplicada à uma carga é diretamente proporcional ao duty cycle. Entretanto. com freqüência de chaveamento de 1KHz. Esse circuito está ilustrado na Figura 7. 51 | P á g i n a . Se aplicarmos o sinal PWM na base de um transistor TBJ. ele funcionará como uma chave.PWM Figura 7.3 que configuramos o PWM no canal CCP1. Podemos utilizar o PWM para realizar o chaveamento de semicondutor.3.4. e a freqüência do PWM é de 1KHz. por exemplo. Quando o sinal PWM estiver em nível lógico baixo. uma corrente circulará no sentido coletoremissor. No ciclo ativo. cortando a alimentação da chave. o transistor funciona como uma chave aberta. alimentando a carga. Configuramos também o ciclo de trabalho para 50%. Isso é o mesmo que dizer que o período do PWM é de 1us. Configuração do PWM no PICWizard Podemos ver na Figura 7.Capítulo 7 . Chaveamento de um semicondutor utilizando-se PWM Nesse exemplo.Capítulo 7 . SETUP_CCPX() Configura o funcionamento do módulo CCPX. 7.PWM Figura 7.1.2. SET_PWMX_DUTY() Configura o ciclo ativo do módulo CCP no modo PWM. poderíamos utilizar o sinal PWM em uma chave que faz o controle de velocidade de um motor. 7.4. Para um exemplo mais prático. 7. Sintaxe: setup_ccp1(modo) setup_ccp2(modo) Em que modo é uma variável ou constante inteira de 8 bits. Para configurar o PWM só existe um modo: MODO CCP_PWM FUNÇÃO Configura o modo de geração de sinal PWM. pois o duty cycle escolhido foi de 50%.2. Funções do compilador CCS Existem apenas duas funções de configuração do PWM disponíveis no compilador CCS. Sintaxe: 52 | P á g i n a .2. o LED está sendo alimentado com metade da potência da fonte.2. Atividade prática Crie um programa capaz de gerar um PWM com duty cycle de 0%. O PWM deve ser usado para controlar uma chave. 7.3. 75% e 100%. 25%.Capítulo 7 . que alimenta uma carga puramente resistiva. 50%.PWM set_pwm1_duty(valor) set_pwm2_duty(valor) Em que valor é uma variável ou constante inteira de 8 ou 16 bits. 53 | P á g i n a . que dependa do nível lógico nos pinos da porta A. 2.Comunicação I2C 8. 8. Esses são bidirecionais: SDL (Serial Data Line) e SCL (Serial Clock Line). As principais são: Transmissor: É o dispositivo que envia dados para o barramento. gera o sinal de clock e encerra a transmissão.7 kΩ. Figura 1 .3.1. Receptor: É o dispositivo que recebe dados do barramento. Validação de dados Os dados na via SDA devem ser estáveis durante um nível lógico alto do clock. O estado alto e baixo da linha de dados só pode ser mudado quando o sinal do clock na via SCL está em nível lógico baixo. ficam em nível lógico alto. Condições de START e STOP 54 | P á g i n a . Protocolo I2C Vamos ver agora.2. de uma forma geral. Slave: É o dispositivo endereçado pelo master. SCL e SDA. Master: É o dispositivo que inicia a transferência de dados.Arquitetura da comunicação I2C Figura 8. bem como seu protocolo de funcionamento e um exemplo prático de comunicação do PIC16F876A com uma memória EEPROM.2.2.1. 8. Definições Existem algumas terminologias importantes para o estudo do protocolo I2C. Barramento de comunicação I2C Ambas as vias de comunicação são conectadas ao positivo da fonte de alimentação através de resistores de pull-up. Isso significa que enquanto o barramento está livre. 8. ambas as vias. o fluxo do protocolo de comunicação I2C.2.1. com valores típicos de 4. 8.Capítulo 8 . 8. Comunicação I2C Vamos analisar nesta seção a arquitetura de uma comunicação I2C. Arquitetura Um barramento de comunicação I2C consiste fisicamente de 2 fios. 3. indicam uma condição de STOP (P). seguidos de sinais de ACK do dispositivo slave. enquanto SCL está em nível lógico ALTO. O dispositivo master inicia então a transferência de dados. confirmando o recebimento do byte. O barramento é considerado ocupado (BUSY) depois de uma condição START. 7 bits para endereçamento do dispositivo slave. Após receber esse primeiro byte.Comunicação I2C Durante uma comunicação I2C. seguido de um bit read/write. definidas como START (S) e STOP (P).Capítulo 8 . Comunicação O dispositivo master ajusta as condições iniciais.2. e um “1” indica uma requisição de dados (READ). Figura 8. Uma transição de nível lógico ALTO para BAIXO na via SDA. O dispositivo master envia então. indicam uma condição de START (S). Condições de START e STOP Essas condições de START e STOP são sempre geradas pelo master. 55 | P á g i n a . existem duas situações únicas. Figura 8. enquanto SCL está em nível lógico ALTO. Uma transferência de dados sempre se encerra com um sinal de STOP do dispositivo master.2. O barramento é considerado livre (FREE) novamente algum tempo após a condição de STOP.4.Um “0” indica uma transmissão (WRITE). Uma transição de nível lógico BAIXO para ALTO na via SDA. Primeiro byte após o sinal de START Esse último bit determina se o dispositivo irá escrever ou ler o endereço no dispositivo slave. Ele envia para o barramento a condição de START. o dispositivo slave envia um sinal de ACKNOWLEDGE (ACK). sempre em pacotes de 8 bits. 8. 3. A sintaxe para utilização desta função é: i2c_start() 8. A tabela 1 mostra as principais opções temos para a diretiva.1. Tabela 1 . A sintaxe para utilização desta função é: 56 | P á g i n a .Capítulo 8 . O pino do SCL será o C3. Seta o pino XX como SDA. e o pino SDA será o C4. #USE I2C (Master.4. Seta o dispositivo como slave da comunicação. Seta o pino XX como SCL. I2C_STOP() Essa função determina o fim de uma comunicação I2C.Fast. Vamos ver agora as principais funções utilizadas no compilador CCS para a comunicação I2C. Comunicação I2C 8. um sinal de STOP é enviado para o barramento. Um exemplo de sintaxe para a diretiva #USE I2C é mostrado abaixo. Com essa função.Comunicação I2C Figura 8.2. Funções do Compilador CCS Para habilitarmos o módulo de comunicação I2C.3.sda=PIN_C4. Usa a comunicação I2C no modo rápido.Opções para a diretiva #USE I2C OPÇÃO MASTER SLAVE SCL=PIN_XX SDA=PIN_XX FAST SLOW FUNÇÃO Seta o dispositivo como master da comunicação. Com essa função o sinal START é enviado para o barramento. Usa a comunicação I2C no modo lento.3. 8. precisamos utilizar uma diretiva do compilador CCS: #USE I2C(opções) Existem diversas opções que podem ser adicionadas à diretiva. I2C_START() Essa função determina o início da comunicação I2C. a comunicação funcionará no modo rápido e o dispositivo será o master da comunicação.scl=PIN_C3) Neste exemplo. e o que cada uma realiza. Essas opções são separadas por vírgulas. encerrando uma transmissão/leitura de dados. Opera em uma faixa de tensão de 4.4. Pinagem EEPROM 24C02 As linhas funcionais de endereço permitem uma conexão de oito memórias 24C02 no mesmo barramento.3.5. respectivamente. essa função retorna o bit de ACKNOWLEDGE.5V – 5.4. Figura 8. Descrição dos pinos 8.Comunicação I2C i2c_stop() 8.3. Memória EEPROM 24C02 Vamos utilizar o protocolo I2C para realizarmos a comunicação entre o PIC16F876A e uma memória EEPROM 24C02. Apresenta baixo consumo.4.4.1. A sintaxe para utilização desta função é: dados = i2c_read() Essa função retorna um valor inteiro de 8 bits. 10μA e 1mA.1. DAS 57 | P á g i n a .Capítulo 8 .5V. 8. 8. I2C_READ() Essa função lê um byte do barramento I2C.5. com valores típicos em standby e com corrente ativa de. BIT ACK 0 1 2 SIGNIFICADO ACK NO ACK Colisão no modo multi-master 8.3. A pinagem desta EEPROM está ilustrada na Figura 8. A sintaxe para utilização desta função é: i2c_write(dados) Após utilizada. A EEPROM 24C02 é uma memória organizada como um bloco único de 256 bytes. I2C_WRITE() Essa função envia para o barramento um dado de 8 bits.1. SCL Esta entrada é usada para sincronizar a transferência de dados de e para o dispositivo.Comunicação I2C Este é um pino bi-direcional usado para transferir endereços e dados para o dispositivo. A1. A0.4.3. A2 Os níveis lógicos nestas entradas são comparados com os bits correspondentes no endereço do dispositivo slave. Quando este bit é “1”.1.4.4. Para transferência normal de dados. A2). 8. após a condição de START do dispositivo master. a proteção de hardware à escrita é desativada. A1. Figura 8. Oito dispositivos 24C02 podem ser conectadas ao mesmo barramento utilizando diferentes combinações de bits de seleção de chips. para ler e escrever na memória. Deve ser conectado ao Vcc ou ao Vss. Se conectado ao Vcc. SDA pode mudar somente quando SCL está em nível lógico baixo.1. Após o recebimento da word do endereço. 8.4.2. a proteção de hardware à escrita é ativada.1. e dá-se inicio a transmissão de dados. Os próximos 3 bits do byte de controle são os bits de seleção de chip (A0. o código de controle (Control Code).2. e será escrito no ponteiro de endereço da memória 24C02. o dispositivo slave responde com outro sinal ACK. Para a memória 24C02 este é o conjunto 1010.4. O dispositivo enviará um ACK logo após o envio do byte de controle. Lembramos que 1 word = 4 bytes. a operação de escrita é selecionada. a operação de leitura é selecionada. Se o pino WP é conectado ao Vss. Byte de controle O byte de controle consiste de 4 bits.6. O próximo byte a ser transmitido pelo master é a word do endereço. A linha SDA requer um resistor de pull-up conectado ao Vcc. 8. e quando o bit é “0”. O chip é selecionado se a comparação é verdadeira. 8.Capítulo 8 . Endereçamento de dispositivos Um byte de controle é o primeiro byte recebido. Essas entradas podem ser conectadas tanto ao Vcc quanto ao Vss. 58 | P á g i n a . WP Este é pino de proteção à escrita. O último bit do byte de controle define qual operação será executada. i2c_write(2). result=i2c_read(). Aplicação Uma memória é utilizada para armazenarmos dados e não sobrecarregarmos as memórias internas do microcontrolador. i2c_write(0xa0). i2c_write(80).result). Por exemplo. B3(PIC16) or B5(PIC18) used for I/O //No EE protection //Lower half of Program Memory is Write Protected #use delay(clock=10000000) #define EEPROM_SCL PIN_C3 #define EEPROM_SDA PIN_C4 #use i2c(Master. i2c_write(2). delay_ms(3). Depois.Fast.Comunicação I2C Figura 2.5. /* Mostra no display LCD o dado armazenado na memó- 59 | P á g i n a . i2c_stop(). lcd_init(). delay_ms(3). veremos que o CCS disponibiliza funções específicas para a utilização com memórias EEPROM externas.sda=PIN_C4. os dados resultantes de uma conversão A/D podem ser armazenados nesta EEPROM que estamos utilizando.Capítulo 8 . printf(lcd_putc. /* /* /* /* /* Envia o sinal de START para o barramento I2C */ Envia para o barramento o byte de controle (1010 000 0) */ Define em qual endereço da memória o dado será alocado */ Escreve o dado (80) no endereço de memória selecionado */ Envia o sinal de STOP para o barramento I2C */ /* /* /* /* /* /* /* Envia o sinal de START para o barramento I2C */ Envia para o barramento o byte de controle (1010 000 0) */ Define de qual endereço da memória o dado será lido */ Envia outro sinal de START para o barramento I2C */ Envia para o barramento o byte de controle (1010 000 1) */ Lê o endereço de memória e armazena na variável "result" */ Envia o sinal de STOP para o barramento I2C */ delay_ms(10). Transmissão de dados para uma EEPROM 24C02 8. Programa em C #include <LCD. i2c_start(). i2c_start().C> #include <16F876A. Vamos ver agora como utilizamos as funções I2C do compilador CCS para armazenarmos dados na 24C02. i2c_stop(). "Data: %u ria */ while (1). } ". i2c_start(). i2c_write(0xa0).h> #FUSES #FUSES #FUSES #FUSES #FUSES #FUSES #FUSES #FUSES #FUSES NOWDT XT NOPUT NOPROTECT NODEBUG NOBROWNOUT NOLVP NOCPD WRT_50% //No Watch Dog Timer //Crystal osc <= 4mhz //No Power Up Timer //Code not protected from reading //No Debug mode for ICD //No brownout reset //No low voltage prgming.7. i2c_write(0xa1).scl=PIN_C3) void main() { byte result. 5. d) 60 | P á g i n a .2. INIT_EXT_EEPROM() Essa função inicializa a comunicação com a memória EEPROM. A utilização dessas funções diretamente no programa é mais vantajosa.8.Capítulo 8 .5. a seqüência para escrevermos ou lermos algo da memória será sempre essa. Design no PROTEUS 8. 8. Depois.Comunicação I2C Esse simples programa escreve o valor “80” no endereço de memória “2” da EEPROM 24C02.5.1. Figura 8.1.1. Entretanto. por aumentar a velocidade de compilação. economizar espaço na memória RAM do microcontrolador e são menos suscetíveis a bugs. WRITE_EXT_EEPROM() Essa função escreve na memória EEPROM um valor desejado. reduzindo o tamanho do código e facilitando o trabalho do programador. A sua sintaxe é: write_ext_eeprom(a. e o mostramos no display LCD.1. Na figura 8 temos o projeto no PROTEUS para simularmos o código criado no CCS. o driver da EEPROM 24C02 possui funções próprias para serem utilizadas. Sua sintaxe é: init_ext_eeprom() 8. Ela deve ser chamada antes das outras funções referentes à memória. Funções do CCS para memória externa Utilizando as funções I2C. Apresentamos essas funções nas seções subseqüentes. lemos este valor do endereço de memória. EXT_EEPROM_READY() Esse comando retorna true se a memória estiver pronta para receber opcodes. e o valor 0x12 será atribuído à variável value.4. o dado d. Sua sintaxe é: d = read_ext_eeprom(a) Esse comando lerá o endereço a da memória. Por exemplo. podemos ter: value=read_eeprom(0x0) Nesse exemplo.0x12).Comunicação I2C Esse comando escreverá no endereço a da memória. e procure pela pasta drivers.1.Capítulo 8 . READ_EXT_EEPROM() Esse comando lê um valor da memória EEPROM. Utilizando essas funções poderíamos utilizar o programa anterior da seguinte forma: 61 | P á g i n a . 8. Sua sintaxe é: b = ext_eeprom_ready() Lembramos que esses comandos só funcionam para os drivers que estão disponíveis na biblioteca do compilador CCS.5. podemos ter: write_ext_eeprom(0x0. Esse dado deverá ser um byte. Por exemplo.1. o byte lido será atribuído à variável d. o endereço 0 da memória será lido.3. o valor 0x12 será escrito no endereço 0 de memória. entre na pasta onde foi instalado o CCS.5. 8. Nesse exemplo. Para verificar os drivers disponíveis. delay_ms(20). B3(PIC16) or B5(PIC18) used for I/O //No EE protection //Lower half of Program Memory is Write Protected #use delay(clock=10000000) #use i2c(Master.result). result = read_ext_eeprom(2).Capítulo 8 . 62 | P á g i n a .h> #include <2402.sda=PIN_C4.scl=PIN_C3) void main() { BYTE result=0.Fast. printf(lcd_putc. lcd_init().Comunicação I2C #include <LCD. delay_ms(3). init_ext_eeprom(). /* Mostra no display LCD o dado armazenado Aplicação 2 Utilizando a comunicação I2C. write_ext_eeprom(2. "data: %u na memória */ while (1). } 8. armazene os dados medidos pelo termômetro projetado no capítulo de conversão A/D em uma memória EEPROM.6.C> #include <16F876A.C> #FUSES #FUSES #FUSES #FUSES #FUSES #FUSES #FUSES #FUSES #FUSES NOWDT HS NOPUT NOPROTECT NODEBUG NOBROWNOUT NOLVP NOCPD WRT_50% //No Watch Dog Timer //High speed Osc (> 4mhz) //No Power Up Timer //Code not protected from reading //No Debug mode for ICD //No brownout reset //No low voltage prgming. ". 50). delay_ms(10). Anexo Anexo – Funções internas do compilador CCS 63 | P á g i n a . Anexo 64 | P á g i n a . Anexo 65 | P á g i n a . Anexo 66 | P á g i n a .
Copyright © 2024 DOKUMEN.SITE Inc.