A situao que nos encontramos hoje no campo de microcontroladores teve seu incio a partir do desenvolvimento da tecnologia de circuitos integrados. Esse desenvolvimento permitiu que pudssemos instalar centenas de milhares de transistores em um nico chip, que foi a precondio para a possibilidade de fabricao de microprocessadores. Os primeiros computadores foram ento desenvolvidos a partir dos microprocessadores, adicionando perifricos externos, tais como memrias, linhas de entrada e sada, temporizadores e outros circuitos. Aumentando ainda mais a densidade de elementos dentro dos chips resultou no desenvolvimento de circuitos que continham ambos, processador e perifricos. Isto mostra como o primeiro chip contendo um microcomputador chamado mais tarde de microcontrolador foi desenvolvido.
1.1 Introduo
Novatos em eletrnica geralmente pensam que o microcontrolador o mesmo que microprocessador. Isso no verdade. Eles diferem entre si em muitos aspectos. A diferena primeira e mais importante em favor do microcontrolador a sua funcionalidade. Para que o microprocessador possa ser usado, outros componentes, como a memria por exemplo, devem ser adicionados a ele. Mesmo sendo considerada uma poderosa mquina de computao, no capaz, por si s, de se comunicar com o ambiente externo. A fim de permitir que o microprocessador se comunique com o ambiente externo, circuitos especiais devem ser usados. Isto como era no princpio e continua sendo at hoje. Por outro lado, o microcontrolador foi projetado para ser tudo isso em um nico chip. No so necessrios outros componente externos para a sua aplicao, pois todos os circuitos necessrios j esto includos no mesmo, dentro de um nico chip. Isso economiza tempo e espao necessrios para projetar um dispositivo. Na figura 1.1 podem ser vistos os componentes perifricos inclusos no chip de um microcontrolador de uso geral. Observe que o microcontrolador formado basicamente pelo microprocessador, responsvel pelo controle de todo o funcionamento do chip, e dos circuitos perifricos como memrias, conversores A/D, circuito oscilador, etc.
Captulo 1 Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 2
Figura 1.1 Elementos construtivos de um microcontrolador de uso geral.
Dispositivos eletrnicos capazes de controlar um pequeno submarino, um guindaste ou um elevador j so construdos em um nico chip. Os microcontroladores oferecem uma ampla gama de aplicaes e, normalmente, apenas algumas delas so usadas. critrio do projetista decidir o que ele quer que o microcontrolador faa no seu produto. Para isso, o projetista descarrega um programa contendo instrues adequadas para que o microcontrolador execute a ao desejada. Antes de conceber o seu produto final, seu funcionamento deve ser testado por um simulador. Se tudo funcionar bem, o microcontrolador inserido no dispositivo. Se h necessidade de alteraes no comportamento do produto, melhorias ou atualizaes, basta faz-lo. At quando? At que sinta-se satisfeito. Na figura 1.2 pode ser observado, de uma forma cmica, o fluxo de desenvolvimento de um projeto que utiliza microcontroladores como principal elemento. A rigor, um projeto baseado em microcontroladores consiste no estudo do dispositivo a ser controlado pelo microcontrolador. Baseado nas caractersticas desse dispositivo, o projetista deve identificar as necessidades de hardware tais como nmero de entradas/sadas, temporizadores, conversores A/D, etc, para o seu controle. Com as necessidades de hardware identificadas, o projetista deve escolher um microcontrolador que possua aqueles requisitos e que satisfaa s suas necessidades. Usando um computador pessoal e uma linguagem de programao de alto nvel, deve-se escrever um programa para rodar no microcontrolador. Enquanto programa, usa-se o computador para fazer simulaes e testar o seu funcionamento. O programa escrito deve ser convertido em cdigo que pode ser interpretado pelo microcontrolador. Com o auxlio de um programador, esse cdigo deve ser descarregado dentro da memria do microcontrolador. Uma vez que o microcontrolador possua em sua memria as instrues a serem executadas, basta instal-lo no dispositivo a ser controlado. Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 3
Figura 1.2 Fluxo de desenvolvimento de um projeto utilizando microcontroladores.
Diga tchau para a sua famlia por alguns dias Alimente seus animais de estimao Estude a mquina a ser controlada pelo microcontrolador Procure pelas caractersticas disponveis em cada microcontrolador Escolha as que atendem suas necessidades Projete e construa um hardware para conectar o microcontrolador ao mundo externo Use um computador para escrever o programa a ser executado Converta o programa em cdigo de mquina e descarregue esse cdigo na memria do microcontrolador Insira o microcontrolador j programado no dispositivo a ser controlado Aproveite o sucesso e comece a pensar em novos projetos
Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 4 1.2 Sistemas numricos
Sistema de Numerao Decimal
O sistema decimal um sistema de numerao posicional que utiliza a base dez. Baseia-se em uma numerao de posio, onde os dez algarismos indo-arbicos: 0 1 2 3 4 5 6 7 8 9 servem para contar unidades, dezenas, centenas, etc. da direita para a esquerda. Contrariamente numerao romana, o algarismo rabe tem um valor diferente segundo sua posio no nmero: assim, em 111, o primeiro algarismo significa 100, o segundo algarismo 10 e o terceiro 1, enquanto que em VIII (oito em numerao romana) os trs I significam todos 1. Assim:
Da direita para esquerda, o primeiro dgito representa as unidades, o segundo as dezenas, o terceiro as centenas e assim sucessivamente. No sistema decimal o smbolo 0 (zero) posicionado esquerda do nmero escrito no altera seu valor representativo. Assim: 1; 01; 001 ou 0001 representam a mesma grandeza, neste caso a unidade. O smbolo zero posto direita implica multiplicar a grandeza pela base, ou seja, por 10 (dez).
Sistema de Numerao Binrio
O que aconteceria se apenas dois dgitos fossem usados - 0 e 1? Ou se no soubssemos como determinar se algo 3 ou 5 vezes maior do que qualquer outra coisa? Ou se estivssemos restritos a comparar dois tamanhos, ou seja, se s podemos afirmar que algo existe (1) ou no existe (0)? A resposta "nada de especial". Gostaramos de continuar a usar os nmeros da mesma forma como o fazemos agora, mas seria um pouco diferente. Por exemplo: 11011010. Quantas pginas de um livro so representadas pelo nmero 11011010? A fim de aprender isso, voc apenas tem que seguir a mesma lgica que no exemplo anterior, mas em ordem inversa. Tenha em mente que tudo isso sobre matemtica apenas com dois dgitos, 0 e 1, ou seja, a base do sistema de nmero 2 (sistema de nmeros binrios). O sistema binrio ou base 2, um sistema de numerao posicional em que todas as quantidades se representam com base em dois nmeros, com o que se dispe das cifras: zero e um (0 e 1). Os computadores digitais, e tambm os microcontroladores trabalham internamente com dois nveis de tenso, visto que o seu sistema de numerao natural o sistema binrio (ligado, desligado). O sistema binrio a base para a lgebra booleana (de George Boole - matemtico ingls), que permite fazer operaes lgicas e aritmticas usando-se apenas dois dgitos ou dois estados (sim e no, falso e verdadeiro, tudo ou nada, 1 e 0, ligado e desligado). Toda a eletrnica digital e computao esto baseadas nesse sistema binrio e na lgica de Boole, que permite representar por circuitos eletrnicos digitais (portas lgicas) os nmeros, caracteres, realizar operaes lgicas e aritmticas.
Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 5 Sistema de Numerao Hexadecimal
No incio do desenvolvimento dos computadores foi percebido que as pessoas tinham muitas dificuldades em lidar com nmeros binrios. Por esta razo, um novo sistema, com 16 smbolos diferentes foi criado. chamado sistema de numerao hexadecimal, consistindo de dez dgitos que estamos acostumados a usar(0, 1, 2, 3, ... 9) e mais seis letras do alfabeto A, B, C, D, E e F. O maior nmero que pode ser representado por 4 dgitos binrios o nmero 1111. Ele corresponde ao nmero 15 no sistema decimal, enquanto que no sistema hexadecimal representado por um nico dgito, F. o maior nmero de 1 dgito no sistema hexadecimal. O maior nmero escrito com oito dgitos binrios , ao mesmo tempo o maior nmero de 2 dgitos hexadecimais. Na figura 1.3 pode ser observado um exemplo da correlao existente entre nmeros no sistema binrio e no sistema hexadecimal.
Figura 1.3 Mesmo nmero sendo representado por 8 dgitos binrios e 2 dois dgitos hexadecimais.
Converso entre Sistemas de Numerao
O sistema numrico binrio mais comumente usado, o sistema decimal mais compreensvel, enquanto o sistema hexadecimal algo entre eles. Portanto, muito importante aprender como converter nmeros de um sistema numrico para outro, ou seja, como transformar uma sequncia de zeros e uns em valores compreensveis.
Converso binrio-decimal
Dgitos em um nmero binrio tm valores diferentes dependendo da posio que eles ocupam no nmero. Alm disso, cada posio pode conter 1 ou 0 e seu valor pode ser facilmente determinado atravs da contagem de sua posio da direita para esquerda. Para fazer a converso de um nmero binrio para decimal necessrio multiplicar os valores dos dgitos correspondentes (0 ou 1) pelo seu respectivo peso na base binria e adicionar todos os resultados. Veja o exemplo abaixo:
Note-se que, para representar nmeros decimais de 0 a 3, voc precisar usar apenas dois dgitos binrios. Para nmeros maiores, dgitos binrios extras devem ser usados. Assim, a fim de representar nmeros decimais 0-7 voc precisa de trs dgitos Binrio de 8 dgitos Mesmo nmero no sistema hexadecimal Nmero binrio Mesmo nmero no sistema decimal Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 6 binrios, conforme o exemplo acima. Para os nmeros 0-15 voc precisa de quatro dgitos, etc. Com n dgitos binrios possvel representar 2 n valores decimais. Para saber qual o maior nmero decimal que pode ser representado com n dgitos binrios, simplesmente calcule o valor de 2 n -1. Assim, por exemplo, se n= 4:
2 4 -1 = 16-1 = 15
Assim, usando 4 dgitos binrios, possvel representar nmeros decimais de 0 a 15, o que equivale a 16 diferentes valores no total.
Converso hexadecimal-decimal
A fim de fazer a converso de um nmero hexadecimal em decimal, cada dgito hexadecimal deve ser multiplicado pelo nmero 16 elevado pelo seu valor de posio, semelhante ao que foi feito na base binria. Aps isto, somam-se os valores obtidos individualmente. Por exemplo:
Converso hexadecimal-binrio
No necessrio realizar nenhum clculo a fim de converter nmeros de hexadecimal para binrio. Os dgitos hexadecimais so simplesmente substitudos por dgitos binrios adequados. Desde que o mximo valor representado por um dgito hexadecimal equivalente ao nmero decimal 15, ns precisamos usar quatro dgitos binrios para representar um dgito hexadecimal. Por exemplo:
Um quadro comparativo a seguir contm os valores dos nmeros de 0-255 em trs diferentes sistemas numricos. Esta provavelmente a maneira mais fcil de entender a lgica comum aplicado a todos os sistemas. Observe que para representar os valores 0-255 nesses sistemas so necessrios:
* 3 dgitos decimais no sistema decimal; * 8 dgitos binrios no sistema binrio; * 2 dgitos hexadecimais no sistema hexadecimal.
Nmero hexadecimal Mesmo nmero no sistema decimal Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 7 O sistema numrico decimal, juntamente com os sistemas binrio e hexadecimal, so considerados os sistemas numricos mais importantes para ns. fcil fazer a converso de um nmero hexadecimal em binrio e tambm fcil de lembrar. No entanto, essas converses podem causar confuso. Por exemplo, o que significa a frase preciso contar at 110 produtos na linha de montagem. Dependendo se tratar de um valor binrio, decimal ou hexadecimal, o resultado poderia ser 6, 110 ou 272 produtos, respectivamente! Assim, a fim de evitar mal-entendidos, diferentes prefixos e sufixos so adicionados diretamente aos nmeros. O prefixo $ ou 0x, bem como o sufixo h marcam os nmeros no sistema hexadecimal. Por exemplo, o nmero hexadecimal 10AF pode ser escrito como $10AF, ou 0x10AF, ou ainda 10AFh. Da mesma forma, os nmeros binrios geralmente usam os prefixos % ou 0b. Se um nmero no tem nem o prefixo nem sufixo considerado decimal. Infelizmente, esta maneira de marcar os nmeros no padronizada, assim, isto depende da concreta aplicao
.
Tabela comparativa mostrando os valores 0-255 escritos em trs diferentes sistemas numricos: decimal, binrio e hexadecimal.
Conceito de BIT
Um bit nada mais que um dgito binrio. Semelhante ao sistema de numerao decimal em que os dgitos de um nmero no tm o mesmo valor (por exemplo, os dgitos do nmero decimal 444 so os mesmos, mas tm valores diferentes), a significncia de um bit depende de sua posio no nmero binrio . Como no h sentido falar de unidades, dezenas etc, em nmeros binrios, seus dgitos so referidos como o bit zero (bit mais direita), primeiro bit (o segundo da direita), Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 8 segundo bit, terceiro bit, etc. Alm disso, uma vez que o sistema binrio utiliza dois dgitos apenas (0 e 1), o valor de um bit pode ser 0 ou 1.
Conceito de BYTE
Um byte composto por oito bits agrupados. Se um bit um dgito, lgico dizer que bytes representam nmeros. Todas as operaes matemticas podem ser realizadas sobre eles, os bytes, igualmente aos nmeros decimais. Semelhante a dgitos de um nmero qualquer, os dgitos de um bytes no tem o mesmo significado. O bit mais esquerda tem o maior valor, e chamado o bit mais significativo (MSB Most Significant Bit). O bit mais direita tem o menor valor e por isso chamado o bit menos significativo (LSB Least Significant bit). Os 8 bits de um byte podem assumir valores 0 ou 1, independentemente. Assim, esses 8 bits podem ser combinados em 256 formas diferentes, o maior nmero decimal que pode ser representado por um byte 255. Um nibble referido como metade de um byte. Dependendo de que metade do byte estivermos falando (esquerdo ou direito), dizemos que h 'alto' e 'baixo' nibble, respectivamente. Os conceitos de bit, byte e nibble podem ser entendidos observando a figura 1.4.
Figura 1.4 Representao dos conceitos de bit, byte e nibble. Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 9
Conceitos de Eletrnica Digital
Alguma vez voc j se perguntou o que h dentro de circuitos eletrnicos integrados digitais como microcontroladores e processadores? O que faz estes circuitos realizarem operaes matemticas complexas e tomar decises? Sabia que essa aparente complexidade inclui apenas alguns elementos diferentes chamados circuitos lgicos ou portas lgicas?
2.1 lgebra de Boole
A operao dos circuitos lgicos baseada em princpios estabelecidos por um matemtico britnico, George Boole em meados do sculo XIX, antes mesmo da primeira lmpada ter sido inventada. Originalmente, a idia principal era expressar formas lgicas atravs de funes algbricas. Tal pensamento foi logo transformado em um produto prtico, que hoje conhecido como circuitos lgicos E (AND), OU (OR) e NO (NOT), ou inversor. O princpio de sua operao conhecida como lgebra booleana. Algumas instrues encontradas nos programas de microcontroladores do o mesmo resultado que portas lgicas. Sua operao ser discutida em seguida.
Porta lgica E (AND)
A porta lgica E tem duas ou mais entradas e uma sada. Suponha que a porta usada neste exemplo tem apenas duas entradas. A lgica um (1) ir aparecer em sua sada apenas se as duas entradas (A e B) so acionadas com nvel lgico alto (1). A tabela seguir, chamada de tabela da verdade, mostra a dependncia mtua entre as entradas e sada.
Captulo 2 Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 10 Quando usado em um programa, uma operao lgica E realizada por uma instruo do programa, que ser discutida posteriormente. Por ora, basta lembrar que a lgica E num programa refere-se operao lgica AND aplicada aos bits correspondentes a dois registradores, que so posies de memria onde so armazanados valores binrios, conforme se pode ver no quadro abaixo.
Porta lgica OU (OR)
Da mesma forma, portas lgicas OU tambm tem duas ou mais entradas e uma sada. Se a porta tem apenas duas entradas, uma lgica um (1) ir aparecer em sua sada se uma entrada (A ou B) acionada com nvel lgico alto (1). Ou seja, uma lgica um (1) aparece em sua sada, se pelo menos uma entrada mantida alta (1). Se todas as entradas esto lgica zero (0), a sada tambm apresenta lgica zero (0). Em seguida, pode ser visto a tabela da verdade para a porta lgica OU assim como uma operao OU realizada com os valores de dois registradores.
Porta lgica NO (NOT)
A porta lgica NO (not) tem apenas uma entrada e uma nica sada. Ela opera de maneira extremamente simples. Quando a lgica zero (0) aparece em sua entrada, uma lgica de um (1) aparece em sua sada e vice-versa. Isso significa que esta porta inverte o sinal e freqentemente chamada de inversora. No programa, essa operao lgica feita sobre um byte, ou apenas um bit. O resultado um byte com bits invertidos. Se o byte considerado como um nmero, o valor invertido na verdade um complemento do mesmo. O complemento de um nmero um valor que adicionado ao nmero faz com que ele alcance o maior nmero de 8 dgitos binrios. Em outras palavras, a soma de um nmero de 8 dgitos e seu complemento sempre 255. Em seguida, pode ser visto a tabela da verdade para a porta lgica NO assim como uma operao NO realizada com o valor de um registrador.
Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 11
Porta lgica OU-EXCLUSIVO (XOR)
A porta OU EXCLUSIVO (XOR) um pouco complicado em comparao com outras portas. Ela representa uma combinao de todos eles. A lgica um (1) aparece em sua sada somente quando suas entradas tm estados lgicos diferentes. No programa, esta operao comumente usada para comparar dois bytes. A subtrao pode ser utilizada para o mesmo fim (se o resultado for 0, os bytes so iguais). Ao contrrio de subtrao, a vantagem desta operao lgica que no possvel a obteno de resultados negativos. Em seguida, pode ser visto a tabela da verdade para a porta lgica OU EXCLUSIVO assim como uma operao realizada com os valores de dois registradores.
Registradores
Em suma, um registrador, ou uma clula de memria, um circuito eletrnico que pode memorizar o estado de um byte. Dentro de um microcontrolador h vrios registradores que so usados para armazenar as informaes do programa. Essas informaes podem ser variveis de controle do programa, estado das entradas ou sadas, resultado de uma operao matemtica, etc. Graficamente, podemos ver como funciona um registrador atravs da figura 2.1. Nessa figura, a unidade central de processamento (CPU) pode armazenar um byte numa posio de memria, ou registrador. Esse valor armazenado, pode em seguida ser utilizado pela prpria CPU para um novo clculo ou processamento.
Figura 2.1 CPU comunicando-se com um registrador. Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 12 Alm de registradores de uso geral como o mostrado na figura 2.1, que no tem nenhuma funo especfica e determinada, cada microcontrolador possui um nmero de registradores especiais (Special Function Registers-SFR), cuja funo pr-determinada pelo fabricante. Seus bits so conectados (literalmente) com os circuitos internos do microcontrolador, tais como temporizadores, conversores A/D, osciladores e outros, o que significa que eles so usados diretamente no comando da operao destes circuitos. O estado dos bits do registrador alterado a partir do programa. O estado dos bits controla pequenos circuitos dentro do microcontrolador. Imagine oito interruptores que controlam o funcionamento de um pequeno circuito dentro do microcontrolador: registradores especiais fazem exatamente isso, como pode ser observado na figura 2.2.
Figura 2.2 CPU comunicando-se com um registrador de funo especial.
Portas de Entrada/Sada
A fim de tornar o microcontrolador til, este tem que ser ligado a uma eletrnica adicional, ou seja, aos perifricos. Cada microcontrolador tem um ou mais registradores (chamados portas) conectados aos pinos do microcontrolador. Por que entrada / sada? Porque voc pode mudar a funo do pino que desejar. Por exemplo, suponha que voc deseja que o seu dispositivo ligue/desligue trs LEDs de sinal e, simultaneamente, monitore o estado lgico de cinco sensores ou teclas. Algumas das portas precisam ser configuradas de modo que hajam trs sadas (ligadas LEDs) e cinco entradas (ligadas a sensores). Esta configurao simplesmente realizada por software, ou seja, atravs do programa que o projetista escreve, o que significa que a funo do pino pode ser alterada durante a operao. Podemos observar o funcionamento de uma porta de um microcontrolador atravs da figura 2.3.
Figura 2.3 CPU comunicando-se com uma porta de entrada/sada. Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 13 Uma importante especificao dos pinos de entrada/sada (I/O) a corrente mxima que estes podem suportar. Para a maioria dos microcontroladores atuais, a corrente obtida a partir de um pino suficiente para ativar um LED ou algum outro dispositivo de baixa corrente (1-20 mA). Quanto mais pinos de I/O, menor corrente mxima de um pino. Em outras palavras, a corrente mxima indicada na folha de especificaes de dados para o microcontrolador compartilhada entre todas as portas de I/O. Outra funo importante de um pino de I/O que estes podem ter resistncias de pull-up. Essas resistncias conectam os pinos tenso positiva de alimentao que pode ser diferente daquela que usada para alimentar o chip do microcontrolador. Isto til quando se deseja trabalhar com tenses distintas no mesmo circuito Cada porta de I/O est normalmente sob o controle de um registrador especial, o que significa que cada bit do registrador determina o estado do pino correspondente. Por exemplo, escrevendo uma lgica (1) para um bit do registrador de controle (SFR), o pino apropriado da porta automaticamente configurado como entrada e a tenso presente nele pode ser lida como nvel lgico 0 ou 1. Caso contrrio, ao escrever zero a um bit desse SFR, o pino apropriado da porta configurado como uma sada.
Unidade de Memria
A memria a parte do microcontrolador utilizado para armazenamento de dados. A maneira mais fcil de explicar compar-la com um armrio de arquivo com muitas gavetas. Suponha-se, as gavetas esto claramente identificadas para que seu contedo possa ser encontrada com facilidade atravs da leitura da etiqueta na parte frontal da gaveta. Da mesma forma, cada endereo de memria corresponde a um local de memria. O contedo de qualquer lugar pode ser acessado e lido pelo seu endereamento. Memria pode ser escrita ou lida. Na figura 2.4 temos um representao de uma memria que pode ser escrita ou lida. Do lado esquerdo, temos o endereo de cada posio de memria, do lado direito, temos os dados. Ao enderear uma posio especfica, a linha de dados apresenta o contedo presente naquela posio endereada. Esse contedo pode ser lido para ser usado em algum processamento, ou ainda, esse contedo pode ser alterado mediante a escrita de um novo dado naquele endereo.
Figura 2.4 Memria de escrita/leitura de um microcontrolador. Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 14 Existem vrios tipos de memria dentro do microcontrolador, tais como:
Memria apenas de leitura (Read Only Memory-ROM) - usado para salvar permanentemente o programa sendo executado. O tamanho do programa que pode ser escrito depende do tamanho da memria. Microcontroladores atuais costumam usar 16 bits de endereamento, o que significa que eles so capazes de enderear at 64 Kb de memria, ou seja, 65.535 localidades. Para iniciantes, o programa ir raramente exceder o limite de vrias centenas de instrues. Existem vrios tipos de ROM.
Memria Flash - Este tipo de memria foi inventado nos anos 80 nos laboratrios da Intel e foi apresentada como o sucessor da EPROM UV (tipo de memria ROM que usa luz ultravioleta para ser apagada). Como o contedo dessa memria pode ser escrito e apagado praticamente um nmero ilimitado de vezes, microcontroladores com memria Flash ROM so ideais para a aprendizagem, experimentao e produo em pequena escala. Devido sua grande popularidade, a maioria dos microcontroladores so fabricados com tecnologia flash. Ento, se voc estiver pensando em comprar um microcontrolador, o tipo definitivamente o Flash!
Memria de acesso aleatrio (Random Access Memory-RAM) - Uma vez que a alimentao desligada, o contedo da RAM apagado. Ela usada para armazenar dados temporrios e resultados intermedirios criados e utilizados durante a operao do microcontrolador. Por exemplo, se o programa realiza uma adio (de tudo), necessrio ter um registro que representa o que na vida cotidiana a chamada "soma". Por esta razo, podemos ter um dos registros de memria RAM chamado de 'soma' e usado para armazenar os resultados da adio.
Memria ROM eletricamente apagvel e programvel (Electrically Erasable Programable ROM-EEPROM) L-se E 2 PROM. O contedo da EEPROM pode ser alterado durante a operao (semelhante RAM), mas permanente, mesmo aps a perda de alimentao (similar a ROM). Assim, EEPROM freqentemente usado para armazenar valores, criados durante a operao, que deve ser permanentemente guardados. Por exemplo, se voc criar uma fechadura eletrnica ou um alarme, seria timo que este permitisse ao usurio criar e digitar uma senha. Mas intil se essa senha for perdida cada vez que a alimentao se apaga. A soluo ideal um microcontrolador com uma EEPROM embutida.
Interrupes
A maioria dos programas usam interrupes em sua execuo normal. O objetivo do microcontrolador principalmente responder s mudanas no seu entorno. Em outras palavras, quando um evento ocorre, o microcontrolador faz alguma coisa. Por exemplo, quando voc aperta um boto em um controle remoto, o microcontrolador ir registr-lo e responder pela alterao de um canal, aumentar o volume para cima ou para baixo, etc. Se o microcontrolador passasse a maior parte de seu tempo infinitamente verificando alguns botes por horas ou dias, isso no seria prtico. por isso que o microcontrolador possui uma tcnica de resposta a certos estmulos. Em vez de verificar cada pino ou bit constantemente, o microcontrolador delega essa funo a circuitos especficos que s respondero quando algo especfico acontece, por exemplo, o pressionamento de um boto. Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 15 O sinal que informa a unidade de processamento central quando um evento como esse ocorre chamado de uma interrupo. Quando a interrupo ocorre, o microcontrolador para de executar o programa e atende aquele evento em especial. As interrupes so recursos extremamente poderosos e prticos para o desenvolvimento de sistemas microcontrolados.
Unidade Central de Processamento (CPU)
Como o prprio nome sugere, esta uma unidade que monitora e controla todos os processos dentro do microcontrolador. constituda por vrias subunidades, das quais as mais importantes so:
Decodificador de Instrues (Instruction Decoder) uma parte da eletrnica embutida no microcontrolador que decodifica as instrues do programa e ativa outros circuitos com base nisso. O "conjunto de instrues" que diferente para cada famlia de microcontroladores expressa a capacidade do circuito; Unidade Lgica Aritmtica (ULA) realiza todas as operaes matemticas e lgicas sobre os dados; Acumulador um registrador de uso especial intimamente relacionada com a operao da ULA. uma espcie de mesa de trabalho usada para armazenar todos os dados em que uma operao deve ser realizada (transferncia, adio/mover etc.) Ele tambm armazena os resultados prontos para uso no tratamento posterior. Um dos SFR, chamado de Registrador de Status (Status Register), est intimamente relacionado com o acumulador. Ele mostra, em determinado momento o 'status' de um nmero armazenado no acumulador (se nmero maior ou menor que zero, etc.). O acumulador tambm chamado de registrador de trabalho e est marcado como registrador W, ou apenas W.
Na figura 2.5 podem ser vistas as subunidades da CPU citadas.
Figura 2.5 Unidade Central de Processamento e suas subunidades.
Na figura 2.5, temos setas representando os fios que levam a informao de endereamento de memria (Address), dos dados (Data) e das linhas de controle (Control Line). Cada seta, dependendo do tipo de microcontrolador, pode conter 8, 16 fios ou at mais. Cada conjunto de fios que carregam uma informao do mesmo tipo chamado de Barramento. Assim, temos os barramentos de endereo, de dados e de controle.
Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 16 Oscilador
Para que o microcontrolador execute as instrues armazenadas em sua memria, necessrio a presena de um sinal pulsante, normalmente uma onda quadrada, para que as instrues sejam executadas a cada pulso. Esse sinal chamado de sinal de relgio (clock), e proveniente de um circuito oscilador. O circuito oscilador normalmente configurado de modo a utilizar um cristal de quartzo ou ressonador cermico, conectado a dois pinos do microcontrolador, para a estabilidade de freqncia, mas tambm pode operar como um circuito stand-alone (como um oscilador RC interno). importante dizer que as instrues no so executadas ao ritmo imposto pelo oscilador em si, mas vrias vezes mais lento. Isso acontece porque cada instruo executada em vrias etapas. Em alguns microcontroladores, o mesmo nmero de ciclos necessrio para executar todas as instrues, enquanto em outros, o nmero de ciclos diferente para diferentes instrues. Assim, se o sistema usa um cristal de quartzo com uma frequncia de 20 Mhz, o tempo de execuo de uma instruo no 50ns, mas 200, 400 ou 800 ns, dependendo do tipo de microcontrolador!
Circuito de alimentao
H duas coisas que merecem ateno sobre o circuito de alimentao do microcontrolador:
Brown out uma condio potencialmente perigosa que ocorre no momento em que o microcontrolador desligado ou quando a tenso cai para um valor mnimo devido a rudo eltrico. Como o microcontrolador composto por vrios circuitos, com diferentes nveis de tenso de funcionamento, este estado pode provocar um funcionamento fora de controle. Para evitar isso, normalmente o microcontrolador possui um circuito de reset que reinicia todos os circuitos assim que o microcontrolador incorre em um estado de emergncia. Pino de reset normalmente marcado como MCLR (Master Clear Reset). utilizado para reiniciar o microcontrolador atravs da aplicao de uma lgica de zero (0) ou um (1) nesse pino, o que depende do tipo do microcontrolador.
Temporizadores/Contadores
O oscilador do microcontrolador utiliza cristal de quartzo para o seu funcionamento. Mesmo no sendo a soluo mais simples para a obteno de um sinal de relgio, existem muitas razes para us-lo. A freqncia do oscilador precisamente definida e muito estvel, de modo que gera pulsos sempre da mesma largura, o que os torna ideais para a medio do tempo. Tais osciladores tambm so usados em relgios de quartzo. Se necessrio medir o tempo entre dois eventos, basta contar os pulsos gerados por este oscilador. Isto exatamente o que o temporizador, ou timer, faz. A maioria dos programas usam este cronmetro eletrnico em miniatura. Estes so geralmente registradores de funes especiais de 8 ou 16-bits, cujo contedo automaticamente incrementado por cada impulso vindo do circuito oscilador. Uma vez que um registrador completamente carregado, uma interrupo pode ser gerada. Se o timer usa um oscilador de quartzo para o seu funcionamento interno, ento ele pode ser usado para medir o tempo entre dois eventos (se o valor do registrador T1 Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 17 no momento em que se inicia a medio, e T2, no momento em que termina, ento o tempo decorrido igual a o resultado da subtrao T2-T1). Se os registradores usam pulsos provenientes de fontes externas conectados a um pino do microcontrolador, ento o timer transformado em um contador. Esta apenas uma explicao simples da operao em si. No entanto, um pouco mais complicado na prtica.
Conversor Analgico/Digital (A/D)
Sinais externos normalmente so fundamentalmente diferentes daqueles que o microcontrolador entende (zeros e uns) e tm de ser convertidos em valores compreensveis para o microcontrolador. Um conversor analgico/digital um circuito eletrnico que converte os sinais contnuos para discretos nmeros digitais. Em outras palavras, este circuito converte um valor analgico em um nmero binrio e o transfere para a CPU para processamento adicional. Este mdulo utilizado para a medio de tenso analgica em um pino de entrada (valor analgico). Na figura 2.6, por exemplo, temos uma representao do conversor A/D sendo controlado pela CPU. O grfico ao lado mostra a relao de converso de sinais analgicos de 0V at 5V em nmeros binrios que vo de 0x000 a 0x3FF.
Figura 2.6 Operao de um conversor analgico/digital.
Arquitetura Interna
Todos os microcontroladores usam um dos dois modelos de projeto bsicos chamados arquitetura Harvard e arquitetura von-Neumann. Eles representam duas formas diferentes de troca de dados entre a CPU e a memria. Os microcontroladores com a arquitetura von-Neumann tem apenas um bloco de memria e um barramento de 8 bits de dados. Como todos os dados so trocados atravs dessas 8 linhas, o barramentos fica sobrecarregado e a comunicao muito lenta e ineficiente. A CPU pode apenas executar uma instruo de leitura ou gravao de dados para a memria. Ambas no podem ocorrer ao mesmo tempo, uma vez que instrues e dados usam o mesmo barramento. Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 18
Figura 2.7 arquitetura Von-Neumann.
Os microcontroladores com arquitetura Harvard tem dois barramentos diferentes. Um deles conecta a CPU com a memria RAM. O outro consiste em linhas de 12, 14 ou 16 bits e conecta a CPU com a memria ROM. Assim, a CPU pode ler uma instruo e ter acesso a dados da memria, ao mesmo tempo. Como todos os registradores da memria RAM so de 8 bits, todos os dados sendo trocados so da mesma largura. Durante o processo de escrita, um programa apenas manipula os dados de 8 bits. Em outras palavras, tudo o que voc pode mudar a partir do programa e tudo o que pode influenciar de 8 bits. Todos os programas escritos para estes microcontroladores sero armazenado na ROM do microcontrolador interno depois de serem compilados em cdigo de mquina. No entanto, posies de memria ROM no tem 8, mas 12, 14 ou 16 bits. O resto dos bits 4, 6 ou 8 representa a instruo especificando para a CPU o que fazer com os dados de 8 bits.
Figura 2.8 arquitetura Harvard.
O Conjunto de Instrues
Todas as instrues compreensveis para o microcontrolador so chamadas de o conjunto (Set) de instrues. Quando voc escreve um programa em linguagem assembly, na verdade voc especifica instrues na ordem em que devem ser executadas. A principal restrio aqui o nmero de instrues disponveis. Os fabricantes costumam considerar uma das duas abordagens abaixo:
Conjunto reduzido de instrues (RISC-Reduced Instruction Set Computer) Neste caso, o microcontrolador reconhece e executa apenas as operaes bsicas (adio, subtrao, cpia, etc.) Outras operaes mais complicadas so realizadas atravs da combinao delas. Por exemplo, a multiplicao feita atravs da realizao de sucessivas adies. Os microcontroladores da linha PIC so do tipo RISC.
Conjunto complexo de instrues (CISC-Complex Instruction Set Computer) CISC o oposto ao RISC. Microcontroladores concebidos para reconhecer mais de 200 instrues diferentes, podendo realizar inmeras tarefas em alta velocidade. No entanto, Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 19 preciso entender como aproveitar tudo o que estas instrues oferecem, o que no nada fcil. Processadores, como Pentium, Core 2 Duo so do tipo CISC.
Modelo genrico de um microcontrolador
Todos os elementos de hardware vistos at agora, e tantos outros no apresentados aqui, fazem parte da eletrnica embutida em um microcontrolador. Esses elementos esto todos interligados para desempenhar diferentes tarefas, dependendo das necessidades do projetista. A figura 2.9 mostra como esses elementos esto interligados para potencializar o uso de um microcontrolador
Figura 2.9 Elementos de um microcontrolador.
Como fazer a escolha certa?
Ok, voc novato e tomou a deciso de se aventurar em trabalhar com os microcontroladores. Parabns pela sua escolha! No entanto, no to fcil escolher o correto microcontrolador, como pode parecer. O problema no um nmero limitado de dispositivos, mas o oposto! Antes de comear a projetar um dispositivo baseado no microcontrolador, pense o seguinte: quantas linhas de entrada/sada eu preciso para a operao? Deve realizar algumas operaes alm de simplesmente acionar rels? Ser que preciso de algum mdulo especializado, tal como comunicao serial, etc. Um conversor A/D? Quando voc cria uma imagem clara do que voc precisa, o intervalo de seleco bastante reduzido e hora de pensar em preos. Se voc pensar em todas essas coisas pela primeira vez, ento, tudo parece um pouco confuso. Primeiro, selecione o fabricante, ou seja, a famlia do microcontrolador. Estude um modelo especfico. Saiba quanto voc precisa, no entre em detalhes. Resolva um problema especfico por vez. Em seguida, voc vai perceber que aprendendo um modelo daquela famlia, voc estar apto a trabalhar com qualquer outro modelo. Os microcontroladores PIC, desenvolvidos pela Microchip Technology provavelmente so a melhor escolha para iniciantes. Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 20
O Microcontrolador PIC 16F877
O PIC16F877 um produto bem conhecido da Microchip. Ele possui todos os componentes que os microcontroladores modernos normalmente tm. Por seu baixo preo, ampla gama de aplicaes de alta qualidade e fcil acesso, uma soluo ideal em aplicaes como o controle de diferentes processos na indstria, dispositivos de controle de mquinas, a medio de valores de tenso, etc. Algumas de suas principais caractersticas esto listadas abaixo.
3.1 Introduo
O PIC16F877 um microcontrolador que teve suas origens no ano de 1965, quando a companhia GI (General Instruments), formou a Diviso de Microeletrnica. Na dcada de 70, a GI criou um dos primeiros processadores de 16 bits, chamado CP16000. Como este microprocessador tinha uma certa deficincia no processamento de entradas/sadas, a GI projetou e construiu um Controlador de Interface Perifrica (em ingls, Peripheral Interface Controller, ou PIC). Este controlador foi projetado tendo em vista a rapidez, pois devia processar as operaes de E/S de uma mquina de 16 bits, e tinha um conjunto de instrues muito pequeno. O CP16000 no teve muito sucesso, porm o PIC evoluiu para a arquitetura PIC16C5x. Como era disponvel somente nas verses em ROM, permaneceu como uma boa soluo para grandes usurios, que podiam encomendar diretamente da fbrica um grande volume de circuitos j pr- programados. Na dcada de 80, a diviso de microeletrnica da GI foi reestruturada e se transformou na GI Microeletrnica, uma empresa subsidiria. Esta empresa foi vendida para investidores e transformada na Arizona Microchip Technology, dedicada especificamente ao desenvolvimento de produtos utilizados em sistemas dedicados. Como parte desta estratgia, grande esforo da companhia foi direcionado ao desenvolvimento de vrias verses do PIC, sendo que a verso com EEPROM (eprom apagvel eletricamente) a mais indicada para o desenvolvimento rpido de aplicaes, devido ao baixo custo do sistema de desenvolvimento necessrio e do hardware de processamento. O dispositivo mais flexvel disponvel hoje da srie PIC de 14 bits de palavra de controle, e que ao mesmo tempo rene um conjunto de caractersticas adequadas ao uso em pequenas sries de produtos e estudo de microcontroladores o PIC16F877A. Na Captulo 3 Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 21 figura 3.1 pode-se ver o encapsulamento DIP de 40 pinos, um dos encapsulamentos disponveis para esse microcontrolador. Como o microcontrolador PIC16F877A se utiliza da arquitetura Harvard, isto possibilita que as palavras de instrues tenham um nmero de bits (14 bits de comprimento) diferente do tamanho da palavra de dados (8 bits para este microcontrolador). Com este tamanho de palavra de instruo possvel codificar todas as instrues, com exceo dos desvios para outras posies de programas, como instrues de uma nica palavra, resultando em uma grande velocidade de execuo, como 200ns para a verso de 20Mhz.
Figura 3.1 Microcontrolador PIC 16F877A com encapsulamento DIP de 40 pinos.
Estes dispositivos podem enderear direta e indiretamente seus arquivos de registros ou memria de dados. O conjunto de instrues foi projetado de tal forma que se pode realizar qualquer operao em qualquer registro utilizando qualquer modo de endereamento. A unidade lgica aritmtica do PIC16F877 pode realizar operaes de adio, subtrao, deslocamento e operaes lgicas. Os microcontroladores da srie PIC16F877 so dispositivos computacionais extremamente adequados para experimentao e pequenos projetos. Devido ao seu baixo custo e facilidade de programao, podem ser empregados em aplicaes onde at recentemente se utilizavam componentes discretos, como por exemplo, os temporizadores e controladores de temperatura, adicionando novas funes at ento no implementadas devido a complexidade do circuito necessrio. O projeto com microcontroladores traz uma diferena fundamental de paradigma para o projetista de circuitos. Ao invs de um bem sortido estoque de componentes discretos que realizam vrias funes diferentes cada um, e de um conceito de projeto que consiste em interligar estas diferentes funes de forma que o sistema como um todo tenha o comportamento adequado, utilizamos agora praticamente um mesmo tipo de hardware para todas as aplicaes. A diferena de funcionalidade fica por conta do software. Alteraes de funcionalidade podem ser feitas, em grande parte das vezes, atravs da modificao apenas do software, sem ser necessria alterao do hardware. Os microcontroladores da srie PIC16F87X so mquinas RISC. Isto significa que so mquinas com um reduzido conjunto de instrues. Para ser exato, so apenas 35 instrues para serem compreendidas, cada uma ocupando uma palavra (14 bits ). O PIC16F877 possui as seguintes caractersticas bsicas: 5 conjuntos de portas de entrada e sada (total de 33 entradas/sadas); Conversor analgico/digital de 10 bits de resoluo e 8 canais de entrada; Perifrico de comunicao paralela e serial (USART e MSSP); Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 22 2 Mdulos CCP (Comparao, Captura e PWM); 3 Timers (1 de 16 bits e 2 de 8 bits); Watchdog timer (temporizador especial). Na figura 3.2 temos uma representao da arquitetura interna do PIC16F877, ou seja, uma representao da forma como os recursos esto ligados internamente no chip.
Figura 3.2 Arquitetura interna do PIC microcontrolador PIC 16F877.
Na figura 3.3 temos a descrio dos pinos no encapsulamento. Observe que alguns pinos apresentam mais de uma funo. Isso significa que o projetista deve escolher qual a funo que o pino vai assumir quando estiver fazendo a sua programao. A descrio de cada pino do microcontrolador mostrada na tabela que segue:
Figura 3.3 Pinagem do microcontrolador PIC 16F877. Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 23
Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 24 A fim de que o microcontrolador funcione adequadamente necessrio fornecer:
Alimentao eltrica; Sinal de reset, e Sinal de clock.
Mesmo que o PIC16F877 possa operar em tenses de alimentao diferentes, uma fonte de alimentao DC de 5V a mais adequada. O circuito mostrado na figura 3.4 utiliza um circuito integrado de trs terminais LM7805, um regulador positivo que oferece alta qualidade de estabilidade de tenso e corrente suficiente para permitir que o microcontrolador e perifricos eletrnicos funcionem normalmente (o suficiente, aqui, significa 1A). Para que o microcontrolador possa operar corretamente, uma lgica (VCC) deve ser aplicado sobre o pino de reset (pino 1). O boto conectando o pino MCLR ao GND no necessrio. No entanto, quase sempre fornecido, pois permite que o microcontrolador seja resetado manualmente, fazendo com que este retorne s condies normais de funcionamento, caso algo d errado. Ao pressionar este boto, o pino levado a 0V, o microcontrolador reiniciado e comea a execuo do programa desde o incio. Um resistor de 10K usado para permitir que o pino MCLR v a 0V, atravs do boto, sem curto-circuitar com o nvel de 5V DC. Esse resistor chamado de resistor de pull-up, pois conectado entre o VCC e o pino. Mesmo que o microcontrolador possua um oscilador interno, ele no pode operar sem componentes externos que estabilizam o seu funcionamento e determinem sua freqncia (velocidade de operao do microcontrolador). Dependendo do elemento em uso para estabilizar a frequncia, bem como suas freqncias, o oscilador pode operar em quatro modos diferentes:
LP - Cristal de Baixa Potncia; XT - Cristal/Ressonador; HS - Cristal de Alta Velocidade e RC - Resistor/Capacitor.
Quando o cristal de quartzo utilizado para a estabilizao da freqncia, o oscilador funciona com uma frequncia precisa, que no afetado por mudanas na temperatura e tenso de alimentao. Esta frequncia geralmente indicada na embalagem do crysal. Alm do cristal, os capacitores C1 e C2 tambm devem ser conectados conforme esquema abaixo. Os valores previstos para C1 e C2 na tabela a seguir devem ser considerados como uma recomendao e no como uma regra rgida.
Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 25
Figura 3.4 Circuito de alimentao, reset e oscilador para o PIC 16F877.
Como visto na figura acima, trata-se de um circuito simples, mas nem sempre assim. Se o dispositivo de destino utilizado para controlar grandes mquinas ou dispositivos de suporte a vida, tudo fica cada vez mais complicado. No entanto, esta soluo suficiente por enquanto. Independentemente do fato de que o microcontrolador um produto de tecnologia moderna, este intil se no estiver ligado a alguns componentes adicionais. Simplificando, o aparecimento de tenses nos pinos do microcontrolador no significa nada se no for utilizado para a realizao de determinadas operaes, tais como ligar ou desligar LEDS, rels, ler botes ou chaves, exibir dados em um display de 7 segmentos ou display de LCD etc. Nos captulos que se seguem, sero abordadas as tcnicas de programao em linguagem C, bem como a utilizao do micocontrolador para realizar tarefas que vo desde acender/apagar um LED, at tarefas mais complexas como escrita em um LCD ou mesmo a comunicao entre dois microcontroladores. No final desta apostila, encontra-se o datasheet resumido do PIC16F877, contendo as principais informaes necessrias para o desenvolvimento de aplicaes utilizando esse microcontrolador.
Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 26
Introduo Linguagem C
Assim como o uso de uma linguagem no est limitada apenas a livros e revistas, as Linguagens de Programao no esto estritamente relacionadas com algum tipo especial de computador, processador ou Sistema Operacional. C atualmente uma linguagem de programao de alto nvel e de uso geral. Entretanto, o fato da no associatividade da linguagem C a nenhuma mquina pode causar problemas durante a sua utilizao, dependendo das peculiaridades de cada mquina em que est se programando (isto poderia ser comparado ao uso de diferentes dialetos de uma linguagem).
4.1 Introduo
A idia associada a escrever um programa na linguagem C quebrar um grande problema em vrios problemas menores, mais simples de serem resolvidos. Suponha, por exemplo, que necessrio escrever um programa para o microcontrolador para realizar a medio de temperatura e mostrar o resultado em um display de cristal lquido. O processo de medir feito com o uso de um sensor apropriado, que converte a temperatura em uma tenso proporcional. O microcontrolador usa seu conversor A/D para converter essa tenso (analgica) em um nmero (digital) que ento enviado para o LCD atravs de vrios fios. Assim, o programa dividido em quatro partes que precisam ser executadas na ordem correta, como seguem:
1. Ativar e ajustar o conversor A/D; 2. Realizar a medio do valor analgico; 3. Calcular a temperatura; 4. Enviar os dados de forma apropriada para o display.
Captulo 4 Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 27 Para facilitar a compreenso da linguagem C, vejamos primeiramente um exemplo de programa:
Vejamos o significado de cada linha do programa. A primeira linha do programa:
// Primeiro exemplo
chamada de comentrio. Os comentrios no so interpretados pelo compilador, mas so apenas descries inseridas no cdigo-fonte pelo programador com o intuito de documentar o programa e para facilitar o seu entendimento por parte de outros programadores que eventualmente faro alteraes ou atualizaes no programa original. Os comentrios podem ser de linha simples, como foi mostrado no exemplo anterior, e so iniciados por uma barra dupla. Os comentrios de linha simples podem ser iniciados em qualquer ponto de uma linha e so muito utilizados para descrever o funcionamento ao final de cada linha de cdigo. Os comentrios tambm podem ser de mltiplas linhas. Nesse caso, so compostos por uma ou mais linhas. Iniciam sempre com os caracteres /* para iniciar o comentrio, e a sequncia */ para terminar o comentrio, como mostra o exemplo abaixo:
/* Este um exemplo de comentrio de mltiplas linhas */
Na prxima linha temos:
#include <16F877A.h>
O comando #include uma diretiva do compilador. Neste caso, est determinando ao compilador que anexe ao programa o arquivo especificado: 16F877A.h, que um arquivo que contm todas as informaes sobre o microcontrolador utilizado, no caso, o PIC 16F877A. Arquivos com extenso do tipo .h so chamados de arquivos de cabealho e so utilizados em C para definir variveis, tipos, smbolos e funes teis ao programa. // Primeiro exemplo
main() { output_high(pin_b0); //seta o pino rb0 delay_ms(500); //aguarda 500ms output_low(pin_b0); //reseta o pino rb0
}
Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 28 Na prxima linha encontramos:
#fuses HS
Esta uma diretiva que especifica o estado dos fusveis da palavra de configurao do dispositivo. No caso, estamos indicando ao processador que opere com a opo HS ou High Speed, isto , com um cristal de alta velocidade. Existem vrias outras opes para configurar os fuses, como por exemplo, proteger o cdigo gravado no microcontrolador contra leitura, modos de programao, proteo para evitar travamentos no caso de uma queda de tenso, etc. Em seguida temos:
#use delay(clock=20M)
Esta outra diretiva do compilador. Esta diretiva especifica o clock, ou a velocidade do cristal usado para sincronizar as operaes dentro do dispositivo. No caso, estamos indicando ao compilador que o dispositivo opera com um cristal de 20MHz. Este valor utilizado para a gerao de cdigos de atraso e outras rotinas que dependam do tempo. Na prxima linha do programa encontramos:
main()
A declarao main( ) especifica o nome de uma funo. No caso, a funo main( ) padronizada na linguagem C e utilizada para definir a funo principal, ou o corpo principal do programa. Uma funo em C um conjunto de instrues que pode ser executado a partir de qualquer ponto do programa. O sinal de abertura da chave { utilizado para delimitar o incio da funo e o sinal de fechamento da chave } indica o final da funo. Na realidade, as chaves delimitam o que chamamos de bloco de programa ou bloco de cdigo. O bloco de programa dentro da funo main( ) formado por 3 instrues. Cada instruo terminada por um ponto e vrgula (;). A instruo output_high(pin_b0) uma chamada a uma funo interna do compilador. Esta funo utilizada para setar (ou seja, colocar em nvel lgico 1) um pino do microcontrolador, identificado entre os parnteses. Isto significa que o pino rb0 (da porta B) ser setado. Note que (pin_b0) um smbolo predefinido para especificar o pino rb0. Este smbolo est localizado no arquivo de cabealho do processador utilizado, e que foi adicionado com a diretiva #include. O contedo presente entre os parnteses de uma funo chamado de argumento da funo. Assim, pin_b0 o argumento da funo output_high( ). A prxima funo a ser executada :
delay_ms(500);
Esta tambm uma funo interna do compilador e utilizada para gerar um atraso de X milissegundos, indicado entre os parnteses. No caso, o atraso ser igual a 500ms. A instruo output_low(pin_b0) uma chamada a uma outra funo interna do compilador. Esta funo utilizada para resetar (ou seja, colocar em nvel lgico 0) um pino do microcontrolador, identificado entre os parnteses. Isto significa que o pino rb0 (da porta B) ser resetado. Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 29 Desta forma, ao programarmos o PIC com o programa anterior e se tivermos conectado um LED (com o devido resistor de limitao de corrente) ao pino rb0, ns o veremos acender, permanecer aceso por 500ms, apagar e depois permanecer apagado. Obviamente este um programa bem simples, mas que til para o entendimento inicial da estrutura de um programa escrito em linguagem C. Podemos dizer que um programa em C constitudo por um ou mais dos seguintes elementos:
*Operadores so elementos utilizados para comandar interaes entre variveis e dados em C;
*Variveis que so usadas para armazenamento temporrio ou permanente de dados. A linguagem C dispe de uma variedade de tipos de variveis e dados;
*Comandos de controle so elementos essenciais escrita de programas em C. So utilizados para controlar, testar e manipular dados e informaes dentro de programas em C;
*Funes so estruturas de programa utilizadas para simplificar, otimizar ou apenas tornar mais claro o funcionamento do programa.
Vejamos outro exemplo de programa em C:
As quatro primeiras linhas do programa acima constituem o que podemos chamar de cabealho do programa, onde temos alguns comentrios acerca do programa e tambm as diretivas de controle do compilador. Observe que as diretivas no necessitam (e nem permitem) o uso do ponto e vrgula como delimitador. O primeiro comando, int tempo, chamado de declarao de varivel. Este comando determina que o compilador crie uma varivel do tipo inteira int chamada tempo. Esta operao, na realidade ir reservar uma posio de memria no microcontrolador para o armazenamento do valor relativo varivel. O tipo inteiro int especifica um tipo de dados de 8 bits com valores compreendidos entre 0 e 255 decimal. Veremos mais sobre variveis e tipos de dados em seguida. // Segundo exemplo
main() { int tempo; tempo=100; output_high(pin_b0); //seta o pino rb0 delay_ms(tempo); //aguarda 100ms output_low(pin_b0); //reseta o pino rb0 delay_ms(tempo);
}
Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 30 O nome dado varivel um identificador e pode ser composto de letras, nmeros e o caractere sublinhado _. Veremos mais sobre identificadores vlidos na linguagem C. Em seguida, temos a linha tempo=100 que constitui em uma operao de atribuio. As atribuies em C so executadas pelo operador de igualdade =. Desta forma, a linha tempo=100 far com que o compilador gere uma sequncia de instrues para fazer com que o valor 100 decimal seja armazenado na varivel tempo. As linhas com output_high( ) e output_low( ) so funes internas ao compilador e so utilizadas para setar e resetar, respectivamente, algum pino do microcontrolador, nesse caso, o pino b0 (da porta B). As outras duas linhas restantes so as linhas com a instruo delay_ms(tempo). Esta tambm uma funo interna do compilador e utilizada para gerar um atraso de X milissegundos. O valor X o parmetro dessa funo, no caso, X igual ao contedo da varivel tempo, que foi previamente carregada com o valor 100. Logo, o atraso gerado ser de 100ms. Maiores detalhes sobre o funcionamento das funes internas do compilador podem ser vistas no manual do usurio do compilador PIC C (CCS).
4.2 Palavras reservadas na Linguagem C
Toda linguagem de programao possui um conjunto de palavras ou comandos para os quais j existe interpretao interna prvia. Tais palavras no podem ser utilizadas para outras finalidades que no as definidas pela linguagem. A linguagem C ANSI estipula as seguintes palavras reservadas:
auto break case char const continue default do double else enum extern float for goto if int long register static return short signed sizeof struct switch typedef union void volatile while unsigned
4.3 Identificadores
Identificadores so nomes dados pelo programador a variveis, funes e outros elementos da linguagem C. No permitido utilizar palavras reservadas como identificadores. Um identificador pode ser composto de caracteres numricos e alfanumricos, alm do caractere sublinhado _. Alm disso, um identificador somente pode ser iniciado por uma letra ou sublinhado, nunca por um nmero, como nos exemplos:
varivel variavel1 _teste _teste1 _13_abc abc_def Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 31 4.4 Variveis e tipos de dados
Variveis e constantes so os elementos bsicos que um programa manipula. Uma varivel um espao reservado na memria do microcontrolador para armazenar um tipo de dado determinado. Variveis devem receber nomes para poderem ser referenciadas e modificadas quando necessrio. Muitas linguagens de programao exigem que os programas contenham declaraes que especifiquem de que tipo so as variveis que ele utilizar e s vezes um valor inicial. Tipos podem ser, por exemplo: inteiros, reais, caracteres, etc. As expresses combinam variveis e constantes para calcular novos valores. Os dados podem assumir cinco tipos bsicos em C que so:
Tipo Tamanho em bits Intervalo char 8 0 a 255 int 8 0 a 255 float 32 3.4*10 -38 a 3.4*10 38
void 0 Nenhum valor
char: (Caractere) O valor armazenado um caractere (letras dgitos e smbolos especiais). Caracteres geralmente so armazenados em cdigos (usualmente o cdigo ASCII). int: Nmero inteiro o tipo padro e o seu tamanho normalmente depende da mquina em que o programa est rodando. No caso do PIC16F877, seu tamanho de 8 bits. float: Nmero em ponto flutuante de preciso simples. So conhecidos normalmente como nmeros reais. void: Este tipo serve para indicar que um resultado no tem um tipo definido. Uma das aplicaes deste tipo em C criar um tipo vazio que pode posteriormente ser modificado para um dos tipos anteriores.
O intervalo especifica qual a faixa de valores que podem ser representados por uma varivel daquele tipo. Modificadores podem ser aplicados a estes tipos. Estes modificadores so palavras que alteram o tamanho do intervalo de valores que o tipo pode representar. Por exemplo, um modificador permite que possam ser armazenados nmeros inteiros maiores. Outro modificador obriga que s nmeros sem sinal possam ser armazenados pela varivel. Deste modo no necessrio guardar o bit de sinal do nmero e somente nmeros positivos so armazenados. O resultado prtico que o conjunto praticamente dobra de tamanho. A Tabela abaixo mostra todos os tipos bsicos definidos no compilador CCS
Tipo Tamanho em bits Intervalo short int, int1, boolean 1 0 ou 1 char 8 0 a 255 signed char 8 -128 a 127 unsigned char 8 0 a 255 int, int8, byte 8 0 a 255 signed int, signed byte 8 -128 a 127 unsigned int, unsigned 8 0 a 255 long int, int16 16 0 a 65535 signed long int 16 -32768 a 32767 Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 32 unsigned long int 16 0 a 65535 int32 32 0 a 4294967295 signed int32 32 -2147483648 a unsigned int32 32 0 a 4294967295 float 32 3.4*10 -38 a 3.4*10 38
4.4 Declarao de variveis
Para serem usadas, as variveis precisam ser declaradas de modo que o compilador possa reservar espao na memria para o valor a ser armazenado. Declarar uma varivel nada mais do que informar ao compilador o nome dessa varivel, atravs de um identificador e o seu tipo, conforme a tabela anterior. A forma geral de uma declarao :
tipo lista_de_variaveis ;
Exemplos:
int i; unsigned int a, b, c; unsigned long int dia, mes, ano; float salario;
Outro aspecto importante da declarao de variveis o local onde elas so declaradas. A importncia do local onde a varivel declarada relaciona-se acessibilidade ou no dessa varivel por outras partes do programa. Basicamente, podemos declarar as variveis em dois pontos distintos do programa, a saber:
No corpo principal do programa, (fora de qualquer funo, inclusive da funo main() . Variveis declaradas dessa forma so chamadas de variveis globais, porque podem ser acessadas de qualquer ponto do programa;
Dentro de uma funo. As variveis declaradas dentro de um funo somente podem ser acessadas de dentro da funo em que foram declaradas. Variveis declaradas dessa forma so chamadas de variveis locais. Isto significa que uma varivel local somente existe enquanto a funo est sendo executada.
Em seguida, temos um exemplo de um programa com variveis locais e globais.
int var_global; //declarao de varivel global (fora das funes)
main() { int tempo, var_local; var_global=3; var_local=5; }
Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 33 O programa, apesar de no produzir nenhum efeito sobre os pinos do microcontrolador, ilustra a forma de declarao de uma varivel global e local. Abaixo da diretiva #use delay temos a declarao de uma varivel do tipo inteiro cujo nome atribudo foi var_global. Essa uma varivel do tipo global, pois est fora de qualquer funo. Dentro da funo main( ) temos a declarao de duas variveis do tipo inteiras, cujos nomes so tempo e var_local. Essas variveis so locais, pois foram declaradas dentro do corpo da funo main( ). As variveis locais devem sempre ser declaradas no incio de cada funo, antes do chamado a qualquer comando. No final da funo main( ) as variveis local e global so carregadas pela atribuio do valor 3 varivel global e do valor 5 varivel local.
4.5 Operadores
Operadores so elementos da linguagem que realizam aes sobre variveis. Podemos classificar os operadores da linguagem C nas categorias principais que seguem abaixo:
Operador de atribuio (igualdade): comum maioria das linguagens, este operador (=) faz a varivel da esquerda assumir o valor da varivel, constante ou expresso da direita. Exemplo:
var = var + 2;
Portanto, o contedo de var aumentado de 2.
Operadores aritmticos: realizam operaes aritmticas sobre os valores das variveis, constantes ou expresses associadas.
Eles avaliam o relacionamento entre duas expresses e do o resultado 1 se verdadeiro ou 0 se falso. Operador Descrio < Menor que <= Menor ou igual > Maior que >= Maior ou igual == Igual != Diferente Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 34
Exemplo:
var = 2; if( var>2 ) var = 3;
Ou seja, o valor de var continua 2. Um lapso comum confundir o operador de comparao (= =) com o operador de igualdade (=). Exemplo:
var = 1; if( var=2 ) var = 3;
E o valor de var ser 3, o que certamente no era esperado. Isso ocorre porque var=2 atribui 2 a var e, desde que foi executado, a expresso retornar um valor verdadeiro para a declarao if, permitindo a execuo da linha seguinte. Portanto, o correto seria
if( var==2 )
Deve ser lembrado que, mesmo sem operadores, a linguagem C considera verdadeiro qualquer valor no nulo. Por exemplo, aps a execuo das linhas
var = 2; if( -50 ) var = 3;
o valor de var ser 3.
Operadores de incremento e decremento
So dois operadores bastante teis para simplificar expresses:
++ (incremento de 1) -- (decremento de 1)
Podem ser colocados antes ou depois da varivel a modificar. Se inseridos antes, modificam o valor antes de a expresso ser usada e, se inseridos depois, modificam depois do uso. Alguns exemplos:
x = 2; var = ++x;
No caso acima, o valor de var ser 3 e o de x ser 3.
Operadores de bits
Manipulam bits em valores inteiros. Nos exemplos a seguir, so considerados dados de 8 bits de valores inteiros e sem sinal.
Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 35
~ (complemento): Atuando em apenas um valor, muda os bits de valor 1 para 0 e vice- versa. Exemplo: se a varivel var tem o valor 170 (10101010), aps ~var, ela ter 85 (01010101).
<< (deslocamento esquerda): Desloca, para a esquerda, os bits do operando esquerdo no valor dado pelo operando direito. Equivale multiplicao pela potncia de 2 dada por este ltimo. Exemplo: se a varivel var tem o valor 3 (00000011), aps var << 2, ela ser 12 (00001100).
>> (deslocamento direita): Desloca, para a direita, os bits do operando esquerdo no valor dado pelo operando direito. Equivale diviso pela potncia de 2 dada por este ltimo. Exemplo: se a varivel var tem o valor 12 (00001100), aps var >> 2, ter 3 (00000011).
& (E): Faz o valor do bit igual a 1 se ambos os bits correspondentes nos operandos so 1 e 0 nos demais casos. Exemplo: se a varivel var tem o valor 12 (00001100) e fazendo a operao com 6 (00000110), o resultado, var & 6, ser 4 (00000100).
^ (OU exclusivo): Faz o valor do bit igual a 1 se apenas um dos bits correspondentes nos operandos 1 e 0 nos demais casos. Exemplo: se a varivel var tem o valor 12 (00001100) e fazendo a operao com 6 (00000110), o resultado, var ^ 6, ser 10 (00001010).
| (OU inclusivo): Faz o valor do bit igual a 1 se um ou ambos os bits correspondentes nos operandos 1 e 0 nos demais casos. Exemplo: se a varivel var tem o valor 12 (00001100) e fazendo a operao com 6 (00000110), o resultado, var | 6, ser 14 (00001110).
Operadores lgicos
Usados normalmente com expresses booleanas, isto , expresses que retornam verdadeiro ou falso (1 ou 0), para fins de testes em declaraes condicionais.
&& (E lgico): Retorna verdadeiro se ambos os operandos so verdadeiros e falso nos demais casos. Exemplo:
if( a>3 && b<4).
|| (OU lgico): Retorna verdadeiro se um ou ambos os operandos so verdadeiros e falso se ambos so falsos. Exemplo:
if( a>3 || b<4).
! (NO lgico): Usado com apenas um operando. Retorna verdadeiro se ele falso e vice-versa. Exemplo:
if( !var ). Notar que essa expresso equivalente a if( var = =0 ).
Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 36 4.6 Declaraes de controle
As declaraes ou comandos de controle so uma parte muito importante de uma linguagem de programao. Podemos classificar as declaraes de controle em duas categorias bsicas:
1. Declaraes de teste condicional: so utilizadas para testar determinadas condies/variveis e executar um cdigo para cada caso. A linguagem C dispe de dois tipos de declaraes condicionais: o comando if-else e o comando switch;
2. Declaraes de estrutura de repetio: so utilizadas para provocar a execuo de um bloco de comandos enquanto uma determinada condio for verdadeira. Em C dispomos de trs declaraes de repetio: for, while e do-while.
4.7 O lao While
O comando while um comando de repetio. Ele possui a seguinte forma geral:
while(condio) { Comando1; Comando2; ... }
A filosofia de funcionamento do comando while : primeiramente a condio avaliada, caso seja verdadeira, ento o comando ou o bloco de comandos associado executado e a condio novamente avaliada, reiniciando o lao. Caso a condio seja falsa, o comando ou o bloco de comandos no executado e o programa tem sequncia a partir da declarao seguinte ao bloco while. A condio testada pelo comando while pode ser qualquer expresso da linguagem C que possa ser avaliada como verdadeira ou falsa. Podemos alterar o programa visto no incio do captulo a fim de fazer com que o LED fique piscando indefinidamente. Para isso, basta introduzir os comandos que esto dentro da funo main( ) em um lao do tipo while. Para que o lao seja indefinidamente repetido, o teste da condio deve resultar sempre num valor verdadeiro. Assim, o programa fica como segue abaixo:
main() { while(true) //lao de repetio { output_high(pin_b0); //seta o pino rb0 delay_ms(500); //aguarda 500ms output_low(pin_b0); //reseta o pino rb0 delay_ms(500); //aguarda 500ms } } Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 37 A palavra true usada entre os parnteses do lao while garante que a condio sempre verdadeira, uma vez que a palavra true, em ingls, significa verdadeiro. A palavra true definida como tendo o valor 1 no arquivo de cabealho .h do dispositivo usado. Assim, os comandos dentro do lao while sero sempre executados na ordem em que aparecem. Imaginemos agora que no desejamos mais que o LED fique piscando indefinidamente, mas gostaramos que ele piscasse apenas uma quantidade de vezes definida, digamos, dez vezes, e em seguida ele deve permanecer aceso. O programa que executa esta funo mostrado abaixo, e uma explicao dada em seguida.
Na linha:
int contador;
temos uma declarao de varivel. Este comando determina que o compilador crie uma varivel do tipo inteiro int chamada contador. Esta operao ir na realidade reservar uma posio na memria RAM do PIC para armazenar valores relativos a essa varivel. Durante a execuo do programa, esse valor pode ser alterado pelo programa, da essa posio ser chamada de varivel. O tipo inteiro int especifica um tipo de dado de 8 bits com valores compreendidos entre 0 e 255 decimal. Em seguida temos a linha:
contador=0;
que se constitui numa operao de atribuio. As atribuies em C so executadas pelo operador de igualdade =. Desta forma, essa linha far com que o compilador gere uma sequncia de instrues para fazer com que o valor zero decimal seja armazenado na posio de memria do PIC nomeada como contador. No lao while, a condio agora que a varivel contador seja menor que dez. Isso verdadeiro, j que a varivel contador possui o valor zero. Assim, o bloco de // Quinto exemplo
int contador; //definio da varivel contador contador=0; //inicializao da varivel com zero
while(contador<10) //lao de repetio { output_high(pin_b0); //seta o pino rb0 delay_ms(500); //aguarda 500ms output_low(pin_b0); //reseta o pino rb0 delay_ms(500); //aguarda 500ms contador=contador+1; }
output_high(pin_b0); //seta o pino rb0 }
Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 38 comandos dentro das chaves executado, fazendo com que o LED acenda, espere 500ms, apague, espere mais 500ms e, depois de feito isso, temos a linha:
contador=contador+1;
que uma operao de atribuio, fazendo com que a varivel contador seja modificada para o valor atual do contador mais uma unidade, ou seja, o contador agora passa a ter o valor de 1, j que antes possua o valor zero. Aps essa instruo, a condio do lao while mais uma vez testada. Nesse caso, o contador possui o valor 1, e menor do que 10, fazendo com que o teste da condio seja verdadeiro (contador<10). Ento, mais uma vez o bloco dentro das chaves executado, fazendo o LED acender e piscar mais uma vez. No final, a varivel contador novamente incrementada, passando a ter o valor 2, j que deve assumir o valor atual mais uma unidade. O teste da condio do lao while feito mais uma vez, resultado em verdadeiro, j que 2<10, e o processo se repete at que a varivel contador assuma o valor 9. Quando a varivel contador assume o valor 10, o teste da condio while no mais verdadeiro, ou seja, 10 no menor do que 10. Com isso, o bloco de comandos dentro do lao while no mais executado, e o programa passa direto para o comando que vem em seguida, que no caso o comando output_high(pin_b0), que seta o pino rb0, fazendo com que o LED se acenda e fique permanentemente aceso. O LED ento piscou dez vezes e em seguida ficou permanentemente aceso, como era o nosso interesse.
4.4 O lao For
O lao for uma das mais comuns estruturas de repetio, sendo a verso em C considerada uma das mais poderosas e flexveis dentre todas as linguagens de programao. O formato geral do lao for :
Cada uma das trs sees do comando for possui uma funo distinta, conforme em seguida:
1. Inicializao: esta seo conter uma expresso vlida utilizada normalmente para inicializao da varivel de controle do lao for; 2. Condio: esta seo pode conter a condio a ser avaliada para decidir pela continuidade ou no do lao de repetio, semelhante ao lao while; 3. Atualizao: esta seo pode conter uma ou mais declaraes para atualizao da varivel de controle do lao.
O funcionamento bsico do comando o seguinte: primeiramente a seo de inicializao do comando executada, em seguida, a condio de teste avaliada e caso seja verdadeira executado o comando ou bloco de comandos compreendido entre as Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 39 chaves. Em seguida a seo de atualizao executada e o lao repetido, voltando a avaliar a condio, no havendo mais inicializao. Ou seja, a inicializao ocorre apenas uma vez, no incio da lao for. O programa anterior poderia ser escrito, sem alterar seu funcionamento, conforme mostrado abaixo:
4.5 O Exemplo do LED Andante
Consideremos que temos 8 LEDS conectados a uma das portas do PIC, digamos a porta B. Ao acender o primeiro LED e fazendo com que o LED aceso se desloque do primeiro ao ltimo, ou seja, se o primeiro est aceso, em seguida apaga-se esse LED enquanto acende-se o segundo, e assim sucessivamente at o oitavo LED, teremos um efeito conhecido como LED andante. Em outras palavras, estaremos fazendo o deslocamento do LED. Ao chegar ao oitavo LED, podemos fazer ainda com que este se desloque no sentido reverso, ou seja, do oitavo para o primeiro LED. A seguir temos uma implementao em C para este problema. Ambas as implementaes utilizam os comandos for e while. As implementaes poderiam ter sido feitos apenas usando o comando for, ou apenas o comando while. critrio do programador escolher qual a opo mais simples, ou a mais clara no que diz respeito ao entendimento do programa. Observe cada um dos cdigos e identifique as semelhanas e diferenas. Verifique como feito o teste no lao for. Verifique ainda qual o artifcio usado para proporcionar o deslocamento do LED nos dois casos. Em ambos os programas ocorre o uso da funo interna output_B(contador). Essa funo envia para os pinos da porta B uma palavra digital de 8 bits correspondente ao valor do argumento, ou seja, o valor da varivel contador. Mais informaes sobre as portas de entrada/sada do PIC sero vistas no prximo captulo. // Quinto exemplo modificado
main() { int contador; //definio da varivel contador int tempo=100;
while(true) { for(contador=1; contador!=128; contador=contador<<1) { output_B(contador); //atualiza a porta B delay_ms(tempo); //aguarda 100ms }
while(contador>1) { output_B(contador); //atualiza a porta B delay_ms(tempo); //aguarda 100ms contador=contador>>1; } } }
Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 41
Portas de Entrada/Sada
Embora o fato dos microcontroladores serem produtos de alta tecnologia, eles acabam ficando sem uso prtico se no forem conectados a outros dispositivos adicionais. O aparecimento de tenso nos pinos do microcontrolador no til se no for para ligar/desligar dispositivos tais como displays, rels, LEDs, etc. Uma das caractersticas mais importantes dos microcontroladores o nmero de entradas e sadas que permitem ao projetista conectar dispositivos de entrada e sada. O PIC16F877 tem 35 pinos de entrada e sada de propsito geral, que mais que suficiente para vrias aplicaes.
5.1 Introduo
Uma das mais importantes caractersticas dos microcontroladores o nmero de pinos de entrada/sada, ou, pinos de I/O (Input/Output). O PIC 16F877 possui 33 pinos de I/O que podem ser configurados para funcionar como entradas e/ou sadas. De modo a fazer com que o funcionamento dos pinos de I/O se adque arquitetura de 8 bits do microcontrolador, os 33 pnos de I/O so agrupados em estruturas fsicas denominadas PORT. O PIC 16F877 possui 5 portas denominadas A, B, C, D e E. Idealmente, cada porta deveria possuir 8 pinos de I/O. Entretanto, devido a algumas limitaes fsicas de hardware, algumas portas so incompletas, possuindo apenas 6 ou mesmo 3 pinos de I/O. Na tabela abaixo encontramos o nmero de pinos de I/O disponveis em cada porta do PIC 16F877.
PORT Nmero de pinos de I/O A 6 B 8 C 8 D 8 E 3
Por razes prticas, a maioria dos pinos de I/O tem vrias funes. Se um pino usado para qualquer uma das funes, ele no pode ser usado para outra. Na verdade, a funo de um pino de I/O pode ser alterada enquanto o microcontrolador estiver em funcionamento, mas o hardware externo ao microcontrolador deve estar preparado para se adequar mudana da nova funcionalidade do pino de I/O. Captulo 5 Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 42 5.2 Componentes adicionais
Esta seo cobre a maioria dos componentes mais utilizados na prtica que se conectam ao microcontrolador, tais como chaves, botes, transistores, LEDs, rels, etc. Chaves e botes de pulso (push-buttons) so provavelmente os mais simples dispositivos que possibilitam a deteco do aparecimento de tenso em um pino do microcontrolador. Entretanto, isto no to simples quanto parece. A razo para isso o que se conhece por bounce, ou oscilao, ou ainda, rudo eltrico.
A oscilao nos contatos de uma chave mecnica um problema comum que deve ser tratado pelo projetista de circuitos com microcontroladores. Esta oscilao causa problemas em alguns circuitos analgicos e digitais, como os microcontroladores, que respondem rapidamente s variaes de tenso em seus pinos. Na figura anterior, por exemplo, temos a representao da tenso em um pino de I/O do PIC, no qual foi conectada uma chave conforme mostra a figura abaixo. Quando a chave est em repouso, ela est fechada e a tenso no pino de I/O de 5V. Ao se pressionar a chave, a tenso no cai para zero volt e permanece l. Em vez disso, ela cai e volta a subir enquanto o chaveamento do contato da chave no se estabilizar. Isso ocorre rapidamente, e quase imperceptvel. Mas no para o microcontrolador, que percebe todas essas variaes de tenso. Assim, por exemplo, ao usar o microcontrolador para contar a quantidade de vezes que uma chave pressionada, podem ocorrer erros devido a tais oscilaes. Este problema pode ser facilmente resolvido simplesmente conectando um circuito RC simples para suprimir essas rpidas mudanas de tenso. Uma vez que o perodo de durao das oscilaes no definido, os valores dos componentes no so precisamente determinados. Em muitos casos, recomendado usar os valores mostrados na figura abaixo.
Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 43 Em adio a esta soluo por hardware, h tambm uma soluo simples por software. Quando o programa testa o estado lgico (nvel de tenso) de um pino de entrada e detecta uma mudana, o teste deve ser feito mais uma vez depois de um certo tempo. Se o programa confirmar a mudana, significa que o boto, ou a chave mudou sua posio, e ento o programa executa a tarefa associada.
5.3 O comando IF e o comando switch na linguagem C
De uma maneira geral, o comando if (ou se em portugus) utilizado para executar um comando ou bloco de comandos no caso de uma determinada condio ser avaliada como verdadeira. Opcionalmente, tambm possvel executar outro comando ou bloco de comandos no caso da condio ser avaliada como falsa. A forma geral do comando if
if(condio) comandoA; else comando B;
Ele pode ser um comando ou declarao qualquer da linguagem C, ou um bloco de comandos na seguinte forma:
Em ambos os casos, a clusula else no obrigatria para o funcionamento do comando. O princpio de funcionamento do comando muito simples: se a condio for verdadeira, ser executado apenas o comandoA (ou o bloco de comandos A). Caso a condio seja avaliada como falsa, ento ser executado apenas o comandoB (ou o bloco de comandos B). Um detalhe muito importante a ser observado que nunca, no mesmo teste, os dois comandos ou blocos de comandos sero executados, apenas um ou outro. Em seguida, observe um exemplo de programa que faz a leitura de teclas e usa o comando if para testar qual das teclas foi pressionada. Nesse programa, o comando input(pin_d0), l o valor de tenso presente no pino d0 (pino 0 da porta D). Se o pino tem 5V, ento a leitura do pino igual a 1, se a tenso no pino for de 0V, ento a leitura no pino igual a 0. A exclamao que vem antes desse comando , conforme foi visto no captulo anterior, um operador lgico de negao. Ele inverte o valor da leitura de tenso no pino. Assim, se o pino tem 5V, ele l como se existisse 0V no pino, e vice versa. Considerando ainda que os botes estejam ligados no PIC conforme a figura anterior, ento, nos pinos d0, d1 e d2 h 5V de tenso. Porm a leitura dos pinos ser feita como 0V, devido ao operador de negao citado anteriormente. Assim, nenhum comando dentro dos comandos if ser executado. Entretanto, ao se pressionar um dos Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 44 botes, a leitura feita como 1, e a o comando dentro do if correspondente ser executado, alterando o valor da varivel value.
Aps a alterao da varivel value, seu contedo enviado porta B atravs do comando output_B(value), fazendo com que os pinos da porta B sejam ativados de acordo com o contedo dessa varivel. Por exemplo, caso o boto conectado ao pino d1 seja pressionado, a varivel value assume o valor 0b00001111, e os pinos da porta B, em seguida, so acionados conforme este valor, ou seja, os quatro primeiros pinos so setados e os quatro ltimos pinos so resetados. Esse valor permanece sendo exibido na porta B por um perodo de 1 segundo, e em seguida a porta B totalmente resetada. Se nenhum boto pressionado, a porta B permanece resetada. O programa ento permanece dentro do loop infinito do lao while, sempre lendo o estado dos pinos dos botesna porta D e atualizando a porta B com o valor correspondente do boto pressionado, ou resetando a porta B caso nenhum boto seja pressionado. Observe que estamos usando 3 pinos da porta D como pinos de entrada, uma vez que estamos lendo o estado desses pinos. Ao mesmo tempo, estamos usando os 8 pinos da porta B como sada, uma vez que neles estamos escrevendo. Em princpio, qualquer pino de qualquer porta pode ser usado como entrada ou sada. A escolha feita automaticamente pelo software. Ao usarmos instrues do tipo input( ), o pino ou a porta correspondente configurado como entrada. Ao usarmos instrues do tipo output( ), o pino ou a porta correspondente configurada como sada. Ao conectarmos LEDs na porta B, podemos observar o valor da varivel value sendo escrito na porta B ao pressionarmos algum dos botes.
Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 45 Poderamos implementar a mesma funo do programa anterior com o uso do comando switch. Em alguns casos, como na comparao de uma determinada varivel a diversos valores diferentes, o comando if pode torna-se um pouco confuso, ou pouco eficiente. A declarao switch permite a realizao de comparaes sucessivas, de uma forma muito mais elegante, clara e eficiente. Vejamos ento o formato geral da declarao switch:
switch(varivel) { case constante1: ComandoA; ... Break; case constante2: ComandoB; ... Break; case constante3: ComandoC; ... Break; default: ComandoZ; ... Break; }
Observe que o valor da varivel testado contra as constantes especificadas pela clusula case. Caso a varivel e a constante possuam o mesmo valor, ento os comandos seguintes quela clusula case sero executados. Caso o valor no encontre correspondentes nas constantes especificadas pelas cases, ento os comandos especificados pela clusula default so executados. Repare que cada sequncia de comandos da clusula case encerrada por uma clusula break. Caso esta clusula seja omitida, ento todos os comandos subseqentes ao case especificado sero executados, at que seja encontrada uma outra clusula break, ou atingindo o final do bloco switch.
while(true) { switch(input_D()) { Case 0b11111110: value=0b11110000; break; Case 0b11111101: value=0b00001111; break; Case 0b11111011: value=0b10101010; break; }
output_B(value); delay_ms(1000); output_B(0); } } Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 46 O comando input_b(), l o valor de tenso presente nos pinos da porta D. O resultado dessa leitura um byte que explicita o estado lgico dos pinos da porta D. Se nenhuma chave est pressionada, ento a leitura dos pinos da porta D 0b11111111, onde todos os pinos esto em 5V. Se o boto do pino d0 for pressionado, ento o valor lido 0b11111110. O comando switch testa ento a possibilidade das chaves em d0, d1 e d2 estarem pressionadas, e executa o programa conforme mostrado anteriormente.
5.4 Rels
Um rel um interruptor eltrico que abre e fecha sob o controle de um outro circuito eltrico. , portanto, ligado aos pinos de sada do microcontrolador e usado para ativar/desativar dispositivos de alta potncia, como motores, transformadores, aquecedores, lmpadas, etc. Estes dispositivos so quase sempre colocados longe de componentes sensveis. Existem vrios tipos de rels, mas todos eles funcionam da mesma maneira. Quando a corrente flui atravs da bobina, o rel operado por um eletrom para abrir ou fechar um ou mais conjuntos de contatos. Similarmente aos acopladores pticos, no h nenhuma conexo galvnica (contato eltrico) entre os circuitos de entrada e sada. Rels normalmente demandam uma maior tenso e corrente mais alta para iniciar a operao, mas h tambm aqueles em miniatura que podem ser ativados por baixa corrente obtidas diretamente de um pino do microcontrolador.
A figura a seguir mostra a soluo mais comumente empregada para se conectar um rel a pino do microcontrolador.
Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 47 Uma vez que as correntes e tenses fornecidas diretamente nos pinos de sada de um microcontrolador so normalmente bem pequenas, isso poderia ser insuficiente para ativar diretamente o rel. Assim, o transistor T1 utilizado como driver para ativar o rel. A fim de prevenir o aparecimento de alta tenso, auto-induo, causada por uma interrupo brusca do fluxo de corrente atravs da bobina, um diodo inversamente polarizado, chamado diodo de roda livre, ligado em paralelo com a bobina. O objetivo deste diodo "cortar" o pico de tenso. Como exerccio de aplicao, deixado o seguinte desafio:
Implementar o hardware e desenvolver o software para uma fechadura eletrnica codificada. A estrutura de hardware e software deve obedecer aos seguintes critrios:
8 chaves devem ser conectadas porta D. 1 rel deve ser conectado no pino b1. 1 LED vermelho deve ser conectado nopino b2. As chaves sero usadas como interface com o usurio. por elas que a senha deve ser inserida no circuito. Escolha uma senha de 4 dgitos apropriada. Se a senha digitada nas chaves for a correta, ento o rel deve ser ativado para liberar a fechadura. Se a senha estiver errada, ento o led vermelho deve acender, indicando ao usurio que a senha fornecida est incorreta. Aps 3 segundos, o led se apaga e o usurio pode entrar com uma nova tentativa de acesso.
Outras implementaes podem ser feitas a seu critrio. Por exemplo, se aps 3 tentativas de acesso o usurio no obtiver sucesso, a fechadura deve ser bloqueada durante algum tempo, para evitar novas tentivas de acesso. Alm disso, aps uma tentativa falha, alm do LED vermelho ser ativado, um pequeno beep pode ser emitido atravs de um buzzer conectado em algum outro pino de I/O. Como foi dito anteriormente, os pinos de I/O do PIC16F877 possui diversas funes, que vo muito alm de simples entradas e sadas. Por exemplo, existem pinos que fornecem sinais PWM para o controle de velocidade de motores, intensidade luminosa de lmpadas incandescentes. Existem outros pinos responsveis por fazer a comunicao do PIC com outros PICs, ou ainda do PIC com um microcomputador. Existem tambm pinos que so responsveis por tratar sinais analgicos conectados ao microcontrolador, entre outros. Essas funcionalidades especiais sero avaliadas nos prximos captulos. Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 48
LCD e Displays de 7 Segmentos
Um display de sete segmentos um tipo de display (mostrador) barato usado como alternativa a displays de matriz de pontos, mais complexos e dispendiosos. Displays de sete segmentos so comumente usados em eletrnica como forma de exibir uma informao numrica sobre as operaes internas de um dispositivo. Uma evoluo dos displays de 7 segmentos so os displays alfanumricos, que podem exibir nmeros e letras. Atualmente, os displays de cristal lquido alfa-numrico so a melhor opo como interface de exibio de sada.
6.1 Displays de 7 segmentos
Um display de sete segmentos, como seu nome indica, composto de sete elementos (LEDs), os quais podem ser ligados ou desligados individualmente. Eles podem ser combinados para produzir representaes simplificadas de algarismos arbicos. Freqentemente, os sete segmentos so dispostos de forma oblqua ou itlica, o que melhora a legibilidade. Os sete segmentos so dispostos num retngulo com dois segmentos verticais em cada lado e um segmento horizontal em cima e em baixo. Em acrscimo, o stimo segmento bissecta o retngulo horizontalmente. Tambm existem displays de catorze segmentos e de dezesseis segmentos (para exibio plena de caracteres alfanumricos; todavia, estes tm sido substitudos em sua maioria por displays de matriz de pontos, ou LCDs alfanumricos) Para simplificar as conexes, os anodos, ou catodos, de todos os segmentos so conectados a um terminal comum do display. Assim, dependendo de quais terminais dos diodos so conectados em comum, temos displays de anodo comum e displays de catodo comum. Os segmentos de um display de sete segmentos so definidos pelas letras de A a G, conforme indicado na figura 6.1, onde o ponto decimal opcional DP (um "oitavo segmento") usado para a exibio de nmeros no-inteiros. Captulo 6 Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 49
Figura 6.1 - Display de 7 segmentos e sua representao.
Displays de sete segmentos podem usar LCD, matrizes de LEDs e outras tcnicas de controle ou gerao de luz, tais como descarga de gs de catodos frios, vcuo fluorescente, filamentos incandescentes, entre outros. Para totens de preos em postos de combustvel e outros painis de grande porte, segmentos refletores de luz eletromagneticamente acionveis ainda so comumente utilizados. Um fato decepcionante que indica que o microcontrolador apenas um tipo miniaturizado de computador, projetado para s entender a linguagem de zeros e uns, expresso plenamente ao tentar exibir qualquer dgito. Ou seja, o microcontrolador no sabe o que so unidades, dezenas ou centenas, nem tampouco conhece a aparncia dos dez dgitos que estamos acostumados a usar no sistema arbico. A formao e exibio dos caracteres so feitas acionando-se determinados segmentos e apagando-se outros. Por esta razo, cada nmero a ser apresentado deve seguir alguns procedimentos: Antes de tudo, um nmero de mltiplos dgitos deve ser dividido em unidades, dezena, centenas, etc. Ento, cada um destes dgitos deve ser armazenado em bytes especficos. Os dgitos obtm aparncia reconhecvel atravs da realizao de um processo chamado "mascaramento". Em outras palavras, o formato binrio de cada dgito substitudo por uma combinao diferente de bits. Por exemplo, o nmero de 8 bits (0b0000 1000) substitudo pelo nmero binrio 0b01111111, a fim de ativar todos os LEDs, exibindo o dgito 8. O nico bit remanescente inativo aqui reservado para o ponto decimal. Se uma porta do microcontrolador conectado ao display de tal forma que o bit 0 ativa o segmento a, o bit 1 ativa o segmento b, e assim sucessivamente, ento a tabela abaixo mostra a mscara para cada dgito, considerando que o display seja do tipo catodo comum. Para displays do tipo anodo comum, todos os uns (1) da tabela devem ser substitudos por zeros (0), e vice versa. O termo PD o ponto decimal.
Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 50 Um exemplo de aplicao mostrado na figura 6.2, onde o nmero 5, em binrio, mascarado com o valor 0b01101101 e em seguida exibido no display de 7 segmentos.
Figura 6.2 Mascaramento e exibio do dgito 5 no display de sete segmentos.
Um circuito de controle para um display de sete segmentos mostrado na figura abaixo. Os resistores de 470R limitam a corrente que circula pelos LEDs de cada segmento do display.
Na pgina seguinte, temos um exemplo simples de decodificao do display de sete segmentos. O programa exibe, continuamente, os dgitos decimais de 0 a 9, sequencialmente, espaados por um intervalo de 1 segundo, criando uma espcie de contador. Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 51
Percebe-se que so necessrios 7 terminais do microcontrolador para fazer o correto controle de cada display. Imagine ento a situao em que necessrio fazer o controle de 4 displays. Seriam ento necessrios 28 terminais para fazer o controle. Entretanto, existe uma tcnica de multiplexao de displays que consiste em usar os mesmos 7 terminais para todos os displays, alm de usar terminais extras para selecionar um dos displays por vez. Esta uma tcnica que se beneficia de uma propriedade do olho humano, chamada persistncia luz, para criar uma iluso de tica. Assim, se a seleo do display for suficientemente rpida, o efeito obtido como se os 4 displays estivessem ligados ao mesmo tempo, embora apenas um esteja ativo. Um circuito que executa tal tarefa mostrado na figura 6.3. Aqui est uma explicao sobre o funcionamento deste circuito:
* Inicialmente, um byte representando as unidades enviado ao PORT2 o transistor T1 ativado ao mesmo tempo. Depois de um curto intervalo de tempo o transistor T1 desligado, um segundo byte, representando as dezenas, enviado ao PORT2 e o transistor T2 ativado. Esse processo repetido ciclicamente em alta velocidade para todos os dgitos e transistores correspondentes.
Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 52
Figura 6.3 Multiplexao de quatro displays de sete segmentos.
6.2 Matrizes de dados
Uma matriz um conjunto de dados homogneos referenciado por um identificador nico. Por dados homogneos entendem-se variveis ou dados do mesmo tipo. Assim, uma matriz ser um conjunto de variveis ou dados do mesmo tipo e referenciados por um nico identificador. A linguagem C suporta a criao de matrizes unidimensionais at matrizes multidimensionais. No nosso cotidiano, estamos acostumados a trabalhar com diversos tipos de matrizes: unidimensionais, como, por exemplo, listas (uma lista de nomes), bidimensionais (como um tabuleiro de xadrez, ou uma planilha de dados) e as multidimensionais com trs ou mais dimenses. Para declarar uma matriz na linguagem C, utilizamos os colchetes [ ]. Uma matriz declara da seguinte forma:
tipo_de_dado nome_da_matriz[tamanho];
tipo_de_dado um especificador do tipo de dado utilizado em cada um dos elementos da matriz. Podemos criar matrizes com qualquer dos tipos de dados disponveis em C. nome_dd_matriz um identificador da matriz. Todas as referncias matriz sero realizadas pelo uso deste identificador. tamanho o nmero de elementos que pode ser armazenado na matriz.
Vejamos o exemplo em seguida: Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 53 int nota[40]; //define uma matriz de 40 nmeros inteiros char nome[20]; //define uma matriz de 20 caracteres long int outra[5]; //define uma matriz de 5 nmeros do tipo long int
Ao declarar uma varivel do tipo matriz, o compilador reserva espao na memria RAM do microcontrolador para armazenas aquelas variveis ou dados. Vejamos a representao grfica da matriz outra:
outra[0] outra[1] outra[2] outra[3] outra[4]
O primeiro elemento da matriz acessado pela declarao outra[0] e o ltimo elemento pela declarao outra[4]. Em C, o primeiro elemento de uma matriz sempre o de ndice zero.
Poderamos reescrever o programa anterior atravs do uso de matrizes. Vejamos ento o programa reescrito.
// Decodificao de display de 7 segmentos com uso de matrizes
while(true) { output_B(tabela[value]); delay_ms(1000); ++value; if(value>9) value=0; } } Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 54 No corpo do programa, antes da funo main( ), temos uma declarao de uma matriz de constantes. Constantes so valores (numricos ou no) fixos e que no podem ser alterados pelo programa durante a sua execuo. Uma constnate declarada precedida da palavra reservada const. A diferena entre uma varivel e uma constante que nas variveis, o contedo pode ser alterado durante a execuo do programa, enquanto que nas constantes isso no ocorre. Outra diferena prtica que as variveis so armazenadas na memria RAM e as constantes so armazenadas na memria de programa do microcontrolador. Uma vez que a memria RAM de pequeno tamanho, o uso de constantes ajuda o programador a economizar espao em memria. A constante tabela do tipo int e possui 10 elementos, referenciados como tabela[0] at tabela[9]. Alm da declarao da matriz, esse comando tambm faz a inicializao dessa matriz, ou seja, define os valores armazenados em cada elemento da matriz. Por exemplo, o elemento tabela[0] iniciado com o valor 0b00111111. Ao analisarmos os 10 valores armazenadas na matriz tabela, podemos perceber que se tratam das mscaras dos dez dgitos decimais para o display de sete segmentos. Na funo main( ), inicialmente declarada uma varivel do tipo int chamada value. Essa varivel inicializada com o valor 0. No lao while, estamos escrevendo na porta B o contedo do elemento da tabela referenciado pela varivel value. Ou seja, inicialmente, o comando output_B(tabela[value]) escreve na porta B o valor tabela[0], que no caso a mscara do dgito 0. Em seguida, espera-se um segundo, a varivel value incrementada, assumindo o valor 1 e um teste if feito para verificar se a varivel value maior que 9. Como a varivel value no maior que 9, o programa volta a escrever na porta B o valor tabela[value], que agora tabela[1], ou seja, a mscara do dgito 1. Isso se repete at que sejam escritos as 9 mscaras dos dgitos decimais na porta B. Nesse instante, o teste if resulta em verdadeiro, pois aps o ltimo incremento da varivel value ela assume o valor 10, fazendo com que o comando value=0 seja executado, e ento todo o processo repetido.
* Como exerccio de aplicao, altere o programa anterior para que o display exiba sequencialmente todos os dgitos hexadecimais. * Altere tambm o programa anterior para que sejam exibidos sequencialmente, em dois displays distintos, todos os dgitos hexadecimais, segundo o critrio: em um dos displays, a exibio deve ser na ordem crescente. No outro display, a exibio deve ser em ordem decrescente.
6.3 Displays de Cristal Lquido (LCD)
Este componente fabricado especificamente para ser usado com microcontroladores, o que significa que no pode ser ativado por circuitos discretos comuns. O modelo aqui descrito devido ao seu baixo preo e grande capacidade e o mais utilizada na prtica. baseado no controlador de displays HD44780 (Hitachi), ou equivalentes, e podem exibir mensagens em duas linhas com 16 caracteres cada. Ele pode exibir todas as letras do alfabeto, letras gregas, sinais de pontuao, smbolos matemticos, etc Tambm possvel exibir smbolos feitos pelo usurio. Outras caractersticas teis incluem mudana automtica de mensagem (esquerda e direita), diodo emissor de luz de fundo (backlight), etc.
Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 55
Este LCD pode exibir duas linhas com 16 caracteres cada. Cada caractere composto por 5x8 ou 5x11 pontos.
O contraste da tela depende da tenso de alimentao e se as mensagens so exibidas em uma ou duas linhas. Por esta razo, variando a tenso de 0-VCC aplicada ao pino identificado como VEE, variamos o contraste do display. Um trimpot normalmente usado para este fim. Alguns dos displays LCD tm embutido o backlight (LEDs de cor azul ou verde). Quando usado durante a operao, um resistor limitador de corrente deve ser conectado em srie a um dos pinos para a fonte de luz de fundo (semelhante ao dodos LED). O circuito de controle do contraste e do backlight mostrado abaixo.
Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 56 Dependendo de quantas linhas so usadas para conectar um LCD com o microcontrolador, existem os modos de 8 bits e o de 4-bits. O modo apropriado selecionado no incio da operao no processo chamado de "inicializao". O modo de 8 bits usa as linhas D0-D7 para transferir dados para o LCD. O objetivo principal do modo de 4 bits economizar pinos do microcontrolador. Apenas os 4 bits superiores (D4-D7) so usados para a comunicao, enquanto os outros podem ser deixados desligados. A inicializao permite que o LCD ligue e interprete os bits recebidos corretamente. O circuito completo de controle de um LCD no modo de 4 bits mostrado abaixo.
Os demais terminais (RS, R/W e E) mostrados na figura acima so usados no controle da comunicao com o LCD. Para a utilizao do display necessrio usarmos funes especiais que fazem todo o controle da comunicao com o display e permitem a escrita no LCD. Essas funes especiais devem ser includas no programa atravs da diretiva #include, conforme se pode ver no exemplo abaixo.
printf(exibe_lcd,"\f CURSO DE PIC \n PIC 16F877"); delay_ms(2000); printf(exibe_lcd,"\f Escrita no LCD "); while(true); } Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 57 As funes referentes ao controle do LCD esto dentro do arquivo chamado LCD_BLIO.h, e foram includas no programa com a diretiva #include. A funo ini_lcd_16x2() deve sempre ser chamada ao usarmos LCDs, pois esta inicia o LCD, preparando-o para receber textos do microcontrolador. Essa funo pertence biblioteca de funes especiais contidas no arquivo LCD_BLIO. Basicamente, ela faz com que o microcontrolador envie comandos de inicializao ao LCD. A forma como esses comandos devem ser enviados pode ser verificada no manual do display. A funo printf(exibe_lcd,"\f CURSO DE PIC \n PIC 16F877A") escreve no LCD o texto que est entre as aspas. A funo printf uma funo interna do compilador. Essa no faz parte da biblioteca LCD_BLIO.h. Entretanto, essa funo opera em conjunto com uma funo interna biblioteca LCD_BLIO.h (funo exibe_lcd). Existem alguns caracteres especiais que no so visveis no display, mas que servem para controlar a escrita de textos no LCD. No exemplo anterior, os caracteres \f e \n so caracteres especiais que no sero impressos no LCD. Tais caracteres so conhecidos como cdigos de barra invertida Os cdigos mais comumente utilizados esto mostrados abaixo:
Caractere especial Funo \f Apaga o que est escrito no LCD \n Pula para a prxima linha \t Insere um espao de tabulao \ Escreve o caractere
* Altere o programa acima para que o LCD exiba o seu nome no centro da primeira linha, espere um segundo, e em seguida apague seu nome e reescreva-o no centro da segunda linha, permanecendo executando estas aes em um loop infinito. Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 58
Conversores Analgico-Digitais
Alm de um grande nmero de linhas de entrada/sada usado para comunicao com perifricos, o PIC16F877 contm 8 entradas analgicas. Eles permitem que o microcontrolador reconhea no apenas se um pino est em lgica zero ou um (0 ou 5 V), mas tambm permitem medir com preciso a sua tenso e convert-la em valor numrico, ou seja, o formato digital.
7.1 Conversores Analgico/Digitais
O conversor analgico-digital (frequentemente abreviado por conversor A/D ou ADC) um dispositivo eletrnico capaz de gerar uma representao digital a partir de uma grandeza analgica, normalmente um sinal representado por um nvel de tenso ou intensidade de corrente eltrica. Os ADCs so muito teis na interface entre dispositivos digitais (microprocessadores, microcontroladores, DSPs, etc) e dispositivos analgicos e so utilizados em aplicaes como leitura de sensores, digitalizao de udio e vdeo, etc. Por exemplo, um conversor A/D de 10 bits, preparado para um sinal de entrada analgica de tenso varivel de 0V a 5V pode assumir os valores binrios de 0 (0000000000) a 1023 (1111111111), ou seja, capaz de capturar 1024 nveis discretos de um determinado sinal. Se o sinal de entrada do suposto conversor A/D estiver em 2,5V, por exemplo, o valor binrio gerado ser 512. O mdulo conversor analgico digital do PIC16F877 tem as seguintes caractersticas:
O conversor gera um resultado binrio de 10 bits usando o mtodo de aproximaes sucessivas e armazena os resultados das converses; H 8 entradas analgicas individuais multiplexadas; A resoluo mnima ou a qualidade da converso pode ser ajustada s vrias necessidades selecionando as tenses de referncia Vref- e Vref +.
Considerando que as tenses de referncia para a converso so 0V e +5V, o conversor A/D tem o comportamento mostrado no grfico a seguir, onde no eixo Y temos a tenso analgica presente em uma das entradas do conversor e no eixo X temos os valores binrios fornecidos pelo conversor. Captulo 7 Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 59
A grosso modo, a medio de tenso no conversor baseada na comparao da tenso de entrada com uma escala interna, que tem 1024 pontos (2 10 = 1024). A marca mais baixa da escala representa a tenso de referncia inferior Vref-, enquanto que a sua maior marca representa a tenso de referncia superior Vref+. A figura abaixo mostra as tenses de referncia selecionveis, bem como os valores mnimo e mximo.
O uso do conversor A/D bem simples, sendo um dos perifricos mais simples de serem utilizados nos microcontroladores. Para exemplificar o uso do conversor A/D, consideraremos o exemplo mostrado a seguir que faz a medio de temperatura ambiente atravs do sensor LM35.
Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 60
Na segunda linha do programa anterior temos a diretiva #device ADC=10, que especifica que o conversor A/D ir fornecer o resultado da converso em 10 bits. O conversor pode fornecer o resultado com uma quantidade menor de bits, acelerando o processo de converso, porm deixando o sistema menos preciso. Na funo principal temos a declarao de duas variveis. A primeira do tipo long int, que capaz de armazenar valores inteiros de 16 bits, ou seja, capaz de armazenar valores de 0 at 65535. A segunda do tipo float, ou ponto flutuante. Essa varivel capaz de armazenar valores negativos e positivos com pontos decimais. A instruo setup_adc(adc_clock_internal) indica ao microcontrolador que o conversor A/D vai trabalhar com o clock interno. Para que o conversor A/D realize a converso, necessrio um sinal de clock. O PIC16F877 permite selecionar outras fontes de clock. A instruo setup_adc_ports(AN0) indica que apenas a entrada analgica A0 vai ser usada pelo conversor. A instruo setup_adc_channel(0) seleciona o canal 0 (pino A0) para fazer a leitura analgica. Dentro do loop infinito, a primeira instruo a leitura do conversor A/D pela funo read_adc( ). O microcontrolador faz a converso do valor analgico presente no pino A0 e armazena o resultado na varivel valor. Nesse momento, a varivel valor possui um nmero compreendido entre 0 e 1023, uma vez que o valor binrio resultante da converso de 10 bits. Como a sada do conversor um nmero binrio proporcional tenso medida, e no o prprio valor binrio da tenso, necessrio utilizar tcnicas conhecidas como escalonamento, de forma a calcular o valor equivalente entrada do conversor. O #include <16f877A.h> #device ADC=10 #fuses HS #use delay(clock=20M) #include "LCD_BLIO.h"
void main() { unsigned long int valor; //armazena o valor lido do conversor float temperatura; //armazena a temperatura atual
ini_lcd_16x2(); printf(exibe_lcd,"\f Medio de\n Temperatura"); delay_ms(2000); setup_adc(adc_clock_internal); setup_adc_ports(AN0); set_adc_channel(0);
//Loop infinito
while(true) { valor=read_adc(); temperatura=((int32)valor*500/1023); printf(exibe_lcd,"\f Temp= %1.1f", temperatura); delay_ms(1000); } } Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 61 escalonamento feito pelo clculo mostrado na atribuio da varivel temperatura. Esse escalonamento ser explicado mais detalhadamente em seguida. Assim, a varivel temperatura agora possui o valor da temperatura atual. Para finalizar, o valor da temperatura atual mostrado no LCD com o uso da funo printf(exibe_lcd,"\f Temp= %1.1f", temperatura), com taxa de atualizao de um segundo. Observe na funo de escrita do LCD que a impresso do valor da temperatura tem um formato especfico. Quando o programador deseja imprimir o valor numrico de uma varivel, esse valor deve ser formatado conforme est mostrado na funo. O termo %1.1f especifica ao compilador que substitua esse termo pelo valor numrico da varivel explicitada no final da funo printf, que no caso a varivel temperatura. O f no final desse termo especifica que a impresso deve ocorrer no formato float, levando-se em considerao o ponto decimal. Alm disso, os nmeros 1.1 indicam ao compilador que a impresso deve ser feita com apenas um dgito aps o ponto decimal. O circuito que implementa a funo de leitura de temperatura ambiente mostrado na figura abaixo.
O sensor LM35 um sensor de temperatura que fornece 10mV/C. Assim, se a tenso de sada fornecida por ele de 0V ento a temperatura ambiente de 0C, e se a tenso de sada for de 5V, a temperatura ambiente ser de 500C. Essa tenso fornecida pelo LM35 ligada ao pino A0 do PIC, que a entrada analgica para o conversor A/D. A relao entre a tenso fornecida pelo sensor, o valor lido pelo conversor A/D e o valor da temperatura mostrado abaixo:
0 mV 5V 0 1023 0 C 500C X T Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 62 Analisando a relao acima, consegue-se chegar a concluso que T=(500*X)/1023, que a relao existente entre o valor lido pelo conversor A/D e o valor da temperatura atual, ou seja, esse deve ser o escalonamento feito para que o LCD exiba corretamente o valor de temperatura ambiente. A varivel valor convertida para 32 bits, atravs do prefixo (int32) para que o microcontrolador possa efetuar o clculo corretamente, sem truncamentos ou perda de preciso.
* Modifique o programa anterior para que o mesmo exiba um alarme quando a temperatura for superior a 100C. * Modifique o programa anterior para que o mesmo exiba uma mensagem de zona segura quando a temperatura estiver entre 30C e 40C, zona inferior quando abaixo de 30C e zona de perigo quando acima de 40C. Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 63
Memria EEPROM interna e Interrupes
A memria EEPROM interna uma poderosa ferramenta de armazenamento no PIC 16F877. Essa memria garante o armazenamento permanente de dados, mesmo na falta de energia, o que garante continuidade de operao em sistemas que precisam voltar a operar automaticamente aps o restabelecimento de energia. As interrupes so tambm outra ferramenta poderosa que permitem que o microcontrolador realize outras tarefas enquanto espera por um evento especfico.
8.1 Memria EEPROM Interna
Em alguns casos, existe a necessidade do armazenamento permanente de dados referentes ao processo que se deseja controlar, mesmo com a falta de energia. Por exemplo, em uma fechadura eletrnica codificada, ao se cadastrar uma senha deseja-se que esta senha no seja esquecida pelo sistema no caso de uma falta de energia. Isso garante que, aps o restabelecimento da alimentao do microcontrolador, o sistema volte a operar normalmente, tendo como base a senha previamente cadastrada. Essa senha deve ser armazenada na memria EEPROM interna. A memria EEPROM interna possui 256 bytes que podem ser usados livremente pelo projetista. Para escrever um dado em uma posio de memria qualquer usa-se a instruo write_eeprom(endereo,dado), onde endereo um nmero de 0 a 255, correspondendo ao endereo de memria no qual se deseja escrever algo, e dado um valor de 8 bits, correspondendo informao que se deseja armazenar. Para ler uma palavra em uma posio de memria qualquer usa-se a instruo read_eeprom(endereo), onde endereo um nmero de 0 a 255, correspondendo ao endereo de memria no qual se deseja ler o seu contedo. O exemplo a seguir faz a leitura de 6 chaves. Quatro delas (SW1 a SW4) so usadas como entrada de senha, as outras duas realizam a operao de escrita e leitura na memria EEPROM interna. Ao ser pressionada a chave escrever, o estado das chaves SW armazenado na memria EEPROM. Ao ser pressionada a chave ler, o estado das chaves, gravado na memria, exibido nos 4 leds conectados porta D.
Captulo 8 Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 64 O circuito usado mostrado na figura abaixo, e o programa mostrado em seguida.
output_D(0); } } Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 65 No programa, temos uma nova diretiva do compilador, a diretiva #define. Essa diretiva informa ao compilador para substituir o identificador pelo texto especificado imediatamente depois dele. No exemplo do programa, a primeira diretiva #define substituir todas as ocorrncias do identificador LER pelo texto input(pin_b1), j a segunda diretiva substituir todas as ocorrncias do identificador ESCREVER pelo texto input(pin_b0). Na funo principal, percebe-se que foram usados os identificadores LER e ESCREVER nos comandos if. Esta diretiva pode ser utilizada para criar substituies simples de texto, ou ainda para a criao de macro comandos em linguagem C. O programa testa continuamente se alguma das chaves, ler ou escrever foi pressionada. O comando if(LER) testa se a chave ler foi pressionada. Caso essa chave tenha sido pressionada, o bloco de comandos seguinte ao if executado. Inicialmente ocorre a leitura da porta B, que l o estado das chaves SW1 a SW4, alm do prrpio estado das chaves ler e escrever, pois estas chaves tambm esto conectadas porta B. O resultado da leitura armazenado na varivel valor. Para levar em considerao apenas o estado das chaves SW, o programa executa a operao valor=valor & 0b00111100. Essa operao faz um AND bit a bit com o valor binrio 0b00111100 e a varivel valor. Isso mascara o estado das chaves ler e escrever, fazendo com que a varivel valor assuma o contedo 0b00XXXX00, onde XXXX representa o estados das chaves SW. Em seguida, esse valor deslocado dois bits direita, passando ento a varivel valor a assumir o contedo binrio 0b0000XXXX. Finalmente, esse contedo escrito no endereo 0 (zero) da memria EEPROM com o uso do comando write_eeprom(0, valor). O comando if(ESCREVER) testa se a chave escrever foi pressionada. Caso essa chave tenha sido pressionada, o bloco de comandos seguinte ao if executado. Inicialmente ocorre a leitura do contedo do endereo 0 (zero) da memria EEPROM pelo uso do comando valor=read_eeprom(0). A varivel valor assume o contedo dessa posio de memria. Finalmente, o contedo da varivel valor escrito na porta D. O contedo da varivel valor exatamente o ltimo estado lido das chaves SW. O comando while(LER) faz com que o programa fique parado nessa linha enquanto a chave ler estiver pressionada.
8.2 Interrupes
Como o prprio nome sugere, uma interrupo serve para interromper imediatamente o fluxo regular de um programa. Desta maneira, podemos tomar atitudes instantneas. As interrupes so aes tratadas diretamente pelo hardware, o que as tornam muito rpidas e disponveis em qualquer ponto do sistema. Assim sendo, quando uma interrupo acontece, o programa paralisado, uma funo especfica (definida pelo programador) executada e depois o programa continua a ser executado no mesmo ponto em que estava. Interrupes de hardware foram introduzidas como forma de evitar o desperdcio de tempo valioso do processador em polling loops, a espera de eventos externos. Por exemplo, quando voc pressiona um boto em um controle remoto, o microcontrolador registrar essa ao e responder mudando o canal ou aumentando o volume, etc. Se o microcontrolador gastar a maior parte do tempo verificando se cada um dos botes foi pressionado, isso no seria nada prtico. Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 66 Existem diversas fontes de interrupo que podem ser habilitadas no PIC 16F877. Apenas para citar algumas, podemos destacar as interrupes dos timers (temporizadores), interrupes de fim de escrita na memria EEPROM, interrupes de fim de converso no mdulo conversor A/D, interrupes de mudana de estado em alguns pinos do microcontrolador, etc.
8.3 Interrupo externa em RB0
Essa interrupo gerada por um sinal externo ligado a um pino especfico do PIC, que no caso o pino RB0. Desta maneira, podemos identificar e processar imediatamente um sinal externo. Ela utilizada para diversas finalidades, como, por exemplo, a comunicao entre microcontroladores, garantindo sincronismo, o reconhecimento de um boto ou outro sinal do sistema que necessite de uma ao imediata. O pino RB0 a nica fonte de interrupo externa verdadeira. A interrupo ocorre quando h uma mudana de nvel lgico nesse pino, e identificada pela borda de transio do sinal. Ela pode ser configurada para reagir a uma borda de subida (transio do nvel baixo para nvel alto), ou a uma borda de descida (transio do nvel alto para o nvel baixo). O exemplo a seguir caracteriza o uso desse tipo de interrupo. O circuito usado mostrado na figura abaixo. O programa faz com que um LED ligado em RD0 fique oscilando com uma frequncia de 2 Hz. Ao ser pressionada a chave ligada em RB0 (fonte da interrupo), o programa altera o estado lgico do pino RD1, fazendo com que o LED ligado a esse pino tambm altere o seu estado a cada pressionamento da chave.
Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 67
A instruo ext_int_edge(L_TO_H) especifica qual a borda do sinal externo vai caracterizar a interrupo. Nesse caso, a borda do tipo L_TO_H, ou seja, Low To High (nvel baixo para o nvel alto). Isso ocorre quando o boto pressionado. A instruo enable_interrupts(int_ext) habilita a interrupo externa. A instruo enable_interrupts(global) permite que todas as interrupes previamente habilitadas ocorram. No caso, habilitamos apenas a interrupo externa em RB0. A execuo do programa permanece todo o tempo dentro do lao while, que permite a oscilao do estado do LED ligado em RD0. Ao ocorrer uma transio do nvel lgico baixo para o alto em RB0 (que ocorre ao pressionarmos a chave em RB0), o programa pra o fluxo de execuo do lao while e executa a funo especificada logo em seguida diretiva #INT_EXT, que especifica ao compilador que a prxima funo deve ser executada quando ocorrer uma interrupo em RB0. Cada tipo de interrupo possui uma diretiva especfica. A funo especificada a funo altera_estado( ). Essa funo poderia receber qualquer nome. O corpo da funo chama a funo interna output_toggle(pin_d1), que faz com que o estado lgico do pino D1 se inverta, fazendo com que o LED conectado a esse pino tambm inverta seu estado a cada execuo da funo, ou seja, a cada pressionamento da chave em RB0.
* Modifique o primeiro programa deste captulo para que no seja necessrio fazer com que o microcontrolador fique continuamente lendo se as chaves ler ou escrever foram pressionadas. Enquanto nenhuma chave for pressionada, o microcontrolador deve ficar oscilando um LED conectado ao pino RD7 com uma frequncia de 4 Hz. #include <16F877A.h> #fuses HS #use delay(clock=20M)
void altera_estado() { output_toggle(pin_d1); } Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 68
Timers Internos
O oscilador do microcontrolador utiliza cristal de quartzo para a gerao do sinal de clock para o seu funcionamento. Embora esta no seja a soluo mais simples, existem muitas razes para us-la. A freqncia de osciladores com cristais de quartzo precisamente definida e muito estvel, de modo que gera pulsos sempre da mesma largura, o que os torna ideais para a medio do tempo. Tais osciladores tambm so usados em relgios de quartzo. Se for necessrio medir o tempo entre dois eventos, basta contar a quantidade de pulsos gerados por este oscilador no intervalo desejado. Isto exatamente o que os timers internos ao microcontrolador fazem.
9.1 Introduo
A maioria dos programas usa uma espcie de relgio em miniatura. Na prtica, esses relgios, conhecidos como timers, ou ainda contadores, so na verdade registradores de 8 ou 16 bits cujo contedo automaticamente incrementado por cada pulso do oscilador do microcontrolador. Uma vez que o contedo do registrador estiver completamente preenchido, um evento de interrupo pode ser gerado, a fim de executar uma determinada ao. Se o timer usa um oscilador de quartzo para o seu funcionamento interno, ento ele pode ser usado para medir o tempo entre dois eventos (se o valor do registrador T1 no momento em que se inicia a medio, e T2, no momento em que termina, ento o tempo decorrido igual a o resultado da subtrao T2-T1). Se os registradores usam pulsos provenientes de fontes externas conectados a um pino do microcontrolador, ento o timer transformado em um contador. Obviamente, o mesmo circuito eletrnico, capaz de operar em dois modos diferentes. A nica diferena que neste caso os pulsos a serem contados provm de um pino de entrada do microcontrolador e sua durao (largura) mais indefinida. por isso que eles no podem ser usados para medir o tempo, mas para outros fins, tais como contagem de produtos em uma linha de montagem, o nmero de rotao do eixo de um motor, etc (dependendo do sensor em uso). Na prtica, os impulsos gerados pelo oscilador de quartzo so levados para o circuito que incrementa o nmero armazenado no registrador associado ao timer. Estes pulsos podem ser levados diretamente, uma vez por cada ciclo de mquina, ou ainda atravs de um divisor. Por exemplo, Se um clico de mquina tem a durao de quatro perodos do oscilador de quartzo, funcionando a 4Mhz, ento, o contador ser incrementado um milho de vezes por segundo. A figura 9.1 mostra de forma simplificada como funciona um timer interno ao microcontrolador.
Captulo 9 Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 69
Figura 9.1 Operao dos timers internos.
A figura mostra que os pulsos do oscilador de 4Mhz, usado como exemplo, so divididos por 4, referente a quantiodade de pulsos necessria execuo de cada ciclo de mquina. Assim, aps essa diviso, temos pulsos a uma frequncia de 1Mhz. Esses pulsos so ligados diretamente ao registrador associado ao timer, e, a cada pulso, o contedo desse registrador incrementado (a cada microssegundo). Se o registrador usado for de 8 bits, fcil medir intervalos de tempo de at 256 microssegundos, pois o valor mximo que o contador pode assumir. O intervalo de tempo transcorrido entre dois instantes calculado como mostra a figura 9.1. Essa restrio pode ser facilmente superada de diversas maneiras, como atravs do uso de um oscilador mais lento, usar um registrador com mais bits, usar um outro divisor de frequncia (prescaler), ou usar interrupes. As duas primeiras solues tm alguns pontos fracos de modo que mais recomendvel usar prescalers ou interrupes.
9.2 Usando Prescalers
Um prescaler (divisor) um dispositivo eletrnico usado para reduzir a freqncia por um fator predeterminado. A fim de gerar um pulso em sua sada, necessrio levar 1, 2, 4 ou mais pulsos em sua entrada. A maioria dos microcontroladores possuem um ou mais prescalers embutidos e sua taxa de diviso pode ser alterada a partir do programa. O divisor utilizado quando necessrio medir perodos de tempo mais longos. Um prescaler normalmente compartilhado por vrios temporizadores, de modo que no pode ser usado por mais de um simultaneamente. A figura 9.2 Ilustra o uso do prescaler. Nesse caso, o incremento do contedo do registrador ocorre de forma mais lenta, permitindo a medio de maiores intervalos de tempo.
Figura 9.2 Operao dos timers internos. Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 70 9.3 Usando Interrupes no uso de timers
Se o registrador do temporizador composto de 8 bits, o maior nmero que este pode armazenar 255. Quanto aos registros de 16 bits, o maior nmero 65535. Se esse nmero for ultrapassado, o temporizador ser automaticamente reiniciado e a contagem vai comear do zero novamente. Esta condio chamada de um estouro do timer. Se ativado a partir do programa, o estouro pode causar uma interrupo, o que d possibilidades completamente novas. Por exemplo, em um relgio digital, o estado dos registradores usados para a contagem de segundos, minutos ou dias pode ser alterado em uma rotina de interrupo. A figura 9.3 ilustra o uso de uma operao com o uso de interrupo no timer. Se a interrupo por estouro no timer for configurada, o contedo do registrador adicional incrementado. O contedo desse registrador adicional usado para controlar determinadas funes no programa principal.
Figura 9.3 Uso de interrupo no timer interno.
9.4 Timers no PIC 16F877
O PIC 16F877 possui 3 timers internos, chamados TIMER0, TIMER1 e TIMER2. O TIMER0 e o TIMER2 so de 8 bits, enquanto que o TIMER1 de 16 bits. Qualquer timer pode ser configurado com prescaler, e o timer 2 possui ainda um postscaler (divisor extra).
TIMER0
O TIMER0 possui as seguintes caractersticas:
Registrador de 8 bits; Permite ler e escrever no seu contedo; Prescaler programvel de 3 bits (1, 2, 4, 8, 16, 32, 64, 128); Fonte de clock selecionvel como interna ou externa; Interrupo no estouro do contador de FFh para 00h; Borda selecionvel para fonte de clock externa. Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 71 TIMER1
O TIMER1 possui as seguintes caractersticas:
Registrador de 16 bits; Permite ler e escrever no seu contedo; Prescaler programvel de 2 bits (1, 2, 4, 8); Fonte de clock selecionvel como interna ou externa; Interrupo no estouro do contador.
O programa a seguir implementa a funo de um relgio digital simples, com exibio do tempo no formato HH:MM:SS, usando a interrupo pelo estouro do TIMER1. O tempo exibido em um display de cristal lquido. Inicialmente so declaradas 3 variveis globais do tipo int (segundos, minutos e horas). Essas variveis vo registrar o tempo atual. Uma quarta varivel do tipo int, chamada conta tambm declarada. Essa varivel servir como varivel auxiliar para garantir maiores contagens de tempo no TIMER1. Na funo main() todas as variveis so inicializadas com zero. Para que o relgio inicie com um tempo diferente de 00:00:00, basta alterar o contedo da inicializao das variveis minutos, segundos e horas. Em seguida, o LCD inicializado com a funo ini_lcd_16x2( ). As prximas 3 funes internas so referentes ao ajuste do TIMER1. A funo setup_timer_1(T1_INTERNAL|T1_DIV_BY_8) ajusta o TIMER1 para operar com o clock interno e usa o prescaler divisor por 8. Estes dois ajustes fazem com que o TIMER1 seja incrementado a cada 1,6 s. Com esses ajustes, cada estouro do contador leva aproximadamente 104,8 ms. A funo enable_interrupts(int_timer1) habilita a interrupo pelo estouro do TIMER1, e a funo enable_interrupts(global) habilita as interrupes globais. Como apenas a interrupo do TIMER1 foi previamente habilitada, apenas essa interrupo ser tratada. Em seguida, a funo: printf(exibe_lcd,"\f %02d:%02d:%02d", horas, minutos, segundos) imprime pela primeira vez a hora no display. Observe que a formatao da impresso de cada campo do formato de hora do tipo %02d. Isso indica que a impresso deve ser feita com dois dgitos do tipo inteiro para cada campo, e que deve ser precedido por um zero, caso o dgito seja nico, como por exemplo na impresso de 02:15:03 (os campos horas e segundos esto precedidos por um zero, j no campo minutos no necessrio a insero do zero nesse instante). Aps isso, o programa entra no loop infinito do while(true), e fica aguardando o estouro do TIMER1. Quando o TIMER1 estoura, o programa executa a funo aps a diretiva #INT_TIMER1. A cada estouro, a varivel conta incrementada e aps 9 estouros (aps o tempo de 1 segundo) o teste if(conta==9) resulta em verdadeiro. Assim, a varivel conta zerada e ocorre a atualizao dos campos horas, minutos e segundos pelos incrementos e testes realizados. Inicialmente se incrementa o campo dos segundos, e em seguida realizam-se testes para verificar a necessidade de incrementar os campos minutos e horas. Esses testes baseiam-se no fato de que a cada 60 segundos, deve ocorrer um incremento no campo minutos, e a cada 60 minutos, deve ocorrer um incremento no campo horas. Deve ser tambm verificado que quando o campo minutos sofre um incremento, o campo segundos deve ser zerado e tambm, quando o campo horas sofre um incremento, o campo minutos deve ser zerado. Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 72 Aps a atualizao das variveis, ocorre a impresso do tempo no display.
printf(exibe_lcd,"\f %02d:%02d:%02d", horas, minutos, segundos); } } Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 73 9.4 PWM (Pulse Width Modulation) Modulao por Largura de Pulso
A maneira tradicional, ou mais simples de se controlar a potncia aplicada em uma carga atravs de um reostato em srie, conforme mostra a figura 9.4.
Figura 9.4 Controle de potncia em uma carga com o uso de Reostato.
Variando-se a resistncia apresentada pelo reostato pode-se modificar a corrente na carga e, portanto, a potncia aplicada a ela. Este tipo de controle ainda encontrado nas lmpadas de painis de alguns carros mais antigos. A grande desvantagem deste tipo de controle, denominado linear, que a queda de tenso no reostato multiplicada pela corrente que ele controla representa uma grande quantidade de calor gerada. O controle passa a dissipar (e pedir) mais potncia que a aplicada na prpria carga em determinadas posies do ajuste. Alm desta perda ser inadmissvel, ela exige que o componente usado no controle seja capaz de dissipar elevadas potncias, ou seja, torna-se caro e grande (normalmente reostatos ou potencimetros de fio, mesmo para potncias relativamente baixas). Outra opo de controle de potncia seria a substituio do reostato com o uso de transistores, ou circuitos integrados em um controle mais elaborado, polarizados adequadamente de forma que ainda varie linearmente a potncia aplicada pelo controle direto da corrente. Mesmo assim, a potncia dissipada pelo dispositivo que controla a corrente principal (o transistor) elevada. Esta potncia depende da corrente e da queda de tenso no dispositivo e, da mesma forma, em certas posies do ajuste, pode ser maior que a prpria potncia aplicada ao dispositivo. Na eletrnica moderna, o rendimento com pequenas perdas e a ausncia de grandes dissipadores que ocupem espao fundamental, principalmente quando circuitos de alta potncia esto sendo controlados. Desta forma, este tipo de controle de potncia linear no conveniente, sendo necessrias outras configuraes de maior rendimento como as que fazem uso das tecnologias PWM. Os controles de potncia, inversores de frequncia, conversores para servomotor, fontes chaveadas e muitos outros circuitos utilizam o conceito PWM (Pulse Width Modulation) ou Modulao por Largura de Pulso como base de seu funcionamento. Para que se entenda como funciona esta tecnologia no controle de potncia, partimos de um circuito imaginrio, formado por um interruptor de ao muito rpida e uma carga que deve ser controlada, de acordo com a figura 9.5.
Carga Reostato + - Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 74
Figura 9.5 Controle de potncia em uma carga com o uso de interruptor eletrnico.
Quando o interruptor est aberto no h corrente na carga e a potncia aplicada nula. No instante em que o interruptor fechado, a carga recebe a tenso total da fonte e a potncia aplicada mxima. Como fazer para obter uma potncia intermediria, digamos 50%, aplicada carga? Uma idia fazermos com que a chave seja aberta e fechada rapidamente de modo a ficar 50% do tempo aberta e 50% fechada. Isso significa que, em mdia, teremos metade do tempo com corrente e metade do tempo sem corrente, conforme mostra a figura abaixo.
A potncia mdia e, portanto, a prpria tenso mdia aplicada carga neste caso 50% da tenso de entrada. Veja que o interruptor fechado define uma largura de pulso pelo tempo em que ele fica nesta condio (t1), e um intervalo entre pulsos pelo tempo em que ele fica aberto (t2). Os dois tempos juntos definem um perodo (t) e, portanto, uma frequncia de controle. A relao entre o tempo em que temos o pulso e a durao de um ciclo completo de operao do interruptor nos define ainda o ciclo ativo (Duty Cycle) (neste caso, o ciclo ativo de 50%). Carga Controle + - 100 50 0 Tenso na carga (%) Tempo Tenso mdia t t1 t2 Largura do pulso t1=t2 (50% do ciclo ativo) Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 75 Variando-se a largura do pulso e tambm o intervalo de modo a termos ciclos ativos diferentes, podemos controlar a potncia mdia aplicada a uma carga. Assim, quando a largura do pulso varia de zero at o mximo, a potncia tambm varia na mesma proporo. Este princpio usado justamente no controle PWM: modulamos (variamos) a largura do pulso de modo a controlar o ciclo ativo do sinal aplicado a uma carga e, com isso, a potncia aplicada a ela. A figura abaixo mostra sinais do tipo PWM para diferentes larguras de pulso e diferentes valores mdios de tenso aplicada carga.
Na prtica, substitumos o interruptor por algum dispositivo de estado slido que possa abrir e fechar o circuito rapidamente como, por exemplo, um transistor bipolar, um FET de potncia, um IGBT ou at mesmo um SCR ou TRIAC. A este dispositivo ento ligado um oscilador que possa ter seu ciclo ativo controlado numa grande faixa de valores. Na prtica, difcil chegar durao zero do pulso e 100%, j que isso implicaria na parada do oscilador, mas podemos chegar bem perto disso. Na operao de um controle por PWM existem diversas vantagens a serem consideradas e alguns pontos para os quais o projetista deve ficar atento para no jogar fora estas vantagens. Na condio de aberto, nenhuma corrente circula pelo dispositivo de controle e, portanto, sua dissipao nula. Na condio de fechado, teoricamente, se ele apresenta uma resistncia nula, a queda de tenso nula, e ele no dissipa tambm nenhuma potncia. Isso significa que, na teoria, os controles PWM no dissipam potncia alguma e, portanto, consistem em solues ideais para este tipo de aplicao. Na prtica, entretanto, isso no ocorre. Em primeiro lugar, os dispositivos usados no controle no so capazes de abrir e fechar o circuito num tempo infinitamente pequeno. Eles precisam de um tempo para mudar de estado e, neste intervalo de tempo, sua resistncia sobe de um valor muito pequeno at infinito e vice-versa. Neste intervalo de tempo a queda de tenso e a corrente atravs do dispositivo no so nulas, e uma boa quantidade de calor poder ser gerada conforme a carga controlada. Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 76 Dependendo da frequncia de controle e da resposta do dispositivo usado, uma boa quantidade de calor poder ser gerada neste processo de comutao. Entretanto, mesmo com este problema, a potncia dissipada num controle PWM ainda muito menor do que num circuito de controle linear equivalente. Transistores de comutao rpidos, FETs de potncia, e outros componentes de chaveamento podem ser suficientemente rpidos para permitir que projetos de controles de potncias elevadas sejam implementados sem a necessidade de grandes dissipadores de calor ou que tenham problemas de perdas de energia por gerao de calor que possam ser preocupantes. O segundo problema que poder surgir vem justamente do fato de que os transistores de efeito de campo ou bipolares usados em comutao no se comportam como resistncias nulas, quando saturados (fechados). Os transistores bipolares podem apresentar uma queda de tenso de at alguns volts quando saturados, o mesmo ocorrendo com os FETs. Deve-se observar em especial o caso dos FETs de potncia que so, s vezes, considerados comutadores perfeitos, com resistncias de frao de ohm entre o dreno e a fonte quando saturados (Rds(on)) mas na prtica no isso que ocorre. A baixssima resistncia de um FET de potncia quando saturado (resistncia entre dreno e fonte no estado on) s vlida para uma excitao de comporta feita com uma tenso relativamente alta. Assim, dependendo da aplicao, principalmente nos circuitos de baixa tenso, os transistores de potncia bipolares ou mesmo os IGBTs podem ser ainda melhores que os FETs de potncia. O controle de potncia por PWM possui diversas aplicaes prticas, tais como: controle de velocidade e sentido de rotao de motores, controle de luminosidade de lmpadas e LEDS, controle do posicionamento de servomotores, entre outros
9.5 Mdulo PWM no PIC16F877
O PIC16F877 possui dois mdulos (hardwares) chamados de CCP (Capture/Compare/PWM) que pode operar de diferentes maneiras. Eles permitem temporizar e controlar diferentes eventos. Quando o mdulo CCP opera no modo de Captura, ele permite o acesso ao estado corrente de um registrador que muda constantemente seu valor. NO caso, este registrador o TIMER1. Basicamente, esse modo usado para capturar eventos externos e medir o intervalo de tempo entre eles. Quando o mdulo CCP opera no modo de Comparao, ele compara constantemente o contedo de dois registradores. Um deles o TIMER1. Este modo permite ao usurio disparar determinados eventos depois de transcorrido um determinado intervalo de tempo. Quando o mdulo CCP opera no modo PWM, ele pode gerar sinais de diferentes frequncias e ciclo ativo em um ou mais pinos de sada. O CCP1 fornece o sinal PWM no pino C2, da porta C, e o CCP2 fornece o sinal PWM no pino C1, da mesma porta. Este modo opera em conjunto com o TIMER2, que o responsvel pelas temporizaes que determinam as frequncias de operao do sinal PWM. O perodo T do sinal PWM determinado atravs de um registrador de 8 bits, chamado PR2, pertencente ao TIMER2. O perodo pode ser calculado usando a seguinte equao:
T = (PR2+1) * 4Tosc * TIMER2 prescaler
Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 77 PR2 pode assumir valores de 0 a 255, pois referente aos 8 bits do registrador;
Tosc o perodo de oscilao do cristal utilizado no oscilador do PIC, calculado como Tosc=1/Fosc, onde Fosc a frequncia do cristal utilizado;
TIMER2 prescaler o valor do divisor de frequncia associado ao TIMER2. Esse valor pode assumir 3 valores distintos, 1, 4, e 16.
A tabela seguinte mostra exemplos de como gerar sinais PWM em algumas frequncias, considerando que o cristal oscilador de 20MHz (Tosc=50ns).
O Ciclo ativo (Duty Cycle) determinado atravs de um registrador de 10 bits. Nesse caso, para uma determinada frequncia, podemos obter 1024 diferentes valores de ciclo ativo. O programa abaixo mostra como configurar o CCP e o TIMER2 para gerao de um sinal PWM.
O programa, inicialmente declara a varivel do tipo long int (16 bits) chamada ciclo. Em seguida, o conversor A/D ajustado, conforme foi visto em captulos anteriores. A funo interna setup_timer_2(T2_DIV_BY_16, 255, 1) ajusta o TIMER2 para garantir uma frequncia de PWM de 1,22Khz. O valor 255 na funo referente ao //Programa exemplo de configurao do CCP como PWM
while(true) { ciclo=read_adc(); set_pwm1_duty(ciclo); } } Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 78 registrador PR2, citado anteriormente. O prescaler usado foi o 16. O valor 1 na funo deve ser inserido para garantir a frequncia de PWM correta. Esse valor pode ser alterado e funciona como um divisor da frequncia de PWM gerada. A funo setup_ccp1(ccp_pwm) ajusta o mdulo CCP1 para operar como PWM. No lao while, o microcontrolador permanece constantemente lendo a entrada analgica 0, e armazena o valor da converso na varivel ciclo. Nesse instante, a varivel ciclo, apesar de ser de 16 bits, possui um valor que pode ser representado apenas por 10 bits, visto que o resultado da converso A/D de 10 bits. O valor dessa varivel usado na funo set_pwm1_duty(ciclo) para ajustar o ciclo ativo do sinal PWM gerado. Ao conectarmos um trimpot na entrada analgica 0, podemos variar de 0 a 100% o ciclo ativo do sinal PWM variando-se a posio do eixo do trimpot. O Sinal PWM fornecido no pino C2, pois estamos usando o mdulo CCP1. A figura 9.6 mostra um circuito que pode ser usado para verificao do funcionamento do programa anterior. Um LED foi conectado ao pino C2 para verificao funcional do sinal PWM. O brilho do LED vai aumentando gradativamente medida que o ciclo ativo do sinal PWM aumenta de 0 a 100%.
Figura 9.6 Circuito de verificao de gerao do sinal PWM. Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 79
Comunicao Serial e Protocolos
Em muitas aplicaes microcontroladas, pode ser necessrio realizar a comunicao entre o microcontrolador e um ou mais dispositivos externos, tais como memrias externas, outros microcontroladores, como em um sistema distribudo, ou mesmo computadores, como numa rede integrada. Esses dispositivos tanto podem estar na mesma placa do circuito, como fora dela, a metros ou mesmo dezenas de quilmetros de distncia um do outro. A escolha do sistema de comunicao mais adequado para realizar essa tarefa depende de vrios fatores como: velocidade, imunidade a rudos, custo, etc.
10.1 Introduo
As tcnicas de comunicao entre dispositivos podem ser divididas em duas grandes categorias: serial e paralela. Na comunicao serial, a informao a ser transmitida fracionada em pequenas partes (bits) que so enviadas ao equipamento receptor uma aps a outra, em srie, da a denominao de comunicao serial. Cada bit tem uma certa durao para permitir que os dispositivos que estejam recebendo os dados possam ler a informao. Dependendo da durao do bit, um sistema pode transmitir mais ou menos informaes em um determinado intervalo de tempo. A isso, d-se o nome de taxa de transmisso, ou velocidade do canal de comunicao, e medida em bauds, ou ainda bits/segundo (bps). Por exemplo, se num intervalo de um segundo um sistema de comunicao transmite 9600 bits, dizemos que a taxa de transmisso desse canal, ou sua velocidade, da ordem de 9600 bauds, ou ainda 9600 bps. A temporizao e o formato dos bits fazem parte do que se chama de protocolo de comunicao. Ele visa estabelecer regras para que a comunicao seja bem sucedida. Como exemplos de sistemas de comunicao serial podemos citar: as interfaces seriais dos computadores (RS-232, USB, Firewire), protocolos de redes locais (Ethernet, Token-Ring, etc), outros protocolos como I2C, SPI, 1-Wire, LIN, CAN, etc. Na comunicao paralela, os bits componentes da informao so transmitidos simultanemanete (total ou parcialmente) em paralelo. Como exemplos de sistemas de comunicao paralela podemos citar os barramentos internos dos microprocessadores e microcontroladores, barramento ISA, PCI, VESA, AGP, a interface de impressora paralela dos microcomputadores, SCSI, IDE, etc. A escolha dentre os tipos de comunicao um paradoxo da dualidade custo x benefcio: na comunicao paralela, temos altas velocidade de comunicao, mas Captulo 10 Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 80 tambm uma alta utilizao de meios de transmisso, alm de uma baixa imunidade a rudos. Na comunicao serial, temos uma velocidade mxima menor que na comunicao paralela, mas tambm uma menor utilizao de meios de transmisso e uma melhor imunidade a rudos. Na verdade, as tcnicas de comunicao serial vm sendo continuamente aprimoradas, e atualmente temos diversos protocolos de comunicao capazes de atingir altssimas velocidades, tais como: o USB 2.0, Firewire, SCSI, Serial ATA, etc. A tcnica serial pode ainda ser subdividida em duas categorias: sncrona e assncrona. Na comunicao serial sncrona, alm da(s) linha(s) de comunicao, encontramos uma ou mais linhas de sincronizao (clock). A informao na linha de dados transmitida a cada transio da linha de clock Neste tipo de comunicao serial, encontramos ainda uma outra classificao para os elementos de comunicao: o elemento que gera o sinal de sincronizao de transmisso (clock) chamado de mestre, o(s) dispositivo(s) que recebe o sinal de soncronismo (so) chamado(s) de escravo(s). No exemplo da figura abaixo, temos uma comunicao serial sncrona com um dispositivo mestre (Transmissor) e um escravo (Receptor). So usadas duas linhas de comunicao entre os dispositivos ( linha de clock e linha de dados).
Na comunicao serial assncrona, no encontramos uma linha especfica para sincronizao. Neste caso, a sincronizao entre os elementos transmissor e receptor garantida pela preciso dos clocks de cada elemento e tambm pela utilizao de sinais marcadores de incio (start) e fim (stop) da palavra transmitida.
10.2 Comunicao Serial Assncrona
Como foi dito, a comunicao serial assncrona caracteriza-se pela utilizao de marcadores de incio e fim de transmisso. Na figura abaixo podemos observar a transmisso de um sinal serial assncrono.
Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 81 Quando o canal de comunicao est em repouso, o sinal correspondente no canal tem um nvel lgico 1. Um pacote de dados sempre comea com uma transio do nvel 1 para o nvel lgico 0 (start bit), para sinalizar ao receptor que uma transmisso foi iniciada. O start bit inicializa um temporizador interno no receptor, que sincroniza a leitura do canal com a durao de cada bit. Seguido do start bit, 8 bits de dados de mensagem, iniciando pelo bit LSB, so enviados na taxa de transmisso especificada. O pacote concludo com os bits de paridade (opcional) e de parada (stop bit). O bit de paridade serve para detectar eventuais erros de comunicao entre os dispositivos.
10.3 O Padro RS-232
Tambm conhecido por EIA RS-232C ou V.24, o RS-232 um padro de comunicao serial bastante antigo, mas que continua sendo bem utilizado por sua simplicidade e confiabilidade. Como qualquer dispositivo de transmisso serial, os bits so enviados um a um, sequencialmente, e normalmente com o bit menos significativo primeiro (LSB). Por ser um protocolo assncrono, isto , sem uma linha de relgio (clock), responsabilidade do transmissor e do receptor efetuarem controles de tempo para saber quando cada bit inicia e finaliza. Para cada byte transmitido, existem bits de start e stop; o mais comum utilizar- se 1 bit de incio (start bit) e 1 bit de parada (stop bit), mas possvel encontrar aplicaes que utilizam 1,5 ou 2 bit de incio/parada. A figura abaixo mostra como a transmisso de um byte ocorre:
Como j citado anteriormente, esta transmisso assncrona. Tendo a velocidade de comunicao ajustada nos dois dispositivos inicialmente, cada um deles sabe quanto tempo um bit demora a ser transmitido, e com base nisto que a identificao dos bits possvel. No transmissor o envio basicamente resume-se a enviar um bit de incio, aguardar um tempo, e enviar os prximos 8 bits e mais o bit de parada, com o mesmo intervalo de tempo entre eles. No receptor, aps a primeira borda de descida (nvel lgico de "1" para "0") (start bit) o receptor sabe que uma sequncia de mais 8 bits de dados, mais o bit de parada, chegar. Ele tambm conhece a velocidade de transmisso, ento tudo o que ele precisa fazer aguardar o tempo de transmisso entre cada bit e efetuar a leitura do canal de comunicao. Aps receber o bit de parada, a recepo encerra-se e ele volta a aguardar o prximo start bit. Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 82 Nos microcontroladores modernos, todo este trabalho normalmente efetuado por um mdulo interno chamado USART (Universal Synchronous Asynchronous Receiver Transmitter). Este perifrico encarrega-se de efetuar todo o controle e apenas gerar interrupes quando um byte recebido. No entanto, algumas vezes o microcontrolador utilizado no possui uma USART, ou mesmo ela est sendo utilizada. Nestes casos, possvel implementar uma interface serial atravs de software, tratando a seqncia de transmisso e recepo descrita anteriormente. Na interface RS232 o nvel lgico "1" corresponde uma tenso entre -3V e -12V, e o nvel lgico "0" uma tenso entre +3V e +12V (lgica invertida). Valores de tenso entre -3V e +3V so indefinidos e precisam ser evitados. O estado idle (desocupado) da linha o 1 lgico (-V). Entretanto, a grande maioria dos perifricos que trabalha com portas seriais no utiliza os nveis eltricos do padro RS232 diretamente. Portanto sempre necessrio um circuito de converso de nveis TTL/RS232. O circuito integrado de baixo custo mais comum para efetuar esta converso o MAX232, que possui alimentao TTL. O chip MAX232 usa um circuito oscilador interno, auxiliado por capacitores conectados externamente ao CI, para converter as tenses do padro TTL para o RS-232 e vice-versa. O circuito abaixo mostra como fazer uma interface de um dispositivo que funciona no padro TTL (lado esquerdo), como um microcontrolador, com um dispositivo que funciona no padro RS-232, como a porta serial de um microcomputador (lado direito).
Do lado do dispositivo TTL, temos duas linhas de comunicao, uma chamada TX e outra RX. Da mesma forma, do lado RS-232, temos duas linhas chamadas com o mesmo nome. Para realizar um interfaceamento com uma porta serial de um microcomputador, usa-se um conector DB-9 padro, usando o pino 2 como entrada de dados (recepo - RX) no computador e o pino 3 como sada de dados (transmisso TX). A informao enviada atravs de uma interface serial geralmente feita por bytes que seguem o padro dos caracteres ASCII (American Standard Code for Information Interchange) de 7 bits (o oitavo bit zero). Assim, entre os bits de start e stop h sempre um caractere ASCII. A tabela abaixo mostra os caracteres do padro ASCII. Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 83
A norma EIA232 especifica uma taxa mxima de transferncia de dados de 20.000 bits por segundo (o limite usual 19200 bps). Taxas fixas no so fornecidas pela norma. Contudo, os valores comumente usados so 300, 1200, 2400, 4800, 9600 e 19200 bps. O programa a seguir mostra um exemplo de como implementar uma comunicao serial assncrona no padro RS232 entre um microcontrolador PIC16F877 e um microcomputador utilizando o Hyper Terminal do Windows. O Hyper Terminal usado para enviar e receber dados do microcontrolador e exibi-los na tela do microcomputador. O programa faz com que o microcontrolador ecoe os dados recebidos pela porta serial do microcomputador. Assim, o microcontrolador recebe um byte enviado pelo computador e o reenvia pela porta serial.
Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 84
A diretiva #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) informa ao compilador qual a taxa de transmisso (9600 bps) usada pelo microcontrolador na comunicao serial. Informa tambm quais os pinos do microcontrolador usados para transmisso (PIN_C6) e recepo (PIN_C7) dos dados. No programa principal, o comando enable_interrupts(INT_RDA) uma funo interna do compilador que habilita a interrupo da porta serial do PIC. Assim, no necessrio que o microcontrolador fique lendo a porta serial para verificar se chegou um novo dado transmitido pelo computador. A instruo seguinte a habilitao global das interrupes. O programa passa a maior parte do tempo dentro do loop infinito promovido pelo lao while. Porm, o microcontrolador no executa qualquer ao dentro desse lao. No microcontrolador, a chegada de um dado transmitido pelo computador atravs da porta serial gera uma interrupo, previamente habilitada. O programa ento executa a funo indicada pela diretiva #INT_RDA (RS232 Data Available). A funo executada quando ocorre a interrupo a funo ecoa_byte(). Nessa funo, inicialmente declara uma varivel caractere do tipo char. Em seguida, o comando caractere=getc() l o dado que foi transmitido pelo computador e o armazena na varivel caractere. O comando printf("%c", caractere) faz com que o microcontrolador transmita pela porta serial o dado contido na varivel caractere. Esse comando usado para transmitir dados pela porta serial do PIC. O programa acima faz ento com que o PIC leia o dado recebido pela porta serial e o reenvia para o computador. A confirmao de que o microcontrolador est, de fato, reenviando o dado por ser observada desconectando-se o cabo serial do PC. Os caracteres deixam de ser ecoados. //Programa exemplo de comunicao serial
enable_interrupts(INT_RDA); //habilita interrupo da RS232 enable_interrupts(GLOBAL);
while(true); }
#INT_RDA void ecoa_byte(){ char caractere; caractere=getc(); //l o dado recebido printf("%c", caractere); //reenvia o dado recebido }
Curso Microcontroladores PIC e Linguagem C Prof. Fagner de Araujo Pereira 85 Bibliografia do curso:
SOUSA, D. J. de. Desbravando o PIC: Ampliado e atualizado para PIC16F628A. 6.ed. Editora rica, 2003. PEREIRA, F. Microcontroladores PIC: Programao em C. Editora rica, 2003. SILVA, A. R. Programando Microcontroladores PIC: Linguagem C. Ed. Ensino Profissional, 2006. IBRAHIM, D. Advanced PIC Microcontroller Projects in C: from USB to RTOS with the PIC18F series. Newnes, 2008. VERLE, M. PIC Microcontrollers Programming in C with examples. MikroElektronika, 2009.