tag:blogger.com,1999:blog-64920431486425442502024-03-02T11:21:47.643-03:00MicrocontrolandosAprenda a programar microcontroladores de verdade.Tiago Henriquehttp://www.blogger.com/profile/09385302997357057888noreply@blogger.comBlogger136125tag:blogger.com,1999:blog-6492043148642544250.post-60114131939953825982018-04-02T10:31:00.002-03:002018-04-03T08:23:42.984-03:00MikroC PRO for PIC 7<img class="post-banner" src="https://www.dropbox.com/s/pxobfra2yg00366/download-mikroc-pro-7.png?dl=1" /><br />
<div class="markdown">
<textarea style="height: 91px; margin: 0px; width: 658px;"><br />
Esta é a nova versão do [MikroC PRO for PIC](https://www.mikroe.com/mikroc-pic). Contendo mais de 1000 funções em suas bibliotecas e suportando cerca de 800 microcontroladores PIC, é considerado um dos melhores compiladores existente no mercado.<br />
<br />
Obviamente que este maravilhoso compilador não sai de graça, e sugiro à aqueles que querem se profissionalizar no ramo, compre este software. É baratinho, apenas **U$249,00** rsrs.<br />
<br />
### Instalação<br />
1. Baixe e instale o executável clicando [aqui](https://download.mikroe.com/setups/compilers/mikroc/pic/mikroc-pic-setup-v720.zip);<br />
<br />
### Crackeando<br />
1. Baixe o crack clicando [aqui](https://rebrand.ly/mikroc-pro-pic-7-crack);<br />
2. Copie e cole o arquivo `HIDDongleDLL.dll` na pasta onde você instalou o MikroC. Irá aparecer uma janela de diálogo perguntando se você quer substituir o arquivo. Substitua-o;<br />
<!-- --><br />
Pronto! Agora vocês podem se divertir sem aquela limitação de 2k de código!!!<br />
</textarea></div>
Anonymoushttp://www.blogger.com/profile/12456371589981650356noreply@blogger.com10tag:blogger.com,1999:blog-6492043148642544250.post-55066174607607515512018-03-11T10:55:00.000-03:002018-03-11T14:39:12.651-03:00PIC: MCP4922<img class="post-banner" src="https://www.dropbox.com/s/5sbsftvtsk3mmqf/pic-mcp4922.png?dl=1" />
<br />
<div class="markdown">
<textarea>
[MCP4922](http://ww1.microchip.com/downloads/en/DeviceDoc/22250A.pdf) é um conversor digital-analógico (DAC) de 12-bits da Microchip.
### Características
* Tensão de operação: 2.7V até 5.5V;
* Comunicação via SPI;
* Resolução de 12-bits;
* 2 canais de saída;
* Ganho de saída (1x ou 2x);
### Funcionamento
O MCP4922 converte um valor digital de 12 bits em um valor de tensão de 0V até `VREF`. Ainda é possível ter um ganho de saída de `2 * VREF`. Cada canal possui um pino `VREF` externo.
O pino `SHDN` tem a finalidade de colocar ambos as saídas no modo *shutdown*. Também é possível configurá-los individualmente pelo registro de configuração. No modo *shutdown* a maioria dos circuitos internos são desligados e a saída é configurada para ter uma resistência de 500k.
O cálculo para a tensão de saída é: `((VREF * Valor) / 4096) * Ganho`.
Para definir o valor de um determinado canal:
* Definimos o pino `CS` com nível lógico baixo para habilitar a transmissão dos dados;
* Enviamos 16 bits:
![](https://www.dropbox.com/s/x2sgx9rbcyqxa2e/pic-mcp4922-write-command-register.png?dl=1)
* O bit 15 seleciona o canal: `0` é o canal 0 e `1` é o canal 1;
* O bit 13 indica o ganho de saída: `0` = ganho de 2x e `1` = não há ganho;
* O bit 12 define se o canal selecionado será colocado no modo *shutdown*. `0` = modo shutdown e `1` = modo normal;
* Os bit 11-0 sãos os 12 bits que definem o valor de saída do canal selecionado.
* Definimos o pino `CS` com nível lógico alto para finalizar a transmissão dos dados;
> Um projeto legal que poderíamos montar é um player de músicas no formato WAV (Mono ou Stereo) lidos de um SD Card.
### Download
[MCP4922.zip](http://bit.ly/2IjO33E)
### Código
<div data-gist="https://gist.github.com/tiagohm/5d0b035ac4d8fa9d2431794e581950f4"></div>
</textarea>
</div>
Anonymoushttp://www.blogger.com/profile/12456371589981650356noreply@blogger.com0tag:blogger.com,1999:blog-6492043148642544250.post-24183510031823516942018-03-03T10:19:00.001-03:002018-03-11T14:38:14.094-03:00PIC: TC1047A<img class="post-banner" src="https://www.dropbox.com/s/aqwmz0g54nzsy0j/pic-tc1047a.png?dl=1" />
<br />
<div class="markdown">
<textarea style="height: 165px; width: 670px;">[TC1047A](http://ww1.microchip.com/downloads/en/DeviceDoc/21498D.pdf) é um sensor de temperatura.
### Características
* Tensão de operação: 2.5V até 5.5V;
* Acurácia de ±2°C;
* Faixa mensurável de temperatura: -40°C até 125°C;
* Baixo consumo de energia: 35uA.
### Funcionamento
O TC1047 converte o valor de temperatura em um valor de tensão linearmente proporcional. Cada 10mV corresponde a 1°C.
![](https://www.dropbox.com/s/bc2jxmy957gxlbn/pic-tc1047a-voltage-vs-temperature.png?dl=1)
Através do canal analógico do microcontrolador, iremos ler o valor digital da temperatura. Numa temperatura de -40°C o TC1047A tem uma tensão de saída de 0,1V. A 0°C o TC1047A tem uma tensão de saída de 0,5V e a 125°C tem uma tensão de saída de 1,75V.
Precisamos converter o valor lido do canal analógico em um valor de temperatura. Para isso vamos converter o valor lido em um valor de tensão. No caso de um microcontrolador com um ADC de 10 bits, o valor de tensão (em mV) será: `ADC * 5000 / 1024`. Ainda temos que subtrair `500`mV (pois a 0°C a tensão de saída é 0,5V). Como a resolução da tensão de saída é de 10mV/°C, temos que dividir tudo por `10`. Então nossa fórmula fica assim: `ADC * 500 / 1024 - 50`.
### Download
[TC1047A.zip](http://bit.ly/2GfTz6J)
### Código
<div data-gist="https://gist.github.com/tiagohm/4d1418020960e1707e214187bee5b214">
</div>
</textarea>
</div>
Anonymoushttp://www.blogger.com/profile/12456371589981650356noreply@blogger.com5tag:blogger.com,1999:blog-6492043148642544250.post-62167341460704154472018-02-28T20:42:00.000-03:002018-03-11T14:36:43.729-03:00PIC: AD5206<img class="post-banner" src="https://www.dropbox.com/s/3ewy7jc9ql5ngh7/pic-ad5206.png?dl=1" />
<br />
<div class="markdown">
<textarea style="height: 132px; width: 677px;">[AD5206](http://www.analog.com/media/en/technical-documentation/data-sheets/AD5204_5206.pdf) é um potenciômetro digital de 6 canais.
### Características
* Comunicação via SPI;
* 256 posições;
* Tensão de operação: 2.7V à 5.5V;
### Funcionamento
O AD5206 possui 6 canais. Cada canal contém um potênciômetro de 10k, 50k ou 100k. Cada potênciômetro possui três terminais: 2 fixos representados pelas letras `A` e `B` e um móvel representado pela letra `W`.
Para definir o valor do potenciômetro de um determinado canal, devemos enviar pelo menos 11 bits via comunicação SPI. Se mais de 11 bits forem enviados, somente os últimos 11 bits serão utilizados.
![](https://www.dropbox.com/s/db2ix2bjj4qi9f2/pic-ad5206-serial-data-word-format.png?dl=1)
* Os três bits mais significativos definem o endereço de um canal (de 0 à 5);
* Os 8 bits menos significativos definem o valor do potenciômetro (de 0 à 255).
Antes de iniciar a transmissão dos dados é necessário colocar o pino `CS` em nível lógico baixo e logo após o fim da transmissão, colocar em nível lógico alto, assim os 11 bits enviados serão armazenados num registrador interno e usados por um decodificador para selecionar o canal e definir o valor do potenciômetro.
### Download
[AD5206.zip](http://bit.ly/2Hrf0B7)
### Código
<div data-gist="https://gist.github.com/tiagohm/e6eff6aa1b080218de99678326c28cd3">
</div>
</textarea>
</div>
Anonymoushttp://www.blogger.com/profile/12456371589981650356noreply@blogger.com1tag:blogger.com,1999:blog-6492043148642544250.post-85209968718563116362018-02-25T18:29:00.001-03:002018-03-11T14:39:41.657-03:00PIC: TH02<img class="post-banner" src="https://www.dropbox.com/s/ontufppfdl0kv5m/pic-th02.png?dl=1" />
<br />
<div class="markdown">
<textarea>[TH02](http://www.hoperf.com/upload/sensor/TH02_V1.1.pdf) é um sensor de temperatura e umidade.
![](https://www.dropbox.com/s/uerpkju4cmkcqkf/pic-th02-real.png?dl=1)
Apesar de ser desconhecido para mim, ele aparenta ser um excelente sensor. Baixo consumo de energia, rapidez na medição e boa resolução são os pontos destacáveis desse dispositivo.
### Características
* Tensão de operação: 2.1V à 3.6V;
* Comunicação via I2C;
* Acurácia de 0.5°C para temperatura e 4.5% para umidade;
* Faixa de operação: -40°C à 85°C e 0% - 100%;
* Baixo consumo de energia: 240uA à 320uA durante a conversão;
* Resolução de 14 ou 13 bits para temperatura;
* Resolução de 12 ou 11 bits para umidade;
* Tempo de conversão: 35ms no modo normal e 18ms no modo rápido.
### Funcionamento
O TH02 possui um registro de configuração `CONFIG` (0x03) na qual utilizamos para definir se estamos querendo ler a temperatura ou a umidade (`TEMP`), selecionar a velocidade da conversão (`FAST`) e iniciar a conversão (`START`).
![](https://www.dropbox.com/s/0nshs6vjx9z2siz/pic-th02-config-register.png?dl=1)
O bit `FAST` reduz o tempo de conversão de 35ms para 18ms e o consumo de energia. Além disso reduz a resolução da medição.
![](https://www.dropbox.com/s/tnpi9lkj2wt8wke/pic-th02-fast-conversion-mode.png?dl=1)
Então sempre que quisermos realizar uma leitura de temperatura ou umidade, devemos escrever no registro `CONFIG`.
Os valores de temperatura e umidade se encontram nos registros `DATAH` (0x01) e `DATAL` (0x02).
![](https://www.dropbox.com/s/lodm65682v1chtm/pic-th02-temp-register.png?dl=1)
![](https://www.dropbox.com/s/pmgembesbcgtjz4/pic-th02-humidity-register.png?dl=1)
A sequência para iniciar a conversão e ler os valores é:
* Iniciar a transmissão (pulso de START);
* Enviar o endereço do dispositivo (0x80) + modo de escrita (0);
* Enviar o endereço do registro `CONFIG`;
* Enviar o valor do registro `CONFIG`: Ler temperatura ou umidade, modo rápido ou normal, iniciar a conversão;
* Encerrar a transmissão (pulso de STOP);
* Aguardar o fim da conversão;
* Iniciar a transmissão (pulso de START);
* Enviar o endereço do dispositivo (0x80) + modo de escrita (0);
* Enviar o endereço do registro `DATAH`;
* Encerrar a transmissão (pulso de STOP);
* Iniciar a transmissão (pulso de START);
* Enviar o endereço do dispositivo (0x80) + modo de leitura (1);
* Ler os dois bytes (MSB e LSB);
* Encerrar a transmissão (pulso de STOP);
### Download
[TH02.zip](http://bit.ly/2tEVbo6)
### Código
<div data-gist="https://gist.github.com/tiagohm/30ad4e16a281563ca42ea114fe2cfec6">
</div>
</textarea>
</div>
Anonymoushttp://www.blogger.com/profile/12456371589981650356noreply@blogger.com0tag:blogger.com,1999:blog-6492043148642544250.post-45576425939659423392018-02-21T22:14:00.000-03:002018-03-11T14:40:27.679-03:00PIC: PCF8591<img class="post-banner" src="https://www.dropbox.com/s/uz8zoxj63bljivs/pic-pcf8591.png?dl=1" />
<br />
<div class="markdown">
<textarea>[PCF8591](https://www.nxp.com/docs/en/data-sheet/PCF8591.pdf) é tanto um conversor analógico-digital (ADC) quanto um conversor digital-analógico (DAC).
Possui 3 pinos (A0, A1, A2) responsáveis pelo seu endereçamento no barramento I2C, permitindo conectar até 8 dispositivos.
### Pinagem
![](https://www.dropbox.com/s/tyk4ey5q1wdm9tj/pic-pcf8591-pinagem.png?dl=1)
* AIN0-AIN3: São as entradas analógicas;
* A0-A2: Pinos de endereçamento;
* AOUT: É a saída anlógica;
* VREF: Tensão de referência das entradas e saídas analógicas;
* AGND: Terra das entradas e saídas analógicas.
### Características
* Tensão de operação: 2.5V à 6V;
* Comunicação via I2C;
* Entradas analógicas configuráveis;
* Resolução de 8 bits.
* 4 entradas analógicas;
### Funcionamento
O primeiro byte enviado para o dispositivo é o byte de endereço.
![](https://www.dropbox.com/s/74czoszxj3pa0ui/pic-pc8591-address-byte.png?dl=1)
O segundo byte enviado para o dispositivo é responsável por habilitar a saída analógica, configurar as entrada analógicas e selecionar o canal analógico.
![](https://www.dropbox.com/s/zn45gv3zfekno3f/pic-pcf8591-control-byte.png?dl=1)
* Bit 0-1: Seleciona os canais analógicos de 0 a 3;
* Bit 2: Se for igual à `1`, o número do canal analógico é incrementado automaticamente após cada conversão AD. Em toda a leitura o canal selecionado será o canal 0;
* Bit 4-5: Define o modo de configuração das entradas analógicas. Veja a figura acima;
* Bit 6: Habilita com `1` a saída analógica.
O terceiro byte enviado, quando quiser usar o DAC, é armazenado no registro do conversor digital-analógico (DAC) e é convertido para o valor correspondende de tensão. O DAC nada mais é do que uma série de resistores formando vários divisores de tensão de até 256 níveis.
A fórmula para o cálculo da tensão de saída é `AGND + ((VREF - AGND) / 256) * valor armazenado no DAC`.
> O Datasheet indica um erro de compensação de 50mv.
<!-- -->
### Download
[PCF8591.zip](http://bit.ly/2Il2T9R)
### Código
<div data-gist="https://gist.github.com/tiagohm/0c8a20bcf025c95a543558b8fd2c38ca">
</div>
</textarea></div>
Anonymoushttp://www.blogger.com/profile/12456371589981650356noreply@blogger.com3tag:blogger.com,1999:blog-6492043148642544250.post-38557683085077775482015-06-06T20:57:00.000-03:002018-03-11T14:41:23.911-03:00PIC: MCP3201<img class="post-banner" src="https://www.dropbox.com/s/jmgg7zvcg2i2ugf/pic-mcp3201.png?dl=1" />
<br />
<div class="markdown">
<textarea style="height: 115px; width: 661px;">[MCP3201](http://ww1.microchip.com/downloads/en/DeviceDoc/21290D.pdf) é um Conversor Analógico/Digital de 12 bits com interface SPI.
### Características
* 12 bits de resolução;
* Comunicação via SPI;
* Tensão de operação: 2.7V - 5.5V;
### Funcionamento
A comunicação com o dispositivo funciona através da interface SPI. Inicialmente habilitamos a comunicação colocando o pino `CS` em nível lógico baixo. Iremos ler os 15 bits, dos quais 12 bits correspondem ao valor da entrada analógica, começando do bit MSB até o bit LSB. A leitura de cada bit é feita após cada borda de descida do pulso de clock. Por fim, desabilitamos a comunicação colocando o pino `CS` em nível lógico alto.
O cálculo real da tensão de entrada é: `Vin = ADC * Vref / 4096`, sendo `Vin = [V+] – [V-]`. Caso `V-` seja igual a `0V`, `Vin = V+`.
### Download
[MCP3201.zip](http://bit.ly/2p7mHoJ)
### Código
<div data-gist="https://gist.github.com/tiagohm/6005024956b28cc68d4701bac57024d0">
</div>
</textarea>
</div>
Tiago Henriquehttp://www.blogger.com/profile/09385302997357057888noreply@blogger.com11tag:blogger.com,1999:blog-6492043148642544250.post-30979386283248823562015-04-26T17:29:00.000-03:002018-03-07T09:03:10.337-03:00PIC: DS1631<img class="post-banner" src="https://www.dropbox.com/s/bey1r2qqutg3zw5/pic-ds1631.png?dl=1" />
<br />
<div class="markdown">
<textarea style="height: 66px; width: 657px;">[DS1631](https://datasheets.maximintegrated.com/en/ds/DS1631-DS1731.pdf) é um termômetro/termostato digital que realiza a leitura de temperaturas entre -55°C e 125°C com resolução ajustável de 9, 10, 11 ou 12 bits.
A comunicação é feita através da inteface I2C.
### Características
* Acurácia de ±0.5°C;
* Tensão de alimentação: 3V a 5,5V;
* Baixo consumo de energia.
### Registros
Possui 4 registros, `TH` e `TL` (ambos 2 bytes) usados no modo Termostato, o registro `T` (2 bytes) usado no modo Termômetro e o registro de Configuração `CONFIG` (1 byte).
Os registros `TH`, `TL` e `T` são formados pelos seguintes bits:
![](https://www.dropbox.com/s/wtvt1sxe3z7z1it/pic-ds1631-temperature-registers.png?dl=1)
### Modo Termômetro
Por meio de um conversor analógico Delta-Sigma coverte a temperatura num valor digital de 9, 10, 11 ou 12 bits, configurados pelos bits `R0` e `R1` do registro de `CONFIG`. A conversão demora um certo tempo dependendo da resolução, veja a tabela abaixo:
###### bits de resolução e tempo de conversão
![](https://www.dropbox.com/s/8hcsx2eths4xixj/pic-ds1631-bits-resolucao.png?dl=1)
O DS1631 inicia em *stand-by* (modo de baixo consumo), e através de um comando enviado, realiza a conversão da temperatura em modo *contínuo* ou *one-shot*.
No modo *one-shot* a conversão da temperatura é feita sempre que recebe o comando `START CONVERT`.
No modo *contínuo* a conversão é realiza continuamente. É necessário enviar `START CONVERT` pelo menos uma vez só pra dar aquele empurrão inicial.
Podemos configurá-los através do bit `ONE-SHOT` do registro `CONFIG`. Setando com `1` estaremos definindo com o modo *one-shot* e com `0` para o modo *contínuo*.
Para encerrar a conversão usamos o comando `STOP CONVERT`. Isto faz com que entre no modo *stand-by*. Isto é útil quando está no modo *contínuo* e não queremos mais ler o valor de temperatura, fazendo o dispositivo economizar em energia. No modo *one-shot* não é necessário enviar este comando, pois após a conversão automaticamente o dispositivo entra em *stand-by*.
Para ler a temperatura use o comando `READ TEMPERATURE`.
### Modo Termostato
No modo termostato temos dois registros, `TH` e `TL`, que são usados para armazenar os dois valores de temperatura. Quando a temperatura ultrapassar o valor de `TH` o pino `TOUT` é `ativado`. O pino `TOUT` permanece ativado até que a temperatura caia e fique abaixo de `TL`.
Podemos configurar se o pino `TOUT` será ativado com nível lógico `alto` ou `baixo`, através do bit `POL` do registro `CONFIG`. Defina com `1` para ativá-lo com nivel lógico `alto`.
### Endereçamento
O DS1631 possui três pinos `A0`, `A1` e `A2` responsáveis por alterar seu endereço no barramento.
O bit `0` define se nós iremos ler(1) ou escrever(0) no dispositivo.
O endereço é composto por:
![](https://www.dropbox.com/s/yl16shd45db1zw4/pic-ds1631-endereco.png?dl=1)
### Biblioteca
<div data-gist='https://gist.github.com/tiagohm/ceac11241c44bdb177fda87d8a4607cd'>
</div>
</textarea>
</div>
Tiago Henriquehttp://www.blogger.com/profile/09385302997357057888noreply@blogger.com4tag:blogger.com,1999:blog-6492043148642544250.post-57258052481991112612015-03-30T11:24:00.000-03:002018-03-01T07:54:26.993-03:00AVR: Display 7 Segmentos<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvGIbf1ozXHlIPrErHd4mmvjGvyoxLu0e-PvzR_ueU5MoFhpQsVkAGT1sAykZICWR3b_f3qr6t_9I-pd4osAyUg5BWZUc8AzIRUqQ48lLJopy5eruKnN6v4fiS2LXCLqVzppw12hwBd8vi/s1600/avr_display_7_segmentos.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="422" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvGIbf1ozXHlIPrErHd4mmvjGvyoxLu0e-PvzR_ueU5MoFhpQsVkAGT1sAykZICWR3b_f3qr6t_9I-pd4osAyUg5BWZUc8AzIRUqQ48lLJopy5eruKnN6v4fiS2LXCLqVzppw12hwBd8vi/s1600/avr_display_7_segmentos.png" width="640" /></a></div>
<div class="markdown">
<textarea style="height: 58px; width: 660px;">Mais um projeto envolvendo o ATMEGA328P. Desta vez iremos criar um simples contador de 0 até 99 acionado por um botão.
O projeto utiliza um display de 7 segmentos de 2 dígitos com catodo comum (cada segmento tem em comum um pino GND, são os pinos 1 e 2, um para cada dígito). Um segmento é aceso quando aplicamos uma corrente em seu pino de entrada (pinos A ao G).
Se vocês perceberam, não dá pra exibir dois números ao mesmo tempo, já que compartilham os mesmos pinos de entrada. Por isso precisamos intercalar a exibição de um dígito. Nós setamos os pinos de entrada para que possa exibir algo e habilitamos o primeiro dígito e desabilitamos o segundo digito. Algum tempo depois, nós setamos os pinos de entrada para o segundo dígito e desabilitamos o primeiro e habilitamos o segundo dígito. E o ciclo se repete. Todo o tempo de transição de um digito para o outro deve ser feito de modo que nossos olhos não perceba essa mudança.
### Código
<div data-gist="https://gist.github.com/tiagohm/69d68aac5f58733669fe0548805f258d">
</div>
</textarea>
</div>
Tiago Henriquehttp://www.blogger.com/profile/09385302997357057888noreply@blogger.com5tag:blogger.com,1999:blog-6492043148642544250.post-21053877506496669582015-03-26T21:07:00.001-03:002018-03-01T08:17:57.212-03:00AVR: Pull-ups<img class="post-banner" src="https://www.dropbox.com/s/qxy57newy6hwiwt/avr-pull-ups.png?dl=1"></img>
<div class="markdown">
<textarea style="height: 143px; width: 672px;">Os resistores de pull-up são resistores conectados no nível lógico alto (5V). São utilizados para evitar a flutuação do nível lógico das entradas quando nenhum dispositivo estiver conectado.
O microcontrolador [ATMEGA328P](http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_Datasheet.pdf) possui resistores de pull-up interno em todos os pino I/O. Mas como ativamos? Primeiramente precisamos definir o pino como entrada `DDRx.Bn = 0`. Quando fizermos isso, o bit correspondente do registro `PORTx` terá uma nova função, que é de ativar/desativar o resistor de pull-up do pino.
> O bit `PUD` do registro `MCUCR` é o interruptor geral dos resistores de pull-up. É habilitado com `0`. Por padrão seu valor inicial é `0`.
### Código
<div data-gist="https://gist.github.com/tiagohm/4980b31293322a7fb5b94cfeec8f8758">
</div>
</textarea>
</div>
Tiago Henriquehttp://www.blogger.com/profile/09385302997357057888noreply@blogger.com1tag:blogger.com,1999:blog-6492043148642544250.post-90272560899107474272015-03-23T10:15:00.000-03:002015-03-26T21:08:07.289-03:00Pisca-Pisca com ATMEGA328P<h1 style="text-align: center;">
<span style="color: red; font-family: Trebuchet MS, sans-serif;">AVR: P<span style="font-weight: normal;">isca</span>-P<span style="font-weight: normal;">isca com</span> AT<span style="font-weight: normal;">MEGA</span>328<span style="font-weight: normal;">P</span></span></h1>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeucIAPizCc_YYnAaQOHpiG85-srstvFSuawO1rB9DDvEhhQy14-F6HABKo7PiCJL1Wa99LjwnnLdu_YL6d1hNmA-K-pmBTxRHL13Y1ZOzXpRCX_ha7_cq-WCgNrfuMgJzy2gjaDixoXXx/s1600/avr_pisca_pisca_com_atmega328p.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeucIAPizCc_YYnAaQOHpiG85-srstvFSuawO1rB9DDvEhhQy14-F6HABKo7PiCJL1Wa99LjwnnLdu_YL6d1hNmA-K-pmBTxRHL13Y1ZOzXpRCX_ha7_cq-WCgNrfuMgJzy2gjaDixoXXx/s1600/avr_pisca_pisca_com_atmega328p.png" height="338" width="640" /></a></div>
<br />
<br />
<a name='more'></a><br />
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">Olá de novo! Está começando a série de projetos com AVR.</span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">Este primeiro projeto será de um pisca-pisca com o microcontrolador ATMEGA328P ( o mesmo utilizado no Arduino Uno ).</span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">Precisamos ter um conhecimento básico sobre pinos I/O, então, clique <a href="http://microcontrolandos.blogspot.com.br/2013/07/avr-portas-io.html" target="_blank">aqui</a>.</span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">Para criar um simples pisca-pisca, não tem nenhum segredo né! Precisamos apenas de um resistor de 220Ohms e um LED. A conexão é vista na imagem acima.</span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">Neste primeiro exemplo utilizamos o método trivial para fazer o led piscar. Dentro de um loop infinito, ligamos e desligamos o led num intervalo de 500ms.
</span></div>
<div class="github-code">
<script src="https://gist.github.com/tiagohm/86db563af8fd789c1989.js"></script>
</div>
<br />
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">Outro jeito de fazer o led piscar é utilizar o operador de complemento "~".
</span></div>
<div class="github-code">
<script src="https://gist.github.com/tiagohm/4f7be026ed687c76ab65.js"></script>
</div>
<br />
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">Também podemos assim: Quando escrevemos 1 num determinado bit do registro PINB, estamos alternando o valor do bit correspondente do registro PORTB.
</span></div>
<div class="github-code">
<script src="https://gist.github.com/tiagohm/338bfb95cfed4c03feb5.js"></script>
</div>
<br />
<br />
<div style="text-align: right;">
<b>またね、バイバイ</b></div>
Tiago Henriquehttp://www.blogger.com/profile/09385302997357057888noreply@blogger.com0tag:blogger.com,1999:blog-6492043148642544250.post-43613632467400571442015-01-05T13:09:00.001-02:002018-02-28T08:25:42.652-03:00PIC: 25XX320<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ95n42gamuNuizRdCoAyyWyplnc1_ygRycqQkVpche24Lhq-l3OtabwIPz9Goar-79KC3dFz5g-5YJzgQgfuZQdosX2R5Nt-XRo-N7TXSSvP9MKIugU47ymv-YYpN2aNi4BBXR43f7lKI/s1600/PIC.25XX320.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="322" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ95n42gamuNuizRdCoAyyWyplnc1_ygRycqQkVpche24Lhq-l3OtabwIPz9Goar-79KC3dFz5g-5YJzgQgfuZQdosX2R5Nt-XRo-N7TXSSvP9MKIugU47ymv-YYpN2aNi4BBXR43f7lKI/s1600/PIC.25XX320.png" width="640" /></a></div>
<br />
<div class="markdown">
<textarea style="height: 100px; width: 675px;">[25XX320](http://ww1.microchip.com/downloads/en/DeviceDoc/21227E.pdf) corresponde as memórias eeprom's (25AA320, 25LC320, 25C320) de 32Kb da Microchip. Comunica-se via SPI, utilizando apenas 4 fios (CLK, SDO, SDI, CS).
### Características
* Tensão de alimentação: 5V;
* 4096 x 8 bit;
* Tempo de escrita: 5ms;
* Proteção de memória;
### Funcionamento
![](https://www.dropbox.com/s/3m2kgi7d7xm27c2/pic-25x320-sequence.png?dl=1)
Para realizar a escrita:
1. Habilitar o dispositivo (CS = 0);
2. Enviar a instrução de escrita;
3. Enviar um endereço de 16 bits. Enviar os 8 bits mais significativos, depois os 8 bits menos significativos.
4. Enviar o dado (1 byte) que será gravado no endereço.
5. Desabilitar o dispositivo (CS = 1);
> Antes de cada operação de escrita é necessário enviar o comando que dá a permição de escrita e após a operação de escrita é necessário enviar o comando que revoga a permissão de escrita.
Para realizar a leitura:
1. Habilitar o dispositivo (CS = 0);
2. Enviar a instrução de leitura;
3. Enviar um endereço de 16 bits. Enviar os 8 bits mais significativos, depois os 8 bits menos significativos.
4. Realizar a leitura de 1 byte do endereço.
5. Desabilitar o dispositivo (CS = 1);
O dispositivo possui o seguinte registro de `STATUS`:
![](https://www.dropbox.com/s/s5cfg1wy9s5erl5/pic-25x320-status-register.png?dl=1)
`WPEN`: Habilita/Desabilita a proteção de escrita. Trabalha em conjunto com o pino externo WP. Para mais detalhes, veja a tabela 3-3 do datasheet.
`BP1-BP0`: Protege um bloco de memória. 00 - nenhum bloco está protegido; 01 - 0x0C00 até 0x0FFF está protegido; 10 - 0x0800 até 0x0FFF está protegido. 11 - todos os blocos estão protegidos.
`WEL`: Indica se está autorizado a realizar uma operação de escrita.
`WIP`: Indica se está ocorrendo uma operação de escrita.
### Biblioteca
<div data-gist="https://gist.github.com/tiagohm/5b1b376a2efd434d347355598cf41803"></div>
</textarea>
</div>
Tiago Henriquehttp://www.blogger.com/profile/09385302997357057888noreply@blogger.com1tag:blogger.com,1999:blog-6492043148642544250.post-59679959988297865292014-12-30T11:17:00.002-02:002015-01-22T14:10:43.517-02:00PIC: RDA5807<h1 style="text-align: center;">
<span style="color: red; font-family: Trebuchet MS, sans-serif;"><b>PIC: RDA5</b><span style="font-weight: normal;">80</span><b>7</b></span></h1>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEih7DKaAXb91hoosPodX0qMYvGKKxQnWaD_d3I8hn2mflhePI3TNi_CpRvftLQXJ_ALISYWc9vTOq9BkSycZgs4WrNJvLvb82gN6eSWr8OjFWzyDWwu3JEoktCbysKJHPrUoQl1aNb5KNbJ/s1600/PIC.RDA5807.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEih7DKaAXb91hoosPodX0qMYvGKKxQnWaD_d3I8hn2mflhePI3TNi_CpRvftLQXJ_ALISYWc9vTOq9BkSycZgs4WrNJvLvb82gN6eSWr8OjFWzyDWwu3JEoktCbysKJHPrUoQl1aNb5KNbJ/s1600/PIC.RDA5807.png" height="340" width="640" /></a></div>
<br />
<a name='more'></a><span style="font-family: 'Trebuchet MS', sans-serif;"><a href="https://drive.google.com/file/d/0B_-qufAUxAJLWVJmVEdHT1VWMlk/view?usp=sharing" target="_blank">RDA5807P </a>é um circuito integrado que é capaz de sintonizar emissoras de rádio FM, operando na faixa de 76MHz até 108MHz.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="color: red; font-family: Trebuchet MS, sans-serif;"><b>CARACTERÍSTICAS</b></span><br />
<br />
<ul>
<li><span style="font-family: Trebuchet MS, sans-serif;">Duas bandas de frequência;</span></li>
<li><span style="font-family: 'Trebuchet MS', sans-serif;">Mono ou Stereo;</span></li>
<li><span style="font-family: 'Trebuchet MS', sans-serif;">Indicador de força do sinal ( RSSI );</span></li>
<li><span style="font-family: 'Trebuchet MS', sans-serif;">Controle de volume;</span></li>
<li><span style="font-family: 'Trebuchet MS', sans-serif;">Comunicação I2C;</span></li>
<li><span style="font-family: 'Trebuchet MS', sans-serif;">Tensão de alimentação: 5V;</span></li>
</ul>
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;">VANTAGENS</span></b><br />
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">Este chip possui as mesmas características do <a href="http://microcontrolandos.blogspot.com.br/2014/06/pic-tea5767-radio-fm.html" target="_blank">TEA5767</a>. A vantagem de utilizá-lo é que eu encontrei uma placa pronta para utilizar, precisando apenas conectar os fios, ao contrário do TEA5767 ( talvez exista um módulo para ele, mas não encontrei ) que precisa soldar os fios e correr o risco de destruir a plaquinha ( acabei arrancando uns componentes, rs ). Outra vantagem do RDA5807P é que é possível controlar o volume da saída, mesmo utilizando fones de ouvido, o som é muito alto.</span></div>
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="color: red; font-family: Trebuchet MS, sans-serif;"><b>FUNCIONAMENTO</b></span><br />
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">Possui 4 registradores internos de 16 bits, utilizados para sua configuração, como a frequência atual, volume, seleção da banda, ativar o modo de busca, entre outros. Para realizar a operação de escrita, basta enviar o endereço do dispositivo ( 0x20 ) e os 8 bytes.</span></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilJm_7SeVefvGj_bjI1DcHnkK_kCcRM4JrmpBvDznBZuzH8B8DV_ybR_0GtESp9UQoDsC5QbAe_IpgY0-d8jDvhHFy2IWoEKgyp94GUvo8m2ohIYze8bnvs4byV9O5c2P4ZIDKBioOThW6/s1600/PIC.RDA5807.WREG.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilJm_7SeVefvGj_bjI1DcHnkK_kCcRM4JrmpBvDznBZuzH8B8DV_ybR_0GtESp9UQoDsC5QbAe_IpgY0-d8jDvhHFy2IWoEKgyp94GUvo8m2ohIYze8bnvs4byV9O5c2P4ZIDKBioOThW6/s1600/PIC.RDA5807.WREG.png" height="64" width="640" /></a></div>
<br />
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">Para poder sintonizar uma frequência, devemos escrever nos bits CHAN, setar o bit TUNE e enviar os todos os bytes. Podemos calcular o valor da frequência através dessa fórmula: F = SPACE * CHAN + ( 87000 ou 76000 );</span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">Para realizar uma busca, devemos definir a direção da busca ( pra cima ou pra baixo ) definindo um valor para o bit SEEKUP. Também devemos setar o bit SEEK e enviar todos os bytes.</span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">Também possui 2 registradores de 16 bits, que são utilizados para leitura, informando a frequência atual, a força do sinal captado e contendo vários bits de sinalização.</span></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdcwDxqBcLn_KwiEQu2rpTGYHttYMBhaXI_owYoNqxJvsVThwLrpmLef-n1XtJxfynW3h1IINnsvqwpExsLJM10tvXU9FkQ2_V6CoEoxsZauU4gootsUzoLZz3MLX14UJ0pdKFj_X5jvv8/s1600/PIC.RDA5807.RREG.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdcwDxqBcLn_KwiEQu2rpTGYHttYMBhaXI_owYoNqxJvsVThwLrpmLef-n1XtJxfynW3h1IINnsvqwpExsLJM10tvXU9FkQ2_V6CoEoxsZauU4gootsUzoLZz3MLX14UJ0pdKFj_X5jvv8/s1600/PIC.RDA5807.RREG.png" height="38" width="640" /></a></div>
<br />
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;">CÓDIGO DA BIBLIOTECA</span></b><br />
<div style="text-align: right;">
<b><span style="color: #999999; font-family: Trebuchet MS, sans-serif; font-size: x-small;">MikroC PRO PIC
</span></b></div>
<div class="github-code">
<script src="https://gist.github.com/Microcontrolandos/171d6a5535dbea99c2d7.js"></script>
</div>
<br />
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;">EXEMPLO:
</span></b><br />
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;"><br /></span></b>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgY1mA3ug9JT6eJZNIohZAS5cjpxir9Fc5js8lXeDKjn1xyJ0SGSiHE0Oc1FNclrOBKqudc3oAr090cpdX9GKeM3ZY45sup23VKwfUuOvirPy7-jhFKtsVflxCjf4xy6LHCkvIzGrm-hXYI/s1600/PIC.RDA5807.TESTE.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgY1mA3ug9JT6eJZNIohZAS5cjpxir9Fc5js8lXeDKjn1xyJ0SGSiHE0Oc1FNclrOBKqudc3oAr090cpdX9GKeM3ZY45sup23VKwfUuOvirPy7-jhFKtsVflxCjf4xy6LHCkvIzGrm-hXYI/s1600/PIC.RDA5807.TESTE.jpg" height="400" width="300" /></a></div>
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;"><br /></span></b>
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;"><br /></span></b>
<br />
<div class="github-code">
<script src="https://gist.github.com/Microcontrolandos/9c0753e7a83390957cab.js"></script>
</div>Tiago Henriquehttp://www.blogger.com/profile/09385302997357057888noreply@blogger.com14tag:blogger.com,1999:blog-6492043148642544250.post-85066779798777387322014-12-26T20:45:00.000-02:002015-01-22T21:28:40.861-02:00PIC: SSD1306<h1 style="text-align: center;">
<span style="color: red; font-family: Trebuchet MS, sans-serif;">PIC: SSD1<span style="font-weight: normal;">30</span>6</span></h1>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOx0APJ7zUzysG0WqZk1b4MGs-wV6eCRkuCgBssIA6yBXRnDkM8kOUJdTqAZ9WB4NARizJoHBK7g9JeMV1w2HJhDydglxyA8NTSdLxdIxk-0x8URDV8tSrZTNg8d_cXa74qXOn17nKM5EY/s1600/PIC.SSD1306.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOx0APJ7zUzysG0WqZk1b4MGs-wV6eCRkuCgBssIA6yBXRnDkM8kOUJdTqAZ9WB4NARizJoHBK7g9JeMV1w2HJhDydglxyA8NTSdLxdIxk-0x8URDV8tSrZTNg8d_cXa74qXOn17nKM5EY/s1600/PIC.SSD1306.png" height="398" width="640" /></a></div>
<br />
<a name='more'></a><span style="font-family: Trebuchet MS, sans-serif;"></span><br />
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;"><a href="https://www.adafruit.com/datasheets/SSD1306.pdf" target="_blank">SSD1306</a> é um controlador para display OLED. Este display pode ser encontrado no Mercado Livre, possui uma resolução de 128x64 pixels e tem o mesmo tamanho de uma moeda de 1 real.</span></div>
<span style="font-family: Trebuchet MS, sans-serif;">
</span>
<br />
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">Comunica-se através do barramento I2C, por isso utiliza apenas dois fios ( Clock e Data ).</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="color: red; font-family: Trebuchet MS, sans-serif;"><b>CARACTERÍSTICAS</b></span><br />
<ul>
<li><span style="font-family: 'Trebuchet MS', sans-serif;">Resolução de 128x64 pixels;</span></li>
<li><span style="font-family: 'Trebuchet MS', sans-serif;">Tensão de alimentação: 3.3V ou 5V ( O display que eu comprei no Mercado Livre suporta esta tensão. Verifique se o seu display também suporta ).</span></li>
<li><span style="font-family: 'Trebuchet MS', sans-serif;">Contraste ajustável;</span></li>
</ul>
</div>
<br />
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;">FUNCIONAMENTO</span></b><br />
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">A interface I2C com o display consiste no envio de um endereço ( <b>0b011110XY </b>), na qual o bit <b>X </b>corresponde ao endereço do display ( 0 ou 1 ). Na parte de trás do display há um jumper com um pingo de solda, selecionando por padrão o endereço 0. Com isso, você é capaz de ligar até dois displays no mesmo barramento. O bit <b>Y </b>informa se a operação será de escrita(0) ou leitura(1). Após isso, é necessário enviar no mínimo dois bytes ( um de comando e outro de dado ). O byte de comando ( <b>0bXY000000 </b>) é composto pelo bit <b>X</b> que, uma vez setado, você poderá enviar <i>n</i> dados na sequência. O bit <b>Y </b>quando for igual a 1, diz que o próximo dado corresponde a um comando interno do display. Quando for igual à 0, diz que o próximo dado corresponde a uma carácter, por exemplo, que é gravado na </span><span style="font-size: 11pt;"><span style="font-family: Trebuchet MS, sans-serif;"><i>GDDRAM </i>( memoria utilizada pelo display para exibir as informações na tela ).</span></span></div>
<div style="text-align: justify;">
<span style="font-size: 11pt;"><span style="font-family: Trebuchet MS, sans-serif;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="font-size: 11pt;"><span style="color: red; font-family: Trebuchet MS, sans-serif;"><b>CÓDIGO DA BIBLIOTECA</b></span></span></div>
<div style="text-align: justify;">
<div style="text-align: right;">
<span style="color: #666666; font-family: Trebuchet MS, sans-serif; font-size: x-small;"><b>MikroC PRO PIC</b></span></div>
</div>
<div class="github-code">
<script src="https://gist.github.com/Microcontrolandos/84324a916df880382e70.js"></script>
</div>
<br />
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;">EXEMPLO</span></b><br />
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;"><br /></span></b>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhf2V5_NNMW18MstxjWDAV9uSR9FN_P9dNLaCBIvIxxHNrBFoZGNph44mkqsBqsENtwiUVF2cBByfMlmMV-np9O09RjpyQ6exs4KnKCa0H5zEBSxtsaZwE-nXGAw-adb49WC8hJTUTq1xJF/s1600/PIC.SSD1306.TESTE.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhf2V5_NNMW18MstxjWDAV9uSR9FN_P9dNLaCBIvIxxHNrBFoZGNph44mkqsBqsENtwiUVF2cBByfMlmMV-np9O09RjpyQ6exs4KnKCa0H5zEBSxtsaZwE-nXGAw-adb49WC8hJTUTq1xJF/s1600/PIC.SSD1306.TESTE.jpg" height="400" width="300" /></a></div>
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;"><br /></span></b>
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;"><br /></span></b>
<br />
<div style="text-align: right;">
<b><span style="color: #999999; font-family: Trebuchet MS, sans-serif; font-size: x-small;">MikroC PRO PIC</span></b></div>
<div class="github-code">
<script src="https://gist.github.com/Microcontrolandos/71d7c9faec9f35199fab.js"></script>
</div>
<br />Tiago Henriquehttp://www.blogger.com/profile/09385302997357057888noreply@blogger.com17tag:blogger.com,1999:blog-6492043148642544250.post-50465327843593716072014-11-03T10:09:00.004-02:002015-01-22T14:40:23.067-02:00PIC: PCF8583<h1 style="text-align: center;">
<span style="color: red; font-family: Trebuchet MS, sans-serif;">PIC: PCF8<span style="font-weight: normal;">5</span>8<span style="font-weight: normal;">3</span></span></h1>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAfpxkPvrB-96jFAM0wieq_OS1VQhyMHeQaZhBQjTLMzkp-3a2V-utlCpR8ouLsPGaq8jqe_Ttml9Nt6ST4LjsRgWY13dVfpBW2Osit9gLqRjlv0EdHl5NcoL18DFS8_jm_WcIaFWhVwgp/s1600/PIC.PCF8583.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAfpxkPvrB-96jFAM0wieq_OS1VQhyMHeQaZhBQjTLMzkp-3a2V-utlCpR8ouLsPGaq8jqe_Ttml9Nt6ST4LjsRgWY13dVfpBW2Osit9gLqRjlv0EdHl5NcoL18DFS8_jm_WcIaFWhVwgp/s1600/PIC.PCF8583.png" height="334" width="640" /></a></div>
<br />
<a name='more'></a><div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">O <a href="http://www.nxp.com/documents/data_sheet/PCF8583.pdf" target="_blank">PCF8583</a> é um relógio/calendário e alarme digital da <a href="http://www.nxp.com/" target="_blank">NXP Semiconductors</a> com uma memória RAM de 256 x 8 bits, que controlado através de um microcontrolador, fornece data e hora em tempo real.</span></div>
<div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
</div>
<div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">Utiliza o barramento I2C. Possui endereçamento selecionável através do pino A0, podendo assim, ligar até dois relógios no mesmo barramento.</span></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbgrNiXMmdxO9v8DmRmCVX6lJuRR_Ic6uqYTr7nES2-9AvXzgokG_P8TZwvf4lA4PhrGF4gRamB1n6AInLkPgUy7LbxeU5XqvzYPCyJLZocHZH-Lx6kvRAJE76VaRSwb8QSqumDgP3k7wo/s1600/PCF8583.PINS.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbgrNiXMmdxO9v8DmRmCVX6lJuRR_Ic6uqYTr7nES2-9AvXzgokG_P8TZwvf4lA4PhrGF4gRamB1n6AInLkPgUy7LbxeU5XqvzYPCyJLZocHZH-Lx6kvRAJE76VaRSwb8QSqumDgP3k7wo/s1600/PCF8583.PINS.png" /></a></div>
<br /></div>
<div>
<span style="font-family: 'Trebuchet MS', sans-serif; text-align: justify;">O PCF8583 fornece informações do ano, mês, dia e dia da semana, hora, minuto, segundo e centissegundo. Todos no formato BCD.</span><br />
<div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">O endereço 0x00 é usado como um registro de controle e status. Os endereços de 0x01 até 0x07 são usados como contador para a função relógio. Os endereços de 0x08 até 0x0F podem ser programados como registro do alarme ou utilizado como memória RAM livre, quando o alarme está desativado.</span></div>
</div>
</div>
<div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
</div>
<div>
<div style="text-align: justify;">
<span style="color: red; font-family: Trebuchet MS, sans-serif;"><b>CARACTERÍSTICAS</b></span></div>
</div>
<div>
<div style="text-align: justify;">
<br />
<ul>
<li><span style="font-family: 'Trebuchet MS', sans-serif;">Barramento I2C;</span></li>
<li><span style="font-family: 'Trebuchet MS', sans-serif;">Tensão de alimentação de 1.0V à 6.0V. Isso permite adicionar uma pequena bateria de backup de 3V no caso de ocorrer uma falha de energia;</span></li>
<li><span style="font-family: 'Trebuchet MS', sans-serif;">Memória RAM de 256 x 8 bits;</span></li>
<li><span style="font-family: 'Trebuchet MS', sans-serif;">Função relógio com 4 anos ( incluindo ano bissexto );</span></li>
<li><span style="font-family: 'Trebuchet MS', sans-serif;">Formato de horas: 24h ou 12h ( AM/PM );</span></li>
<li><span style="font-family: 'Trebuchet MS', sans-serif;">Alarme e Timer com interrupção programável.</span></li>
</ul>
</div>
</div>
<div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="color: red; font-family: Trebuchet MS, sans-serif;"><b>REGISTRO DE CONTROLE E STATUS</b></span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">Este registro contém as flags de interrupção do alarme e do timer, que são os bit <b>1 </b>e <b>0</b>, respectivamente. O bit <b>7 </b>quando setado pausa o relógio. Os bits <b>5 </b>e <b>4 </b>configuram o clock. O bit <b>3 </b>funciona como uma chave para habilitar/desabilitar todas as interrupções.</span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="color: red; font-family: Trebuchet MS, sans-serif;"><b>REGISTRO DE CONTROLE DO ALARME</b></span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">Este registro contém a configuração de contagem do timer ( bits <b>2</b>, <b>1 </b>e <b>0 </b>). O bit <b>3 </b>é usado para habilitar/desabilitar a interrupção do timer. Os bits <b>5 </b>e <b>4 </b>configuram o modo do alarme e o bit <b>7 </b>habilita/desabilita a interrupção do alarme.</span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="color: red; font-family: Trebuchet MS, sans-serif;"><b>MODO ALARME</b></span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">No modo alarme você define a hora para ele disparar. Quando a hora atual e a hora do alarme forem iguais uma interrupção será gerada, e a flag será setado. Esta flag deverá ser limpa via software. Para configurar como alarme você deve:</span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<ol>
<li style="text-align: justify;"><span style="font-family: Trebuchet MS, sans-serif;">Definir a hora do alarme ( endereços 0x09 até 0x0E )</span></li>
<li style="text-align: justify;"><span style="font-family: Trebuchet MS, sans-serif;">Configurar o modo do alarme ( bits <b>5</b> e <b>4 </b>do <i>registro de controle do alarme</i> )</span></li>
<li style="text-align: justify;"><span style="font-family: Trebuchet MS, sans-serif;">Habilitar a interrupção do alarme ( bit <b>7 </b>do <i>registro de controle do alarme</i> )</span></li>
</ol>
<div>
<div style="text-align: justify;">
<span style="color: red; font-family: Trebuchet MS, sans-serif;"><b>MODO TIMER</b></span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">No modo timer você define um tempo para ele disparar. Esse tempo pode ser incrementado de segundos em segundos, ou minutos ou horas ou dias, configurando os bits <b>2</b>, <b>1</b> e <b>0</b> do <i>registro de controle do alarme</i>. A contagem inicia a partir do valor definido pelo usuário até <b>99</b>. Após isso ocorrerá um estouro, retornando a contagem para 0 e gerando uma interrupção. A flag também será setado. Esta flag deverá ser limpa via software, assim como o valor do timer. Para configurar o timer você deve:</span></div>
<ol>
<li><span style="font-family: 'Trebuchet MS', sans-serif;">Definir um valor inicial do timer ( endereço 0x0F )</span></li>
<li><span style="font-family: 'Trebuchet MS', sans-serif;">Configurar o modo de contagem ( bits 2, 1 e 0 do <i>registro de controle do alarme</i> )</span></li>
<li><span style="font-family: 'Trebuchet MS', sans-serif;">Habilitar a interrupção do timer ( bit 3 do <i>registro de controle do alarme</i> )</span></li>
</ol>
<div>
<span style="color: red; font-family: Trebuchet MS, sans-serif;"><b>BIBLIOTECA</b></span></div>
<div>
<div style="text-align: right;">
<span style="color: #666666; font-family: Trebuchet MS, sans-serif; font-size: x-small;"><b>MikroC PRO PIC</b></span></div>
</div>
</div>
</div>
<div class="github-code">
<script src="https://gist.github.com/Microcontrolandos/db80d853c57ebc6a294f.js"></script>
</div>
<br />
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;">EXEMPLO</span></b><br />
<div style="text-align: right;">
<b><span style="color: #666666; font-family: Trebuchet MS, sans-serif; font-size: x-small;">MikroC PRO PIC
</span></b></div>
<div class="github-code">
<script src="https://gist.github.com/Microcontrolandos/2f9db42eec1578d82ff0.js"></script>
</div>Tiago Henriquehttp://www.blogger.com/profile/09385302997357057888noreply@blogger.com2tag:blogger.com,1999:blog-6492043148642544250.post-29529319629936177602014-10-18T12:00:00.002-03:002018-02-20T07:50:36.749-03:00TUTORIAL: Ellipsis<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLP-OPmb4GMBVcJa8R0SO8OfVEFR63GAac7Nfnmbj66oJNWcl0Tqy6Tk78SIbKHXMTl2K93ub_jS5-e7YqKxwiBoizbC4Ty6WAlenNUGF_FUOouRtq9oOlhI9hDHpqCMkyUH1t6GcTANip/s1600/programming-languages.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1067" data-original-width="1600" height="426" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLP-OPmb4GMBVcJa8R0SO8OfVEFR63GAac7Nfnmbj66oJNWcl0Tqy6Tk78SIbKHXMTl2K93ub_jS5-e7YqKxwiBoizbC4Ty6WAlenNUGF_FUOouRtq9oOlhI9hDHpqCMkyUH1t6GcTANip/s640/programming-languages.jpg" width="640" /></a></div>
<div class="markdown">
<textarea>Em todas as funções que criamos, o número de parâmetros deve ser conhecido com antecedência. Mas a linguagem C permite que passamos quantos parâmetros quiser para uma chamada de função. Para isso a linguagem fornece o especificador ellipsis ( ou reticências ).
A ellipsis deve ser sempre o último parâmetro da função e seus componentes devem ser do mesmo tipo.
A ellipsis "informa" ao compilador que a função CalcularMedia poderá conter x parâmetros. Você deve estar ciente que o compilador aloca os parâmetros sequencialmente, isto quer dizer que, na memória, supondo que o primeiro parâmetro (todos do tipo char, isto é, usam 1 byte) ocupa o endereço 44, o segundo parâmetro irá ocupar o endereço 45, o terceiro parâmetro irá ocupar o endereço 46 e, assim por diante. O que temos que fazer é simplesmente apontar para o primeiro parâmetro da sequência e "caminhar" nesta sequência, recuperando assim seus valores.
### Exemplo
</textarea>
</div>
<script src="https://gist.github.com/tiagohm/848a86c10f12a6effd3459499b3ab77b.js"></script>Tiago Henriquehttp://www.blogger.com/profile/09385302997357057888noreply@blogger.com2tag:blogger.com,1999:blog-6492043148642544250.post-87297183513350947382014-10-17T22:23:00.002-03:002018-03-23T07:55:05.246-03:00PIC: MCP41XXX<img class="post-banner" src="https://www.dropbox.com/s/df2iy0ohc9c4w6f/pic-mcp41xxx.png?dl=1" /> <br />
<div class="markdown"><textarea><br />
[MCP41XXX](http://ww1.microchip.com/downloads/en/DeviceDoc/11195c.pdf) é uma família de potenciômetro digital de 256 posições e 1 canal. A família é composta por MCP41010 (10k), MCP41050 (50k) e MCP41100 (100k). A comunicação é feita via SPI. <br />
<br />
### Funcionamento<br />
Para definir o valor do potenciômetro é necessário enviar 2 bytes. <br />
<br />
O primeiro byte é o byte de comando: <br />
<br />
![](https://www.dropbox.com/s/k70lw1ox5nip3za/pic-mcp41xxx-command-byte.png?dl=1) <br />
<br />
* Os bits `C1` e `C0` são os bits de comando: `00` = comando de escrita, `01` coloca o dispositivo em *shutdown*; <br />
* Os bits `P1` e `P0` são os bits que selecionam um potenciômetro. `01` seleciona o potenciômetro `0`. <br />
<br />
O segundo byte define o valor do potenciômetro. <br />
<br />
### Download<br />
[MCP41XXX.zip](http://bit.ly/2FK6OyL) <br />
<br />
### Código<br />
<div data-gist="https://gist.github.com/tiagohm/d0a6926d796f1063dcc7e31621bfb61a"></div></textarea> </div>Tiago Henriquehttp://www.blogger.com/profile/09385302997357057888noreply@blogger.com4tag:blogger.com,1999:blog-6492043148642544250.post-18249778271483662322014-10-14T13:24:00.004-03:002016-12-14T08:51:46.774-02:00Arduino Uno para Proteus<h1 style="text-align: center;">
<span style="color: red; font-family: "trebuchet ms" , sans-serif;">ARDUINO UNO PARA O PROTEUS</span></h1>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxeQFqIy-3bfI3sMdHkyzQWkcN_VnVHZEtc1lorkcMaR847bliWbyrXTqwuNR4ysa39FJfYg5Wo3BxQJayKbDQV8DbYDzB53-fhH_qQbGj404IKfePbrVn0jxxwwgf5G0Hh9v3ykoDUAce/s1600/ARDUINO.UNO.V3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="374" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxeQFqIy-3bfI3sMdHkyzQWkcN_VnVHZEtc1lorkcMaR847bliWbyrXTqwuNR4ysa39FJfYg5Wo3BxQJayKbDQV8DbYDzB53-fhH_qQbGj404IKfePbrVn0jxxwwgf5G0Hh9v3ykoDUAce/s1600/ARDUINO.UNO.V3.png" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<a name='more'></a><span style="font-family: "trebuchet ms" , sans-serif;">Esta é a nova versão do simulador de Arduino Uno R3 para o Proteus. Nessa nova versão modifiquei o design para ficar mais bonito, deixando seus novos projetos mais atraentes.</span><br />
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span>
<span style="color: red; font-family: "trebuchet ms" , sans-serif;"><b>INSTALAÇÃO</b></span><br />
<span style="font-family: "trebuchet ms" , sans-serif;">Copie o arquivo <span style="color: blue;">ARDUINO.LIB</span> para a pasta:</span><br />
<span style="font-family: "trebuchet ms" , sans-serif;"><b>C:\Arquivos de Programas\Labcenter Electronics\Proteus 8 Professional\LIBRARY</b> ou </span><b><span style="font-family: "trebuchet ms" , sans-serif;">C:\ProgramData\Labcenter Electronics\Proteus 8 Professional\LIBRARY</span><span style="color: #6aa84f; font-family: "trebuchet ms" , sans-serif;">.</span></b><br />
<div>
<b><span style="color: #6aa84f; font-family: "trebuchet ms" , sans-serif;"><br /></span></b></div>
<div>
<span style="color: red; font-family: "trebuchet ms" , sans-serif;"><b>DOWNLOAD</b></span></div>
<div>
<span style="font-family: "trebuchet ms" , sans-serif;">Biblioteca Arduino para Proteus : <b><a href="https://microcontrolandos.wordpress.com/2016/11/17/arduino-uno-proteus/" target="_blank">Arduino.lib</a></b></span></div>
<div>
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFeuhhAMvFjKo6xsJPZUBU5FZoXVdcYOD-hnqfrQ6fwm-X56wzaDBEvII7iZqPItgXhQiuuY-GkicO4E-fQld4vh3XRZA1kKkc0pQrXUHuBDgfv875BIZSRsF4yQgQxh8QPCmT2olIUodn/s1600/ARDUINO.UNO.V3.EXEMPLO.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="329" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFeuhhAMvFjKo6xsJPZUBU5FZoXVdcYOD-hnqfrQ6fwm-X56wzaDBEvII7iZqPItgXhQiuuY-GkicO4E-fQld4vh3XRZA1kKkc0pQrXUHuBDgfv875BIZSRsF4yQgQxh8QPCmT2olIUodn/s1600/ARDUINO.UNO.V3.EXEMPLO.png" width="640" /></a></div>
<div>
<span style="font-family: "trebuchet ms" , sans-serif;"><br /></span></div>
Tiago Henriquehttp://www.blogger.com/profile/09385302997357057888noreply@blogger.com43tag:blogger.com,1999:blog-6492043148642544250.post-70114865069132953932014-07-12T21:45:00.000-03:002014-10-11T12:19:30.218-03:00PIC: LCD com Menus<h1 style="text-align: center;">
<span style="color: red; font-family: Trebuchet MS, sans-serif;">PIC: LCD <span style="font-weight: normal;">com </span>M<span style="font-weight: normal;">enus</span></span></h1>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4V70WQLfLaLQgvrwMr8LRMfzP9Fk46xuCd-uvp_U1nNDL8m4jPm3d7b8KUdNIroAAUYZkcx4Y57WLY1l4HARqDilGc4Exdny1m9iP9txhPoxUTjsfG6aA4gsiV2QmIJHxT_sWCBoh1p05/s1600/PIC.LCD.MENUS.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4V70WQLfLaLQgvrwMr8LRMfzP9Fk46xuCd-uvp_U1nNDL8m4jPm3d7b8KUdNIroAAUYZkcx4Y57WLY1l4HARqDilGc4Exdny1m9iP9txhPoxUTjsfG6aA4gsiV2QmIJHxT_sWCBoh1p05/s1600/PIC.LCD.MENUS.png" height="404" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<a name='more'></a><div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">Como foi me pedido, neste post irei explicar como criar um menu, bem sofisticado, para um display de LCD.</span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">Nesse menu, cada item pode conter um submenu, cada submenu pode conter outro submenu, e assim por diante, infinitamente( até acabar a memória ). Cada item pode também executar uma rotina ao ser selecionado.</span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">Primeiramente cria-se um registro que irá armazenar as informações de cada item:
</span></div>
<pre class="mikroCCode">struct MenuItem
{
const Item** mItem; //SubMenu
char Texto[16]; //texto
void(*Tarefa)(char); //Funcao a ser executada
char Parms; //valor do parametro da funcao
};
</pre>
<br />
<span style="font-family: Trebuchet MS, sans-serif;">Depois criamos os items...</span><br />
<pre class="mikroCCode">const Item Menu01 = { Screen1, "FUNCAO 1", &SuaFuncao, 0 };
const Item Menu02 = { Screen2, "FUNCAO 2", NULL, 0 };
</pre>
<br />
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;"><span style="color: #3d85c6;"><b>Screen1</b></span> - é o vetor de itens do submenu. Se não possui um submenu colocar 0.</span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;"><span style="color: #3d85c6;"><b>"FUNCAO 1"</b></span> - É o texto do item a ser exibido.</span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;"><span style="color: #3d85c6;"><b>&SuaFuncao</b></span> - É o endereço da função a ser executada pelo item ao ser selecionado. Se não tiver, colocar 0.</span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;"><span style="color: #3d85c6;"><b>0</b></span> - é o valor do parâmetro a ser passado para a função dita anteriormente.</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">e um vetor que armazena os itens da primeira tela a ser exibida.
</span></div>
<br />
<pre class="mikroCCode">//Terminar sempre com 0(Zero).
const Item* TelaInicial[] = { &Menu01, &Menu02, 0 };
</pre>
<br />
<span style="font-family: Trebuchet MS, sans-serif;">Criamos tambem os itens de uma segunda, terceira, ... , tela:
</span><br />
<pre class="mikroCCode">const Item Menu10 = { Screen3, "Outra Funcao", 0, 0 };
const Item Menu11 = { NULL, "Ativar Saidas", &DefinirSaidas, 255 };
const Item Menu12 = { NULL, "Alternar Saidas", &AlternarSaidas, 0 };
const Item Menu13 = { NULL, "Desligar Saidas", &DefinirSaidas, 0 };
const Item* Screen1[] ={ &Menu10, &Menu11, &Menu12, &Menu13, 0 };
</pre>
<br />
<span style="font-family: Trebuchet MS, sans-serif;">Esse código é mais fácil no sentido de poder acrescentar quantos itens e subitens quiser, sem ter que adicionar mais instruções "if", "else", "switch", etc, deixando o código mais limpo. Por outro lado, é necessário um conhecimento sobre o uso de estruturas( struct ) e ponteiros. Vocês podem ficar espantados ao ver tanto asterisco, como nesse trecho do código <i>"</i><i>static const Item*** MenuAnterior"</i></span>.<span style="font-family: Trebuchet MS, sans-serif;"> Para quem quiser entender, irei explicar:</span><br />
<span style="font-family: Trebuchet MS, sans-serif;">Com Apenas um asterisco: <b>Item*</b> - É um simples ponteiro para um <i>struct Item</i>.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;">Com dois asterisco: <b>Item**</b> - É um vetor de *<i>Item.</i></span><br />
<span style="font-family: Trebuchet MS, sans-serif;">Com três asterisco: <b>Item***</b> - É um vetor de **<i>Item</i>. ( ou matriz de *<i>Item ).</i></span><br />
<br />
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;">CÓDIGO:
</span></b><br />
<pre class="mikroCCode">/*
PROJETO: LCD com MENUS
MCU: PIC18F4550
CLOCK: 48MHz ( 20MHz + PLL )
COMPILADOR: MIKROC PRO PIC
AUTOR: Tiago Henrique
*/
#define NULL 0
//PINOS DO LCD
sbit LCD_RS at RB0_bit;
sbit LCD_EN at RB1_bit;
sbit LCD_D4 at RB2_bit;
sbit LCD_D5 at RB3_bit;
sbit LCD_D6 at RB4_bit;
sbit LCD_D7 at RB5_bit;
sbit LCD_RS_Direction at TRISB0_bit;
sbit LCD_EN_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB4_bit;
sbit LCD_D7_Direction at TRISB5_bit;
/*
PROTOTIPOS
*/
typedef struct MenuItem Item;
static void LcdWriteFromROM( const char* texto );
//Suas Funcoes
void DefinirSaidas( char );
void AlternarSaidas( char );
struct MenuItem
{
const Item** mItem; //submenu
char Texto[16]; //texto
void(*Tarefa)(char); //Funcao a ser executada
char Parms; //valor do parametro da funcao
};
/*
VARIAVEIS GLOBAIS
*/
static char selecao = 0; //posicao do item selecionado
static const Item** MenuAtual; //Menu Atual
static const Item*** MenuAnterior; //Pilha de Menus
static unsigned Stack[16]; //Aloca memoria para a pilha
/*
MENU
*/
//Terceiro Nivel
const Item Menu30 = { NULL, "PORTD = 32", &DefinirSaidas, 32 };
const Item* Screen3[] = { &Menu30, 0 }; //Terminar sempre com o valor 0(NULO)
//Segundo Nivel
const Item Menu10 = { Screen3, "Outra Funcao", 0, 0 };
const Item Menu11 = { NULL, "Ativar Saidas", &DefinirSaidas, 255 };
const Item Menu12 = { NULL, "Alternar Saidas", &AlternarSaidas, 0 };
const Item Menu13 = { NULL, "Desligar Saidas", &DefinirSaidas, 0 };
const Item* Screen1[] = { &Menu10, &Menu11, &Menu12, &Menu13, 0 }; //Terminar sempre com o valor 0(NULO)
const Item Menu20 = { NULL, "PORTD = 1", &DefinirSaidas, 1 };
const Item Menu21 = { NULL, "PORTD = 2", &DefinirSaidas, 2 };
const Item Menu22 = { NULL, "PORTD = 4", &DefinirSaidas, 4 };
const Item Menu23 = { NULL, "PORTD = 8", &DefinirSaidas, 8 };
const Item* Screen2[] = { &Menu20, &Menu21, &Menu22, &Menu23, 0 }; //Terminar sempre com o valor 0(NULO)
//Primeiro Nivel
const Item Menu01 = { Screen1, "FUNCAO 1", NULL, 0 };
const Item Menu02 = { Screen2, "FUNCAO 2", NULL, 0 };
const Item* TelaInicial[] = { &Menu01, &Menu02, 0 }; //Terminar sempre com o valor 0(NULO)
/*
Exibe os items do menu atual no display LCD
*/
static char MostrarItens( const Item* menu[], char sel )
{
char index = 0, row = 1;
Lcd_Cmd( _LCD_CLEAR );
if( menu == 0 )
return 0;
while( menu[index] )
{
if( index < sel ) { index++; continue; }
if( index == sel ) Lcd_Chr( row, 1, '>' );
else Lcd_Chr( row, 1, ' ' );
row++;
LcdWriteFromROM( menu[index++]->Texto );
}
if( index <= sel )
return 1;
return 0;
}
static void LcdWriteFromROM( const char* texto )
{
while( *texto )
{
Lcd_Chr_CP( *texto++ );
}
}
void main()
{
char flags = 0; //flags dos botoes
CMCON = 7;
ADCON1 = 15;
//Botoes
TRISA.B0 = 1;
TRISA.B1 = 1;
TRISA.B2 = 1;
TRISD = 0;
PORTD = 0;
Lcd_Init();
Lcd_Cmd( _LCD_CURSOR_OFF );
MenuAtual = TelaInicial; //A tela atual = tela inicial
MenuAnterior = &Stack; //Aponta para a pilha
MostrarItens( MenuAtual, selecao ); //Exibe os itens
while( 1 )
{
if( PORTA.B0 ) flags.B0 = 1;
else if( PORTA.B1 ) flags.B1 = 1;
else if( PORTA.B2 ) flags.B2 = 1;
//Botao Proximo foi pressionado
if( !PORTA.B0 && flags.B0 )
{
++selecao; //seleciona o proximo item
//Exibe os itens da tela selecionada e
//se o indice do item estourar
//retorna para o primeiro item
if( MostrarItens( MenuAtual, selecao ).B0 )
{
selecao = 0;
MostrarItens( MenuAtual, selecao );
}
flags.B0 = 0;
}
//Botao Enter foi pressionado
if( !PORTA.B1 && flags.B1 )
{
//Recebe o ponteiro da funcao a ser executada
void(*Func)(char) = MenuAtual[selecao]->Tarefa;
//Caso exista uma funcao a ser executada...
if( Func != NULL )
{
//Executa a função
Func( MenuAtual[selecao]->Parms );
}
//Se existir um submenu
if( MenuAtual[selecao]->mItem != NULL )
{
//Salva o menu atual no MenuAnteror
*MenuAnterior++ = MenuAtual;
//atualiza o menu atual com o proximo menu
MenuAtual = MenuAtual[selecao]->mItem;
//Exibe os itens deste proximo menu
selecao = 0;
MostrarItens( MenuAtual, selecao );
}
flags.B1 = 0;
}
//Botao Voltar foi pressionado
if( !PORTA.B2 && flags.B2 )
{
selecao = 0;
//Se não for o primeiro menu( Tela Inicial )
if( ((unsigned*)&MenuAnterior)[0] > (unsigned)&Stack )
{
//MenuAtual recebe o menu salvo no MenuAnterior
MenuAtual = *--MenuAnterior;
MostrarItens( MenuAtual, selecao );
}
flags.B2 = 0;
}
}
}
//Suas Funcoes
void DefinirSaidas( char valor )
{
PORTD = valor;
}
void AlternarSaidas( char valor )
{
PORTD = ~PORTD;
}
</pre>
<br />
<span style="color: red; font-family: Trebuchet MS, sans-serif;"><b>DOWNLOAD:</b></span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><b><span style="color: #3d85c6;">Projeto:</span></b> <a href="https://drive.google.com/file/d/0B_-qufAUxAJLYTVRbFBqWWFUa2s/edit?usp=sharing" target="_blank">LCD_com_menus.rar</a></span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">O código pode ser um pouco difícil de entender, então, qualquer dúvida é só perguntar. Até mais!!!!</span>Tiago Henriquehttp://www.blogger.com/profile/09385302997357057888noreply@blogger.com51tag:blogger.com,1999:blog-6492043148642544250.post-63751705723593417132014-07-10T10:46:00.000-03:002015-07-07T16:40:42.650-03:00Livros Sobre Programação<h1 style="text-align: center;">
<span style="color: red; font-family: Trebuchet MS, sans-serif;">L<span style="font-weight: normal;">ivros</span> S<span style="font-weight: normal;">obre</span> P<span style="font-weight: normal;">rogramação</span></span></h1>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjm43o6OgOpN4DU5cVRaXltG_AbhOdhxL_BJxI3UpPJSd_pscwy5lA6u6nfyZ8xI0V5ctoavc5PAZrydIos4_VlZy2BSHjvE3s8iAoKw0M_pcK6ZTl8FX40tDGfeN0aqmAvtqLiKmQRnSlY/s1600/LIVROS.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="308" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjm43o6OgOpN4DU5cVRaXltG_AbhOdhxL_BJxI3UpPJSd_pscwy5lA6u6nfyZ8xI0V5ctoavc5PAZrydIos4_VlZy2BSHjvE3s8iAoKw0M_pcK6ZTl8FX40tDGfeN0aqmAvtqLiKmQRnSlY/s1600/LIVROS.png" width="640" /></a></div>
<br />
<a name='more'></a><div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">Quem quer aprender mais sobre programação, disponibilizo vários links de livros em pdf. São várias as linguagens de programação, desenvolvimento de aplicativos Mobile, programação Web e programação orientada à objetos. Também vou estar disponibilizando outros livros relacionadas à computação, pois irá ajudar muito para aqueles que estão cursando Ciência da Computação...Se você gostou de algum livro, sugiro que comprem, pois assim, estarão ajudando seus desenvolvedores.</span></div>
<br />
<div style="text-align: center;">
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;">USE A CABEÇA - C#</span></b> - <b><span style="color: #0b5394; font-family: Trebuchet MS, sans-serif;"><a href="https://drive.google.com/file/d/0B_-qufAUxAJLZXBRRE5HbWpYVGc/edit?usp=sharing" target="_blank">DOWNLOAD</a></span></b></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgptf7GIcYRnEMZFZslzfwj7-D8vEAP2_PyFgNNMx_Eg3rbZ8D0W3NRDrLidHMSdv6zqSgQ8GJtz5XblWh_AdYrBy66NsksCPND7TmcFBihfvuZDDJL-oAfCbnh6S23Sjz7EJPHmjRmoMab/s1600/livros_use_a_cabeca_csharp.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgptf7GIcYRnEMZFZslzfwj7-D8vEAP2_PyFgNNMx_Eg3rbZ8D0W3NRDrLidHMSdv6zqSgQ8GJtz5XblWh_AdYrBy66NsksCPND7TmcFBihfvuZDDJL-oAfCbnh6S23Sjz7EJPHmjRmoMab/s1600/livros_use_a_cabeca_csharp.png" width="235" /></a></div>
<div style="text-align: center;">
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;"><br /></span></b></div>
<div style="text-align: center;">
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;">USE A CABEÇA - AJAX</span></b> - <b><span style="color: #0b5394; font-family: Trebuchet MS, sans-serif;"><a href="https://drive.google.com/file/d/0B_-qufAUxAJLY2pKRXE5eXUyZlk/edit?usp=sharing" target="_blank">DOWNLOAD</a></span></b></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLQMgiI6AcVK6AU2rJDa0OCrEenJOenn-HysPWXnXJYRBSqqt1Hv6Zj4SZ9-ZFwnqbIJk8LD7wLBqfnn7j6f_w13Z02ARn3nPGD3oVQWapMMOVlOQVPFL-PTAaVUr-FvYzFiAwgOxhs0Z2/s1600/livros_use_a_cabeca_ajax.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLQMgiI6AcVK6AU2rJDa0OCrEenJOenn-HysPWXnXJYRBSqqt1Hv6Zj4SZ9-ZFwnqbIJk8LD7wLBqfnn7j6f_w13Z02ARn3nPGD3oVQWapMMOVlOQVPFL-PTAaVUr-FvYzFiAwgOxhs0Z2/s1600/livros_use_a_cabeca_ajax.png" width="246" /></a></div>
<div style="text-align: center;">
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;"><br /></span></b></div>
<div style="text-align: center;">
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;">USE A CABEÇA - HTML com CSS</span></b> - <b><span style="color: #0b5394; font-family: Trebuchet MS, sans-serif;"><a href="https://drive.google.com/file/d/0B_-qufAUxAJLZmVRa29vaElENEU/edit?usp=sharing" target="_blank">DOWNLOAD</a></span></b></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYzyL1w3rYKfdLsGtCdNmfF821TH5Axy7UFS2ufI9f_FA511O3wRVqukpUc6_p8rbUsWHEKP0qSNKaflehXxFBHXPy6eNtbabP3MB_NtS_ag2EGYeqlxqxmWJiajeacHIF7bJ1hxW5tXhf/s1600/livros_use_a_cabeca_html.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYzyL1w3rYKfdLsGtCdNmfF821TH5Axy7UFS2ufI9f_FA511O3wRVqukpUc6_p8rbUsWHEKP0qSNKaflehXxFBHXPy6eNtbabP3MB_NtS_ag2EGYeqlxqxmWJiajeacHIF7bJ1hxW5tXhf/s1600/livros_use_a_cabeca_html.png" width="231" /></a></div>
<div style="text-align: center;">
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;"><br /></span></b></div>
<div style="text-align: center;">
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;">USE A CABEÇA - JAVA</span></b> - <b><span style="color: #0b5394; font-family: Trebuchet MS, sans-serif;"><a href="https://drive.google.com/file/d/0B_-qufAUxAJLRnhRMm1FdGQ5RFE/edit?usp=sharing" target="_blank">DOWNLOAD</a></span></b></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTo7J4bRscPkMP1VsX95IAm3YMK8CA9gFE_QdyckkhqW7oYlFMcnC0v8jq-ygWxt0D5GQMzq77snJA1Vf4jpaLOLKxNzv5vHh4h_EhCt1Livdju85VWzRwYTGvASMzpcduwB_juNE-A2Su/s1600/livros_use_a_cabeca_java.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTo7J4bRscPkMP1VsX95IAm3YMK8CA9gFE_QdyckkhqW7oYlFMcnC0v8jq-ygWxt0D5GQMzq77snJA1Vf4jpaLOLKxNzv5vHh4h_EhCt1Livdju85VWzRwYTGvASMzpcduwB_juNE-A2Su/s1600/livros_use_a_cabeca_java.png" width="232" /></a></div>
<div style="text-align: center;">
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;"><br /></span></b>
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;">USE A CABEÇA - JAVASCRIPT</span></b> - <b><span style="color: #0b5394; font-family: Trebuchet MS, sans-serif;"><a href="https://drive.google.com/file/d/0B_-qufAUxAJLMVQwZFBLT0xTSDg/edit?usp=sharing" target="_blank">DOWNLOAD</a></span></b></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik8dIxT70d4Dl5KN9pH8wO01b2sBY0BZNDDckhPGbGe04xTk4In6o2Hhm8LXRkOmCgwUZst85AjxCWIbYbFnrTn9YePfPrmYInoDY-WBpGYKLTXCZdKQcTbZ9clEt2RSHQ3Nl0M-cvDqL8/s1600/livros_use_a_cabeca_javascript.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik8dIxT70d4Dl5KN9pH8wO01b2sBY0BZNDDckhPGbGe04xTk4In6o2Hhm8LXRkOmCgwUZst85AjxCWIbYbFnrTn9YePfPrmYInoDY-WBpGYKLTXCZdKQcTbZ9clEt2RSHQ3Nl0M-cvDqL8/s1600/livros_use_a_cabeca_javascript.png" width="220" /></a></div>
<div style="text-align: center;">
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;"><br /></span></b></div>
<div style="text-align: center;">
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;">USE A CABEÇA - PADRÕES DE PROJETO</span></b> - <b><span style="color: #0b5394; font-family: Trebuchet MS, sans-serif;"><a href="https://drive.google.com/file/d/0B_-qufAUxAJLUF8xbktPMnNYUFk/edit?usp=sharing" target="_blank">DOWNLOAD</a></span></b></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0VqaDZB-MPEV8GTc1l7z-IEQiEfdtzmpoZFDk-NYWgVZHpB-crQvnfw0D8fbxq2QhsK2SHEr4R7qyD3UUq-BOfV-qmqVKntVphfQCTMbqf4jdUicguISAkiFdcd34t8KZ_QDnf2FDJ-BP/s1600/livros_use_a_cabeca_padroes_de_projetos.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0VqaDZB-MPEV8GTc1l7z-IEQiEfdtzmpoZFDk-NYWgVZHpB-crQvnfw0D8fbxq2QhsK2SHEr4R7qyD3UUq-BOfV-qmqVKntVphfQCTMbqf4jdUicguISAkiFdcd34t8KZ_QDnf2FDJ-BP/s1600/livros_use_a_cabeca_padroes_de_projetos.png" width="240" /></a></div>
<div style="text-align: center;">
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;"><br /></span></b></div>
<div style="text-align: center;">
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;">USE A CABEÇA - PHP</span></b> - <b><span style="color: #0b5394; font-family: Trebuchet MS, sans-serif;"><a href="https://drive.google.com/file/d/0B_-qufAUxAJLUWUybW42QnBnQm8/edit?usp=sharing" target="_blank">DOWNLOAD</a></span></b></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6gzI19oVnW9sx5kKL6KsYZAf_xwMlNdIIYvn82aBbSAZnIGfWYbJ1RX-y6bDWkwdS0tJKx6IY2OicnjhEelLD0j-yDM2YnL9fykbt8XF7U8lMZLvMMFW7W5579OcKzC4VD4_ddObXi72S/s1600/livros_use_a_cabeca_php.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6gzI19oVnW9sx5kKL6KsYZAf_xwMlNdIIYvn82aBbSAZnIGfWYbJ1RX-y6bDWkwdS0tJKx6IY2OicnjhEelLD0j-yDM2YnL9fykbt8XF7U8lMZLvMMFW7W5579OcKzC4VD4_ddObXi72S/s1600/livros_use_a_cabeca_php.png" width="276" /></a></div>
<br />
<div style="text-align: center;">
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;">USE A CABEÇA - RAILS</span></b> - <b><span style="color: #0b5394; font-family: Trebuchet MS, sans-serif;"><a href="https://drive.google.com/file/d/0B_-qufAUxAJLYmwyaHpHakt3Rms/edit?usp=sharing" target="_blank">DOWNLOAD</a></span></b></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjt2E3Lu4X0tdYzFieXUyk1PoGWoBnN50AakGJEq2CCUEppjOVhJf6ijl9ViaGbUIp027K6OXiK_eLQm6CV0mbHjP7xqtLicB04hwK0vPTcCIkG8Z3rIW7AuyYKXaqlC8pXnVTOGrsRHMv8/s1600/livros_use_a_cabeca_rails.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjt2E3Lu4X0tdYzFieXUyk1PoGWoBnN50AakGJEq2CCUEppjOVhJf6ijl9ViaGbUIp027K6OXiK_eLQm6CV0mbHjP7xqtLicB04hwK0vPTcCIkG8Z3rIW7AuyYKXaqlC8pXnVTOGrsRHMv8/s1600/livros_use_a_cabeca_rails.png" width="221" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;">USE A CABEÇA - SQL</span></b> - <b><span style="color: #0b5394; font-family: Trebuchet MS, sans-serif;"><a href="https://drive.google.com/file/d/0B_-qufAUxAJLd2FhU2RlQlE4X0E/edit?usp=sharing" target="_blank">DOWNLOAD</a></span></b></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdfrW3vpGhvSqjYOj7DFdYxc7BsW9DPPdCNLjXM3ftlMX7bOOTocS6jRdpgLKzoWErZEZZyKsA84QuRXZZw6uNHt8wUblDy_0KjlLK3HOcuuV16jBDNkzKwsDB7Pd_2M26BeeCE8kSIPZF/s1600/livros_use_a_cabeca_sql.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdfrW3vpGhvSqjYOj7DFdYxc7BsW9DPPdCNLjXM3ftlMX7bOOTocS6jRdpgLKzoWErZEZZyKsA84QuRXZZw6uNHt8wUblDy_0KjlLK3HOcuuV16jBDNkzKwsDB7Pd_2M26BeeCE8kSIPZF/s1600/livros_use_a_cabeca_sql.png" width="228" /></a></div>
<div style="text-align: center;">
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;"><br /></span></b></div>
<div style="text-align: center;">
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;">DESENVOLVENDO APLICATIVOS MOBILE - ANDROID</span></b> - <b><span style="color: #0b5394; font-family: Trebuchet MS, sans-serif;"><a href="https://drive.google.com/file/d/0B_-qufAUxAJLNWViUkpmN293VEk/edit?usp=sharing" target="_blank">DOWNLOAD</a></span></b></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrWmfwA6lXo9WUns25MqQDjPwHeNO7h4bhll3KnlwESPUnDn4C-ARzq3xhORw0X0srDTyP1qE0Eksb2i8KpMr8gKFBKM0dWv3M-QafgDR4Hn_arKTSRofS-JSimNu6y2T3QIT-I08C_dmp/s1600/livros_android_hachi.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrWmfwA6lXo9WUns25MqQDjPwHeNO7h4bhll3KnlwESPUnDn4C-ARzq3xhORw0X0srDTyP1qE0Eksb2i8KpMr8gKFBKM0dWv3M-QafgDR4Hn_arKTSRofS-JSimNu6y2T3QIT-I08C_dmp/s1600/livros_android_hachi.png" style="border: 1px solid black;" width="226" /></a></div>
<div style="text-align: center;">
<b><span style="color: #0b5394; font-family: Trebuchet MS, sans-serif;"><br /></span></b></div>
<div style="text-align: center;">
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;">ORGANIZAÇÃO ESTRUTURA DE COMPUTADORES </span><span style="color: #0b5394; font-family: Trebuchet MS, sans-serif;">- <a href="https://drive.google.com/file/d/0B_-qufAUxAJLTjBtQkNVMjlMTzA/edit?usp=sharing" target="_blank">DOWNLOAD</a></span></b></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3SOsVz55zG46Vk_4hkBfbp9jjoNcgHj911aoQccVPxDbBGKx-YF1JnhveILM-IdZ-DUmq265vvIwZVT90bXvqJxYz6pamQkQc0OKscvLqHPNKpiXjc74HDUs3q9-vZYzqUMFBQfV8uRim/s1600/livros_organizacao_estruturada_de_computadores.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3SOsVz55zG46Vk_4hkBfbp9jjoNcgHj911aoQccVPxDbBGKx-YF1JnhveILM-IdZ-DUmq265vvIwZVT90bXvqJxYz6pamQkQc0OKscvLqHPNKpiXjc74HDUs3q9-vZYzqUMFBQfV8uRim/s1600/livros_organizacao_estruturada_de_computadores.png" style="border: 1px solid black;" width="228" /></a></div>
<div style="text-align: center;">
<b><span style="color: #0b5394; font-family: Trebuchet MS, sans-serif;"><br /></span></b>
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;">GOOGLE ANDROID</span><span style="color: #0b5394; font-family: Trebuchet MS, sans-serif;"> - <a href="https://drive.google.com/file/d/0B_-qufAUxAJLNkEzTmpMT0o4NFU/edit?usp=sharing" target="_blank">DOWNLOAD</a></span></b><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjT_w1NxmPlA0p07WDI7GljSIWnpGkKJBIEpuRUMyNO4NqrRfCI9rijaaPul5mslB4D-1GZ2ghwl7ArtAnuiTDsYDQFLyWxfEUZnCiCQuXxA9PqyXw-rFdyBr4yn-ZwTXO1AVIgP6QMlvCl/s1600/livros_google_android.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjT_w1NxmPlA0p07WDI7GljSIWnpGkKJBIEpuRUMyNO4NqrRfCI9rijaaPul5mslB4D-1GZ2ghwl7ArtAnuiTDsYDQFLyWxfEUZnCiCQuXxA9PqyXw-rFdyBr4yn-ZwTXO1AVIgP6QMlvCl/s1600/livros_google_android.png" width="231" /></a></div>
<b><span style="color: #0b5394; font-family: Trebuchet MS, sans-serif;"><br /></span></b>
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;"><br /></span></b><br />
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;">APLICATIVOS WEB PRO ANDROID</span><span style="color: #0b5394; font-family: Trebuchet MS, sans-serif;"> - <a href="https://drive.google.com/file/d/0B_-qufAUxAJLTWViZWdGTFVKQnM/edit?usp=sharing" target="_blank">DOWNLOAD</a></span></b><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpWcF3DSEcditSLwXtX5MSoPSDyvIHMhPu9X4KOLPG2aY0l1Jiv9CwRHSy6vtCy7ilF5_cm7zgQM2WGdIzWL12ZEhpuyb9UmViO_M8gDvlNu3pHqS7avffJivjW5GVKW1vcUEfWhNSAXKj/s1600/livros_aplicativos_web_pro_android.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpWcF3DSEcditSLwXtX5MSoPSDyvIHMhPu9X4KOLPG2aY0l1Jiv9CwRHSy6vtCy7ilF5_cm7zgQM2WGdIzWL12ZEhpuyb9UmViO_M8gDvlNu3pHqS7avffJivjW5GVKW1vcUEfWhNSAXKj/s1600/livros_aplicativos_web_pro_android.png" width="221" /></a></div>
<b><span style="color: #0b5394; font-family: Trebuchet MS, sans-serif;"><br /></span></b>
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;">PROGRAMMING ANDROID ( Inglês )</span><span style="color: #0b5394; font-family: Trebuchet MS, sans-serif;"> - <a href="https://drive.google.com/file/d/0B_-qufAUxAJLaUtEN2pwMnljY2M/edit?usp=sharing" target="_blank">DOWNLOAD</a></span></b><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwWXJZHNuaIPgi9K04uPHfnZX13L_4rmVRnM2lVLzMTHZ879_r9V3hApp9EzssQPa3PHXKYwkNsro2ioF6JY2ioTfy9gU1Tsjla9DgZ5MLvbSbYE3x3tG4bl3OD5f4G8ocwhzVhAcvmVws/s1600/livros_programming_android.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwWXJZHNuaIPgi9K04uPHfnZX13L_4rmVRnM2lVLzMTHZ879_r9V3hApp9EzssQPa3PHXKYwkNsro2ioF6JY2ioTfy9gU1Tsjla9DgZ5MLvbSbYE3x3tG4bl3OD5f4G8ocwhzVhAcvmVws/s1600/livros_programming_android.png" width="248" /></a></div>
<b><span style="color: #0b5394; font-family: Trebuchet MS, sans-serif;"><br /></span></b>
<b><span style="color: orange; font-family: Trebuchet MS, sans-serif;">NOVOS</span></b><br />
<b><span style="color: #0b5394; font-family: Trebuchet MS, sans-serif;"><br /></span></b>
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;">DESENVOLVA JOGOS COM HTML5 e JAVASCRIPT</span><span style="color: #0b5394; font-family: Trebuchet MS, sans-serif;"> - <a href="https://drive.google.com/file/d/0B_-qufAUxAJLQ3I2Sm1sTlBzeE0/edit?usp=sharing" target="_blank">DOWNLOAD</a></span></b><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkUDp5xrvUAjrfGewQ3JrZUpuJ72IA4WpHkTyQcG3tOUP8e9NrmFI-iB7oBQajJ0j0YsOLM6oEPISSkH4y9KHk3JGnk792mXZLPbJ4QIoHUkyjciJr2aMmDzY5rGBA90IL52vsFjo8uSiI/s1600/desenvolvendo-jogos-com-html5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkUDp5xrvUAjrfGewQ3JrZUpuJ72IA4WpHkTyQcG3tOUP8e9NrmFI-iB7oBQajJ0j0YsOLM6oEPISSkH4y9KHk3JGnk792mXZLPbJ4QIoHUkyjciJr2aMmDzY5rGBA90IL52vsFjo8uSiI/s1600/desenvolvendo-jogos-com-html5.png" width="226" /></a></div>
<b><span style="color: #0b5394; font-family: Trebuchet MS, sans-serif;"><br /></span></b>
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;">DOMINANDO JAVASCRIPT COM JQUERY</span><span style="color: #0b5394; font-family: Trebuchet MS, sans-serif;"> - <a href="https://drive.google.com/file/d/0B_-qufAUxAJLdG1hV2IzdFRWYlk/edit?usp=sharing" target="_blank">DOWNLOAD</a></span></b><br />
<div class="separator" style="clear: both;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhz4YNkJnNpCnlpcIpFjaeTJTugHbrlV38_AK7nZISkxYXy5lZYFsNqJFkcYpmKKnGKAUEZxY6R5c5J2K59cgnfYDgWBe3NiXq7GvR0iilsPLiEeHLRGyt4-HAq6QvAeB1pt5lK-5fDd5Ii/s1600/dominado-javascript-com-jquery.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhz4YNkJnNpCnlpcIpFjaeTJTugHbrlV38_AK7nZISkxYXy5lZYFsNqJFkcYpmKKnGKAUEZxY6R5c5J2K59cgnfYDgWBe3NiXq7GvR0iilsPLiEeHLRGyt4-HAq6QvAeB1pt5lK-5fDd5Ii/s1600/dominado-javascript-com-jquery.png" width="227" /></a></div>
<div class="separator" style="clear: both;">
<br /></div>
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;">JAVA 8 PRÁTICO</span><span style="color: #0b5394; font-family: Trebuchet MS, sans-serif;"> - <a href="https://drive.google.com/file/d/0B_-qufAUxAJLSk9xNmRrYWlTTEE/edit?usp=sharing" target="_blank">DOWNLOAD</a></span></b><br />
<div class="separator" style="clear: both;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1B0nyyeKb8EDOZPdXsmutLRjmm8dEphQlTgerCTHz5T8KT4i5a3J-HatM44bjqehkHidmaPpPwGZaoIQQtwLTpUqvHAux_KEbq4CfaB6wndItVUF3paxRx5gSxgJky5az4fM7-rX41tbC/s1600/java-8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1B0nyyeKb8EDOZPdXsmutLRjmm8dEphQlTgerCTHz5T8KT4i5a3J-HatM44bjqehkHidmaPpPwGZaoIQQtwLTpUqvHAux_KEbq4CfaB6wndItVUF3paxRx5gSxgJky5az4fM7-rX41tbC/s1600/java-8.png" width="226" /></a></div>
<div class="separator" style="clear: both;">
<br /></div>
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;">COMPILADORES, PRINCÍPIOS, TÉCNICAS E FERRAMENTAS</span><span style="color: #0b5394; font-family: Trebuchet MS, sans-serif;"> - <a href="https://drive.google.com/file/d/0B_-qufAUxAJLOHpRRlpBMkdyalE/edit?usp=sharing" target="_blank">DOWNLOAD</a></span></b><br />
<div class="separator" style="clear: both;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-viUgYkW7IjGJYhkGamJrNTSJONSVZo_hvJnnqrn-b4mZNH_XwufKlheQaYClEdB_JkxNkd0mXjQJcwORqKdRklWTh8J2jfJtw1HDGq8EOlCaKpbJtVqkNb2J7JE4aw8Abse1x3lFvBbK/s1600/Compiladores-Principios-Tecnicas.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-viUgYkW7IjGJYhkGamJrNTSJONSVZo_hvJnnqrn-b4mZNH_XwufKlheQaYClEdB_JkxNkd0mXjQJcwORqKdRklWTh8J2jfJtw1HDGq8EOlCaKpbJtVqkNb2J7JE4aw8Abse1x3lFvBbK/s1600/Compiladores-Principios-Tecnicas.png" width="242" /></a></div>
<div>
<br /></div>
<div>
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;">JAVA - COMO PROGRAMAR - 8ª EDIÇÃO</span><span style="color: #0b5394; font-family: Trebuchet MS, sans-serif;"> - <a href="https://drive.google.com/file/d/0B_-qufAUxAJLbUh3RXQ0cXlpalU/edit?usp=sharing" target="_blank">DOWNLOAD</a></span></b><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQBoLHVvyBm5N2MR9L1FvqUHAZhyQgtWc6L2uuEzwwp7Eva-YpejdH8rHNWDpc6I2fRLVpXkRASj40JfGn7XNdvlX2DXVQvGl0NAdZAABHAYD0td6wKPnmUGSyMHhlh5hP4s2zlv9WT8Ez/s1600/Java-Como-Programar.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQBoLHVvyBm5N2MR9L1FvqUHAZhyQgtWc6L2uuEzwwp7Eva-YpejdH8rHNWDpc6I2fRLVpXkRASj40JfGn7XNdvlX2DXVQvGl0NAdZAABHAYD0td6wKPnmUGSyMHhlh5hP4s2zlv9WT8Ez/s1600/Java-Como-Programar.jpg" width="226" /></a></div>
<b><span style="color: #0b5394; font-family: Trebuchet MS, sans-serif;"><br /></span></b>
<div class="separator" style="clear: both;">
<br /></div>
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;">LÓGICA DE PROGRAMAÇÃO</span><span style="color: #0b5394; font-family: Trebuchet MS, sans-serif;"> - <a href="https://drive.google.com/file/d/0B_-qufAUxAJLOFQ5TEV6SWVMSU0/edit?usp=sharing" target="_blank">DOWNLOAD</a></span></b><br />
<div class="separator" style="clear: both;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiACcF7MdNo9G6d95x2OTJr1WvjLXtQlwNZ7qvC6vA1urY-ffp5uj65eMEIpQNZaBMjWfoWV84CBzitq36jYsAwsQfbd-_ikOBhEekfNcmuH8ZOuaXHg07gYQH0DDYbptlj747Apkhgfnrz/s1600/logica-de-programacao.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiACcF7MdNo9G6d95x2OTJr1WvjLXtQlwNZ7qvC6vA1urY-ffp5uj65eMEIpQNZaBMjWfoWV84CBzitq36jYsAwsQfbd-_ikOBhEekfNcmuH8ZOuaXHg07gYQH0DDYbptlj747Apkhgfnrz/s1600/logica-de-programacao.png" width="226" /></a></div>
<div class="separator" style="clear: both;">
<br /></div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both;">
<br /></div>
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;">PROGRAMANDO EM C/C++ - A BÍBLIA</span><span style="color: #0b5394; font-family: Trebuchet MS, sans-serif;"> - <a href="https://drive.google.com/file/d/0B_-qufAUxAJLVVVIT0pvOTRyVmM/view?usp=sharing" target="_blank">DOWNLOAD</a></span></b><br />
<div class="separator" style="clear: both;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0NCtioGTI-yp5qnOyrbkXJI1vzcWtUG1pShkBj4X-Guf6RziAqXgRimVAJcZn5b5ECMQxha2EccVm8_wk70cULuJQnZwJ9K8EUMM4omCfhnpjlyvnz4WLADtZe0BUJWLa2MJrobpGaG_9/s1600/programando-em-c-a-biblia.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0NCtioGTI-yp5qnOyrbkXJI1vzcWtUG1pShkBj4X-Guf6RziAqXgRimVAJcZn5b5ECMQxha2EccVm8_wk70cULuJQnZwJ9K8EUMM4omCfhnpjlyvnz4WLADtZe0BUJWLa2MJrobpGaG_9/s1600/programando-em-c-a-biblia.jpg" width="231" /></a></div>
<div class="separator" style="clear: both;">
<br /></div>
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;">ALGORITMOS - TEORIA E PRÁTICA</span><span style="color: #0b5394; font-family: Trebuchet MS, sans-serif;"> - <a href="https://drive.google.com/file/d/0B_-qufAUxAJLUG5telZFR1BZNWM/edit?usp=sharing" target="_blank">DOWNLOAD</a></span></b><br />
<div class="separator" style="clear: both;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSFItKuKnY8YtuWtBxEJDVJC8qNf5WGgoVm-xn_Dbiz68rvAdPKq2CIJ5vidMB-7mjwdHif5Tmt_GcT5OuzJBFSkYZ0xA6rsa1H663i2Ld6EKS45mxNy7qvCtwABaa8-pyUCHHI5pcMNkD/s1600/Algoritmos-teoria-e-pratica.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSFItKuKnY8YtuWtBxEJDVJC8qNf5WGgoVm-xn_Dbiz68rvAdPKq2CIJ5vidMB-7mjwdHif5Tmt_GcT5OuzJBFSkYZ0xA6rsa1H663i2Ld6EKS45mxNy7qvCtwABaa8-pyUCHHI5pcMNkD/s1600/Algoritmos-teoria-e-pratica.png" width="241" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />
<b><span style="color: #0b5394; font-family: Trebuchet MS, sans-serif;"><br /></span></b>
<br />
<div class="separator" style="clear: both;">
</div>
<div class="separator" style="clear: both;">
</div>
<div class="separator" style="clear: both;">
</div>
</div>
<div class="separator" style="clear: both;">
</div>
</div>
Tiago Henriquehttp://www.blogger.com/profile/09385302997357057888noreply@blogger.com38tag:blogger.com,1999:blog-6492043148642544250.post-85245638379252934872014-06-21T13:54:00.000-03:002014-06-21T13:57:21.261-03:00PIC: Sensor PIR<h1 style="text-align: center;">
<span style="color: red; font-family: Trebuchet MS, sans-serif;">PIC: S<span style="font-weight: normal;">ENSOR</span> PIR</span></h1>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVGqt_8odoHJuyauL3hdU_lY45pzIGA5C0mD9vWp3fsQFH6H4OV0VHNa1tCvjGjAuB_bK4PDA7_wXX4gGec7TK54wng7vIUyEjrugYqDv-h7y1K7VFiAa5Tf2EeZj3B2tDTm0MOzCH6Rm3/s1600/PIC.SENSOR.PIR.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVGqt_8odoHJuyauL3hdU_lY45pzIGA5C0mD9vWp3fsQFH6H4OV0VHNa1tCvjGjAuB_bK4PDA7_wXX4gGec7TK54wng7vIUyEjrugYqDv-h7y1K7VFiAa5Tf2EeZj3B2tDTm0MOzCH6Rm3/s1600/PIC.SENSOR.PIR.png" height="354" width="640" /></a></div>
<br />
<br />
<a name='more'></a><div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">Sensor PIR ( Passive Infra-Red ) são usados para detectar movimentos, através da radiação infravermelha liberada por uma pessoa. Podemos ligar este sensor</span><span style="font-family: 'Trebuchet MS', sans-serif;"> para acender uma lâmpada, acionar portas, portões, sirenes, etc.</span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMuUb_DG8-TmmJl-19JkaNlY3nQ4qro_TtGtMynwtZtSdMpiFuslPibhcLA7aF_Mx7JvhiV3_m-Bg0kbfp1ZT4MtyApyz0EUri5D_MVD_VFCUyj40M-DRJRps_YWmG-XTC9eMZUYd-rDlG/s1600/PIC.SENSOR.PIR.1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMuUb_DG8-TmmJl-19JkaNlY3nQ4qro_TtGtMynwtZtSdMpiFuslPibhcLA7aF_Mx7JvhiV3_m-Bg0kbfp1ZT4MtyApyz0EUri5D_MVD_VFCUyj40M-DRJRps_YWmG-XTC9eMZUYd-rDlG/s1600/PIC.SENSOR.PIR.1.jpg" height="238" width="400" /></a></div>
<br />
<span style="font-family: Trebuchet MS, sans-serif;">Este módulo possui um ajuste de sensibilidade, podendo aumentar ou diminuir o alcance do sensor( 3 a 7 metros ). Também possui um ajuste do tempo que a saída permanecerá acionada ( nível alto ), variando de 5 a 200 segundos. Estes ajustes são feitos através de dois potenciômetros:</span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuyS2X-RuGpsZVtAQLUiD-rcQ7oZDkNtkl-IcyEryq_gTSUyMI-BzjY7TRUvH9NIx6CaDcOZ4aV-phldB2bFXIWJNI2aXtbsSU6FstnQEdLzy8ncFevWbbmcdRO52QEck-WI4f7vq3cirq/s1600/PIC.SENSOR.PIR.2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuyS2X-RuGpsZVtAQLUiD-rcQ7oZDkNtkl-IcyEryq_gTSUyMI-BzjY7TRUvH9NIx6CaDcOZ4aV-phldB2bFXIWJNI2aXtbsSU6FstnQEdLzy8ncFevWbbmcdRO52QEck-WI4f7vq3cirq/s1600/PIC.SENSOR.PIR.2.png" height="221" width="400" /></a></div>
<br />
<br />
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">Quando o sensor detecta a presença de alguém, a saída ( OUTPUT ) ficará em nível lógico alto. Após um determinado tempo ( ajustado pelo potenciômetro ) ele voltará para o estado lógico baixo.</span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="color: red; font-family: Trebuchet MS, sans-serif;"><b>EXEMPLO</b></span><br />
<div style="text-align: right;">
<span style="color: #666666; font-family: Trebuchet MS, sans-serif; font-size: x-small;"><b>MikroC PRO PIC</b></span></div>
</div>
<pre class="mikroCCode">//PROJETO: SENSOR DE MOVIMENTO
//MCU: PIC12F675
//CLOCK: 4MHz INTOSC
//COMPILADOR: MikroC PRO PIC
// Habilitar a seguinte biblioteca:
// - Sound
sbit Sensor at GPIO.B2;
void main()
{
ANSEL = 0; //desabilita o canal analogico
CMCON = 0; //desabilita o comparador analogico
TRISIO.B2 = 1; //define o pino GP2 como entrada
Sound_Init( &GPIO, 0 );
while(1)
{
if( Sensor )
{
Sound_Play( 1500, 200 ); //toca um som relaxante
Delay_ms( 400 );
}
}
}
</pre>
Tiago Henriquehttp://www.blogger.com/profile/09385302997357057888noreply@blogger.com3tag:blogger.com,1999:blog-6492043148642544250.post-27087788822119781972014-06-20T17:00:00.000-03:002015-01-22T14:11:25.493-02:00PIC: TEA5767<h1 style="text-align: center;">
<span style="font-family: Trebuchet MS, sans-serif;"><span style="color: red;">PIC</span><span style="color: red; font-weight: normal;">: </span><span style="color: red;">T</span><span style="color: red; font-weight: normal;">EA</span><span style="color: red;">5</span><span style="color: red; font-weight: normal;">7</span><span style="color: red;">6</span><span style="color: red; font-weight: normal;">7</span></span></h1>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXUEY_PbsGHm_dIl3SMMVSAtVN5wWAPoMSt3Ajoz_5_0fCUE-6hvrEFLGZ3ozO0pz92FABO0Y-i1Ijg6-kwfcXxIEeXiscWvnYwJ2MIcTPqT55RzWCOiGYwjhzdOFAVVpC6ksBD-D2cNrD/s1600/PIC.TEA5767.RADIO.FM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXUEY_PbsGHm_dIl3SMMVSAtVN5wWAPoMSt3Ajoz_5_0fCUE-6hvrEFLGZ3ozO0pz92FABO0Y-i1Ijg6-kwfcXxIEeXiscWvnYwJ2MIcTPqT55RzWCOiGYwjhzdOFAVVpC6ksBD-D2cNrD/s1600/PIC.TEA5767.RADIO.FM.png" height="366" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<a name='more'></a><span style="font-family: 'Trebuchet MS', sans-serif; text-align: justify;">Dessa vez, iremos montar um rádio FM digital, utilizando o módulo </span><a href="http://www.voti.nl/docs/TEA5767.pdf" style="font-family: 'Trebuchet MS', sans-serif; text-align: justify;" target="_blank"><b>TEA5767</b></a><span style="font-family: 'Trebuchet MS', sans-serif; text-align: justify;">.</span><br />
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">O circuito integrado <b>TEA5767 </b>é um rádio FM estéreo em um único chip. Possui um baixo consumo de energia e não requer nenhum tipo de ajuste no circuito. Sintoniza bandas FM Japonesas( 76 - 91 MHz ) ou Europeias ( 87.5 - 108 MHz ). Comunica-se com o microcontrolador através de um barramento I2C.</span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">O módulo possui 10 pinos. O pino <i>BUS MODE</i> quando em nível baixo habilita a comunicação via I2C. Para habilitar a comunicação 3-Wire apenas coloque o pino em nível alto. Os pinos <i>SDA </i>( dados ) e <i>SCL </i>( clock ) são os pinos da interface I2C. É alimentado com tensão entre 2.5V até 5V. Possui duas saídas para o áudio estéreo ( <i>LEFT </i>e <i>RIGHT </i>). O pino 10 é para a ligação de uma antena.</span></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikp-ZqPCyZ3AfRbxdzIuBS40Vl5gfkZPc8VRHrIesxhjMPtuzPe-mQF4RqYsMz-WT0wJw6j7mJtyLIehnkHsV2QFa8p46XfkVQHVEVZlgPTI2XUCOXJ75JZ0WJ58H5zUoDC9zMPTnl-eex/s1600/PIC.TEA5767.RADIO.FM.PINOUT.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikp-ZqPCyZ3AfRbxdzIuBS40Vl5gfkZPc8VRHrIesxhjMPtuzPe-mQF4RqYsMz-WT0wJw6j7mJtyLIehnkHsV2QFa8p46XfkVQHVEVZlgPTI2XUCOXJ75JZ0WJ58H5zUoDC9zMPTnl-eex/s1600/PIC.TEA5767.RADIO.FM.PINOUT.png" height="202" width="320" /></a></div>
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;">BIBLIOTECA
</span></b><br />
<div style="text-align: right;">
<span style="color: #666666; font-family: Trebuchet MS, sans-serif; font-size: x-small;"><b>MikroC PRO PIC</b></span></div>
<pre class="mikroCCode">#define TEA5767_ADDRESS 0xC0
static char WriteBytes[5] = { 0x00, 0x00, 0xD0, 0x10, 0x00 };
struct
{
union
{
char FREQUENCIA_H : 6;
char SEARCH_MODE : 1;
char MUTE : 1;
};
char FREQUENCIA_L;
union
{
char SWP1 : 1;
char MUTE_LEFT : 1;
char MUTE_RIGHT : 1;
char MONO_TO_STEREO : 1;
char HLSI : 1;
char SEARCH_STOP_LEVEL : 2;
char SEARCH_UP_DOWN : 1;
};
union
{
char : 5;
char BAND_LIMIT : 1; //1 = Japan FM Band, 0 = US/Europe FM Band
char STANDY_BY_ON : 1;
char SWP2 : 1;
};
} TEA5767 at WriteBytes;
void TEA5767_Write()
{
Soft_I2C_Start();
Soft_I2C_Write( TEA5767_ADDRESS );
Soft_I2C_Write( WriteBytes[0] );
Soft_I2C_Write( WriteBytes[1] );
Soft_I2C_Write( WriteBytes[2] );
Soft_I2C_Write( WriteBytes[3] );
Soft_I2C_Write( WriteBytes[4] );
Soft_I2C_Stop();
}
void TEA5767_Read( unsigned long *freq_hz, char *flags, char *sinal )
{
unsigned long Freq_Tmp = 0;
char ReadBytes[5];
//Faz a leitura de 4 bytes
Soft_I2C_Start();
Soft_I2C_Write( TEA5767_ADDRESS | 1 );
ReadBytes[0] = Soft_I2C_Read( 1 );
ReadBytes[1] = Soft_I2C_Read( 1 );
ReadBytes[2] = Soft_I2C_Read( 1 );
ReadBytes[3] = Soft_I2C_Read( 1 );
ReadBytes[4] = Soft_I2C_Read( 0 );
Soft_I2C_Stop();
//Calcula a frequencia em hz
((char*)&Freq_Tmp)[1] = ReadBytes[0] & 0x3F;
((char*)&Freq_Tmp)[0] = ReadBytes[1];
Freq_Tmp <<= 13;
if( TEA5767.HLSI )
Freq_Tmp -= 225000;
else
Freq_Tmp += 225000;
*freq_hz = Freq_Tmp;
//Nivel do sinal recebido
*sinal = ReadBytes[3] >> 4;
//flags
(*flags).B0 = ReadBytes[2].B7; //mono ou stereo
(*flags).B1 = ReadBytes[0].B7; //estacao foi encontrada, caso o scan estiver ativado
(*flags).B2 = ReadBytes[0].B6; //atingiu o limite de banda
}
void TEA5767_Sintonizar( unsigned long freq_hz )
{
//Formula = 4 * ( FREQ + 225000 ) / 32768
if( TEA5767.HLSI )
freq_hz += 225000;
else
freq_hz -= 225000;
freq_hz >>= 13;
TEA5767.FREQUENCIA_H = ((char*)&freq_hz)[1];
TEA5767.FREQUENCIA_L = ((char*)&freq_hz)[0];
TEA5767.SEARCH_STOP_LEVEL = 1;
TEA5767_Write();
}
void TEA5767_Scan( char direcao )
{
TEA5767.SEARCH_MODE = 1;
TEA5767.SEARCH_UP_DOWN = direcao.B0;
TEA5767.SEARCH_STOP_LEVEL = 2;
TEA5767_Write();
}
</pre>
<br />
<div style="text-align: left;">
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;">EXEMPLO</span></b></div>
<div style="text-align: right;">
<b style="color: #666666; font-family: 'Trebuchet MS', sans-serif; text-align: right;"><span style="font-size: x-small;"><br /></span></b>
<b style="color: #666666; font-family: 'Trebuchet MS', sans-serif; text-align: right;"><span style="font-size: x-small;"><br /></span></b>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjZ6Er1SW6FwVmWHyqdqs2xmAaa0OlGNv-ztWuOMpBveki62aycUMeMKeH_laCvY4x_lSEd6kmLQLn7G3QZY0bfPwtBnGt-GRbM2E-KGwB1ekXSU-pnAYLkz0cj0zuI25NYjFoT4Ljncz3/s1600/PIC.TEA5767.TESTE.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjZ6Er1SW6FwVmWHyqdqs2xmAaa0OlGNv-ztWuOMpBveki62aycUMeMKeH_laCvY4x_lSEd6kmLQLn7G3QZY0bfPwtBnGt-GRbM2E-KGwB1ekXSU-pnAYLkz0cj0zuI25NYjFoT4Ljncz3/s1600/PIC.TEA5767.TESTE.jpg" height="400" width="300" /></a></div>
<br />
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">No exemplo, há dois botões, que são utilizados para sintonizar a frequência e, também para procura automática das estações de rádio. A procura das estações ocorre quando o botão é pressionado por mais de 1 segundo. Para sintonizar, basta pressionar o botão, que a frequência irá decrementar ou incrementar em 100KHz ( 0.1MHz ).</span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">O Display de LCD exibirá a frequência da rádio, o tipo da saída de áudio ( Stereo ou Mono ) e também o nível do sínal recebido. </span></div>
<b style="color: #666666; font-family: 'Trebuchet MS', sans-serif;"><span style="font-size: x-small;">MikroC PRO PIC</span></b></div>
<pre class="mikroCCode">//Projeto: Radio FM com TEA5767
//MCU: PIC18F4550
//CLOCK: 48MHz ( 20MHz + PLL )
//Autor: Tiago Henrique
//Compilador: MikroC PRO PIC
//Habilitar as seguintes bibliotecas:
// - Conversions
// - Software_I2C
// - LCD
//copie e cole o código da biblioteca aqui!!!
sbit Soft_I2C_Scl at RD1_bit;
sbit Soft_I2C_Sda at RD0_bit;
sbit Soft_I2C_Scl_Direction at TRISD1_bit;
sbit Soft_I2C_Sda_Direction at TRISD0_bit;
sbit LCD_RS at RD2_bit;
sbit LCD_EN at RD3_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;
sbit LCD_RS_Direction at TRISD2_bit;
sbit LCD_EN_Direction at TRISD3_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
sbit ButtonUp at PORTB.B2;
sbit ButtonDown at PORTB.B3;
unsigned long frequencia = 103500000; //frequencia de uma rádio em Hz
char nivel;
char radio_flags = 0;
char texto[12];
char tempo = 0;
void main()
{
ADCON1 = 0x0F; //desativa o canal analogico
CMCON = 7; //desativa o comparador analogico
NOT_RBPU_Bit = 0; //habilita os resistores de pull-up da PORTB
Soft_I2C_Init(); //inicializa a comunicacao I2C
Lcd_Init(); //iniciliaza o display lcd
Lcd_Cmd( _LCD_CURSOR_OFF );
Lcd_Cmd( _LCD_CLEAR );
TRISB.B3 = 1; //botao de sintonia ( - ), botao de procura ( down )
TRISB.B2 = 1; //botao de sintonia ( + ), botao de procura ( up )
TEA5767_Sintonizar( frequencia ); //Sintoniza o radio
while( 1 )
{
if( !ButtonUp )
{
tempo = 0;
while( !ButtonUp )//enquanto o botao estiver pressionado
{
tempo++;
if( tempo >= 200 )
break;
Delay_ms( 5 );
}
frequencia += 100000;
TEA5767_Sintonizar( frequencia );
if( tempo >= 200 ) //1 segundo pressionado?
{
TEA5767_Scan( 1 );
Lcd_Out( 2, 8, "SCAN" );
}
}
else if( !ButtonDown )
{
tempo = 0;
while( !ButtonDown )//enquanto o botao estiver pressionado
{
tempo++;
if( tempo >= 200 )
break;
Delay_ms( 5 );
}
frequencia -= 100000;
TEA5767_Sintonizar( frequencia );
if( tempo >= 200 ) //1 segundo pressionado
{
TEA5767_Scan( 0 );
Lcd_Out( 2, 8, "SCAN" );
}
}
TEA5767_Read( &frequencia, &radio_flags, &nivel );
//imprime no display lcd
Lcd_Out( 1, 1, "FREQ: " );
WordToStr( frequencia / 100000, texto );
Lcd_Chr_CP( texto[1] );
Lcd_Chr_CP( texto[2] );
Lcd_Chr_CP( texto[3] );
Lcd_Chr_CP( '.' );
Lcd_Chr_CP( texto[4] );
Lcd_Out_CP( " MHz" );
ByteToStr( nivel, texto );
Lcd_Out( 2, 12, texto );
if( radio_flags.B0 )
Lcd_Out( 2, 1, "STEREO" );
else
Lcd_Out( 2, 1, " MONO " );
if( radio_flags.B1 ) //Estacao encontrada
{
TEA5767.SEARCH_MODE = 0;
Lcd_Out( 2, 8, " " );
}
Delay_ms( 50 );
}
}
</pre>
Tiago Henriquehttp://www.blogger.com/profile/09385302997357057888noreply@blogger.com10tag:blogger.com,1999:blog-6492043148642544250.post-19816021099649251162014-06-18T21:39:00.000-03:002018-03-23T08:43:23.654-03:00PIC: LCD com 74HC595<img class="post-banner" src="https://www.dropbox.com/s/vhaltd79cmei5n3/pic-lcd595.png?dl=1"></img><br />
<br />
<div class="markdown"><textarea><br />
Neste post mostrarei uma maneira de ligar um display de LCD a microcontroladores PIC que possuem poucos pinos de IO, como é o caso do PIC12F675.<br />
<br />
Utilizando um registrador de deslocamento (*Shift Register*), o 74HC595, funcionando como um expansor de portas I/O, é possível utilizar apenas 3 pinos do microcontrolador, ao invés de 6 pinos.<br />
<br />
> Para o PIC12F675 é recomendável usar seu clock interno (*INTOSC Oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN*). Assim sobram mais pinos para serem usados como entrada analógica, ligar um botão ou um LED.<br />
<br />
<!-- --><br />
### Download<br />
<br />
[LCD595.zip](https://www.dropbox.com/s/g7dgnl9p0dnaypd/PIC-LCD595.zip?dl=1)<br />
<br />
### Código<br />
<br />
<div data-gist="https://gist.github.com/tiagohm/ac1872ea46f7b21800723ad7f32f1da9"></div></textarea><br />
</div>Tiago Henriquehttp://www.blogger.com/profile/09385302997357057888noreply@blogger.com6tag:blogger.com,1999:blog-6492043148642544250.post-12213880855238052352014-04-25T15:29:00.002-03:002014-05-04T13:48:10.941-03:00PIC: Controlando Motores DC com L293D<div style="text-align: justify;">
<h1 style="text-align: center;">
<span style="color: red; font-family: Trebuchet MS, sans-serif;">PIC: C<span style="font-weight: normal;">ontrolando</span> M<span style="font-weight: normal;">otores</span> DC <span style="font-weight: normal;">com</span> L293D</span></h1>
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpUXYJTTFfNLDz8hyjfwxgJyOMzYmNnqZL6VTbJxeg2eGAScWbKHRfwXzoZCWNjoePGbYowzUH5rZkry45G6F3D86zO22tW179aDjzjuBv1RSzevI6OmXl2tRu-gPIIPQD2Z-1DmwLnTRC/s1600/PIC.L293D.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpUXYJTTFfNLDz8hyjfwxgJyOMzYmNnqZL6VTbJxeg2eGAScWbKHRfwXzoZCWNjoePGbYowzUH5rZkry45G6F3D86zO22tW179aDjzjuBv1RSzevI6OmXl2tRu-gPIIPQD2Z-1DmwLnTRC/s1600/PIC.L293D.png" height="376" width="640" /></a></div>
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<br />
<a name='more'></a><br />
<div style="text-align: justify;">
<span style="font-family: 'Trebuchet MS', sans-serif;">O CI </span><a href="http://pdf.datasheetcatalog.com/datasheet/stmicroelectronics/1330.pdf" style="font-family: 'Trebuchet MS', sans-serif;" target="_blank">L293D</a> <span style="font-family: 'Trebuchet MS', sans-serif;">é um controlador que possui duas </span><a href="http://pt.wikipedia.org/wiki/Ponte_H" style="font-family: 'Trebuchet MS', sans-serif;" target="_blank">Ponte-H</a><span style="font-family: 'Trebuchet MS', sans-serif;">. Pode controlar motores de corrente contínua (DC) de 4.5V até 36V. O L293D suporta uma corrente constante de 600mA e uma corrente de pico de 1.2A. Portanto, tome cuidado para não utilizar motores que exijam correntes maiores que 600mA. Também possuem diodos de proteção internamente.</span></div>
<div style="text-align: justify;">
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: 'Trebuchet MS', sans-serif;">É possível ligar até dois motores ( ou três, para isso consulte o datasheet ).</span><br />
<span style="font-family: 'Trebuchet MS', sans-serif;"><br /></span>
<span style="font-family: 'Trebuchet MS', sans-serif;"><b><span style="color: red;">FUNCIONAMENTO:</span></b></span></div>
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<br />
<center>
<table border="0" cellpadding="5" cellspacing="0" style="background-color: white; border-radius: 5px; border: 3px solid gray;">
<tbody>
<tr><td><span style="color: red; font-family: Trebuchet MS, sans-serif;"><b>EN1</b></span></td><td><span style="color: red; font-family: Trebuchet MS, sans-serif;"><b>IN1</b></span></td><td><span style="color: red; font-family: Trebuchet MS, sans-serif;"><b>IN2</b></span></td><td><span style="color: red; font-family: Trebuchet MS, sans-serif;"><b>Função</b></span></td></tr>
<tr><td><span style="color: #3d85c6; font-family: Trebuchet MS, sans-serif;">H</span></td><td><span style="color: #3d85c6; font-family: Trebuchet MS, sans-serif;">L</span></td><td><span style="color: #3d85c6; font-family: Trebuchet MS, sans-serif;">H</span></td><td><span style="color: #6aa84f; font-family: Trebuchet MS, sans-serif;">Girar para um lado</span></td></tr>
<tr><td><span style="color: #3d85c6; font-family: Trebuchet MS, sans-serif;">H</span></td><td><span style="color: #3d85c6; font-family: Trebuchet MS, sans-serif;">H</span></td><td><span style="color: #3d85c6; font-family: Trebuchet MS, sans-serif;">L</span></td><td><span style="color: #6aa84f; font-family: Trebuchet MS, sans-serif;">Girar para outro lado</span></td></tr>
<tr><td><span style="color: #3d85c6; font-family: Trebuchet MS, sans-serif;">H</span></td><td><span style="color: #3d85c6; font-family: Trebuchet MS, sans-serif;">L</span></td><td><span style="color: #3d85c6; font-family: Trebuchet MS, sans-serif;">L</span></td><td><span style="color: #6aa84f; font-family: Trebuchet MS, sans-serif;">Motor1 Parado</span></td></tr>
<tr><td><span style="color: #3d85c6; font-family: Trebuchet MS, sans-serif;">H</span></td><td><span style="color: #3d85c6; font-family: Trebuchet MS, sans-serif;">H</span></td><td><span style="color: #3d85c6; font-family: Trebuchet MS, sans-serif;">H</span></td><td><span style="color: #6aa84f; font-family: Trebuchet MS, sans-serif;">Motor1 Parado</span></td></tr>
<tr><td><span style="color: #3d85c6; font-family: Trebuchet MS, sans-serif;">L</span></td><td><span style="color: #3d85c6; font-family: Trebuchet MS, sans-serif;">X</span></td><td><span style="color: #3d85c6; font-family: Trebuchet MS, sans-serif;">X</span></td><td><span style="color: #6aa84f; font-family: Trebuchet MS, sans-serif;">Motor1 Parado</span></td></tr>
</tbody></table>
<br />
</center>
<div style="text-align: center;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Os pinos 2 e 7 são a entrada de controle para um motor. Os pinos 10 e 15 são a entrada de controle para um segundo motor.</span></div>
<div style="text-align: center;">
<span style="font-family: Trebuchet MS, sans-serif;">Os pinos 3 e 6 são a saída do motor 1 e os pinos 11 e 14 para o motor 2.</span></div>
<div style="text-align: center;">
<span style="font-family: Trebuchet MS, sans-serif;">Os pinos 1 e 9 habitam as saídas dos motores 1 e 2, respectivamente.</span></div>
<div style="text-align: center;">
<span style="font-family: Trebuchet MS, sans-serif;">O pino 16 é a alimentação do circuito interno, 5V.</span></div>
<div style="text-align: center;">
<div style="text-align: center;">
<span style="font-family: Trebuchet MS, sans-serif;">O pino 8 é a alimentação do motor, de 4.5V a 36V.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Neste projeto há 4 botões: um para acionar ou desacionar o motor, outro para alterar a direção da rotação e outros dois para aumentar e diminuir a velocidade.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">A velocidade do motor é controlada através do canal PWM do PIC conectando no pino 1 (EN1) do L293D.</span><br />
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span>
<span style="font-family: Trebuchet MS, sans-serif;">Para alterar o giro, é só alterar os níveis lógicos nos pinos 2 (IN1) e 7 (IN2), de acordo com a tabela acima.</span></div>
<div style="text-align: center;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div style="text-align: left;">
<span style="color: red; font-family: Trebuchet MS, sans-serif;"><b>DOWNLOAD:</b></span></div>
<div style="text-align: left;">
<span style="font-family: Trebuchet MS, sans-serif;">Projeto: <a href="https://app.box.com/s/8rjt7a9ypsrhl1aatu9k" target="_blank"><b>motor_dc_com_l293d.rar</b></a></span></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;">CÓDIGO:</span></b><br />
<div style="text-align: right;">
<b><span style="color: #999999; font-family: Trebuchet MS, sans-serif; font-size: x-small;">MikroC PRO PIC</span></b></div>
</div>
<div style="text-align: left;">
<br /></div>
</div>
<pre class="mikroCCode">/*
Autor: Tiago Henrique
MCU: PIC16F628A
Clock: INTOSC 4MHz
Bibliotecas:
PWM
*/
//Pinos de ligacao do L293D
sbit L293D_M1_P1 at RA1_Bit;
sbit L293D_M1_P2 at RA2_Bit;
sbit L293D_M1_P1_Direction at TRISA1_Bit;
sbit L293D_M1_P2_Direction at TRISA2_Bit;
void L293D_Init()
{
L293D_M1_P1_Direction = 0;
L293D_M1_P2_Direction = 0;
L293D_M1_P1 = 0;
L293D_M1_P2 = 0;
PWM1_Init( 500 );
PWM1_Set_Duty( 127 ); //Velocidade inicial 50%
PWM1_Start();
}
//direcao == 1 -> gira para um lado
//direcao == 2 -> gira para outro lado
//direcao == 0 -> motor parado
void L293D_Girar( char direcao )
{
//Define as saidas dos pinos
L293D_M1_P1 = direcao.B0;
L293D_M1_P2 = direcao.B1;
}
void main()
{
char velocidade = 255; //100%
char flags = 0;
L293D_Init();
CMCON = 7; //Desativa o comparador analogico
//Define os pinos como entrada
TRISB1_Bit = 1; //botao de giro
TRISA4_Bit = 1; //botao de ligar/ desligar
TRISB4_Bit = 1; //botao aumentar velocidade
TRISB5_Bit = 1; //botao dimunir velocidade
while(1)
{
//botao RB0 pressionado = girar para direita
//botao RB0 liberado = girar para esquerda
//botao RA4 pressionado = motor ligado
//botao RA4 liberado = motor desligado
//Essa linha de comando ficou show hein!!!!
L293D_Girar( PORTA.B4 << PORTB.B0 );
//controlando a velocidade
if( PORTB.B4 ) flags.B0 = 1;
else if( PORTB.B5 ) flags.B1 = 1;
if( !PORTB.B4 && flags.B0 )
{
flags.B0 = 0;
velocidade += 5;
PWM1_Set_Duty( velocidade );
}
else if( !PORTB.B5 && flags.B1 )
{
flags.B1 = 0;
velocidade -= 5;
PWM1_Set_Duty( velocidade );
}
}
}
</pre>
Tiago Henriquehttp://www.blogger.com/profile/09385302997357057888noreply@blogger.com19tag:blogger.com,1999:blog-6492043148642544250.post-44642176434511013342014-04-14T21:26:00.000-03:002014-04-14T21:26:28.762-03:00One-Wire com 74HC595<h1 style="text-align: center;">
<span style="color: red; font-family: Trebuchet MS, sans-serif;">O<span style="font-weight: normal;">ne</span>-W<span style="font-weight: normal;">ire</span> com 74<span style="font-weight: normal;">HC</span>595</span></h1>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgJZ_ALSIJHdpuxWfX_mucl68DGn1XhgGySypmill866L1413-a5Ma4V2pECtKMT0qw-geF3Lta0ESaJ94gvipBo1yMd_oJRkeKKr2gRC17f1ykEiXi5cQtQ02PYsI-r_ZeDH2JTj4fR1s/s1600/PIC.OneWire.74HC595.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgJZ_ALSIJHdpuxWfX_mucl68DGn1XhgGySypmill866L1413-a5Ma4V2pECtKMT0qw-geF3Lta0ESaJ94gvipBo1yMd_oJRkeKKr2gRC17f1ykEiXi5cQtQ02PYsI-r_ZeDH2JTj4fR1s/s1600/PIC.OneWire.74HC595.png" height="350" width="640" /></a></div>
<br />
<a name='more'></a><div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">Navegando pela internet, achei um projeto muito interessante na qual utilizava um registrador de deslocamento, o 74HC595, comunicando com o PIC através apenas de 1 pino.( One-Wire )</span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">Com um pequeno circuito RC, proporciona um tempo de atraso para a linha de dados. Pulsos muito curto significa que foi deslocado o bit 1. Pulsos um pouco mais longo, significa bit 0. Pulsos muito longo é usado para pulsar o latch atualizando as saídas do registrador.</span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">Veja o projeto completo <a href="http://www.romanblack.com/shift1.htm" target="_blank">aqui</a>.</span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<b><span style="font-family: Trebuchet MS, sans-serif;">Observações:</span></b></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">Funciona com clock superior ou igual à 8MHz;</span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">O Pino Q0 do 74HC595 será sempre 0.</span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;">Criei uma biblioteca mais enxuta. Veja:
</span></div>
<div style="text-align: justify;">
<span style="font-family: Trebuchet MS, sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="color: red; font-family: Trebuchet MS, sans-serif;"><b>BIBLIOTECA</b></span></div>
<div style="text-align: right;">
<span style="color: #666666; font-family: Trebuchet MS, sans-serif; font-size: x-small;"><b>MikroC PRO PIC
</b></span></div>
<pre class="mikroCCode"><div style="text-align: justify;">
extern sfr sbit Ow74HC595_Out;</div>
extern sfr sbit Ow74HC595_Out_Direction;
void OneWire74HC595_Init()
{
Ow74HC595_Out_Direction = 0;
Ow74HC595_Out = 1;
}
void OneWire74HC595_Write( char wData )
{
char i;
Ow74HC595_Out = 1;
for( i = 0; i < 8; i++ )
{
if( wData.B7 )
{
Ow74HC595_Out = 0;
Delay_us( 1 );
Ow74HC595_Out = 1;
Delay_us( 15 );
}
else
{
Ow74HC595_Out = 0;
Delay_us( 15 );
Ow74HC595_Out = 1;
Delay_us( 30 );
}
wData <<= 1;
Delay_us( 30 );
}
//Latch
Ow74HC595_Out = 0;
Delay_us( 200 );
Ow74HC595_Out = 1;
Delay_us( 300 );
}
</pre>
<b><span style="color: red; font-family: Trebuchet MS, sans-serif;">Exemplo:</span></b><br />
<br />
<pre class="mikroCCode">sbit Ow74HC595_Out at RD0_Bit;
sbit Ow74HC595_Out_Direction at TRISD0_Bit;
//copie e cole o código da biblioteca aqui!!!
void main()
{
char i = 0;
OneWire74HC595_Init();
while( 1 )
{
OneWire74HC595_Write( i++ );
Delay_ms( 1000 );
}
}
</pre>
<br />
<div style="text-align: right;">
<span style="color: #38761d; font-family: Trebuchet MS, sans-serif; font-size: x-small;"><b>Referência: <a href="http://www.romanblack.com/shift1.htm">http://www.romanblack.com/shift1.htm</a></b></span></div>
Tiago Henriquehttp://www.blogger.com/profile/09385302997357057888noreply@blogger.com0