tag:blogger.com,1999:blog-59445732303365068302024-03-05T13:58:50.889-08:00Microcontroladores e circuitos eletrônicosEngenheiro eletricista -
Desenvolvedor de hardware.
Protótipos e projetos.
Desenvolvimento de software de interface.(aguivone@gmail.com)Unknownnoreply@blogger.comBlogger157125tag:blogger.com,1999:blog-5944573230336506830.post-86358512256158827632024-01-04T10:18:00.000-08:002024-01-04T10:18:18.577-08:00Frequencímetro com 2 canais usando o PIC16F887 e mostrando via serial RS232 (frequencímetro duplo)<p> <span> </span>Olá neste primeiro projeto de 2024 vou colocar um exemplo de frequencímetro duplo para medir 2 frequências através dos CCP'S e enviar via seria, além de funções prontas para calculo da frequência e configuração do prescaler para cada faixa de frequência desejada. </p><p> Nos testes do simulador e no projeto físico funcionou muito bem e com muita precisão, um exemplo de simulação é visto na figura a seguir:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihnEKFj2QNuuqukvatrzk0Z5JqHH8av1gjDIsGTtHk1ard5F57nCrOyVmB3_lgzkMKw5SZqdR8TN6frx6E_9USp6GiCFt5JpR4qyFcEM1PhtlXzoAVGWcWwDPwDZ41VRzSBZpf2ay3uyyO63tjDbvzfdJGnpUnb6VIlNkYehP9KIn0D7psh-lEW-9PO8Q/s1384/frequencimentro.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="860" data-original-width="1384" height="387" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihnEKFj2QNuuqukvatrzk0Z5JqHH8av1gjDIsGTtHk1ard5F57nCrOyVmB3_lgzkMKw5SZqdR8TN6frx6E_9USp6GiCFt5JpR4qyFcEM1PhtlXzoAVGWcWwDPwDZ41VRzSBZpf2ay3uyyO63tjDbvzfdJGnpUnb6VIlNkYehP9KIn0D7psh-lEW-9PO8Q/w623-h387/frequencimentro.png" width="623" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: left;"><span> N</span>ote que os leds são pra indicar que esta lendo pulsos nos pinos dos ccp's , como foi configurado para cada borda de subida logo terá a o valor de frequência menor. Para este foi colocado o mesmo sinal nos 2 canais para simular.</div><p>O código fonte :</p><div style="background: rgb(248, 248, 248); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #408080; font-style: italic;">/*</span>
<span style="color: #408080; font-style: italic;"> *</span>
<span style="color: #408080; font-style: italic;"> * Compilador : MPlabXC8</span>
<span style="color: #408080; font-style: italic;"> * Microcontroladores compativeis : 16F886 e 887</span>
<span style="color: #408080; font-style: italic;"> * Autor: Aguivone Moretti Fógia</span>
<span style="color: #408080; font-style: italic;"> * Versão: 1.1.2</span>
<span style="color: #408080; font-style: italic;"> * Data : 02/01/2024 - inicio de testes com oscilador interno (de 8MHZ) - 100 a 8000hz no simulador </span>
<span style="color: #408080; font-style: italic;"> * Data : 02/01/2024 - inicio de testes com oscilador interno (de 20MHZ) - </span>
<span style="color: #408080; font-style: italic;"> * descrição : Frequencimetro </span>
<span style="color: #408080; font-style: italic;"> * </span>
<span style="color: #408080; font-style: italic;"> */</span>
<span style="color: #bc7a00;">#include <stdio.h></span>
<span style="color: #bc7a00;">#include <string.h> </span><span style="color: #408080; font-style: italic;">//para usar funçoes de string deve se adicionar este header</span>
<span style="color: #bc7a00;">#include <stdlib.h></span>
<span style="color: #408080; font-style: italic;">// se igual a 8MHZ:</span>
<span style="color: #408080; font-style: italic;">/* #define _XTAL_FREQ 8000000</span>
<span style="color: #408080; font-style: italic;"> #pragma config FOSC = INTRC_NOCLKOUT// Oscillator Selection bits (INTOSCIO oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)</span>
<span style="color: #408080; font-style: italic;"> */</span>
<span style="color: #408080; font-style: italic;">// se igual a 20MHZ:</span>
<span style="border: 1px solid rgb(255, 0, 0);">#</span>define _XTAL_FREQ <span style="color: #666666;">20000000</span>
<span style="border: 1px solid rgb(255, 0, 0);">#</span>pragma config FOSC <span style="color: #666666;">=</span> HS <span style="color: #408080; font-style: italic;">// cristal de 20mhz</span>
<span style="color: #bc7a00;">#include <xc.h></span>
<span style="color: #408080; font-style: italic;">/////////////////////////////////////////////////////////configuraçôes//////////////////////////////////////////////////////</span>
<span style="color: #bc7a00;">#pragma config WDTE = OFF </span><span style="color: #408080; font-style: italic;">// Watchdog Timer Enable bit (WDT habilitado)</span>
<span style="color: #bc7a00;">#pragma config PWRTE = OFF </span><span style="color: #408080; font-style: italic;">// Power-up Timer Enable bit (PWRT enabled)</span>
<span style="color: #bc7a00;">#pragma config MCLRE = OFF </span><span style="color: #408080; font-style: italic;">// RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital I/O, MCLR internally tied to VDD)</span>
<span style="color: #bc7a00;">#pragma config BOREN = OFF </span><span style="color: #408080; font-style: italic;">// Brown-out Detect Enable bit (BOD disabled)</span>
<span style="color: #bc7a00;">#pragma config LVP = OFF </span><span style="color: #408080; font-style: italic;">// Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)</span>
<span style="color: #bc7a00;">#pragma config CPD = OFF </span><span style="color: #408080; font-style: italic;">// Data EE Memory Code Protection bit (proteção da eeprom)</span>
<span style="color: #bc7a00;">#pragma config CP = OFF </span><span style="color: #408080; font-style: italic;">// Flash Program Memory Code Protection bit (proteção do codigo)</span>
<span style="color: #408080; font-style: italic;">///////////////defines utilizados///////////////////////////////////////////////////////////////////////////////////////////</span>
<span style="color: #408080; font-style: italic;">//o pino R/W é conectado ao terra pois não é feita nenhuma leitura no display</span>
<span style="color: #408080; font-style: italic;">//configuração:</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// pino da porta selecionada / pino display</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// C4 = pino de D4 do display</span>
<span style="color: #408080; font-style: italic;">// C5 = pino de D5 do display</span>
<span style="color: #408080; font-style: italic;">// C6 = pino de D6 do display</span>
<span style="color: #408080; font-style: italic;">// C7 = pino de D7 do display</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// C1 = pino de RS do display</span>
<span style="color: #408080; font-style: italic;">// C2 = pino de EN do display</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">/*************************** configuração dos pinos **************************************************/</span>
<span style="color: #408080; font-style: italic;">////////PINOS DO DISPLAY DE LCD ///////////////</span>
<span style="color: #408080; font-style: italic;">//16F88</span>
<span style="color: #408080; font-style: italic;">/*</span>
<span style="color: #408080; font-style: italic;"> #define BIT_0 RB0</span>
<span style="color: #408080; font-style: italic;"> #define BIT_1 RB1</span>
<span style="color: #408080; font-style: italic;"> #define BIT_2 RB3</span>
<span style="color: #408080; font-style: italic;"> #define BIT_3 RB4</span>
<span style="color: #408080; font-style: italic;"> #define PIN_RS485 RA1 //pino de controle da rs485</span>
<span style="color: #408080; font-style: italic;"> #define EN RA2</span>
<span style="color: #408080; font-style: italic;"> #define RS RA3</span>
<span style="color: #408080; font-style: italic;">///////// PINO DE SINALIZAÇÃO //////////////</span>
<span style="color: #408080; font-style: italic;">#define LED_STATUS RA4</span>
<span style="color: #408080; font-style: italic;">//////////PINOS DE ENTRADA ///////////////</span>
<span style="color: #408080; font-style: italic;">#define BOT_FUNCAO RB7</span>
<span style="color: #408080; font-style: italic;">#define BOT_SELECAO RB6</span>
<span style="color: #408080; font-style: italic;">#define BOT_OK RA6</span>
<span style="color: #408080; font-style: italic;">*/</span>
<span style="color: #408080; font-style: italic;">//16F887</span>
<span style="color: #bc7a00;">#define LED_STATUS RB0</span>
<span style="color: #bc7a00;">#define LED_freq1 RB1</span>
<span style="color: #bc7a00;">#define LED_freq2 RB2</span>
<span style="color: #b00040;">long</span> periodo_anterior_1<span style="color: #666666;">=0</span>;
<span style="color: #b00040;">long</span> periodo_anterior_2<span style="color: #666666;">=0</span>;
<span style="color: #b00040;">long</span> periodo1<span style="color: #666666;">=0</span>;
<span style="color: #b00040;">long</span> periodo2<span style="color: #666666;">=0</span>;
<span style="color: #b00040;">char</span> CCP1_mult,CCP2_mult;
<span style="color: #b00040;">float</span> aux <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: #b00040;">float</span> fator_de_div <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: #b00040;">void</span> <span style="color: blue;">CCP_div_por</span>(<span style="color: #b00040;">char</span> CCP1_V,<span style="color: #b00040;">char</span> CCP2_V)
{<span style="color: #408080; font-style: italic;">//valor da divisão do CCPs</span>
CCP1CON <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X05;<span style="color: #408080; font-style: italic;">//captura a cada borda </span>
CCP2CON <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X05;<span style="color: #408080; font-style: italic;">//por padrao</span>
CCP1_mult <span style="color: #666666;">=</span> CCP1_V;
<span style="color: green; font-weight: bold;">if</span>(CCP1_mult <span style="color: #666666;">==</span> <span style="color: #666666;">4</span>)
{
CCP1CON <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X06;
}
<span style="color: green; font-weight: bold;">if</span>(CCP1_mult <span style="color: #666666;">==</span> <span style="color: #666666;">16</span>)
{
CCP1CON <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X07;
}
CCP2_mult <span style="color: #666666;">=</span> CCP2_V;
<span style="color: green; font-weight: bold;">if</span>(CCP2_mult <span style="color: #666666;">==</span> <span style="color: #666666;">4</span>)
{
CCP2CON <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X06;
}
<span style="color: green; font-weight: bold;">if</span>(CCP2_mult <span style="color: #666666;">==</span> <span style="color: #666666;">16</span>)
{
CCP2CON <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X07;
}
}
<span style="color: #b00040;">void</span> <span style="color: blue;">prescaler_por</span>(<span style="color: #b00040;">char</span> prescaler)
{
<span style="color: green; font-weight: bold;">switch</span>(prescaler)
{
<span style="color: green; font-weight: bold;">case</span> <span style="color: #666666;">1</span>:<span style="color: #408080; font-style: italic;">///por 1</span>
fator_de_div <span style="color: #666666;">=</span> _XTAL_FREQ<span style="color: #666666;">/4</span>;
T1CON <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X01;
<span style="color: green; font-weight: bold;">break</span>;
<span style="color: green; font-weight: bold;">case</span> <span style="color: #666666;">2</span>: <span style="color: #408080; font-style: italic;">/// por 2</span>
fator_de_div <span style="color: #666666;">=</span> _XTAL_FREQ<span style="color: #666666;">/8</span>;
T1CON <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X11;
<span style="color: green; font-weight: bold;">break</span>;
<span style="color: green; font-weight: bold;">case</span> <span style="color: #666666;">4</span>: <span style="color: #408080; font-style: italic;">/// por 4</span>
fator_de_div <span style="color: #666666;">=</span> _XTAL_FREQ<span style="color: #666666;">/16</span>;
T1CON <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X21;
<span style="color: green; font-weight: bold;">break</span>;
<span style="color: green; font-weight: bold;">case</span> <span style="color: #666666;">8</span>:<span style="color: #408080; font-style: italic;">/// por 8</span>
fator_de_div <span style="color: #666666;">=</span> _XTAL_FREQ<span style="color: #666666;">/32</span>;
T1CON <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X31;
<span style="color: green; font-weight: bold;">break</span>;
}
}
<span style="color: #b00040;">void</span> interrupt <span style="color: blue;">interrupcoes</span>(<span style="color: #b00040;">void</span>)<span style="color: #408080; font-style: italic;">//vetor de interrupção</span>
{
<span style="color: #b00040;">long</span> periodo_atual_1 <span style="color: #666666;">=</span> CCPR1;<span style="color: #408080; font-style: italic;">//pega valores depois vê se é pra tratar</span>
<span style="color: #b00040;">long</span> periodo_atual_2 <span style="color: #666666;">=</span> CCPR2;
<span style="color: #408080; font-style: italic;">/*if(TMR1IF)</span>
<span style="color: #408080; font-style: italic;"> { //não será usado aqui</span>
<span style="color: #408080; font-style: italic;"> TMR1IF = 0;</span>
<span style="color: #408080; font-style: italic;"> }*/</span>
<span style="color: green; font-weight: bold;">if</span>(CCP1IF)
{
CCP1IF <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;<span style="color: #408080; font-style: italic;">//limpa flag de interrupção</span>
<span style="color: green; font-weight: bold;">if</span>(periodo_atual_1<span style="color: #666666;">></span> periodo_anterior_1)
{
periodo1 <span style="color: #666666;">=</span> periodo_atual_1 <span style="color: #666666;">-</span> periodo_anterior_1;
}
<span style="color: green; font-weight: bold;">else</span>
{
periodo1 <span style="color: #666666;">=</span> (<span style="color: #666666;">65535</span> <span style="color: #666666;">-</span> periodo_anterior_1) <span style="color: #666666;">+</span> periodo_atual_1;
}
LED_freq1 <span style="color: #666666;">=</span> <span style="color: #666666;">~</span>LED_freq1;
periodo_anterior_1 <span style="color: #666666;">=</span> periodo_atual_1;
}
<span style="color: green; font-weight: bold;">if</span>(CCP2IF)
{
CCP2IF <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;<span style="color: #408080; font-style: italic;">//limpa flag de interrupção</span>
<span style="color: green; font-weight: bold;">if</span>(periodo_atual_2<span style="color: #666666;">></span> periodo_anterior_2)
{
periodo2 <span style="color: #666666;">=</span> periodo_atual_2 <span style="color: #666666;">-</span> periodo_anterior_2;
}
<span style="color: green; font-weight: bold;">else</span>
{
periodo2 <span style="color: #666666;">=</span> (<span style="color: #666666;">65535</span> <span style="color: #666666;">-</span> periodo_anterior_2) <span style="color: #666666;">+</span> periodo_atual_2;
}
LED_freq2 <span style="color: #666666;">=</span> <span style="color: #666666;">~</span>LED_freq2;
periodo_anterior_2 <span style="color: #666666;">=</span> periodo_atual_2;
}
<span style="color: green; font-weight: bold;">if</span>(RCIF <span style="color: #666666;">==</span> <span style="color: #666666;">1</span>)
{<span style="color: #408080; font-style: italic;">//interrupção de recepção de dados</span>
<span style="color: #b00040;">char</span> aux;
<span style="color: #408080; font-style: italic;">//lembrar de por um timeout pra não ficar travado esperando dados</span>
RCIF <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;<span style="color: #408080; font-style: italic;">// limpa flag de interrupção de recepção</span>
aux <span style="color: #666666;">=</span> RCREG; <span style="color: #408080; font-style: italic;">//deve ler para não trava o chip esperando tratar a interrupçao</span>
<span style="color: #408080; font-style: italic;">// não será utilizado aqui</span>
}
}
<span style="color: #b00040;">void</span> <span style="color: blue;">imprime_rs232</span>(<span style="color: #b00040;">char</span> frase[],<span style="color: #b00040;">int</span> tamanho)
{ <span style="color: #408080; font-style: italic;">//para conseguir imprimir em hexa sem problemas é melhor passar o tamanho do pacote</span>
<span style="color: #b00040;">int</span> indice <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
__delay_us(<span style="color: #666666;">1</span>);
<span style="color: green; font-weight: bold;">for</span>(indice <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;indice <span style="color: #666666;"><</span> tamanho;indice<span style="color: #666666;">++</span>)
{
<span style="color: green; font-weight: bold;">while</span>(TRMT<span style="color: #666666;">==0</span>);<span style="color: #408080; font-style: italic;">//espera enviar caracter, esvaziando o shift register , usando o trmt é mais garantido a entrega </span>
TXREG <span style="color: #666666;">=</span> frase[indice];<span style="color: #408080; font-style: italic;">//no datasheet diz que ao carregar o TXREG limpa o bit TXIF </span>
<span style="color: green; font-weight: bold;">while</span>(TRMT<span style="color: #666666;">==0</span>);
}
}
<span style="color: #b00040;">void</span> <span style="color: blue;">inicializa_RS232</span>(<span style="color: #b00040;">long</span> velocidade,<span style="color: #b00040;">int</span> modo,<span style="color: #b00040;">char</span> pega_ref)
{<span style="color: #408080; font-style: italic;">////por padrão é usado o modo 8 bits e sem paridade, mas se necessario ajuste aqui a configuração desejada.</span>
<span style="color: #408080; font-style: italic;">//verifique datasheet para ver a porcentagem de erro e se a velocidade é possivel para o cristal utilizado.</span>
RCSTA <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X90;<span style="color: #408080; font-style: italic;">//habilita porta serial,recepção de 8 bit em modo continuo,assincrono.</span>
<span style="color: #b00040;">long</span> valor;
<span style="color: green; font-weight: bold;">if</span>(modo <span style="color: #666666;">==</span> <span style="color: #666666;">1</span>)
{<span style="color: #408080; font-style: italic;">//modo = 1 ,modo alta velocidade</span>
TXSTA <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X24;<span style="color: #408080; font-style: italic;">//8bits/transmissão habilitado/modo assincrono/highspeed</span>
valor <span style="color: #666666;">=</span>(((_XTAL_FREQ<span style="color: #666666;">/</span>velocidade)<span style="color: #666666;">-16</span>)<span style="color: #666666;">/16</span>);<span style="color: #408080; font-style: italic;">//calculo do valor do gerador de baud rate -> 10_06_2022</span>
}
<span style="color: green; font-weight: bold;">else</span>
{<span style="color: #408080; font-style: italic;">//modo = 0 ,modo baixa velocidade</span>
TXSTA <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X20;<span style="color: #408080; font-style: italic;">////8bits/transmissão habilitado/modo assincrono/lowspeed</span>
valor <span style="color: #666666;">=</span>(((_XTAL_FREQ<span style="color: #666666;">/</span>velocidade)<span style="color: #666666;">-64</span>)<span style="color: #666666;">/64</span>);<span style="color: #408080; font-style: italic;">//calculo do valor do gerador de baud rate</span>
}
<span style="color: green; font-weight: bold;">if</span>(pega_ref <span style="color: #666666;">==</span> <span style="color: #666666;">0</span>)
{<span style="color: #408080; font-style: italic;">//valor calculado</span>
SPBRG <span style="color: #666666;">=</span>(<span style="color: #b00040;">int</span>)valor; <span style="color: #408080; font-style: italic;">// veja a pagina 101 do datasheet já tem calculado para 8MHZ</span>
}
<span style="color: green; font-weight: bold;">else</span>
{<span style="color: #408080; font-style: italic;">//valor colocado diretamente</span>
SPBRG <span style="color: #666666;">=</span>(<span style="color: #b00040;">int</span>)velocidade; <span style="color: #408080; font-style: italic;">//coloca valor direto baseado no data sheet </span>
}
RCIE <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;<span style="color: #408080; font-style: italic;">//habilita interrupção de recepção</span>
PEIE <span style="color: #666666;">=1</span>;
TXEN <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>; <span style="color: #408080; font-style: italic;">// habilita o modulo de transmisão</span>
TXIE <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;<span style="color: #408080; font-style: italic;">//deixa interrupção de transmissão desligado(pois corre se o risco de ter uma interrupção escrita e leitura ao mesmo tempo)</span>
}
<span style="color: #b00040;">void</span> <span style="color: blue;">long_to_char</span>(<span style="color: #b00040;">long</span> valor)
{
<span style="color: #b00040;">char</span> Buffer_serial_out[<span style="color: #666666;">5</span>]; <span style="color: #408080; font-style: italic;">//delimitador pra facilitar jogar no excel</span>
Buffer_serial_out[<span style="color: #666666;">0</span>]<span style="color: #666666;">=</span><span style="color: #ba2121;">'0'</span>;
Buffer_serial_out[<span style="color: #666666;">1</span>]<span style="color: #666666;">=</span><span style="color: #ba2121;">'0'</span>;
Buffer_serial_out[<span style="color: #666666;">2</span>]<span style="color: #666666;">=</span><span style="color: #ba2121;">'0'</span>;
Buffer_serial_out[<span style="color: #666666;">3</span>]<span style="color: #666666;">=</span><span style="color: #ba2121;">'0'</span>;
Buffer_serial_out[<span style="color: #666666;">4</span>]<span style="color: #666666;">=</span><span style="color: #ba2121;">'0'</span>;
<span style="color: green; font-weight: bold;">if</span>(valor <span style="color: #666666;"><</span> <span style="color: #666666;">65535</span>)
{
<span style="color: green; font-weight: bold;">while</span>(valor<span style="color: #666666;">>=10000</span>)
{
valor <span style="color: #666666;">=</span> valor <span style="color: #666666;">-</span> <span style="color: #666666;">10000</span>;
Buffer_serial_out[<span style="color: #666666;">0</span>]<span style="color: #666666;">++</span>;
}
<span style="color: green; font-weight: bold;">while</span>(valor<span style="color: #666666;">>=1000</span>)
{
valor <span style="color: #666666;">=</span> valor <span style="color: #666666;">-</span> <span style="color: #666666;">1000</span>;
Buffer_serial_out[<span style="color: #666666;">1</span>]<span style="color: #666666;">++</span>;
}
<span style="color: green; font-weight: bold;">while</span>(valor<span style="color: #666666;">>=100</span>)
{
valor <span style="color: #666666;">=</span> valor <span style="color: #666666;">-</span> <span style="color: #666666;">100</span>;
Buffer_serial_out[<span style="color: #666666;">2</span>]<span style="color: #666666;">++</span>;
}
<span style="color: green; font-weight: bold;">while</span>(valor<span style="color: #666666;">>=10</span>)
{
valor <span style="color: #666666;">=</span> valor <span style="color: #666666;">-</span> <span style="color: #666666;">10</span>;
Buffer_serial_out[<span style="color: #666666;">3</span>]<span style="color: #666666;">++</span>;
}
<span style="color: green; font-weight: bold;">while</span>(valor<span style="color: #666666;">>=1</span>)
{
valor <span style="color: #666666;">=</span> valor <span style="color: #666666;">-</span> <span style="color: #666666;">1</span>;
Buffer_serial_out[<span style="color: #666666;">4</span>]<span style="color: #666666;">++</span>;
}
imprime_rs232(Buffer_serial_out ,<span style="color: #666666;">5</span>);
}
}
<span style="color: #408080; font-style: italic;">//*******************************Rotina principal*********************************************/</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">main</span>(<span style="color: #b00040;">void</span>)
{
TRISA <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>XF7;<span style="color: #408080; font-style: italic;">//configura portA pino habilita rs </span>
TRISB <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X00;<span style="color: #408080; font-style: italic;">//configura portB</span>
TRISC <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X06;<span style="color: #408080; font-style: italic;">//configura portC //tx é saida</span>
TRISD <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X00;<span style="color: #408080; font-style: italic;">//configura portD // somente no 16F887</span>
TRISE <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>XFF;<span style="color: #408080; font-style: italic;">//configura portD </span>
PORTA <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
PORTB <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;<span style="color: #408080; font-style: italic;">//deixa pino tx em nivel alto</span>
PORTC <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
PORTD <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;<span style="color: #408080; font-style: italic;">// somente no 16F887 </span>
GIE <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;<span style="color: #408080; font-style: italic;">//já desliga as interrrupções para terminar as configurações</span>
OPTION_REG <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X80; <span style="color: #408080; font-style: italic;">// pull up desabilitados e prescaler para timer 0 - desabilita watchdog</span>
INTCON <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;<span style="color: #408080; font-style: italic;">//desabilita todas as interrupções </span>
<span style="color: #408080; font-style: italic;">//CMCON = 0X07;//desliga comparadores no 16F887 é outro</span>
<span style="color: #408080; font-style: italic;">//---------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// CCP1CON = 0X05; //Capture mode, every rising edge</span>
<span style="color: #408080; font-style: italic;">// CCP2CON = 0X05;</span>
CCP_div_por(<span style="color: #666666;">1</span>,<span style="color: #666666;">1</span>);<span style="color: #408080; font-style: italic;">// modo do ccp dividido por 1,4 ou 16.</span>
<span style="color: #408080; font-style: italic;">//---------------------------------------------------------</span>
ANSEL <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X00; <span style="color: #408080; font-style: italic;">//portas digitais e AN0 e AN1.</span>
ANSELH <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X00; <span style="color: #408080; font-style: italic;">//portas digitais e AN8 e AN13.// </span>
OSCTUNE <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X1F; <span style="color: #408080; font-style: italic;">// oscilador vel maxima(para que o baud rate tambem dê certo)</span>
<span style="color: #408080; font-style: italic;">// ----------------------------------------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// para oscilador interno de 8 mhz use : </span>
<span style="color: #408080; font-style: italic;">// OSCCON = 0XFE ; // oscilador interno com frequencia de 8mhz ->16F88</span>
<span style="color: #408080; font-style: italic;">// OSCCON = 0XF5 ; // oscilador interno com frequencia de 8mhz ->16F887 </span>
<span style="color: #408080; font-style: italic;">//---------------------------------------------------------------------------------------------------------- </span>
<span style="color: #408080; font-style: italic;">// para cristal de 20 Mhz use: </span>
OSCCON <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>XFE; <span style="color: #408080; font-style: italic;">// oscilador de 20mhz</span>
<span style="color: #408080; font-style: italic;">//----------------------------------------------------------------------------------------------------------</span>
inicializa_RS232(<span style="color: #666666;">19200</span>,<span style="color: #666666;">1</span>,<span style="color: #666666;">0</span>);
CCP1IE <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;<span style="color: #408080; font-style: italic;">//habilita interrupçao de ccp</span>
CCP2IE <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;<span style="color: #408080; font-style: italic;">//habilita interrupçao de ccp</span>
<span style="color: #408080; font-style: italic;">// T1CON=1; //Timer on(para fazer as contagem)) qunado uas a afunção abaixo não precisa por este</span>
prescaler_por(<span style="color: #666666;">1</span>);
<span style="color: #408080; font-style: italic;">// TMR1IE = 1;//habilita interrupção de estouro de timer para verificar quantos estouros houve não será usado</span>
PEIE <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;<span style="color: #408080; font-style: italic;">//habilita interrupção de hardware</span>
GIE <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;
imprime_rs232(<span style="color: #ba2121;">"Frequencimetro duplo com pic </span><span style="color: #bb6622; font-weight: bold;">\n\r</span><span style="color: #ba2121;">"</span>,<span style="color: #666666;">30</span>);
<span style="color: green; font-weight: bold;">for</span>(;;)
{
__delay_ms(<span style="color: #666666;">10</span>);
GIE <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: #408080; font-style: italic;">//imprime o valor da frequencia atual a cada 200ms </span>
imprime_rs232(<span style="color: #ba2121;">"</span><span style="color: #bb6622; font-weight: bold;">\n\r</span><span style="color: #ba2121;"> FREQUENCIAS : "</span>,<span style="color: #666666;">17</span>);
aux <span style="color: #666666;">=</span> fator_de_div <span style="color: #666666;">/</span> periodo1;
aux <span style="color: #666666;">=</span> aux<span style="color: #666666;">*</span>CCP1_mult;
<span style="color: green; font-weight: bold;">if</span>(aux <span style="color: #666666;">></span> <span style="color: #666666;">99999</span>)
{
aux<span style="color: #666666;">/1000</span>;
periodo1 <span style="color: #666666;">=</span> (<span style="color: #b00040;">long</span>)aux;
long_to_char(periodo1);<span style="color: #408080; font-style: italic;">//valor de frequencia calculada</span>
imprime_rs232(<span style="color: #ba2121;">"KHz "</span>,<span style="color: #666666;">3</span>);
}
<span style="color: green; font-weight: bold;">else</span>
{
periodo1 <span style="color: #666666;">=</span> (<span style="color: #b00040;">long</span>)aux;
long_to_char(periodo1);<span style="color: #408080; font-style: italic;">//valor de frequencia calculada</span>
imprime_rs232(<span style="color: #ba2121;">"Hz - freq.2 = "</span>,<span style="color: #666666;">3</span>);
}
aux <span style="color: #666666;">=</span> fator_de_div <span style="color: #666666;">/</span> periodo2;
aux <span style="color: #666666;">=</span> aux<span style="color: #666666;">*</span>CCP2_mult;
<span style="color: green; font-weight: bold;">if</span>(aux <span style="color: #666666;">></span> <span style="color: #666666;">99999</span>)
{
aux<span style="color: #666666;">/1000</span>;
periodo2 <span style="color: #666666;">=</span> (<span style="color: #b00040;">long</span>)aux;
long_to_char(periodo2);<span style="color: #408080; font-style: italic;">//valor de frequencia calculada</span>
imprime_rs232(<span style="color: #ba2121;">"KHz "</span>,<span style="color: #666666;">3</span>);
}
<span style="color: green; font-weight: bold;">else</span>
{
periodo2 <span style="color: #666666;">=</span> (<span style="color: #b00040;">long</span>)aux;
long_to_char(periodo2);<span style="color: #408080; font-style: italic;">//valor de frequencia calculada</span>
imprime_rs232(<span style="color: #ba2121;">"Hz "</span>,<span style="color: #666666;">3</span>);
}
LED_STATUS <span style="color: #666666;">=</span> <span style="color: #666666;">~</span>LED_STATUS;
GIE <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;
}<span style="color: #408080; font-style: italic;">//loop infinito</span>
}
<span style="color: #408080; font-style: italic;">// Notas: *****************</span>
<span style="color: #408080; font-style: italic;">/*</span>
<span style="color: #408080; font-style: italic;"> estando com o CCP1 e CCP2 sem divisão ( div por 1) e com cristal de 20mhz</span>
<span style="color: #408080; font-style: italic;"> * a faixa de range confiavel é aprox :</span>
<span style="color: #408080; font-style: italic;"> * prescaler para 1 : a partir de 80hz a 100Khz(estimado)</span>
<span style="color: #408080; font-style: italic;"> * prescaler para 2 : a partir de 40hz a 70khz(etimado) </span>
<span style="color: #408080; font-style: italic;"> * prescaler para 4 : a partir de 10hz a 30khz(simulado)</span>
<span style="color: #408080; font-style: italic;"> * prescaler para 8 : a partir de 10hz a 25khz(simulado)</span>
<span style="color: #408080; font-style: italic;"> * </span>
<span style="color: #408080; font-style: italic;"> * para faixa maxima o simulador proteus é limitado o ideal é usar um frequencimetro </span>
<span style="color: #408080; font-style: italic;"> * isso se deve ao estouro do timer para frequencia baixa(se for operar nessas frequencia use clock menor)</span>
<span style="color: #408080; font-style: italic;"> */</span>
</pre></div>
<p></p><p>formatado por : http://hilite.me/ acessando em 04/01/2024.</p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5944573230336506830.post-82398244855589590622023-11-08T05:25:00.002-08:002023-12-21T09:04:07.784-08:00Frequencímetro com 2 canais usando o C8051F380 e mostrando via serial RS232 da Silicon Labs,.<p><span> </span> Olá, neste artigo vou aproveitar o código que já havia sido planejado no exemplo do post anterior, quando se configura o hardware para captura já pega o sinal que é inserido nos pinos T0(P3.4 - pino26) e T1(P3.5 - pino25).</p><p><span> </span>Pode-se mudar as configurações para estar na faixa desejada para sua necessidade, neste exemplo um range previsto é algo em torno de 750hz a 4,75KHZ.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhm74eisG3AYQiUbzMADydB0ky7jAd7zxzvO9fzMSYkw6GZhDMYGPEyOdvKGbSfLj9OMPDXOZL2nx6xE8s9ZnyzOxbkyQfvIjXtbusf_uBGT3NSxrSlbpX0YpGDgIp0ULEDPthnHYio8EW1lhyHaGooe8SlsD-BMjYjKrJhD2T4CzpRR0ISaaI-5SlkZHE/s1230/Sem%20t%C3%ADtulo.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="814" data-original-width="1230" height="424" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhm74eisG3AYQiUbzMADydB0ky7jAd7zxzvO9fzMSYkw6GZhDMYGPEyOdvKGbSfLj9OMPDXOZL2nx6xE8s9ZnyzOxbkyQfvIjXtbusf_uBGT3NSxrSlbpX0YpGDgIp0ULEDPthnHYio8EW1lhyHaGooe8SlsD-BMjYjKrJhD2T4CzpRR0ISaaI-5SlkZHE/w640-h424/Sem%20t%C3%ADtulo.jpg" width="640" /></a></div><span> Deixei também alguns leds para testar se estava lendo o sinal no pino, e se havia processamento no microcontrolador.</span><br /><p></p><p><span style="font-size: medium;"><b>O código fonte:</b></span></p><div style="background: rgb(248, 248, 248); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span><span style="color: #408080; font-style: italic;">// Target: C8051F380 e C8051F382</span>
<span style="color: #408080; font-style: italic;">// Tool chain: Simplicity Studio / Keil C51 9.51</span>
<span style="color: #408080; font-style: italic;">//autor: Aguivone Moretti</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">//Data: 06_11_2023 - serial ok e modulos CCP ok</span>
<span style="color: #408080; font-style: italic;">//Data: 07_11_2023 - calculado para um range de 3khz a 19Mhz(embora dê mais porem não fica muito bom)</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Includes</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #bc7a00;">#include "si_toolchain.h"</span>
<span style="color: #bc7a00;">#include <SI_C8051F380_Register_Enums.h></span>
<span style="color: #bc7a00;">#include <stdio.h></span>
<span style="color: #bc7a00;">#include <string.h></span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Global Constants</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #bc7a00;">#define SYSCLK 48000000 </span><span style="color: #408080; font-style: italic;">// Internal oscillator frequency in Hz</span>
<span style="color: #bc7a00;">#define BAUDRATE 19200 </span><span style="color: #408080; font-style: italic;">// Baud rate of UART in bps</span>
<span style="color: #bc7a00;">#define INT_DEC 256 </span><span style="color: #408080; font-style: italic;">// Integrate and decimate ratio</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Function Prototypes</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
SI_INTERRUPT_PROTO(PCA0_ISR, PCA0_IRQn);
<span style="color: #b00040;">void</span> <span style="color: blue;">Liga_Port4</span>(<span style="color: green; font-weight: bold;">const</span> <span style="color: #b00040;">char</span> pino);
<span style="color: #b00040;">void</span> <span style="color: blue;">Desliga_Port4</span>(<span style="color: green; font-weight: bold;">const</span> <span style="color: #b00040;">char</span> pino);
<span style="color: #b00040;">void</span> <span style="color: blue;">Config_Init</span>(<span style="color: #b00040;">void</span>);
<span style="color: #b00040;">void</span> <span style="color: blue;">UART0_Init</span> (<span style="color: #b00040;">void</span>);
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//definicão dos pinos</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
SI_SBIT(SW1, SFR_P0, <span style="color: #666666;">6</span>); <span style="color: #408080; font-style: italic;">// SW1 ='0' botão pressionado</span>
SI_SBIT(SW2, SFR_P0, <span style="color: #666666;">7</span>); <span style="color: #408080; font-style: italic;">// SW2 ='0' botão pressionado</span>
<span style="color: #408080; font-style: italic;">//leds vermelho e sinal de saida</span>
SI_SBIT(LED_1, SFR_P0, <span style="color: #666666;">0</span>); <span style="color: #408080; font-style: italic;">// LED='1' Ligado -> lacoA</span>
SI_SBIT(LED_2, SFR_P0, <span style="color: #666666;">1</span>); <span style="color: #408080; font-style: italic;">// LED='1' Desligado -> lacoB</span>
<span style="color: #408080; font-style: italic;">//led verde</span>
<span style="color: #bc7a00;">#define LED_freq1 0x7F </span>
<span style="color: #bc7a00;">#define LED_freq2 0xBF </span>
<span style="color: #408080; font-style: italic;">//led azul</span>
<span style="color: #bc7a00;">#define LED_Status 0xF7 </span><span style="color: #408080; font-style: italic;">// P4.3</span>
<span style="color: #408080; font-style: italic;">//led vermelho</span>
<span style="color: #bc7a00;">#define LED_ping 0xEF </span><span style="color: #408080; font-style: italic;">//P4.4</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//definicão das variaveis globais</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">bool</span> flag_teste;
<span style="color: #b00040;">unsigned</span> <span style="color: #b00040;">char</span> porta4 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>XFF;
<span style="color: #b00040;">uint16_t</span> pisca <span style="color: #666666;">=0</span>;
<span style="color: #b00040;">char</span> liga_pino_status <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: #408080; font-style: italic;">// variaveis da serial RS232</span>
<span style="color: #bc7a00;">#define UART_BUFFERSIZE 10</span>
<span style="color: #b00040;">uint8_t</span> UART_Buffer_rx[UART_BUFFERSIZE];
<span style="color: #b00040;">uint8_t</span> UART_Buffer_tx[UART_BUFFERSIZE];<span style="color: #408080; font-style: italic;">//para transmissão</span>
<span style="color: #b00040;">uint8_t</span> pos_buffer<span style="color: #666666;">=0</span>;
<span style="color: #b00040;">uint8_t</span> tam_buffer_tx<span style="color: #666666;">=0</span>;
<span style="color: #b00040;">uint8_t</span> pos_buffer_tx<span style="color: #666666;">=0</span>;
<span style="color: #b00040;">bool</span> tem_recp <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: #b00040;">bool</span> rec_232 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: #b00040;">bool</span> trans_232 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: #408080; font-style: italic;">//variaveis para timers e captura</span>
<span style="color: #b00040;">bool</span> sinal0 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: #b00040;">bool</span> sinal1 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: #b00040;">float</span> periodo_1 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: #b00040;">uint16_t</span> periodo_anterior_1<span style="color: #666666;">=0</span>;
<span style="color: #b00040;">uint16_t</span> periodo_atual_1<span style="color: #666666;">=0</span>;
<span style="color: #b00040;">uint8_t</span> num_itens1 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: #b00040;">float</span> periodo_2 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: #b00040;">uint16_t</span> periodo_anterior_2<span style="color: #666666;">=0</span>;
<span style="color: #b00040;">uint16_t</span> periodo_atual_2<span style="color: #666666;">=0</span>;
<span style="color: #b00040;">uint8_t</span> num_itens2 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// SiLabs_Startup() Routine</span>
<span style="color: #408080; font-style: italic;">// é chamada após reset</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">SiLabs_Startup</span> (<span style="color: #b00040;">void</span>)
{
PCA0MD <span style="color: #666666;">=</span> <span style="color: #666666;">0x00</span>; <span style="color: #408080; font-style: italic;">// Disable watchdog timer</span>
}
<span style="color: #408080; font-style: italic;">//------------------------ -----------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// configura todo o hardware necessario</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">Config_Init</span> (<span style="color: #b00040;">void</span>)
{
IE_EA <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>; <span style="color: #408080; font-style: italic;">//desabilita todas as interrupções.</span>
<span style="color: #408080; font-style: italic;">//configura oscilador</span>
OSCICN <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X83; <span style="color: #408080; font-style: italic;">// IHFOsc Enable, sem divisão ira rodar a 12MHz</span>
CLKMUL <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>XC0; <span style="color: #408080; font-style: italic;">// talvez nem precise neste microcontrolador -> habilita e inicializa pll</span>
CLKSEL <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X03; <span style="color: #408080; font-style: italic;">// SYSCLK derived from the Internal High-Frequency Oscillator.sem divisão 48MHZ se estiver habilitado o clksel</span>
PFE0CN <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X20; <span style="color: #408080; font-style: italic;">//(para High Speed) Prefetch Engine Control,otimiza tempo de execu��o lendo 2 bytes de execu��o por vez</span>
<span style="color: #408080; font-style: italic;">/* FLSCL.FOSE(7) = 0 for < 10MHz and 1 for SYSCLK > 10MHz</span>
<span style="color: #408080; font-style: italic;"> FLSCL.FLRT(4) = 0 for < 25MHz and 1 for SYSCLK > 25MHz */</span>
FLSCL <span style="color: #666666;">=</span> <span style="color: #666666;">0x90</span>;
CKCON <span style="color: #666666;">=</span> <span style="color: #666666;">0x00</span>; <span style="color: #408080; font-style: italic;">// todos os timer ligado ao clock do sistema por meio do prescaler / clock dividido por 12(repensar depois)</span>
SPI0CN <span style="color: #666666;">=</span> <span style="color: #666666;">0x02</span>; <span style="color: #408080; font-style: italic;">//Select Mode 3-Wire pra liberar pino NSS</span>
<span style="color: #408080; font-style: italic;">//configura portas //////////////////////////////////////////////////////////////////////////////////////////////////////////////</span>
P0MDIN <span style="color: #666666;">=</span> <span style="color: #666666;">0xFF</span>; <span style="color: #408080; font-style: italic;">// are digital</span>
P1MDIN <span style="color: #666666;">=</span> <span style="color: #666666;">0xFF</span>; <span style="color: #408080; font-style: italic;">// are digital</span>
P2MDIN <span style="color: #666666;">=</span> <span style="color: #666666;">0xFF</span>; <span style="color: #408080; font-style: italic;">// are digital</span>
P3MDIN <span style="color: #666666;">=</span> <span style="color: #666666;">0xFF</span>; <span style="color: #408080; font-style: italic;">// are digital</span>
P4MDIN <span style="color: #666666;">=</span> <span style="color: #666666;">0xFF</span>; <span style="color: #408080; font-style: italic;">// are digital</span>
P0MDOUT <span style="color: #666666;">=</span> <span style="color: #666666;">0x20</span>; <span style="color: #408080; font-style: italic;">// coloca pino 4 como saida</span>
P1MDOUT <span style="color: #666666;">=</span> <span style="color: #666666;">0x00</span>; <span style="color: #408080; font-style: italic;">// enable Switches as open-drain</span>
P2MDOUT <span style="color: #666666;">=</span> <span style="color: #666666;">0x00</span>; <span style="color: #408080; font-style: italic;">// enable Switches as open-drain</span>
P3MDOUT <span style="color: #666666;">=</span> <span style="color: #666666;">0x00</span>; <span style="color: #408080; font-style: italic;">// enable Switches as open-drain</span>
P4MDOUT <span style="color: #666666;">=</span> <span style="color: #666666;">0x04</span>; <span style="color: #408080; font-style: italic;">// enable Switches as open-drain</span>
P0SKIP <span style="color: #666666;">=</span> <span style="color: #666666;">0xCF</span>; <span style="color: #408080; font-style: italic;">// TXeRX precisa do Skip pra funcionar</span>
P1SKIP <span style="color: #666666;">=</span> <span style="color: #666666;">0xFF</span>;
P2SKIP <span style="color: #666666;">=</span> <span style="color: #666666;">0xFF</span>;
P3SKIP <span style="color: #666666;">=</span> <span style="color: #666666;">0xCF</span>;
P4 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>XFF; <span style="color: #408080; font-style: italic;">//portas de p4 ligadas (desliga leds)</span>
XBR0 <span style="color: #666666;">=</span> <span style="color: #666666;">0x01</span>; <span style="color: #408080; font-style: italic;">// CP1AE,CP1E,CP0AE,CP0E,SYSCKE,SMB0E,SPI0E,(UART0E) ///habilita UART0</span>
XBR2 <span style="color: #666666;">=</span> <span style="color: #666666;">0x00</span>; <span style="color: #408080; font-style: italic;">// RESRV,RSRV,RESRV,RESRV,RESRV,RESRV,SMB1E, UART1E</span>
XBR1 <span style="color: #666666;">=</span> <span style="color: #666666;">0xC2</span>; <span style="color: #408080; font-style: italic;">// WEAKPUD,(XBARE),T1E,T0E,ECIE,(PCA0ME):000:Nenhum,001:CEX0,010:CEX0eCEX1,...</span>
<span style="color: #408080; font-style: italic;">// VDM0CN -> monitor de tens�o de reset</span>
VDM0CN <span style="color: #666666;">=</span> <span style="color: #666666;">0x80</span>; <span style="color: #408080; font-style: italic;">// Colocado porque senão da problema na gravacao da flash(já estava isso)</span>
RSTSRC <span style="color: #666666;">=</span> <span style="color: #666666;">0x02</span>; <span style="color: #408080; font-style: italic;">// ativa reset de falha de oscilação.</span>
<span style="color: #408080; font-style: italic;">//configura modulos de captura /////////////////////////////////////////////////////////////////////////</span>
TMOD <span style="color: #666666;">=</span> <span style="color: #666666;">0x11</span>; <span style="color: #408080; font-style: italic;">// 16-bit timer0 e timer1 interrupção no pino</span>
PCA0CN <span style="color: #666666;">=</span> <span style="color: #666666;">0x00</span>; <span style="color: #408080; font-style: italic;">// Stop counter; clear all flags</span>
PCA0CPM0 <span style="color: #666666;">=</span> <span style="color: #666666;">0x21</span>; <span style="color: #408080; font-style: italic;">// ;5:CapPos, 4:CapNeg// habilita modulo ccp0 na borda de subida</span>
PCA0CPL0 <span style="color: #666666;">=</span> <span style="color: #666666;">0x00</span>;
PCA0CPH0 <span style="color: #666666;">=</span> <span style="color: #666666;">0x00</span>;
PCA0CPM1 <span style="color: #666666;">=</span> <span style="color: #666666;">0x21</span>; <span style="color: #408080; font-style: italic;">// ;5:CapPos, 4:CapNeg// habilita modulo ccp1 na borda de subida</span>
PCA0CPL1 <span style="color: #666666;">=</span> <span style="color: #666666;">0x00</span>;
PCA0CPH1 <span style="color: #666666;">=</span> <span style="color: #666666;">0x00</span>;
PCA0CPM2 <span style="color: #666666;">=</span> <span style="color: #666666;">0x00</span>; <span style="color: #408080; font-style: italic;">// desabilitado</span>
PCA0CPM3 <span style="color: #666666;">=</span> <span style="color: #666666;">0x00</span>;
PCA0CPM4 <span style="color: #666666;">=</span> <span style="color: #666666;">0x00</span>;
PCA0MD <span style="color: #666666;">=</span> <span style="color: #666666;">0x09</span>; <span style="color: #408080; font-style: italic;">//desliga watdog - clock sem divisão - habilita interrupção do counter/timer overflow</span>
<span style="color: #408080; font-style: italic;">// PCA0MD = 0x03; //desliga watdog - clock dividido por 4 - habilita interrupção do counter/timer overflow //se mudar aqui deverá mudar os calculos</span>
<span style="color: #408080; font-style: italic;">// PCA0MD = 0x01; //desliga watdog - clock dividido por 12 - habilita interrupção do counter/timer overflow</span>
EIP1 <span style="color: #666666;">=</span> <span style="color: #666666;">0x10</span>; <span style="color: #408080; font-style: italic;">//seta para alta prioridade , EIP1.PPCA0</span>
EIE1 <span style="color: #666666;">=</span> <span style="color: #666666;">0x10</span>; <span style="color: #408080; font-style: italic;">//Habilita Interrupcao da Captura</span>
PCA0CN_CR <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>; <span style="color: #408080; font-style: italic;">// Habilita contadores</span>
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// UART0_Init</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// Return Value : None</span>
<span style="color: #408080; font-style: italic;">// Parameters : None</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// Configure the UART0 using Timer1, for <BAUDRATE> and 8-N-1.</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">UART0_Init</span> (<span style="color: #b00040;">void</span>)
{
SCON0 <span style="color: #666666;">=</span> <span style="color: #666666;">0x10</span>; <span style="color: #408080; font-style: italic;">// SCON0: 8-bit variable bit rate</span>
<span style="color: #408080; font-style: italic;">// level of STOP bit is ignored</span>
<span style="color: #408080; font-style: italic;">// RX enabled</span>
<span style="color: #408080; font-style: italic;">// ninth bits are zeros</span>
<span style="color: #408080; font-style: italic;">// clear SCON0_RI and SCON0_TI bits</span>
<span style="color: green; font-weight: bold;">if</span> (SYSCLK<span style="color: #666666;">/</span>BAUDRATE<span style="color: #666666;">/2/256</span> <span style="color: #666666;"><</span> <span style="color: #666666;">1</span>) {
TH1 <span style="color: #666666;">=</span> <span style="color: #666666;">-</span>(SYSCLK<span style="color: #666666;">/</span>BAUDRATE<span style="color: #666666;">/2</span>);
CKCON <span style="color: #666666;">&=</span> <span style="color: #666666;">~0x0B</span>; <span style="color: #408080; font-style: italic;">// T1M = 1; SCA1:0 = xx</span>
CKCON <span style="color: #666666;">|=</span> <span style="color: #666666;">0x08</span>;
} <span style="color: green; font-weight: bold;">else</span> <span style="color: green; font-weight: bold;">if</span> (SYSCLK<span style="color: #666666;">/</span>BAUDRATE<span style="color: #666666;">/2/256</span> <span style="color: #666666;"><</span> <span style="color: #666666;">4</span>) {
TH1 <span style="color: #666666;">=</span> <span style="color: #666666;">-</span>(SYSCLK<span style="color: #666666;">/</span>BAUDRATE<span style="color: #666666;">/2/4</span>);
CKCON <span style="color: #666666;">&=</span> <span style="color: #666666;">~0x0B</span>; <span style="color: #408080; font-style: italic;">// T1M = 0; SCA1:0 = 01</span>
CKCON <span style="color: #666666;">|=</span> <span style="color: #666666;">0x01</span>;
} <span style="color: green; font-weight: bold;">else</span> <span style="color: green; font-weight: bold;">if</span> (SYSCLK<span style="color: #666666;">/</span>BAUDRATE<span style="color: #666666;">/2/256</span> <span style="color: #666666;"><</span> <span style="color: #666666;">12</span>) {
TH1 <span style="color: #666666;">=</span> <span style="color: #666666;">-</span>(SYSCLK<span style="color: #666666;">/</span>BAUDRATE<span style="color: #666666;">/2/12</span>);
CKCON <span style="color: #666666;">&=</span> <span style="color: #666666;">~0x0B</span>; <span style="color: #408080; font-style: italic;">// T1M = 0; SCA1:0 = 00</span>
} <span style="color: green; font-weight: bold;">else</span> {
TH1 <span style="color: #666666;">=</span> <span style="color: #666666;">-</span>(SYSCLK<span style="color: #666666;">/</span>BAUDRATE<span style="color: #666666;">/2/48</span>);
CKCON <span style="color: #666666;">&=</span> <span style="color: #666666;">~0x0B</span>; <span style="color: #408080; font-style: italic;">// T1M = 0; SCA1:0 = 10</span>
CKCON <span style="color: #666666;">|=</span> <span style="color: #666666;">0x02</span>;
}
IE_ES0 <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>; <span style="color: #408080; font-style: italic;">//habilita interrupção de serial</span>
TL1 <span style="color: #666666;">=</span> TH1; <span style="color: #408080; font-style: italic;">// Init Timer1</span>
TMOD <span style="color: #666666;">&=</span> <span style="color: #666666;">~0xF0</span>; <span style="color: #408080; font-style: italic;">// TMOD: timer 1 in 8-bit autoreload</span>
TMOD <span style="color: #666666;">|=</span> <span style="color: #666666;">0x20</span>;
TCON_TR1 <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>; <span style="color: #408080; font-style: italic;">// START Timer1</span>
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// tratamento especial para port 4</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">Desliga_Port4</span>(<span style="color: green; font-weight: bold;">const</span> <span style="color: #b00040;">char</span> pino)
{<span style="color: #408080; font-style: italic;">//desliga em nivel alto</span>
porta4 <span style="color: #666666;">=</span> porta4 <span style="color: #666666;">|</span> (<span style="color: #666666;">~</span>pino);
P4 <span style="color: #666666;">=</span> porta4;
}
<span style="color: #b00040;">void</span> <span style="color: blue;">Liga_Port4</span>(<span style="color: green; font-weight: bold;">const</span> <span style="color: #b00040;">char</span> pino)
{
porta4 <span style="color: #666666;">=</span> porta4 <span style="color: #666666;">&</span> pino;
P4 <span style="color: #666666;">=</span> porta4;
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Interrupt Service Routines</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// UART0_Interrupt</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// This routine is invoked whenever a character is entered or displayed on the</span>
<span style="color: #408080; font-style: italic;">// Hyperterminal.</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
SI_INTERRUPT(UART0_Interrupt, UART0_IRQn)
{
<span style="color: green; font-weight: bold;">if</span> (SCON0_RI <span style="color: #666666;">==</span> <span style="color: #666666;">1</span>)
{
<span style="color: #b00040;">char</span> RX_232 <span style="color: #666666;">=</span> SBUF0;
SCON0_RI <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: green; font-weight: bold;">if</span>(pos_buffer <span style="color: #666666;">>=</span> UART_BUFFERSIZE) <span style="color: #408080; font-style: italic;">// tem um bug no compilador ou chip que faz reseta</span>
{<span style="color: #408080; font-style: italic;">//erro descarta, pois é maior que o tamanho maximo do buffer</span>
rec_232<span style="color: #666666;">=0</span>; <span style="color: #408080; font-style: italic;">//não recebendo</span>
pos_buffer<span style="color: #666666;">=0</span>;<span style="color: #408080; font-style: italic;">//limpa buffer</span>
tem_recp <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;<span style="color: #408080; font-style: italic;">//sinaliza fim de pacote</span>
}
<span style="color: green; font-weight: bold;">if</span>(rec_232 <span style="color: #666666;">&&</span> RX_232 <span style="color: #666666;">==</span> <span style="color: #ba2121;">'*'</span>)
{<span style="color: #408080; font-style: italic;">//esta recebendo e chegou delimitador de fim</span>
rec_232<span style="color: #666666;">=0</span>; <span style="color: #408080; font-style: italic;">//não recebendo</span>
tem_recp <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;<span style="color: #408080; font-style: italic;">//sinaliza fim de pacote</span>
Liga_Port4(LED_ping);
}
<span style="color: green; font-weight: bold;">if</span>(rec_232)
{<span style="color: #408080; font-style: italic;">//esta recebendo</span>
UART_Buffer_rx[pos_buffer] <span style="color: #666666;">=</span> RX_232;
pos_buffer<span style="color: #666666;">++</span>;
}
<span style="color: green; font-weight: bold;">if</span>(RX_232 <span style="color: #666666;">==</span> <span style="color: #ba2121;">'#'</span>)
{
pos_buffer<span style="color: #666666;">=0</span>;<span style="color: #408080; font-style: italic;">//sinaliza recepção</span>
rec_232<span style="color: #666666;">=1</span>; <span style="color: #408080; font-style: italic;">//recebendo</span>
}
}
<span style="color: green; font-weight: bold;">if</span> (SCON0_TI) <span style="color: #408080; font-style: italic;">//testa se tem transmissão</span>
{
SCON0_TI <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>; <span style="color: #408080; font-style: italic;">// limpa flag de tranmissão</span>
<span style="color: green; font-weight: bold;">if</span>(trans_232 <span style="color: #666666;">==</span> <span style="color: #666666;">1</span>)
{
<span style="color: green; font-weight: bold;">if</span> (pos_buffer_tx <span style="color: #666666;"><</span> tam_buffer_tx)
{<span style="color: #408080; font-style: italic;">// transmitindo</span>
SBUF0 <span style="color: #666666;">=</span> UART_Buffer_tx[pos_buffer_tx];<span style="color: #408080; font-style: italic;">//escreve na porta serial</span>
pos_buffer_tx<span style="color: #666666;">++</span>;
}
<span style="color: green; font-weight: bold;">else</span>
{
trans_232 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>; <span style="color: #408080; font-style: italic;">//fim de transmissao</span>
pos_buffer_tx <span style="color: #666666;">=0</span>;
}
}
}
}
<span style="color: #b00040;">void</span> imprime_hexa(<span style="color: #b00040;">char</span> dados[] ,<span style="color: #b00040;">uint8_t</span> tam)
{
<span style="color: green; font-weight: bold;">while</span>(trans_232); <span style="color: #408080; font-style: italic;">//faz nada só espera enviar todo o pacote talvez por um time out</span>
<span style="color: #408080; font-style: italic;">//se ja houver dados para ser enviado espera terminar para comecar a enviar. // veja que pode travar um pouco aqui o processamento</span>
tam_buffer_tx <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: green; font-weight: bold;">while</span>(tam <span style="color: #666666;">></span> tam_buffer_tx)
{
UART_Buffer_tx[tam_buffer_tx] <span style="color: #666666;">=</span> dados[tam_buffer_tx];<span style="color: #408080; font-style: italic;">//transfere dados</span>
tam_buffer_tx<span style="color: #666666;">++</span>;
}
trans_232 <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;<span style="color: #408080; font-style: italic;">//sinaliza que deve transmitir</span>
SCON0_TI <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>; <span style="color: #408080; font-style: italic;">//para dar inicio a transmissão</span>
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// PCA0_ISR</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// Return Value : None</span>
<span style="color: #408080; font-style: italic;">// Parameters : None</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// This is the ISR for the PCA. It handles the case when a capture occurs on</span>
<span style="color: #408080; font-style: italic;">// channel 0, and updates the variables to reflect the new capture information.</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
SI_INTERRUPT(PCA0_ISR, PCA0_IRQn)
{
periodo_atual_1 <span style="color: #666666;">=</span> (PCA0CPH0<span style="color: #666666;"><<8</span>) <span style="color: #666666;">+</span> PCA0CPL0;<span style="color: #408080; font-style: italic;">//pega valores depois vê se é pra tratar</span>
periodo_atual_2 <span style="color: #666666;">=</span> (PCA0CPH1<span style="color: #666666;"><<8</span>) <span style="color: #666666;">+</span> PCA0CPL1;
<span style="color: #408080; font-style: italic;">/* if(PCA0CN_CF) // houve estouro do contador (1 só pra todos)</span>
<span style="color: #408080; font-style: italic;"> {</span>
<span style="color: #408080; font-style: italic;"> //a fazer</span>
<span style="color: #408080; font-style: italic;"> PCA0CN_CF = 0;</span>
<span style="color: #408080; font-style: italic;"> }*/</span>
<span style="color: green; font-weight: bold;">if</span>(PCA0CN_CCF0) <span style="color: #408080; font-style: italic;">// interrupção no modulo 0</span>
{
PCA0CN_CCF0 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;<span style="color: #408080; font-style: italic;">// Clear module 0 interrupt flag.</span>
<span style="color: green; font-weight: bold;">if</span>(num_itens1<span style="color: #666666;"><10</span>)
{
<span style="color: green; font-weight: bold;">if</span>(periodo_atual_1<span style="color: #666666;">></span> periodo_anterior_1)
{
periodo_1 <span style="color: #666666;">=</span> (periodo_atual_1 <span style="color: #666666;">-</span> periodo_anterior_1)<span style="color: #666666;">+</span>periodo_1;
}
<span style="color: green; font-weight: bold;">else</span>
{
periodo_1 <span style="color: #666666;">=</span> (( <span style="color: #666666;">65535</span> <span style="color: #666666;">-</span> periodo_anterior_1) <span style="color: #666666;">+</span> periodo_atual_1)<span style="color: #666666;">+</span>periodo_1;
}
num_itens1<span style="color: #666666;">++</span>;
}
}
<span style="color: green; font-weight: bold;">if</span>(PCA0CN_CCF1) <span style="color: #408080; font-style: italic;">// interrupção no modulo 2</span>
{
PCA0CN_CCF1 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;<span style="color: #408080; font-style: italic;">// Clear module 0 interrupt flag.</span>
<span style="color: green; font-weight: bold;">if</span>(num_itens2<span style="color: #666666;"><10</span>)
{
<span style="color: green; font-weight: bold;">if</span>(periodo_atual_2<span style="color: #666666;">></span> periodo_anterior_2)
{
periodo_2 <span style="color: #666666;">=</span> (periodo_atual_2 <span style="color: #666666;">-</span> periodo_anterior_2)<span style="color: #666666;">+</span>periodo_2;
}
<span style="color: green; font-weight: bold;">else</span>
{
periodo_2 <span style="color: #666666;">=</span> (( <span style="color: #666666;">65535</span> <span style="color: #666666;">-</span> periodo_anterior_2) <span style="color: #666666;">+</span> periodo_atual_2)<span style="color: #666666;">+</span>periodo_2;
}
num_itens2<span style="color: #666666;">++</span>;
}
}
PCA0CN <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X40;<span style="color: #408080; font-style: italic;">//limpa todos os estouros e deixa o modo captura e timer ligado</span>
periodo_anterior_1 <span style="color: #666666;">=</span> periodo_atual_1;
periodo_anterior_2 <span style="color: #666666;">=</span> periodo_atual_2;
}
<span style="color: #b00040;">void</span> long_to_char(<span style="color: #b00040;">long</span> valor)
{
<span style="color: #b00040;">char</span> Buffer_serial_out[<span style="color: #666666;">5</span>]; <span style="color: #408080; font-style: italic;">//delimitador pra facilitar jogar no excel</span>
Buffer_serial_out[<span style="color: #666666;">0</span>]<span style="color: #666666;">=</span><span style="color: #ba2121;">'0'</span>;
Buffer_serial_out[<span style="color: #666666;">1</span>]<span style="color: #666666;">=</span><span style="color: #ba2121;">'0'</span>;
Buffer_serial_out[<span style="color: #666666;">2</span>]<span style="color: #666666;">=</span><span style="color: #ba2121;">'0'</span>;
Buffer_serial_out[<span style="color: #666666;">3</span>]<span style="color: #666666;">=</span><span style="color: #ba2121;">'0'</span>;
Buffer_serial_out[<span style="color: #666666;">4</span>]<span style="color: #666666;">=</span><span style="color: #ba2121;">'0'</span>;
<span style="color: green; font-weight: bold;">if</span>(valor <span style="color: #666666;"><</span> <span style="color: #666666;">65535</span>)
{
<span style="color: green; font-weight: bold;">while</span>(valor<span style="color: #666666;">>=10000</span>)
{
valor <span style="color: #666666;">=</span> valor <span style="color: #666666;">-</span> <span style="color: #666666;">10000</span>;
Buffer_serial_out[<span style="color: #666666;">0</span>]<span style="color: #666666;">++</span>;
}
<span style="color: green; font-weight: bold;">while</span>(valor<span style="color: #666666;">>=1000</span>)
{
valor <span style="color: #666666;">=</span> valor <span style="color: #666666;">-</span> <span style="color: #666666;">1000</span>;
Buffer_serial_out[<span style="color: #666666;">1</span>]<span style="color: #666666;">++</span>;
}
<span style="color: green; font-weight: bold;">while</span>(valor<span style="color: #666666;">>=100</span>)
{
valor <span style="color: #666666;">=</span> valor <span style="color: #666666;">-</span> <span style="color: #666666;">100</span>;
Buffer_serial_out[<span style="color: #666666;">2</span>]<span style="color: #666666;">++</span>;
}
<span style="color: green; font-weight: bold;">while</span>(valor<span style="color: #666666;">>=10</span>)
{
valor <span style="color: #666666;">=</span> valor <span style="color: #666666;">-</span> <span style="color: #666666;">10</span>;
Buffer_serial_out[<span style="color: #666666;">3</span>]<span style="color: #666666;">++</span>;
}
<span style="color: green; font-weight: bold;">while</span>(valor<span style="color: #666666;">>=1</span>)
{
valor <span style="color: #666666;">=</span> valor <span style="color: #666666;">-</span> <span style="color: #666666;">1</span>;
Buffer_serial_out[<span style="color: #666666;">4</span>]<span style="color: #666666;">++</span>;
}
imprime_hexa(Buffer_serial_out ,<span style="color: #666666;">5</span>);
}
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// main() Routine</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> main (<span style="color: #b00040;">void</span>)
{ <span style="color: #408080; font-style: italic;">//variaveis locais</span>
Config_Init(); <span style="color: #408080; font-style: italic;">// inicializa CPU</span>
UART0_Init(); <span style="color: #408080; font-style: italic;">// inicializa UART0</span>
LED_1 <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;<span style="color: #408080; font-style: italic;">//desliga leds</span>
LED_2 <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;
Desliga_Port4(LED_freq1);
Desliga_Port4(LED_freq2);
Desliga_Port4(LED_Status);
liga_pino_status <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
IE_EA <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;<span style="color: #408080; font-style: italic;">//habilita interrupções globais</span>
flag_teste <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: green; font-weight: bold;">while</span> (<span style="color: #666666;">1</span>)
{
<span style="color: green; font-weight: bold;">if</span>(tem_recp)<span style="color: #408080; font-style: italic;">//recebeu dados</span>
{
<span style="color: #408080; font-style: italic;">//trata os dados recebidos que estão em : UART_Buffer_RX</span>
imprime_hexa(<span style="color: #ba2121;">"</span><span style="color: #bb6622; font-weight: bold;">\n\r</span><span style="color: #ba2121;">"</span>,<span style="color: #666666;">2</span>);<span style="color: #408080; font-style: italic;">//salta linha e retorna para o inicio de linha</span>
imprime_hexa(<span style="color: #ba2121;">"dados =>"</span> ,<span style="color: #666666;">8</span>);
imprime_hexa(UART_Buffer_rx ,pos_buffer);
pos_buffer <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
tem_recp <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;<span style="color: #408080; font-style: italic;">//sinaliza que já leu</span>
Desliga_Port4(LED_ping);
}
<span style="color: green; font-weight: bold;">if</span>(num_itens1<span style="color: #666666;">==10</span>)
{
imprime_hexa(<span style="color: #ba2121;">"</span><span style="color: #bb6622; font-weight: bold;">\n\r</span><span style="color: #ba2121;">"</span>,<span style="color: #666666;">2</span>);<span style="color: #408080; font-style: italic;">//salta linha e retorna para o inicio de linha</span>
imprime_hexa(<span style="color: #ba2121;">"freq1=> "</span> ,<span style="color: #666666;">8</span>);
<span style="color: green; font-weight: bold;">if</span>(periodo_1 <span style="color: #666666;">></span> <span style="color: #666666;">30000</span>) <span style="color: #408080; font-style: italic;">//pra não ultrapassar o limite de impressão</span>
{
imprime_hexa(<span style="color: #ba2121;">"(hz)"</span>,<span style="color: #666666;">4</span>);
periodo_1 <span style="color: #666666;">=</span> <span style="color: #666666;">250000000/</span>((periodo_1<span style="color: #666666;">/10</span>)<span style="color: #666666;">*5.199</span>);<span style="color: #408080; font-style: italic;">//já tira a media</span>
}
<span style="color: green; font-weight: bold;">else</span>
{
imprime_hexa(<span style="color: #ba2121;">"(khz)"</span>,<span style="color: #666666;">5</span>);
periodo_1 <span style="color: #666666;">=</span> <span style="color: #666666;">250000/</span>((periodo_1<span style="color: #666666;">/10</span>)<span style="color: #666666;">*5.199</span>);<span style="color: #408080; font-style: italic;">//já tira a media</span>
}
long_to_char(periodo_1);
<span style="color: green; font-weight: bold;">if</span>(sinal0 <span style="color: #666666;">==</span> <span style="color: #666666;">0</span> )
{
Liga_Port4(LED_freq1);
sinal0 <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;
}
<span style="color: green; font-weight: bold;">else</span>
{
Desliga_Port4(LED_freq1);
sinal0 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
}
num_itens1 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
periodo_1 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
}
<span style="color: green; font-weight: bold;">if</span>(num_itens2<span style="color: #666666;">==10</span>)
{
imprime_hexa(<span style="color: #ba2121;">"</span><span style="color: #bb6622; font-weight: bold;">\n\r</span><span style="color: #ba2121;">"</span>,<span style="color: #666666;">2</span>);<span style="color: #408080; font-style: italic;">//salta linha e retorna para o inicio de linha</span>
imprime_hexa(<span style="color: #ba2121;">"freq2=> "</span> ,<span style="color: #666666;">8</span>);
<span style="color: green; font-weight: bold;">if</span>(periodo_2 <span style="color: #666666;">></span> <span style="color: #666666;">30000</span>) <span style="color: #408080; font-style: italic;">//pra não ultrapassar o limite de impressão</span>
{
imprime_hexa(<span style="color: #ba2121;">"(hz)"</span>,<span style="color: #666666;">4</span>);
periodo_2 <span style="color: #666666;">=</span> <span style="color: #666666;">250000000/</span>((periodo_2<span style="color: #666666;">/10</span>)<span style="color: #666666;">*5.199</span>);<span style="color: #408080; font-style: italic;">//já tira a media</span>
}
<span style="color: green; font-weight: bold;">else</span>
{
imprime_hexa(<span style="color: #ba2121;">"(khz)"</span>,<span style="color: #666666;">5</span>);
periodo_2 <span style="color: #666666;">=</span> <span style="color: #666666;">250000/</span>((periodo_2<span style="color: #666666;">/10</span>)<span style="color: #666666;">*5.199</span>);<span style="color: #408080; font-style: italic;">//já tira a media</span>
}
long_to_char(periodo_2);<span style="color: #408080; font-style: italic;">// valor em htz</span>
<span style="color: green; font-weight: bold;">if</span>(sinal1 <span style="color: #666666;">==</span> <span style="color: #666666;">0</span> )
{
Liga_Port4(LED_freq2);
sinal1 <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;
}
<span style="color: green; font-weight: bold;">else</span>
{
Desliga_Port4(LED_freq2);
sinal1 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
}
num_itens2 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
periodo_2 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
}
pisca<span style="color: #666666;">++</span>;
<span style="color: green; font-weight: bold;">if</span>(pisca <span style="color: #666666;">></span> <span style="color: #666666;">100</span>)
{ <span style="color: #408080; font-style: italic;">// pisca led</span>
<span style="color: green; font-weight: bold;">if</span>(liga_pino_status <span style="color: #666666;">==</span> <span style="color: #666666;">0</span>)
{
liga_pino_status <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;
Liga_Port4(LED_Status);
SCON0_TI <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
}
<span style="color: green; font-weight: bold;">else</span>
{
liga_pino_status <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
Desliga_Port4(LED_Status);
}
pisca <span style="color: #666666;">=0</span>;
}
}
}
</span></pre></div><span>
</span><p></p><p>formatado em : http://hilite.me/ acessado em 08/11/2023.</p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5944573230336506830.post-6961376143450679342023-11-03T10:35:00.000-07:002023-12-21T09:02:07.030-08:00Configurando o 8051CF380 para 48MHZ ( através do pll, com oscilador interno) e configurando a porta serial<p> <span> </span>Neste exemplo é demonstrado alguns aspectos na configuração deste microcontrolador :</p><p>1 - Como configurar o PLL para gerar 48MHZ interno.</p><p>2 - Configurando a serial para receber e enviar dados, com funções prontas e mais otimizadas.</p><p>3 - Como acionar e configura o PORT4.</p><p>4 - Exemplo de leitura de pinos e acionamento das IO's.</p><p><span> </span><span> </span>Aqui é usado o caracter '/' para indicar inicio de dados, mas pode ser trocado por outro, e o caracter '\n' para fim de dados. Assim basta digitar num terminal serial os dados da seguinte forma : "<span style="color: #2b00fe;">/</span><span style="color: #2b00fe; font-family: arial;">dados</span><span style="color: #2b00fe;">\n</span>."</p><p><b>O código fonte :</b></p><div style="background: rgb(248, 248, 248); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #408080; font-style: italic;">//Autor : Aguivone M. F.</span></pre><pre style="line-height: 125%; margin: 0px;"><pre style="line-height: 16.25px; margin-bottom: 0px; margin-top: 0px;"><span style="color: #408080; font-style: italic;">//Compilador: Simplicity studio - Silicon labs </span></pre><span style="color: #408080; font-style: italic;">// EXEMPLO DE COMO USAR A A SERIAL E OS PINOS DO MICROCONTROLADOR C8051F380-A-GQ</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Includes</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #bc7a00;">#include <SI_C8051F380_Register_Enums.h></span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Global CONSTANTS</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #bc7a00;">#define SYSCLK 48000000 </span><span style="color: #408080; font-style: italic;">// frequencia em Hz</span>
<span style="color: #bc7a00;">#define BAUDRATE 9600 </span><span style="color: #408080; font-style: italic;">// Baud rate da UART0 em bps</span>
<span style="color: #408080; font-style: italic;">// todos o led são ligados ao VCC</span>
<span style="color: #bc7a00;">#define LED_freq1 0x7F </span>
<span style="color: #bc7a00;">#define LED_freq2 0xBF </span>
<span style="color: #bc7a00;">#define LED_Status 0xF7 </span><span style="color: #408080; font-style: italic;">// P4.3 </span>
<span style="color: #bc7a00;">#define LED_ping 0xEF </span><span style="color: #408080; font-style: italic;">//P4.4 </span>
<span style="color: #b00040;">unsigned</span> <span style="color: #b00040;">char</span> porta4 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>XFF;
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Function PROTOTYPES</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
SI_INTERRUPT_PROTO(UART0_Interrupt, UART0_IRQn);
<span style="color: #b00040;">void</span> <span style="color: blue;">SYSCLK_Init</span> (<span style="color: #b00040;">void</span>);
<span style="color: #b00040;">void</span> <span style="color: blue;">UART0_Init</span> (<span style="color: #b00040;">void</span>);
<span style="color: #b00040;">void</span> <span style="color: blue;">PORT_Init</span> (<span style="color: #b00040;">void</span>);
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Global Variables</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// variaveis da serial RS232</span>
<span style="color: #bc7a00;">#define UART_BUFFERSIZE 30</span>
<span style="color: #b00040;">uint8_t</span> UART_Buffer_rx[UART_BUFFERSIZE];
<span style="color: #b00040;">uint8_t</span> UART_Buffer_tx[UART_BUFFERSIZE];<span style="color: #408080; font-style: italic;">//para transmissão</span>
<span style="color: #b00040;">uint8_t</span> pos_buffer<span style="color: #666666;">=0</span>;
<span style="color: #b00040;">uint8_t</span> tam_buffer_tx<span style="color: #666666;">=0</span>;
<span style="color: #b00040;">uint8_t</span> pos_buffer_tx<span style="color: #666666;">=0</span>;
<span style="color: #b00040;">bool</span> tem_recp <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: #b00040;">bool</span> rec_232 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: #b00040;">bool</span> trans_232 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: #b00040;">uint16_t</span> pisca <span style="color: #666666;">=0</span>;
<span style="color: #b00040;">char</span> liga_pino_status <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// SiLabs_Startup() - POSIÇÃO INICIAL A SER EXECUTADA</span>
<span style="color: #408080; font-style: italic;">// ----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">SiLabs_Startup</span> (<span style="color: #b00040;">void</span>)
{
PCA0MD <span style="color: #666666;">&=</span> <span style="color: #666666;">~0x40</span>; <span style="color: #408080; font-style: italic;">// WDTE = 0 (clear watchdog timer</span>
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// tratamento especial para port 4</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">Desliga_Port4</span>(<span style="color: green; font-weight: bold;">const</span> <span style="color: #b00040;">char</span> pino)
{<span style="color: #408080; font-style: italic;">//desliga em nivel alto</span>
porta4 <span style="color: #666666;">=</span> porta4 <span style="color: #666666;">|</span> (<span style="color: #666666;">~</span>pino);
P4 <span style="color: #666666;">=</span> porta4;
}
<span style="color: #b00040;">void</span> <span style="color: blue;">Liga_Port4</span>(<span style="color: green; font-weight: bold;">const</span> <span style="color: #b00040;">char</span> pino)
{
porta4 <span style="color: #666666;">=</span> porta4 <span style="color: #666666;">&</span> pino;
P4 <span style="color: #666666;">=</span> porta4;
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// PORT_Init - INICIALIZA AS PORTAS</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// Return Value : None</span>
<span style="color: #408080; font-style: italic;">// Parameters : None</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// Configure the Crossbar and GPIO ports.</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// P0.4 digital push-pull UART TX</span>
<span style="color: #408080; font-style: italic;">// P0.5 digital open-drain UART RX</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">PORT_Init</span> (<span style="color: #b00040;">void</span>)
{
P0MDIN <span style="color: #666666;">=</span> <span style="color: #666666;">0xFF</span>; <span style="color: #408080; font-style: italic;">// are digital</span>
P0MDOUT <span style="color: #666666;">=</span> <span style="color: #666666;">0x20</span>; <span style="color: #408080; font-style: italic;">// Enable UTX as push-pull output</span>
XBR0 <span style="color: #666666;">=</span> <span style="color: #666666;">0x01</span>; <span style="color: #408080; font-style: italic;">// Enable UART on P0.4(TX) and P0.5(RX)</span>
XBR1 <span style="color: #666666;">=</span> <span style="color: #666666;">0x40</span>; <span style="color: #408080; font-style: italic;">// Enable crossbar and weak pull-ups</span>
P4MDOUT <span style="color: #666666;">=</span> <span style="color: #666666;">0x04</span>; <span style="color: #408080; font-style: italic;">// enable Switches as open-drain</span>
P4MDIN <span style="color: #666666;">=</span> <span style="color: #666666;">0xFF</span>; <span style="color: #408080; font-style: italic;">// are digital</span>
P4 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>XFF ; <span style="color: #408080; font-style: italic;">//portas de p4 ligadas (desliga leds)</span>
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// SYSCLK - INICIA A CONFIGURAÇÃO DO CLOCK</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">SYSCLK_Init</span> (<span style="color: #b00040;">void</span>)
{ <span style="color: #408080; font-style: italic;">// configurado para 48mhz</span>
OSCICN <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X83; <span style="color: #408080; font-style: italic;">// IHFOsc Enable, sem divisão ira rodar a 12MHz</span>
CLKMUL <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>XC0; <span style="color: #408080; font-style: italic;">// talvez nem precise neste microcontrolador -> habilita e inicializa pll</span>
CLKSEL <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X03; <span style="color: #408080; font-style: italic;">// SYSCLK derived from the Internal High-Frequency Oscillator.sem divisão 48MHZ se estiver habilitado o clksel</span>
PFE0CN <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X20; <span style="color: #408080; font-style: italic;">//(para High Speed) Prefetch Engine Control,otimiza tempo de execu��o lendo 2 bytes de execu��o por vez</span>
<span style="color: #408080; font-style: italic;">/* FLSCL.FOSE(7) = 0 for < 10MHz and 1 for SYSCLK > 10MHz</span>
<span style="color: #408080; font-style: italic;"> FLSCL.FLRT(4) = 0 for < 25MHz and 1 for SYSCLK > 25MHz */</span>
FLSCL <span style="color: #666666;">=</span> <span style="color: #666666;">0x90</span>;
CKCON <span style="color: #666666;">=</span> <span style="color: #666666;">0x30</span>;
RSTSRC <span style="color: #666666;">=</span> <span style="color: #666666;">0x04</span>; <span style="color: #408080; font-style: italic;">// Enable missing clock detector</span>
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// UART0_Init</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// Return Value : None</span>
<span style="color: #408080; font-style: italic;">// Parameters : None</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// Configure the UART0 using Timer1, for <BAUDRATE> and 8-N-1.</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">UART0_Init</span> (<span style="color: #b00040;">void</span>)
{
SCON0 <span style="color: #666666;">=</span> <span style="color: #666666;">0x10</span>; <span style="color: #408080; font-style: italic;">// SCON0: 8-bit variable bit rate</span>
<span style="color: #408080; font-style: italic;">// level of STOP bit is ignored</span>
<span style="color: #408080; font-style: italic;">// RX enabled</span>
<span style="color: #408080; font-style: italic;">// ninth bits are zeros</span>
<span style="color: #408080; font-style: italic;">// clear SCON0_RI and SCON0_TI bits</span>
<span style="color: green; font-weight: bold;">if</span> (SYSCLK<span style="color: #666666;">/</span>BAUDRATE<span style="color: #666666;">/2/256</span> <span style="color: #666666;"><</span> <span style="color: #666666;">1</span>) {
TH1 <span style="color: #666666;">=</span> <span style="color: #666666;">-</span>(SYSCLK<span style="color: #666666;">/</span>BAUDRATE<span style="color: #666666;">/2</span>);
CKCON <span style="color: #666666;">&=</span> <span style="color: #666666;">~0x0B</span>; <span style="color: #408080; font-style: italic;">// T1M = 1; SCA1:0 = xx</span>
CKCON <span style="color: #666666;">|=</span> <span style="color: #666666;">0x08</span>;
} <span style="color: green; font-weight: bold;">else</span> <span style="color: green; font-weight: bold;">if</span> (SYSCLK<span style="color: #666666;">/</span>BAUDRATE<span style="color: #666666;">/2/256</span> <span style="color: #666666;"><</span> <span style="color: #666666;">4</span>) {
TH1 <span style="color: #666666;">=</span> <span style="color: #666666;">-</span>(SYSCLK<span style="color: #666666;">/</span>BAUDRATE<span style="color: #666666;">/2/4</span>);
CKCON <span style="color: #666666;">&=</span> <span style="color: #666666;">~0x0B</span>; <span style="color: #408080; font-style: italic;">// T1M = 0; SCA1:0 = 01</span>
CKCON <span style="color: #666666;">|=</span> <span style="color: #666666;">0x01</span>;
} <span style="color: green; font-weight: bold;">else</span> <span style="color: green; font-weight: bold;">if</span> (SYSCLK<span style="color: #666666;">/</span>BAUDRATE<span style="color: #666666;">/2/256</span> <span style="color: #666666;"><</span> <span style="color: #666666;">12</span>) {
TH1 <span style="color: #666666;">=</span> <span style="color: #666666;">-</span>(SYSCLK<span style="color: #666666;">/</span>BAUDRATE<span style="color: #666666;">/2/12</span>);
CKCON <span style="color: #666666;">&=</span> <span style="color: #666666;">~0x0B</span>; <span style="color: #408080; font-style: italic;">// T1M = 0; SCA1:0 = 00</span>
} <span style="color: green; font-weight: bold;">else</span> {
TH1 <span style="color: #666666;">=</span> <span style="color: #666666;">-</span>(SYSCLK<span style="color: #666666;">/</span>BAUDRATE<span style="color: #666666;">/2/48</span>);
CKCON <span style="color: #666666;">&=</span> <span style="color: #666666;">~0x0B</span>; <span style="color: #408080; font-style: italic;">// T1M = 0; SCA1:0 = 10</span>
CKCON <span style="color: #666666;">|=</span> <span style="color: #666666;">0x02</span>;
}
IE_ES0 <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>; <span style="color: #408080; font-style: italic;">//habilita interrupção de serial</span>
TL1 <span style="color: #666666;">=</span> TH1; <span style="color: #408080; font-style: italic;">// Init Timer1</span>
TMOD <span style="color: #666666;">&=</span> <span style="color: #666666;">~0xF0</span>; <span style="color: #408080; font-style: italic;">// TMOD: timer 1 in 8-bit autoreload</span>
TMOD <span style="color: #666666;">|=</span> <span style="color: #666666;">0x20</span>;
TCON_TR1 <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>; <span style="color: #408080; font-style: italic;">// START Timer1</span>
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Interrupt Service Routines</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// UART0_Interrupt</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// This routine is invoked whenever a character is entered or displayed on the</span>
<span style="color: #408080; font-style: italic;">// Hyperterminal.</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
SI_INTERRUPT(UART0_Interrupt, UART0_IRQn)
{
<span style="color: green; font-weight: bold;">if</span> (SCON0_RI <span style="color: #666666;">==</span> <span style="color: #666666;">1</span>)
{
<span style="color: #b00040;">char</span> RX_232 <span style="color: #666666;">=</span> SBUF0;
SCON0_RI <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: green; font-weight: bold;">if</span>(pos_buffer <span style="color: #666666;">>=</span> UART_BUFFERSIZE) <span style="color: #408080; font-style: italic;">// tem um bug no compilador ou chip que faz reseta</span>
{<span style="color: #408080; font-style: italic;">//erro descarta, pois é maior que o tamanho maximo do buffer</span>
rec_232<span style="color: #666666;">=0</span>; <span style="color: #408080; font-style: italic;">//não recebendo</span>
pos_buffer<span style="color: #666666;">=0</span>;<span style="color: #408080; font-style: italic;">//limpa buffer</span>
tem_recp <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;<span style="color: #408080; font-style: italic;">//sinaliza fim de pacote</span>
}
<span style="color: green; font-weight: bold;">if</span>(rec_232 <span style="color: #666666;">&&</span> RX_232 <span style="color: #666666;">==</span> <span style="color: #ba2121;">'\n'</span>)
{<span style="color: #408080; font-style: italic;">//esta recebendo e chegou delimitador de fim</span>
rec_232<span style="color: #666666;">=0</span>; <span style="color: #408080; font-style: italic;">//não recebendo</span>
tem_recp <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;<span style="color: #408080; font-style: italic;">//sinaliza fim de pacote</span>
Liga_Port4(LED_ping);
}
<span style="color: green; font-weight: bold;">if</span>(rec_232)
{<span style="color: #408080; font-style: italic;">//esta recebendo</span>
UART_Buffer_rx[pos_buffer] <span style="color: #666666;">=</span> RX_232;
pos_buffer<span style="color: #666666;">++</span>;
}
<span style="color: green; font-weight: bold;">if</span>(RX_232 <span style="color: #666666;">==</span> <span style="color: #ba2121;">'/'</span>)
{
pos_buffer<span style="color: #666666;">=0</span>;<span style="color: #408080; font-style: italic;">//sinaliza recepção</span>
rec_232<span style="color: #666666;">=1</span>; <span style="color: #408080; font-style: italic;">//recebendo</span>
}
}
<span style="color: green; font-weight: bold;">if</span> (SCON0_TI) <span style="color: #408080; font-style: italic;">//testa se tem transmissão</span>
{
SCON0_TI <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>; <span style="color: #408080; font-style: italic;">// limpa flag de tranmissão</span>
<span style="color: green; font-weight: bold;">if</span>(trans_232 <span style="color: #666666;">==</span> <span style="color: #666666;">1</span>)
{
<span style="color: green; font-weight: bold;">if</span> (pos_buffer_tx <span style="color: #666666;"><</span> tam_buffer_tx)
{<span style="color: #408080; font-style: italic;">// transmitindo</span>
SBUF0 <span style="color: #666666;">=</span> UART_Buffer_tx[pos_buffer_tx];<span style="color: #408080; font-style: italic;">//escreve na porta serial</span>
pos_buffer_tx<span style="color: #666666;">++</span>;
}
<span style="color: green; font-weight: bold;">else</span>
{
trans_232 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>; <span style="color: #408080; font-style: italic;">//fim de transmissao</span>
pos_buffer_tx <span style="color: #666666;">=0</span>;
}
}
}
}
<span style="color: #b00040;">void</span> escreve_frase(<span style="color: #b00040;">char</span> dados[] ,<span style="color: #b00040;">uint8_t</span> tam)
{
<span style="color: green; font-weight: bold;">while</span>(trans_232); <span style="color: #408080; font-style: italic;">//faz nada só espera enviar todo o pacote talvez por um time out</span>
<span style="color: #408080; font-style: italic;">//se ja houver dados para ser enviado espera terminar para comecar a enviar. // veja que pode travar um pouco aqui o processamento</span>
tam_buffer_tx <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: green; font-weight: bold;">while</span>(tam <span style="color: #666666;">></span> tam_buffer_tx)
{
UART_Buffer_tx[tam_buffer_tx] <span style="color: #666666;">=</span> dados[tam_buffer_tx];<span style="color: #408080; font-style: italic;">//transfere dados</span>
tam_buffer_tx<span style="color: #666666;">++</span>;
}
trans_232 <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;<span style="color: #408080; font-style: italic;">//sinaliza que deve transmitir</span>
SCON0_TI <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>; <span style="color: #408080; font-style: italic;">//para dar inicio a transmissão</span>
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// MAIN Routine</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> main (<span style="color: #b00040;">void</span>)
{ <span style="color: #408080; font-style: italic;">// enable)</span>
PORT_Init(); <span style="color: #408080; font-style: italic;">// Initialize Port I/O</span>
SYSCLK_Init (); <span style="color: #408080; font-style: italic;">// Initialize Oscillator</span>
UART0_Init();
IE_EA <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;<span style="color: #408080; font-style: italic;">//habilita todas as interrupções</span>
escreve_frase(<span style="color: #ba2121;">"Escreva na formato: /xx</span><span style="color: #bb6622; font-weight: bold;">\n</span><span style="color: #ba2121;"> </span><span style="color: #bb6622; font-weight: bold;">\r</span><span style="color: #ba2121;">"</span> ,<span style="color: #666666;">25</span>);
<span style="color: green; font-weight: bold;">while</span>(<span style="color: #666666;">1</span>)
{
<span style="color: green; font-weight: bold;">if</span>(tem_recp)<span style="color: #408080; font-style: italic;">//recebeu dados</span>
{
<span style="color: #408080; font-style: italic;">//trata os dados recebidos que estão em : UART_Buffer_RX</span>
escreve_frase(<span style="color: #ba2121;">"</span><span style="color: #bb6622; font-weight: bold;">\n\r</span><span style="color: #ba2121;">"</span>,<span style="color: #666666;">2</span>);<span style="color: #408080; font-style: italic;">//salta linha e retorna para o inicio de linha</span>
escreve_frase(<span style="color: #ba2121;">"recebeu dados =>"</span> ,<span style="color: #666666;">16</span>);
escreve_frase(UART_Buffer_rx ,pos_buffer);
pos_buffer <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
tem_recp <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;<span style="color: #408080; font-style: italic;">//sinaliza que já leu</span>
Desliga_Port4(LED_ping);
}
pisca<span style="color: #666666;">++</span>;
<span style="color: green; font-weight: bold;">if</span>(pisca <span style="color: #666666;">></span> <span style="color: #666666;">65500</span>)
{ <span style="color: #408080; font-style: italic;">// pisca led</span>
<span style="color: green; font-weight: bold;">if</span>(liga_pino_status <span style="color: #666666;">==</span> <span style="color: #666666;">0</span>)
{
liga_pino_status <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;
Liga_Port4(LED_Status);
SCON0_TI <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
}
<span style="color: green; font-weight: bold;">else</span>
{
liga_pino_status <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
Desliga_Port4(LED_Status);
}
pisca <span style="color: #666666;">=0</span>;
}
}
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// End Of File</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
</pre></div>
<p><span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="background-color: white; color: #333333; font-size: 14.85px;">Formatado em </span><a href="http://hilite.me/" style="background-color: white; color: #119922; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px; text-decoration-line: none;">http://hilite.me/</a><span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="background-color: white; color: #333333; font-size: 14.85px;"> acessado em 03_11_2023.</span></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5944573230336506830.post-6518063065707307072023-08-23T08:59:00.003-07:002023-08-23T08:59:58.753-07:00Como fazer uma interface isolada de comunicação serial RS232?<p> Olá,</p><p style="text-align: justify;"><span style="text-indent: 35.4pt;"><span> </span><span> </span><span> </span>As vezes necessitamos de uma
forma de isolar um circuito com determinada tensão para outro onde é preciso um
isolamento elétrico (no meu caso parte do circuito estaria conectado a 220V e
outra em 5V), como fazer essas duas partes do circuito se comunicarem? dentre
as possibilidades tem se interface optica, interface wifi e interface a transformador
(tipo o tcp), portanto cada caso deve ser verificado as questões de custos e
desempenho, além dos protocolos de comunicação.</span></p><p><span style="text-align: justify; text-indent: 35.4pt;"><span> </span><span> </span><span> </span>Aqui vou focar
em como fazer uma interface óptica usando o EL817,mas poderia ser o 4N25 ou
qualquer outro dentre as possibilidades vou citar duas possibilidades e suas características
veja a figura a seguir:</span></p><p class="MsoNormal" style="text-align: justify; text-indent: 35.4pt;"><o:p></o:p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilZ0zqMETm4DN6LRHA0Xc1qiUQuNvDHzad6sUB98xOX39WM-seotn67fRRCYPHhY9F0eswVXn7UmuqMUG4dwKsOQxGDDfBgTLkuEQl0U0Wgm4H2clmWKwuMrBWABr60kYaFxs4ws8X2iNs-Z-ZYWnHlUSANf-LjNc1yG8jnTbiZcIAv2OvY2z0jW-d7gc/s1190/opto.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="520" data-original-width="1190" height="230" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilZ0zqMETm4DN6LRHA0Xc1qiUQuNvDHzad6sUB98xOX39WM-seotn67fRRCYPHhY9F0eswVXn7UmuqMUG4dwKsOQxGDDfBgTLkuEQl0U0Wgm4H2clmWKwuMrBWABr60kYaFxs4ws8X2iNs-Z-ZYWnHlUSANf-LjNc1yG8jnTbiZcIAv2OvY2z0jW-d7gc/w526-h230/opto.jpg" width="526" /></a></div><br /><p class="MsoNormal" style="text-align: justify; text-indent: 35.4pt;"></p><p class="MsoNormal" style="text-indent: 35.4pt;">No modo 1, a vantagem é que o
sinal de saída só é acionado no momento da comunicação o que reduz o consumo de
corrente, observe que na saída podemos ou não colocar um resistor de pull up
(RX disp.2). Já no modo 2, apesar do led e do transistor ficar a maior parte do
tempo ligado tem se menos componentes, claro que se pode pensar outras
possibilidades.<o:p></o:p></p>
<p class="MsoNormal" style="text-indent: 35.4pt;">Mas o fato mais importante que
temos que pensar são os níveis de identificação de nível alto e baixo e do
formato dos pulsos (que podem ser distorcidos), quando mal dimensionado os
resistores e o modelo do optoacoplador, veja a figura a seguir um exemplo de
distorção que pode até reduzir a largura do pulso dependendo do valor dos
componentes do circuito. veja um exemplo:<o:p></o:p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0nX1XO9XJlheXUcW4M8qFJiCBCGX-Wr1eUD77w1eJ97Zf_sXasahGw6K8joTDmAdG6dPV7FOfBTLbC4aSYPGXzKWezyzO3aHFlvYr4HV7dE8WK0Obr8LV06uHphNpA8vKz2lIel98-C3SJmN7OOwGRzbvvHdDBLO-SMdZ4hBHtoTOcJVWLy3lwfJhmHo/s916/sinal.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="252" data-original-width="916" height="137" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0nX1XO9XJlheXUcW4M8qFJiCBCGX-Wr1eUD77w1eJ97Zf_sXasahGw6K8joTDmAdG6dPV7FOfBTLbC4aSYPGXzKWezyzO3aHFlvYr4HV7dE8WK0Obr8LV06uHphNpA8vKz2lIel98-C3SJmN7OOwGRzbvvHdDBLO-SMdZ4hBHtoTOcJVWLy3lwfJhmHo/w498-h137/sinal.jpg" width="498" /></a></div><p></p><p class="MsoNormal" style="text-align: justify; text-indent: 35.4pt;">Para se ter sinais mais fieis a
entrada possível nos acopladores ópticos, deve se recorrer a um parâmento chamado
CTR (<i>Current Transfer ratio</i>), que esta associado ao ganho e
sensibilidade do componentes internos (fotoresistor,fotodiodo ou fototransistor),
com isso tem se uma resposta mais fiel do sinal quanto maior o valor do CTR,
como exemplo veja o datasheet do EL817:<o:p></o:p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNBcVHjdGg2CNrHjFaKr4UWBmWG4PgGCPzSmccxVVmPnWVyUF5pG54RQ9sXTYJdM1CPW7T0EKcJAQxGbeBl10ql0kb55x3rx2DDEOAYySlL6vNAk4QGzss00Fe42PZHlw_-NljV0jNlb5pfuZkpzV0NjRj9YTFh9T8WSXUacnINtRIlYcbJdsqnDQa8Tk/s869/ctr.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="282" data-original-width="869" height="184" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNBcVHjdGg2CNrHjFaKr4UWBmWG4PgGCPzSmccxVVmPnWVyUF5pG54RQ9sXTYJdM1CPW7T0EKcJAQxGbeBl10ql0kb55x3rx2DDEOAYySlL6vNAk4QGzss00Fe42PZHlw_-NljV0jNlb5pfuZkpzV0NjRj9YTFh9T8WSXUacnINtRIlYcbJdsqnDQa8Tk/w566-h184/ctr.jpg" width="566" /></a></div><p class="MsoNormal" style="text-indent: 35.4pt;">Espero ter acrescentado um pouco
mais de sabedoria a todos que acompanham ou utilizam as informações deste blog.
Obrigado pela visita!<o:p></o:p></p><p class="MsoNormal" style="text-indent: 35.4pt;"><br /></p><p class="MsoNormal" style="text-align: justify; text-indent: 35.4pt;"></p><p class="MsoNormal" style="text-indent: 35.4pt;"><br /></p><br /><p></p>Unknownnoreply@blogger.com0Goiânia, GO, Brasil-16.6868912 -49.2647943-44.997125036178844 -84.4210443 11.623342636178844 -14.108544299999998tag:blogger.com,1999:blog-5944573230336506830.post-80596922045216541592023-05-19T06:22:00.000-07:002023-11-13T04:12:51.980-08:00Será que posso usar todos os pinos de IO do raspberry como entrada e saida? <p>Olá tudo bem!</p><p><span> </span><span> </span>Não tem coisa pior que fazer uma placa e descobrir que aquele pino de IO não funciona como esperado e então ter que recorrer a outro pino para fazer funcionar nossa aplicação, visando saber quais pinos realmente podem ser usado como entrada ou saída fiz o código fonte que esta no final do post.</p><p><span> </span><span> Neste código para testar os pinos são acionados todos os pinos por um tempo de modo sequencial, para o modo entrada é mostrado no terminal do compilador Geany(padrão do rasp) o estado atual de cada pino. o resultado é colocado na figura a seguir, onde as células em amarelo exigem atenção:</span></p><p><span></span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMJz6oxbdDHcy8HpEvXjj2RFFg1MUX8HktjJyA8aZGlrbIPqseP5ZntIz8Wh0gM78WVXLvQ3bbArwrjv6gCUbtZn7Y_vuB2dPKUJ59qDQQbr17veS5Sb7CcKVKegv7L_E2qWeYtsW4hnxHMKT8Im6Feq1ulNYpTVPCaN3DQ0aywgyf-aS4v5rSFgdR/s1484/padr%C3%A3o%20dos%20pinos.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1484" data-original-width="964" height="842" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMJz6oxbdDHcy8HpEvXjj2RFFg1MUX8HktjJyA8aZGlrbIPqseP5ZntIz8Wh0gM78WVXLvQ3bbArwrjv6gCUbtZn7Y_vuB2dPKUJ59qDQQbr17veS5Sb7CcKVKegv7L_E2qWeYtsW4hnxHMKT8Im6Feq1ulNYpTVPCaN3DQ0aywgyf-aS4v5rSFgdR/w547-h842/padr%C3%A3o%20dos%20pinos.jpg" width="547" /></a></div><span> </span><span> É preciso ter em mente que no raspberry PI4 (versão que usei) cada pino pode ter ate 6 função, então devemos estar atentos as suas funções secundarias.</span><p></p><p>Vídeo<span><span> demonstrando o funcionamento do algoritmo:</span></span></p><p><span></span></p><div class="separator" style="clear: both; text-align: center;"><span><iframe allowfullscreen="" class="BLOG_video_class" height="350" src="https://www.youtube.com/embed/E6_2jtC0Cbw" width="421" youtube-src-id="E6_2jtC0Cbw"></iframe></span></div><span><br /><span><br /></span></span><p></p><p><span><b><span style="font-size: medium;">O código fonte :</span></b><br /> </span></p><div style="background: rgb(248, 248, 248); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span><span style="color: #bc7a00;">#include <stdio.h></span>
<span style="color: #bc7a00;">#include <wiringPi.h></span>
<span style="color: #b00040;">int</span> aux<span style="color: #666666;">=0</span>;
<span style="color: #b00040;">void</span> <span style="color: blue;">teste_de_saida</span>(<span style="color: #b00040;">void</span>)
{
<span style="color: green; font-weight: bold;">while</span>(aux<span style="color: #666666;"><30</span>)
{
pinMode (aux, OUTPUT) ;
aux<span style="color: #666666;">++</span>;
}
aux <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: green; font-weight: bold;">while</span>(aux<span style="color: #666666;"><31</span>)
{<span style="color: #408080; font-style: italic;">//limpa tudo</span>
digitalWrite (aux, LOW) ;
aux<span style="color: #666666;">++</span>;
}
<span style="color: green; font-weight: bold;">for</span> (;;)
{
aux <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: green; font-weight: bold;">while</span>(aux<span style="color: #666666;"><31</span>)
{
digitalWrite (aux, HIGH) ;
delay (<span style="color: #666666;">100</span>);
digitalWrite (aux, LOW) ;
delay (<span style="color: #666666;">100</span>);
aux<span style="color: #666666;">++</span>;
}
}
}
<span style="color: #b00040;">void</span> <span style="color: blue;">teste_entradas</span>(<span style="color: #b00040;">void</span>)
{
<span style="color: green; font-weight: bold;">while</span>(aux<span style="color: #666666;"><31</span>)
{
pinMode (aux,INPUT) ; <span style="color: #408080; font-style: italic;">// como entrada</span>
pullUpDnControl(aux,PUD_OFF); <span style="color: #408080; font-style: italic;">//hailita pullups (PUD_OFF/PUD_DOWN/PUD_UP)</span>
aux<span style="color: #666666;">++</span>;
}
<span style="color: green; font-weight: bold;">for</span> (;;)
{
aux <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: #408080; font-style: italic;">//printf("estado dos pinos 0 1 2 3...29 : \n\r");</span>
<span style="color: green; font-weight: bold;">while</span>(aux<span style="color: #666666;"><31</span>)
{
<span style="color: green; font-weight: bold;">if</span>(digitalRead(aux) <span style="color: #666666;">==</span> <span style="color: #666666;">0</span>)
{
<span style="color: #408080; font-style: italic;">//printf("%d-0 ",aux);</span>
printf(<span style="color: #ba2121;">"0"</span>);
}
<span style="color: green; font-weight: bold;">else</span>
{
printf(<span style="color: #ba2121;">"1"</span>);
}
delay (<span style="color: #666666;">00</span>);
aux<span style="color: #666666;">++</span>;
}
printf(<span style="color: #ba2121;">" </span><span style="color: #bb6622; font-weight: bold;">\n\r</span><span style="color: #ba2121;">"</span>);
}
}
<span style="color: #b00040;">int</span> <span style="color: blue;">main</span> (<span style="color: #b00040;">void</span>)
{
wiringPiSetup () ;
<span style="color: #408080; font-style: italic;">/////////////////// para testar saidas///////// </span>
<span style="color: #408080; font-style: italic;">//teste_de_saida(); </span>
<span style="color: #408080; font-style: italic;">/////////////////// para testar entradas /////////</span>
teste_entradas();
<span style="color: green; font-weight: bold;">return</span> <span style="color: #666666;">0</span>;
}
</span></pre></div><span>
</span><p></p><p>formatado em <a href="http://hilite.me/">http://hilite.me/</a> acessado em 19_05_2023.</p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5944573230336506830.post-39856262681846755042023-05-17T07:49:00.004-07:002023-05-17T07:54:52.278-07:00Iniciando com o Raspberry Pi - Criando programas e acessando as portas do raspberry pelo Geany.<p> Quando se instala o SO do raspberry já se tem o compilador gcc
instalado e o Geany.</p><p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">O próximo passo é intalar a "lib wiringPi".<o:p></o:p></p>
<p class="MsoNormal">Estando instalado esta lib e pode ser testado no terminal do linux
via comando “gpio readall” , se aparecer a tabela com a pinagem do raspberry <span style="mso-spacerun: yes;"> </span>está tudo ok.<o:p></o:p></p>
<p class="MsoNormal">Veja o vídeo abaixo para ver o programa funcionando e os passo para criar o arquivo:<o:p></o:p></p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="355" src="https://www.youtube.com/embed/rcqgBssKpjI" width="427" youtube-src-id="rcqgBssKpjI"></iframe></div><br /><p class="MsoNormal"><br /></p><p class="MsoNormal"></p><p class="MsoNormal"><b><span style="font-size: medium;">O código fonte:</span></b><o:p></o:p></p>
<p class="MsoNormal"><span face=""Arial",sans-serif">#include
<wiringPi.h><o:p></o:p></span></p>
<p class="MsoNormal"><span face=""Arial",sans-serif">int main (void)<o:p></o:p></span></p>
<p class="MsoNormal"><span face=""Arial",sans-serif">{<o:p></o:p></span></p>
<p class="MsoNormal"><span face=""Arial",sans-serif"><span style="mso-spacerun: yes;"> </span><span style="mso-tab-count: 1;"> </span>wiringPiSetup
() ;<o:p></o:p></span></p>
<p class="MsoNormal"><span face=""Arial",sans-serif"><span style="mso-tab-count: 1;"> </span>pinMode (29, OUTPUT) ;<o:p></o:p></span></p>
<p class="MsoNormal"><span face=""Arial",sans-serif"><span style="mso-tab-count: 1;"> </span>pinMode (28, OUTPUT) ;<o:p></o:p></span></p>
<p class="MsoNormal"><span face=""Arial",sans-serif"><span style="mso-tab-count: 1;"> </span>for (;;)<o:p></o:p></span></p>
<p class="MsoNormal"><span face=""Arial",sans-serif"><span style="mso-tab-count: 1;"> </span>{<o:p></o:p></span></p>
<p class="MsoNormal"><span face=""Arial",sans-serif"><span style="mso-tab-count: 2;"> </span>digitalWrite (28, HIGH)
;<o:p></o:p></span></p>
<p class="MsoNormal"><span face=""Arial",sans-serif"><span style="mso-tab-count: 2;"> </span>digitalWrite (29, HIGH)
;<o:p></o:p></span></p>
<p class="MsoNormal"><span face=""Arial",sans-serif"><span style="mso-tab-count: 2;"> </span><span style="mso-spacerun: yes;"> </span>delay (500) ;<o:p></o:p></span></p>
<p class="MsoNormal"><span face=""Arial",sans-serif"><span style="mso-tab-count: 2;"> </span>digitalWrite (29, LOW) ;<span style="mso-tab-count: 1;"> </span><o:p></o:p></span></p>
<p class="MsoNormal"><span face=""Arial",sans-serif"><span style="mso-tab-count: 2;"> </span><span style="mso-spacerun: yes;"> </span>delay (500) ;<o:p></o:p></span></p>
<p class="MsoNormal"><span face=""Arial",sans-serif"><span style="mso-tab-count: 2;"> </span>digitalWrite (28, LOW) ;
<o:p></o:p></span></p>
<p class="MsoNormal"><span face=""Arial",sans-serif"><span style="mso-tab-count: 2;"> </span>digitalWrite (29, HIGH)
;<o:p></o:p></span></p>
<p class="MsoNormal"><span face=""Arial",sans-serif"><span style="mso-tab-count: 2;"> </span><span style="mso-spacerun: yes;"> </span>delay (500) ;<o:p></o:p></span></p>
<p class="MsoNormal"><span face=""Arial",sans-serif"><span style="mso-tab-count: 2;"> </span>digitalWrite (29, LOW) ;<span style="mso-tab-count: 1;"> </span><o:p></o:p></span></p>
<p class="MsoNormal"><span face=""Arial",sans-serif"><span style="mso-tab-count: 2;"> </span><span style="mso-spacerun: yes;"> </span>delay (1000) ;<o:p></o:p></span></p>
<p class="MsoNormal"><span face=""Arial",sans-serif"><span style="mso-spacerun: yes;"> </span><span style="mso-tab-count: 1;"> </span>}<o:p></o:p></span></p>
<p class="MsoNormal"><span face=""Arial",sans-serif"><span style="mso-tab-count: 1;"> </span>return 0;<o:p></o:p></span></p>
<p class="MsoNormal"><span face=""Arial",sans-serif">}<o:p></o:p></span></p>links que ajudam quem está começando :<p></p><div><div>como configura modo grafico : <a href="https://www.youtube.com/watch?v=TeYWxiGY2z4">https://www.youtube.com/watch?v=TeYWxiGY2z4</a></div><div>contruindo o primeiro codigo : <a href="https://www.makerhero.com/blog/linguagem-c-com-raspberry-pi/">https://www.makerhero.com/blog/linguagem-c-com-raspberry-pi/</a></div><div>contruindo o programa no terminal: <a href="https://www.youtube.com/watch?v=wDfUi-2-Efw">https://www.youtube.com/watch?v=wDfUi-2-Efw</a></div></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5944573230336506830.post-41695275212055240312023-04-12T05:59:00.000-07:002023-04-12T05:59:29.675-07:00Usando o timer do microcontrolador EFM8BB1(linha Busy Bee).<p> <span> </span>Olá! hoje exploraremos um pouco do microcontrolador Busy Bee EFM8(EFM8BB1), dentre suas principais características está o fato de ter um ADC de 12BITS,funciona a 25mhz interno, pinos compativel com 5V(pois são geralmente pra 3,3V), sensor de temperatura interno, 4 timers de 16 bits, comunicação UART,SPI e SMBUS/I2C.</p><p><span> </span>Este microcontrolador é totalmente compatível com alguns microcontroladores da linha CIP-51 8051(C8051), sendo praticamente um melhoramento dos projetos anteriores deste componente. Para a utilização deste microcontrolador divergem alguns registradores além do precisar de 2 comando para desligar o "watch dog", sob risco do micro ficar resetando.</p><p><span> </span>Neste exemplo vou demonstrar como acionar um pino usando como base de tempo o timer2 interno deste microcontrolador, apesar de ser um exemplo simples creio que irá ajudar quem está começando a usar este microcontrolador com a interface do Simplicity Studio. Veja na figura a seguir. </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQgdgzgysUJDsgXdfd7gsBw-nOFbL_ynBDGEMrYL8BGmcc_p5D922bUkbaR5Gt25h3PNwDyXB2inGm-P_GDnLvhdwi4aaw_5gwSTz9bEDyq9xZi4TVjeglgkt9IOV3j-FoogxLLYSiPAfg8bq9mNLVMhuvs8o0t5I66H8BqTyiWDV_2dBJOd6HROHd/s1276/Bee.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="936" data-original-width="1276" height="363" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQgdgzgysUJDsgXdfd7gsBw-nOFbL_ynBDGEMrYL8BGmcc_p5D922bUkbaR5Gt25h3PNwDyXB2inGm-P_GDnLvhdwi4aaw_5gwSTz9bEDyq9xZi4TVjeglgkt9IOV3j-FoogxLLYSiPAfg8bq9mNLVMhuvs8o0t5I66H8BqTyiWDV_2dBJOd6HROHd/w494-h363/Bee.jpg" width="494" /></a></div>O código fonte :<div><br />
<!--HTML generated using hilite.me--><div style="background: rgb(248, 248, 248); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Includes</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #bc7a00;">#include "si_toolchain.h" </span><span style="color: #408080; font-style: italic;">// compiler declarations</span>
<span style="color: #bc7a00;">#include <SI_EFM8BB1_Register_Enums.h> </span><span style="color: #408080; font-style: italic;">// SFR declarations</span>
<span style="color: #bc7a00;">#include <stdio.h></span>
<span style="color: #bc7a00;">#include <string.h></span>
<span style="color: #bc7a00;">#define SYSCLK 24500000 </span><span style="color: #408080; font-style: italic;">// Internal oscillator frequency in Hz</span>
SI_SBIT(BOT1, SFR_P0, <span style="color: #666666;">1</span>); <span style="color: #408080; font-style: italic;">// não usado aqui</span>
SI_SBIT(BOT2, SFR_P0, <span style="color: #666666;">2</span>); <span style="color: #408080; font-style: italic;">// não usado aqui</span>
<span style="color: #408080; font-style: italic;">//leds vermelho e sinal de saida</span>
SI_SBIT(LED_1,SFR_P1,<span style="color: #666666;">2</span>);
<span style="color: #b00040;">int</span> pisca_led <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: #b00040;">long</span> tempo_1s <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: #b00040;">void</span> <span style="color: blue;">SiLabs_Startup</span> (<span style="color: #b00040;">void</span>)
{
WDTCN <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>XDE;<span style="color: #408080; font-style: italic;">// WDTE = 0 (desliga watchdog )</span>
WDTCN <span style="color: #666666;">=</span> <span style="color: #666666;">0xAD</span>;<span style="color: #408080; font-style: italic;">// senão colocar essa seuqencia não desliga deser colocado obrigatoriamente os 2</span>
PCA0MD <span style="color: #666666;">=</span> <span style="color: #666666;">0x08</span>; <span style="color: #408080; font-style: italic;">// habilita sytem clok para timer</span>
}
<span style="color: #b00040;">void</span> <span style="color: blue;">__delay_ms</span>(<span style="color: #b00040;">uint32_t</span> val)
{<span style="color: #408080; font-style: italic;">//rotina que usa ciclos de maquina - pode variar devido a interrupções</span>
val <span style="color: #666666;">=</span> <span style="color: #666666;">360*</span>val;
<span style="color: green; font-weight: bold;">while</span>(val<span style="color: #666666;">>1</span>)
{
val<span style="color: #666666;">--</span>;
}
}
<span style="color: #b00040;">void</span> <span style="color: blue;">__delay_us</span>(<span style="color: #b00040;">uint8_t</span> val)
{<span style="color: #408080; font-style: italic;">//rotina que usa ciclos de maquina - pode variar devido a interrupções</span>
<span style="color: green; font-weight: bold;">while</span>(val<span style="color: #666666;">>1</span>)
{
val<span style="color: #666666;">--</span>;
}
}
<span style="color: #b00040;">void</span> <span style="color: blue;">Oscillator_Init</span> (<span style="color: #b00040;">void</span>)
{
HFO0CAL <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X00; <span style="color: #408080; font-style: italic;">// para alta frequencia</span>
CLKSEL <span style="color: #666666;">=</span> <span style="color: #666666;">0x00</span>; <span style="color: #408080; font-style: italic;">//SYSCLK: OpcDiv = 24M5Hz // sem divisão de clock e para alta frequencia// clok interno</span>
}
<span style="color: #b00040;">void</span> <span style="color: blue;">PORT_Init</span>(<span style="color: #b00040;">void</span>)
{
WDTCN <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>XDE;<span style="color: #408080; font-style: italic;">// WDTE = 0 (desliga watchdog )</span>
WDTCN <span style="color: #666666;">=</span> <span style="color: #666666;">0xAD</span>;<span style="color: #408080; font-style: italic;">// senão colocar essa seuqencia não desliga deser colocado obrigatoriamente os 2</span>
CLKSEL <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X00; <span style="color: #408080; font-style: italic;">// 24mhz clock interno</span>
<span style="color: #408080; font-style: italic;">// WDTCN = 0xDE;//(desliga watchdog )</span>
XBR0 <span style="color: #666666;">=</span> <span style="color: #666666;">0x00</span>; <span style="color: #408080; font-style: italic;">// habilita UART no pino P0.4(TX) and P0.5(RX) ; logo não serão usado como como IO´s gerais</span>
XBR2 <span style="color: #666666;">=</span> <span style="color: #666666;">0xC0</span>; <span style="color: #408080; font-style: italic;">// habilita crossbar e pull-ups interno desligados</span>
VDM0CN <span style="color: #666666;">=</span> <span style="color: #666666;">0x00</span>; <span style="color: #408080; font-style: italic;">// Colocado porque senão da problema na gravacao da flash(já estava isso)</span>
RSTSRC <span style="color: #666666;">=</span> <span style="color: #666666;">0x00</span>; <span style="color: #408080; font-style: italic;">// desativa reset de falha de oscilação.</span>
P0MDOUT <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>XC0; <span style="color: #408080; font-style: italic;">//somente pino 6 e 7 são saidas</span>
P1MDOUT <span style="color: #666666;">=</span> <span style="color: #666666;">0xFF</span>; <span style="color: #408080; font-style: italic;">//todos saidas</span>
P2MDOUT <span style="color: #666666;">=</span> <span style="color: #666666;">0xFF</span>; <span style="color: #408080; font-style: italic;">//todos saidas so tem 2 saidas</span>
<span style="color: #408080; font-style: italic;">//configura portas</span>
P0MDIN <span style="color: #666666;">=</span> <span style="color: #666666;">0xF9</span>; <span style="color: #408080; font-style: italic;">// apenas P0.1 e P0.2 são analogica</span>
P1MDIN <span style="color: #666666;">=</span> <span style="color: #666666;">0xFF</span>; <span style="color: #408080; font-style: italic;">// are digital</span>
P0SKIP <span style="color: #666666;">=</span> <span style="color: #666666;">0x3F</span>; <span style="color: #408080; font-style: italic;">//não usado</span>
P1SKIP <span style="color: #666666;">=</span> <span style="color: #666666;">0xFE</span>;
IE_EA <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>; <span style="color: #408080; font-style: italic;">// liga interrupções</span>
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Timer2_Init</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// Configure Timer2 to 16-bit auto-reload and generate an interrupt at</span>
<span style="color: #408080; font-style: italic;">// interval specified by <counts> using SYSCLK/48 as its time base.</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">Timer2_Init</span> (<span style="color: #b00040;">void</span>)
{ <span style="color: #408080; font-style: italic;">//100us</span>
TMR2CN0 <span style="color: #666666;">=</span> <span style="color: #666666;">0x00</span>; <span style="color: #408080; font-style: italic;">/// time 2 no modo 16 bits</span>
TCON <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;<span style="color: #408080; font-style: italic;">//não habilita timer 0 e 1</span>
CKCON0 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>XFD; <span style="color: #408080; font-style: italic;">//todos os timer serão ligados ao sysclock e na menor divisão para timer 0 e 1(por 4)</span>
TMR2RLH <span style="color: #666666;">=</span> <span style="color: #666666;">0xF6</span>; <span style="color: #408080; font-style: italic;">//quando se usa o modo autocarregar puxa daqui o valor</span>
TMR2RLL <span style="color: #666666;">=</span> <span style="color: #666666;">0x70</span>;<span style="color: #408080; font-style: italic;">//quando se usa o modo autocarregar puxa daqui o valor</span>
TMR2 <span style="color: #666666;">=</span> <span style="color: #666666;">0xF670</span>; <span style="color: #408080; font-style: italic;">// um valor para primeiro estouro</span>
IE_ET2 <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>; <span style="color: #408080; font-style: italic;">// enable Timer2 interrupts</span>
TMR2CN0_TR2 <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>; <span style="color: #408080; font-style: italic;">// start Timer2</span>
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Interrupt Service Routines</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Timer2_ISR</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// This routine changes the state of the LED whenever Timer2 overflows.</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
SI_INTERRUPT(Timer2_ISR, TIMER2_IRQn)
{ <span style="color: #408080; font-style: italic;">// tempo de 100us</span>
TMR2CN0_TF2H <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>; <span style="color: #408080; font-style: italic;">// limpa tanto a interrupção nos bytes baixo como altos</span>
TMR2CN0_TF2L <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;<span style="color: #408080; font-style: italic;">// clear Timer2 interrupt flag</span>
tempo_1s<span style="color: #666666;">++</span>;
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// main() Routine</span>
<span style="color: #408080; font-style: italic;">// ----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Note: the software watchdog timer is not disabled by default in this</span>
<span style="color: #408080; font-style: italic;">// example, so a long-running program will reset periodically unless</span>
<span style="color: #408080; font-style: italic;">// the timer is disabled or your program periodically writes to it.</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// Review the "Watchdog Timer" section under the part family's datasheet</span>
<span style="color: #408080; font-style: italic;">// for details. To find the datasheet, select your part in the</span>
<span style="color: #408080; font-style: italic;">// Simplicity Launcher and click on "Data Sheet".</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">int</span> main (<span style="color: #b00040;">void</span>)
{
PORT_Init();
Timer2_Init ();
<span style="color: green; font-weight: bold;">for</span>(;;)
{
<span style="color: green; font-weight: bold;">if</span>(tempo_1s <span style="color: #666666;">></span> <span style="color: #666666;">10000</span>)
{<span style="color: #408080; font-style: italic;">//pisca a cada 1s</span>
tempo_1s <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: green; font-weight: bold;">if</span>(pisca_led <span style="color: #666666;">==</span> <span style="color: #666666;">0</span>)
{
pisca_led <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;
LED_1 <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;
}
<span style="color: green; font-weight: bold;">else</span>
{
pisca_led <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
LED_1 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
}
}
}
}
</pre></div>
</div><div>Formatado no site <a href="http://hilite.me/">http://hilite.me/</a> acessado em 12/04/2023.<div><p><br /></p></div></div>Unknownnoreply@blogger.com0Goiânia, GO, Brasil-16.6868912 -49.2647943-44.997125036178844 -84.4210443 11.623342636178844 -14.108544299999998tag:blogger.com,1999:blog-5944573230336506830.post-46174323650258535982023-02-14T09:55:00.003-08:002023-02-14T09:57:52.452-08:00Acionando Motor de passo a 4 fios (topologia 2 bobinas) com o PIC16F88<p><span style="font-family: arial;"> <span style="text-align: justify; text-indent: 35.4pt;">Olá
tudo bem! </span></span></p><p><span style="font-family: arial;"><span style="text-align: justify; text-indent: 35.4pt;"><span> </span><span> </span>Depois de um longo período sem postar nada trago um exemplo de
acionamento de motor de passo que opera no modo 2 bobinas (apenas 4 fios).</span></span></p>
<p class="MsoNormal" style="text-align: justify;"><span style="line-height: 107%;"><span style="font-family: arial;"> Neste
exemplo foi utilizado um motor japonês STH36C1078 retirado de uma câmera de
vigilância, mas pode-se utilizar qualquer outro motor de passo de 4 fios, pic
16F88, dois CI 74HC00, 8 transistores BC548, 8 diodos 1N4148, duas microswitch(tipo
push botton) , um led sendo o restante composto por resistores.<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: justify;"><span style="line-height: 107%;"><span style="font-family: arial;"> Para
este exemplo pensei em algo simples como um programa que ao pressionar o botão
1 o motor gira em sentido horário e ao pressionar outro botão 2 gira em sentido
anti-horário.<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: justify;"><span style="line-height: 107%;"><span style="font-family: arial;"> Observe que a vantagem deste drive montado é que jamais
ocorrerá a condição de curto, supondo que o CI esteja bom, pois o CI74HC00 faz o
trabalho de sempre alternar os estado lógicos que chegam a base do transistor assim
a tabela de cada drive é ‘01’- aciona a bobina num sentido (por exemplo RB0 = 0
e RB1 = 1) ,’10’ – aciona em sentido inverso, sendo que os estado ‘00’ e ‘11’
deixam as bobinas desligados, para este motor são montados 2 circuitos deste
tipo(um para cada bobina).</span></span></p><p class="MsoNormal" style="text-align: justify;"><span style="text-indent: 35.4pt;"><span style="font-family: arial;"><span> </span>Deve se estar atento a sequência de ligação
dos fios do motor para que ele não fique apenas “tremendo” em vez de girar. Neste
projeto coloquei um resistor de baixo valor(27R) em serie com a alimentação dos
transistores drives caso ocorra alguma falha este resistor funciona com fusível,
porem pode se utiliza um fusível.</span></span></p>
<span style="line-height: 107%;"><span style="font-family: arial;"> Este drive pode
funcionar com 5 a 12V(teoricamente pode até 30V porém não testei isso) enquanto
o resto do circuito pode funciona com 5V, isso é bom pois assim não
sobrecarrega o regulador de tensão que alimenta o microcontrolador.</span></span><h2 style="text-align: left;"><span style="line-height: 107%;"><span style="color: #2b00fe; font-family: arial;">O esquema elétrico simulado :</span></span></h2><h2 style="text-align: left;"><span style="line-height: 107%;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBCs6aNYdhnnIR1sbzHQGcpucmYiWD9c7JLAV9fhSFle5efmNLdFcXEOFMQVq4DnRdH2XFXdz5pe5GK5jt1kGX6DiiIzeLiy1ND6EHJl7GJfp4ZZZA5YNlvni5Hmmaxk5nb3mwqsfCm-PmFSAFOu2jp2vcezvsCI7yUacMVohSYHi_DQ-6vFMcq4dZ/s1202/Sem%20t%C3%ADtulo.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="698" data-original-width="1202" height="372" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBCs6aNYdhnnIR1sbzHQGcpucmYiWD9c7JLAV9fhSFle5efmNLdFcXEOFMQVq4DnRdH2XFXdz5pe5GK5jt1kGX6DiiIzeLiy1ND6EHJl7GJfp4ZZZA5YNlvni5Hmmaxk5nb3mwqsfCm-PmFSAFOu2jp2vcezvsCI7yUacMVohSYHi_DQ-6vFMcq4dZ/w640-h372/Sem%20t%C3%ADtulo.png" width="640" /></a></div></span><span style="line-height: 107%;"><span style="color: #2b00fe; font-family: arial;">O código fonte:</span></span></h2>
<!--HTML generated using hilite.me--><div style="background: rgb(248, 248, 248); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #408080; font-style: italic;">/* Empresa cliente: BLOG MICROCONTROLADORES</span>
<span style="color: #408080; font-style: italic;"> * Compilador : MPlabXC8</span>
<span style="color: #408080; font-style: italic;"> * Microcontroladores compativeis : 16F88A</span>
<span style="color: #408080; font-style: italic;"> * Autor: Aguivone Moretti Fógia</span>
<span style="color: #408080; font-style: italic;"> * Versão: 1.0</span>
<span style="color: #408080; font-style: italic;"> * Data : 14/02/2023</span>
<span style="color: #408080; font-style: italic;"> * descrição : acionando motor de passo com 4 fios </span>
<span style="color: #408080; font-style: italic;"> */</span>
<span style="color: #bc7a00;">#include <stdio.h></span>
<span style="color: #bc7a00;">#include <string.h> </span><span style="color: #408080; font-style: italic;">//para usar funçoes de string deve se adicionar este header</span>
<span style="color: #bc7a00;">#include <stdlib.h></span>
<span style="color: #bc7a00;">#define _XTAL_FREQ 8000000</span>
<span style="color: #408080; font-style: italic;">//#define _XTAL_FREQ 20000000</span>
<span style="color: #bc7a00;">#include <xc.h></span>
<span style="color: #bc7a00;">#pragma config FOSC = INTOSCIO </span><span style="color: #408080; font-style: italic;">// Oscillator Selection bits (INTRC oscillator; port I/O function on both RA6/OSC2/CLKO pin and RA7/OSC1/CLKI pin)</span>
<span style="color: #408080; font-style: italic;">//#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) -- cristal de 20mhz</span>
<span style="color: #bc7a00;">#pragma config WDTE = OFF </span><span style="color: #408080; font-style: italic;">// Watchdog Timer Enable bit (WDT habilitado)</span>
<span style="color: #bc7a00;">#pragma config PWRTE = OFF </span><span style="color: #408080; font-style: italic;">// Power-up Timer Enable bit (PWRT enabled)</span>
<span style="color: #bc7a00;">#pragma config MCLRE = OFF </span><span style="color: #408080; font-style: italic;">// RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital I/O, MCLR internally tied to VDD)</span>
<span style="color: #bc7a00;">#pragma config BOREN = OFF </span><span style="color: #408080; font-style: italic;">// Brown-out Detect Enable bit (BOD disabled)</span>
<span style="color: #bc7a00;">#pragma config LVP = OFF </span><span style="color: #408080; font-style: italic;">// Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)</span>
<span style="color: #bc7a00;">#pragma config CPD = OFF </span><span style="color: #408080; font-style: italic;">// Data EE Memory Code Protection bit (proteção da eeprom)</span>
<span style="color: #bc7a00;">#pragma config CP = OFF </span><span style="color: #408080; font-style: italic;">// Flash Program Memory Code Protection bit (proteção do codigo</span>
<span style="color: #408080; font-style: italic;">///////////////defines utilizados///////////////////////////////////////////////////////////////////////////////////////////</span>
<span style="color: #408080; font-style: italic;">/*************************** configuração dos pinos **************************************************/</span>
<span style="color: #408080; font-style: italic;">////////PINOS DO MOTOR ///////////////</span>
<span style="color: #408080; font-style: italic;">//a bobina 1 é o fio amarelo e vermelho --->> bobina 2 é o fio laranja e marrom</span>
<span style="color: #408080; font-style: italic;">//no motor fisico a sequencia para o modo 1 passo é </span>
<span style="color: #408080; font-style: italic;">/*</span>
<span style="color: #408080; font-style: italic;"> Passo/cor</span>
<span style="color: #408080; font-style: italic;"> * 1 amarelo(+) vermelho(-) laranja(desl) marrom(desl)</span>
<span style="color: #408080; font-style: italic;"> * 2 amarelo(desl) vermelho(desl) laranja(+) marrom(-)</span>
<span style="color: #408080; font-style: italic;"> * 3 amarelo(-) vermelho(+) laranja(desl) marrom(desl)</span>
<span style="color: #408080; font-style: italic;"> * 4 amarelo(desl) vermelho(desl) laranja(-) marrom(+)</span>
<span style="color: #408080; font-style: italic;"> * para motor desligado = todos os pinos em zero ou em 1</span>
<span style="color: #408080; font-style: italic;"> </span>
<span style="color: #408080; font-style: italic;"> </span>
<span style="color: #408080; font-style: italic;"> */</span>
<span style="border: 1px solid rgb(255, 0, 0);">#</span>define A_0 RB0 <span style="color: #408080; font-style: italic;">//bobina A //deve ser colocado corretamente para girar</span>
<span style="border: 1px solid rgb(255, 0, 0);">#</span>define A_1 RB1
<span style="border: 1px solid rgb(255, 0, 0);">#</span>define B_0 RB2 <span style="color: #408080; font-style: italic;">//bobina B </span>
<span style="border: 1px solid rgb(255, 0, 0);">#</span>define B_1 RB3
<span style="border: 1px solid rgb(255, 0, 0);">#</span>define BOT_H RA0
<span style="border: 1px solid rgb(255, 0, 0);">#</span>define BOT_ANTI RA1
<span style="color: #408080; font-style: italic;">///////// PINO DE SINALIZAÇÃO //////////////</span>
<span style="color: #bc7a00;">#define LED_STATUS RB4</span>
<span style="color: #b00040;">void</span> Desligar_motor(<span style="color: #b00040;">void</span>)
{
A_0 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
A_1 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
B_0 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
B_1 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
}
<span style="color: #b00040;">void</span> tempo_pulso(<span style="color: #b00040;">long</span> tempo)
{<span style="color: #408080; font-style: italic;">//pra pode usar tempos maiores</span>
<span style="color: green; font-weight: bold;">while</span>(tempo<span style="color: #666666;">>0</span>)
{
__delay_ms(<span style="color: #666666;">1</span>);
tempo<span style="color: #666666;">--</span>;
}
}
<span style="color: #b00040;">void</span> Girar_motor_horario(<span style="color: #b00040;">long</span> tempo,<span style="color: #b00040;">int</span> num_giros)
{<span style="color: #408080; font-style: italic;">//o tempo ira definir a velocidade de giro</span>
<span style="color: green; font-weight: bold;">while</span>(num_giros<span style="color: #666666;">>0</span>)
{
A_0 <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;
A_1 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
B_0 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
B_1 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
tempo_pulso(tempo);
A_0 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
A_1 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
B_0 <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;
B_1 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
tempo_pulso(tempo);
A_0 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
A_1 <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;
B_0 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
B_1 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
tempo_pulso(tempo);
A_0 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
A_1 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
B_0 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
B_1 <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;
tempo_pulso(tempo);
num_giros<span style="color: #666666;">--</span>;
}
}
}
<span style="color: #b00040;">void</span> Girar_motor_anti_hor(<span style="color: #b00040;">long</span> tempo,<span style="color: #b00040;">int</span> num_giros)
{<span style="color: #408080; font-style: italic;">//o tempo ira definir a velocidade de giro</span>
<span style="color: green; font-weight: bold;">while</span>(num_giros<span style="color: #666666;">>0</span>)
{
A_0 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
A_1 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
B_0 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
B_1 <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;
tempo_pulso(tempo);
A_0 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
A_1 <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;
B_0 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
B_1 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
tempo_pulso(tempo);
A_0 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
A_1 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
B_0 <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;
B_1 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
tempo_pulso(tempo);
A_0 <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;
A_1 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
B_0 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
B_1 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
tempo_pulso(tempo);
num_giros<span style="color: #666666;">--</span>;
}
}</pre><pre style="line-height: 125%; margin: 0px;"><span style="color: #b00040;"><br /></span></pre><pre style="line-height: 125%; margin: 0px;"><span style="color: #b00040;">void</span> main(<span style="color: #b00040;">void</span>)
{
TRISB <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>XC0;<span style="color: #408080; font-style: italic;">//configura portB</span>
TRISA <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>XFF;<span style="color: #408080; font-style: italic;">//configura portA</span>
PORTA <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
PORTB <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;<span style="color: #408080; font-style: italic;">//deixa pino tx em nivel alto</span>
OPTION_REG <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X80; <span style="color: #408080; font-style: italic;">// pull up desabilitados e prescaler para timer 0 - desabilita watchdog</span>
INTCON <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;<span style="color: #408080; font-style: italic;">//desabilita todas as interrupções </span>
CMCON <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X07;<span style="color: #408080; font-style: italic;">//desliga comparadores </span>
OSCTUNE <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X1F; <span style="color: #408080; font-style: italic;">// oscilador vel maxima</span>
OSCCON <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>XFE ; <span style="color: #408080; font-style: italic;">// oscilador interno com frequencia de 8mhz</span>
ANSEL <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X00; <span style="color: #408080; font-style: italic;">//portas digitais desligado. </span>
GIE <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: green; font-weight: bold;">for</span>(;;)
{
<span style="color: green; font-weight: bold;">if</span>(BOT_H <span style="color: #666666;">==</span> <span style="color: #666666;">0</span>)
{
Girar_motor_horario(<span style="color: #666666;">5</span>,<span style="color: #666666;">10</span>);<span style="color: #408080; font-style: italic;">// tempo de acionamento da bobina é de 1ms e dara 10 giros </span>
LED_STATUS <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;
}
<span style="color: green; font-weight: bold;">else</span>
{
<span style="color: green; font-weight: bold;">if</span>(BOT_ANTI <span style="color: #666666;">==</span> <span style="color: #666666;">0</span>)
{
Girar_motor_anti_hor(<span style="color: #666666;">5</span>,<span style="color: #666666;">10</span>);
LED_STATUS <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;
}
<span style="color: green; font-weight: bold;">else</span>
{
Desligar_motor();
LED_STATUS <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
}
}
}<span style="color: #408080; font-style: italic;">//loop infinito</span>
}
</pre></div>
<h2 style="text-align: left;"><span style="line-height: 107%;"><span style="font-family: arial;"><pre class="lang-c s-code-block" style="--_cb-line-numbers-bg: var(--black-050); border-radius: var(--br-md); border: 0px; box-sizing: inherit; color: var(--highlight-color); font-family: var(--ff-mono); font-size: var(--fs-body1); font-stretch: inherit; font-variant-east-asian: inherit; font-variant-numeric: inherit; font-weight: 400; line-height: var(--lh-md); margin-bottom: 0px; margin-top: 0px; max-height: 600px; overflow-wrap: normal; overflow: auto; padding: var(--su12); vertical-align: baseline; width: auto;"><span style="font-family: arial; font-size: x-small;">Formatado no site: http://hilite.me/ 14/02/2023.</span></pre><pre class="lang-c s-code-block" style="--_cb-line-numbers-bg: var(--black-050); border-radius: var(--br-md); border: 0px; box-sizing: inherit; color: var(--highlight-color); font-family: var(--ff-mono); font-size: var(--fs-body1); font-stretch: inherit; font-variant-east-asian: inherit; font-variant-numeric: inherit; font-weight: 400; line-height: var(--lh-md); margin-bottom: 0px; margin-top: 0px; max-height: 600px; overflow-wrap: normal; overflow: auto; padding: var(--su12); vertical-align: baseline; width: auto;"><span style="font-family: arial; font-size: x-small;"><br /></span></pre><pre class="lang-c s-code-block" style="--_cb-line-numbers-bg: var(--black-050); border-radius: var(--br-md); border: 0px; box-sizing: inherit; color: var(--highlight-color); font-family: var(--ff-mono); font-size: var(--fs-body1); font-stretch: inherit; font-variant-east-asian: inherit; font-variant-numeric: inherit; line-height: var(--lh-md); margin-bottom: 0px; margin-top: 0px; max-height: 600px; overflow-wrap: normal; overflow: auto; padding: var(--su12); vertical-align: baseline; width: auto;"><span style="color: #2b00fe; font-family: arial;">Vídeo</span><span style="font-family: arial;"><span style="color: #2b00fe;"> de demonstração:</span><span style="font-weight: 400;"> </span></span></pre></span></span></h2><div><span style="line-height: 107%;"><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="375" src="https://www.youtube.com/embed/MRpoz4_MunQ" width="578" youtube-src-id="MRpoz4_MunQ"></iframe></div><br /><span style="font-family: arial;"><br /></span></span></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5944573230336506830.post-62845217860356023312022-09-23T08:37:00.003-07:002022-09-23T08:40:11.810-07:00Voltímetro para corrente alternada - Voltimetro AC com PIC<p> Olá, hoje postarei um voltímetro para ler sinais AC usando o microcontrolador PIC16F88, no qual analisa um sinal de corrente alternada no pino RA0 e retorna o valor lido em milivolts na porta serial, atente que na simulação e no protótipo real o valor na função de configuração da serial é diferente.</p><p><span> Este projeto é útil quando se precisa ler o valor de pico da tensão, com alguma pequenas modificações é possível ter uma tensão média(tipo do multímetro) ou o valor de pico (tensão RMS). Para simulação foi usado apenas um gerador de sinal, um osciloscopio e um terminal serial configurado para (19200 de baud rate), no pic a frequência de clock é de 8 mhz (pois está usando o oscilador interno). Este projeto funcionou bem na protoboard e na simulação. Favor clicar na imagem para ver melhor os detalhes da tensão.</span><br /></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsUWjBvE0S-iPKKqOOVuubzbyHYG8jBiK9BEAf8yffuHqRUUAo7mhbJr8Jqq3pUJrjLLWXxy4hMOsgX_oAZpX7LYTfsBeMnMAUUMbml5EyVANAV8qxj6l_L6FLDXIHL52Bz7j5Kwnkt7lqXhYcmcHMCsq1uUWrbyRnPdcp95onDZafTKbvc8Z49135/s1530/leitor_AC.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="558" data-original-width="1530" height="234" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsUWjBvE0S-iPKKqOOVuubzbyHYG8jBiK9BEAf8yffuHqRUUAo7mhbJr8Jqq3pUJrjLLWXxy4hMOsgX_oAZpX7LYTfsBeMnMAUUMbml5EyVANAV8qxj6l_L6FLDXIHL52Bz7j5Kwnkt7lqXhYcmcHMCsq1uUWrbyRnPdcp95onDZafTKbvc8Z49135/w640-h234/leitor_AC.jpg" width="640" /></a></div><br /><span><b><span style="font-size: medium;">O código fonte :</span></b></span><div style="background: rgb(248, 248, 248); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="background-color: white; color: #333333; font-size: 14.85px;"><span style="color: #408080; font-style: italic;">/*</span>
<span style="color: #408080; font-style: italic;"> * Empresa cliente: exemplo_blog</span>
<span style="color: #408080; font-style: italic;"> * Compilador : MPlabXC8</span>
<span style="color: #408080; font-style: italic;"> * Microcontroladores compativeis : 16F88A</span>
<span style="color: #408080; font-style: italic;"> * Autor: Aguivone Moretti Fógia</span>
<span style="color: #408080; font-style: italic;"> * Versão: 1</span>
<span style="color: #408080; font-style: italic;"> * Data : 23_09_2022 -> ler tensao AC</span>
<span style="color: #408080; font-style: italic;"> */</span>
<span style="color: #bc7a00;">#include <stdio.h></span>
<span style="color: #bc7a00;">#include <string.h> </span><span style="color: #408080; font-style: italic;">//para usar funçoes de string deve se adicionar este header</span>
<span style="color: #bc7a00;">#include <stdlib.h></span>
<span style="color: #bc7a00;">#define _XTAL_FREQ 8000000</span>
<span style="color: #bc7a00;">#include <xc.h></span>
<span style="color: #408080; font-style: italic;">/////////////////////////////////////////////////////////configuraçôes//////////////////////////////////////////////////</span>
<span style="color: #bc7a00;">#pragma config FOSC = INTOSCIO </span><span style="color: #408080; font-style: italic;">// Oscillator Selection bits (INTRC oscillator; port I/O function on both RA6/OSC2/CLKO pin and RA7/OSC1/CLKI pin)</span>
<span style="color: #408080; font-style: italic;">//#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) -- cristal de 20mhz</span>
<span style="color: #bc7a00;">#pragma config WDTE = OFF </span><span style="color: #408080; font-style: italic;">// Watchdog Timer Enable bit (WDT habilitado)</span>
<span style="color: #bc7a00;">#pragma config PWRTE = OFF </span><span style="color: #408080; font-style: italic;">// Power-up Timer Enable bit (PWRT enabled)</span>
<span style="color: #bc7a00;">#pragma config MCLRE = OFF </span><span style="color: #408080; font-style: italic;">// RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital I/O, MCLR internally tied to VDD)</span>
<span style="color: #bc7a00;">#pragma config BOREN = OFF </span><span style="color: #408080; font-style: italic;">// Brown-out Detect Enable bit (BOD disabled)</span>
<span style="color: #bc7a00;">#pragma config LVP = OFF </span><span style="color: #408080; font-style: italic;">// Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)</span>
<span style="color: #bc7a00;">#pragma config CPD = OFF </span><span style="color: #408080; font-style: italic;">// Data EE Memory Code Protection bit (proteção da eeprom)</span>
<span style="color: #bc7a00;">#pragma config CP = OFF </span><span style="color: #408080; font-style: italic;">// Flash Program Memory Code Protection bit (proteção do codigo)</span>
<span style="color: #bc7a00;">#define TAM_MAX 10</span><span style="color: #408080; font-style: italic;">//tamanho maximo do vetor de amostragem(numero de pontos)</span>
<span style="color: #bc7a00;">#define RANGE_ADC 10</span><span style="color: #408080; font-style: italic;">//variação maxima permitida (filtro de ruido)</span>
<span style="color: #bc7a00;">#define LED_STATUS RB0</span>
<span style="color: #bc7a00;">#define TEMPO_ENVIO 5000</span><span style="color: #408080; font-style: italic;">//(aprox. 0,5s)tempo para enviar os dados(em tempo de rotina))</span>
<span style="color: #b00040;">int</span> vetor[TAM_MAX<span style="color: #666666;">+1</span>]; <span style="color: #408080; font-style: italic;">//armazena as amostra temporaria</span>
<span style="color: #b00040;">char</span> flag_libera<span style="color: #666666;">=0</span>;
<span style="color: #b00040;">char</span> tempo_media <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: #b00040;">int</span> tempo_de_envio <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: #b00040;">int</span> tensao_pico<span style="color: #666666;">=0</span>;
<span style="color: #408080; font-style: italic;">/////////////////////////////////funçoes usadas pela uart /////////////////////////////////////////////////////////////////</span>
<span style="color: #408080; font-style: italic;">/*datasheet pag 101 - baudrate para 8mhz - high speed</span>
<span style="color: #408080; font-style: italic;"> baud rate desejado - baud rate real - faixa de erro - SPBRG</span>
<span style="color: #408080; font-style: italic;"> 2400 2404 0,16 207</span>
<span style="color: #408080; font-style: italic;"> 9600 9615 0,16 51</span>
<span style="color: #408080; font-style: italic;">19200 19231 0,16 25</span>
<span style="color: #408080; font-style: italic;">28800 29412 2,12 16</span>
<span style="color: #408080; font-style: italic;">38400 38462 0,16 12</span>
<span style="color: #408080; font-style: italic;">57600 55556 3,55 8</span>
<span style="color: #408080; font-style: italic;"> */</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">inicializa_RS232</span>(<span style="color: #b00040;">long</span> velocidade,<span style="color: #b00040;">int</span> modo,<span style="color: #b00040;">char</span> pega_ref)
{<span style="color: #408080; font-style: italic;">////por padrão é usado o modo 8 bits e sem paridade, mas se necessario ajuste aqui a configuração desejada.</span>
<span style="color: #408080; font-style: italic;">//verifique datasheet para ver a porcentagem de erro e se a velocidade é possivel para o cristal utilizado.</span>
RCSTA <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X90;<span style="color: #408080; font-style: italic;">//habilita porta serial,recepção de 8 bit em modo continuo,assincrono.</span>
<span style="color: #b00040;">long</span> valor;
<span style="color: green; font-weight: bold;">if</span>(modo <span style="color: #666666;">==</span> <span style="color: #666666;">1</span>)
{<span style="color: #408080; font-style: italic;">//modo = 1 ,modo alta velocidade</span>
TXSTA <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X24;<span style="color: #408080; font-style: italic;">//8bits/transmissão habilitado/modo assincrono/highspeed</span>
valor <span style="color: #666666;">=</span>(((_XTAL_FREQ<span style="color: #666666;">/</span>velocidade)<span style="color: #666666;">-16</span>)<span style="color: #666666;">/16</span>);<span style="color: #408080; font-style: italic;">//calculo do valor do gerador de baud rate -> 10_06_2022</span>
}
<span style="color: green; font-weight: bold;">else</span>
{<span style="color: #408080; font-style: italic;">//modo = 0 ,modo baixa velocidade</span>
TXSTA <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X20;<span style="color: #408080; font-style: italic;">////8bits/transmissão habilitado/modo assincrono/lowspeed</span>
valor <span style="color: #666666;">=</span>(((_XTAL_FREQ<span style="color: #666666;">/</span>velocidade)<span style="color: #666666;">-64</span>)<span style="color: #666666;">/64</span>);<span style="color: #408080; font-style: italic;">//calculo do valor do gerador de baud rate</span>
}
<span style="color: green; font-weight: bold;">if</span>(pega_ref <span style="color: #666666;">==</span> <span style="color: #666666;">0</span>)
{<span style="color: #408080; font-style: italic;">//valor calculado</span>
SPBRG <span style="color: #666666;">=</span>(<span style="color: #b00040;">int</span>)valor; <span style="color: #408080; font-style: italic;">// veja a pagina 101 do datasheet já tem calculado para 8MHZ</span>
}
<span style="color: green; font-weight: bold;">else</span>
{<span style="color: #408080; font-style: italic;">//valor colocado diretamente</span>
SPBRG <span style="color: #666666;">=</span>(<span style="color: #b00040;">int</span>)velocidade; <span style="color: #408080; font-style: italic;">//coloca valor direto baseado no data sheet </span>
}
RCIE <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;<span style="color: #408080; font-style: italic;">//habilita interrupção de recepção</span>
PEIE <span style="color: #666666;">=1</span>;
TXEN <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>; <span style="color: #408080; font-style: italic;">// habilita o modulo de transmisão</span>
TXIE <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;<span style="color: #408080; font-style: italic;">//deixa interrupção de transmissão desligado(pois corre se o risco de ter uma interrupção escrita e leitura ao mesmo tempo)</span>
}
<span style="color: #408080; font-style: italic;">///////////conversor adc //////////////////////////</span>
<span style="color: #408080; font-style: italic;">// 0 - lê sensor de luz 1 - lê sensor magnetico </span>
<span style="color: #b00040;">int</span> <span style="color: blue;">ler_adc_un</span>(<span style="color: #b00040;">void</span>) <span style="color: #408080; font-style: italic;">//(int sele)</span>
{
<span style="color: #b00040;">int</span> lido_adc;
GIE <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;<span style="color: #408080; font-style: italic;">//para não travar com outra interrupção </span>
ADCON0 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>XC5;<span style="color: #408080; font-style: italic;">//pede nova conversão //AN0</span>
<span style="color: green; font-weight: bold;">while</span> (ADCON0 <span style="color: #666666;">==</span> <span style="color: #666666;">0</span>XC5); <span style="color: #408080; font-style: italic;">//espera finalizar leitura</span>
GIE <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;
lido_adc <span style="color: #666666;">=</span> (ADRESH <span style="color: #666666;"><<</span> <span style="color: #666666;">8</span>) <span style="color: #666666;">|</span> ADRESL; <span style="color: #408080; font-style: italic;">// XXXXXXXXLL </span>
<span style="color: green; font-weight: bold;">return</span>(lido_adc);
}
<span style="color: #b00040;">void</span> interrupt <span style="color: blue;">interrupcao</span>(<span style="color: #b00040;">void</span>)<span style="color: #408080; font-style: italic;">//vetor de interrupção</span>
{
<span style="color: #b00040;">char</span> teste;
<span style="color: green; font-weight: bold;">if</span>(RCIF <span style="color: #666666;">==</span> <span style="color: #666666;">1</span>)
{<span style="color: #408080; font-style: italic;">//interrupção de recepção de dados</span>
<span style="color: #408080; font-style: italic;">//lembrar de por um timeout pra não ficar travado esperando dados</span>
RCIF <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;<span style="color: #408080; font-style: italic;">// limpa flag de interrupção de recepção</span>
teste <span style="color: #666666;">=</span> RCREG;
}
}
<span style="color: #b00040;">void</span> <span style="color: blue;">long_to_char</span>(<span style="color: #b00040;">int</span> valor)
{
<span style="color: #b00040;">char</span> valores[] <span style="color: #666666;">=</span> {<span style="color: #ba2121;">'0'</span>,<span style="color: #ba2121;">'0'</span>,<span style="color: #ba2121;">'0'</span>,<span style="color: #ba2121;">'0'</span>};
<span style="color: green; font-weight: bold;">while</span>(valor<span style="color: #666666;">>=1000</span>)
{
valor <span style="color: #666666;">=</span> valor <span style="color: #666666;">-</span> <span style="color: #666666;">1000</span>;
valores[<span style="color: #666666;">0</span>]<span style="color: #666666;">++</span>;
}
<span style="color: green; font-weight: bold;">while</span>(valor<span style="color: #666666;">>=100</span>)
{
valor <span style="color: #666666;">=</span> valor <span style="color: #666666;">-</span> <span style="color: #666666;">100</span>;
valores[<span style="color: #666666;">1</span>]<span style="color: #666666;">++</span>;
}
<span style="color: green; font-weight: bold;">while</span>(valor<span style="color: #666666;">>=10</span>)
{
valor <span style="color: #666666;">=</span> valor <span style="color: #666666;">-</span> <span style="color: #666666;">10</span>;
valores[<span style="color: #666666;">2</span>]<span style="color: #666666;">++</span>;
}
<span style="color: green; font-weight: bold;">while</span>(valor<span style="color: #666666;">>=1</span>)
{
valor <span style="color: #666666;">=</span> valor <span style="color: #666666;">-</span> <span style="color: #666666;">1</span>;
valores[<span style="color: #666666;">3</span>]<span style="color: #666666;">++</span>;
}
<span style="color: green; font-weight: bold;">for</span>(<span style="color: #b00040;">int</span> indice <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;indice <span style="color: #666666;"><</span> <span style="color: #666666;">4</span>;indice<span style="color: #666666;">++</span>)
{
<span style="color: green; font-weight: bold;">while</span>(TRMT<span style="color: #666666;">==0</span>);<span style="color: #408080; font-style: italic;">//espera enviar caracter, esvaziando o shift register , usando o trmt é mais garantido a entrega </span>
TXREG <span style="color: #666666;">=</span> valores[indice];<span style="color: #408080; font-style: italic;">//no datasheet diz que ao carregar o TXREG limpa o bit TXIF </span>
<span style="color: green; font-weight: bold;">while</span>(TRMT<span style="color: #666666;">==0</span>);
}
TXREG <span style="color: #666666;">=</span><span style="color: #ba2121;">'\r'</span>;<span style="color: #408080; font-style: italic;">//retorna paar inicio de linha </span>
<span style="color: green; font-weight: bold;">while</span>(TRMT<span style="color: #666666;">==0</span>);
TXREG <span style="color: #666666;">=</span><span style="color: #ba2121;">'\n'</span>;<span style="color: #408080; font-style: italic;">//pula linha </span>
<span style="color: green; font-weight: bold;">while</span>(TRMT<span style="color: #666666;">==0</span>);
}
<span style="color: #b00040;">void</span> <span style="color: blue;">rotaciona_vetor</span>()
{ <span style="color: #408080; font-style: italic;">// apenas rotciona e descarta o valor que estava em vetor[0]</span>
<span style="color: #b00040;">int</span> aux<span style="color: #666666;">=0</span>;
<span style="color: green; font-weight: bold;">while</span>(aux<span style="color: #666666;"><</span>TAM_MAX)
{
vetor[aux] <span style="color: #666666;">=</span> vetor[aux<span style="color: #666666;">+1</span>];
aux<span style="color: #666666;">++</span>;
}
}
<span style="color: #b00040;">void</span> <span style="color: blue;">ordena_vetor</span>()
{<span style="color: #408080; font-style: italic;">//coloca em ordem crescente onde o maior valor estará em vetor[tam_max]</span>
<span style="color: #b00040;">int</span> aux<span style="color: #666666;">=0</span>;
<span style="color: #b00040;">int</span> aux2<span style="color: #666666;">=0</span>;
<span style="color: #b00040;">int</span> houve_troca <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;
<span style="color: green; font-weight: bold;">while</span>(houve_troca <span style="color: #666666;">==</span> <span style="color: #666666;">1</span>)
{ <span style="color: #408080; font-style: italic;">///faz isso enquanto houver troca de posição</span>
houve_troca <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
aux<span style="color: #666666;">=0</span>;
<span style="color: green; font-weight: bold;">while</span>(aux<span style="color: #666666;"><</span>TAM_MAX)
{
<span style="color: green; font-weight: bold;">if</span>(vetor[aux] <span style="color: #666666;">></span> vetor[aux<span style="color: #666666;">+1</span>])
{
aux2 <span style="color: #666666;">=</span> vetor[aux<span style="color: #666666;">+1</span>];
vetor[aux <span style="color: #666666;">+</span> <span style="color: #666666;">1</span>] <span style="color: #666666;">=</span> vetor[aux];
vetor[aux] <span style="color: #666666;">=</span> aux2;
houve_troca <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;
}
aux<span style="color: #666666;">++</span>;
}
}
}
<span style="color: #b00040;">int</span> <span style="color: blue;">analisa_sinal</span>(<span style="color: #b00040;">void</span>)
{ <span style="color: #408080; font-style: italic;">//analisa os 4 valores mais altos</span>
<span style="color: #b00040;">int</span> valor_pico <span style="color: #666666;">=</span> <span style="color: #666666;">1050</span>;<span style="color: #408080; font-style: italic;">//valor impossivel -> só pra indicar erro na leitura</span>
ordena_vetor();<span style="color: #408080; font-style: italic;">// coloca em ordem crescente</span>
<span style="color: #408080; font-style: italic;">////verifica se há valores discrepantes//// erro ou ruido</span>
<span style="color: #408080; font-style: italic;">//veja que qualquer coisa dessas possibilidade é interpretado como zero</span>
<span style="color: green; font-weight: bold;">if</span>((vetor[TAM_MAX]<span style="color: #666666;">-</span>vetor[TAM_MAX<span style="color: #666666;">-1</span>])<span style="color: #666666;"><</span> RANGE_ADC) <span style="color: #408080; font-style: italic;">//se a diferença não for maior que o range</span>
{<span style="color: #408080; font-style: italic;">//senão houver valor discrepante está ok</span>
<span style="color: green; font-weight: bold;">if</span>((vetor[TAM_MAX<span style="color: #666666;">-1</span>]<span style="color: #666666;">-</span>vetor[TAM_MAX<span style="color: #666666;">-2</span>])<span style="color: #666666;"><</span> RANGE_ADC) <span style="color: #408080; font-style: italic;">//se a diferença não for maior que o range</span>
{<span style="color: #408080; font-style: italic;">//valida os 3 ultimos</span>
valor_pico <span style="color: #666666;">=</span> (vetor[TAM_MAX]<span style="color: #666666;">+</span>vetor[TAM_MAX<span style="color: #666666;">-1</span>]<span style="color: #666666;">+</span>vetor[TAM_MAX<span style="color: #666666;">-2</span>])<span style="color: #666666;">/3</span>;
}
}
<span style="color: green; font-weight: bold;">else</span>
{
<span style="color: green; font-weight: bold;">if</span>((vetor[TAM_MAX<span style="color: #666666;">-1</span>]<span style="color: #666666;">-</span>vetor[TAM_MAX<span style="color: #666666;">-2</span>])<span style="color: #666666;"><</span> RANGE_ADC) <span style="color: #408080; font-style: italic;">//se a diferença não for maior que o range</span>
{<span style="color: #408080; font-style: italic;">//descarta o maior valor</span>
<span style="color: green; font-weight: bold;">if</span>((vetor[TAM_MAX<span style="color: #666666;">-2</span>]<span style="color: #666666;">-</span>vetor[TAM_MAX<span style="color: #666666;">-3</span>])<span style="color: #666666;"><</span> RANGE_ADC) <span style="color: #408080; font-style: italic;">//se a diferença não for maior que o range</span>
{<span style="color: #408080; font-style: italic;">//valida </span>
valor_pico <span style="color: #666666;">=</span> (vetor[TAM_MAX<span style="color: #666666;">-1</span>]<span style="color: #666666;">+</span>vetor[TAM_MAX<span style="color: #666666;">-2</span>]<span style="color: #666666;">+</span>vetor[TAM_MAX<span style="color: #666666;">-3</span>])<span style="color: #666666;">/3</span>;
}
}
}
<span style="color: green; font-weight: bold;">return</span>(valor_pico);
}
<span style="color: #408080; font-style: italic;">//////////////////////////////////////////////////////Rotina principal///////////////////////////////////////////////////////////////çlj</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">main</span>(<span style="color: #b00040;">void</span>)
{
TRISB <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X04;<span style="color: #408080; font-style: italic;">//configura portB como saida , RB2 é entrada pois é rx 232 e B4 não será usado</span>
TRISA <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>XFF;<span style="color: #408080; font-style: italic;">//configura portA como entrada .só RA4 e RA3 como saida </span>
PORTA <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
PORTB <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
OPTION_REG <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X80; <span style="color: #408080; font-style: italic;">// pull up desabilitados e prescaler para timer 0 - desabilita watchdog</span>
INTCON <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;<span style="color: #408080; font-style: italic;">//desabilita todas as interrupções </span>
CMCON <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X07;<span style="color: #408080; font-style: italic;">//desliga comparadores </span>
OSCTUNE <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X1F; <span style="color: #408080; font-style: italic;">// oscilador vel maxima</span>
OSCCON <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>XFE ; <span style="color: #408080; font-style: italic;">// oscilador interno com frequencia de 8mhz</span>
<span style="color: #408080; font-style: italic;">/// OSCCON = 0X7C ; // oscilador cristal externo 20mhz</span>
<span style="color: #408080; font-style: italic;">/////ADC/////////////</span>
ANSEL <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X01; <span style="color: #408080; font-style: italic;">//portas digitais e AN0 .</span>
ADCON0 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>XC1;<span style="color: #408080; font-style: italic;">//ligado ao oscilador RC - AN0 selecionado e modulo de conversão ligado </span>
ADCON1 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X80;<span style="color: #408080; font-style: italic;">//justificado a direita(assim os 2bits mais significativos fica no primeiro byte) , ref ligado ao vdd</span>
<span style="color: #408080; font-style: italic;">// ADCON1 = 0XC0;//justificado a direita(assim os 2bits mais significativos fica no primeiro byte) , ref ligado ao vdd -> clock dividido por 2</span>
<span style="color: #408080; font-style: italic;">/////////////////</span>
PIE1bits.ADIE <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;<span style="color: #408080; font-style: italic;">// desliga interrupção do conversor ADC </span>
<span style="color: #408080; font-style: italic;">//19200 -> modo de alta velocidade -> creio que o clock não está muito bem calibrado pois não está dando muito certo </span>
<span style="color: #408080; font-style: italic;">//valores validos entre spbrg 27 e 30 -> para 19200 logo valores mais adequados 27 a 29 = mas 28 ficou melhor</span>
inicializa_RS232(<span style="color: #666666;">29</span>,<span style="color: #666666;">1</span>,<span style="color: #666666;">1</span>);<span style="color: #408080; font-style: italic;">//passa valor direto do registrador na placa fisica deve ser 28 ou 29</span>
inicializa_RS232(<span style="color: #666666;">25</span>,<span style="color: #666666;">1</span>,<span style="color: #666666;">1</span>);<span style="color: #408080; font-style: italic;">//passa valor direto do registrador para simular no proteus deve ser 25 </span>
GIE <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;
<span style="color: green; font-weight: bold;">for</span>(;;)
{ <span style="color: #408080; font-style: italic;">// atualiza os vetores </span>
__delay_us(<span style="color: #666666;">100</span>); <span style="color: #408080; font-style: italic;">//para garantir uma leitura estavel 0,4ms</span>
vetor[TAM_MAX] <span style="color: #666666;">=</span> ler_adc_un();
<span style="color: green; font-weight: bold;">if</span>((flag_libera <span style="color: #666666;">==</span> <span style="color: #666666;">1</span>))
{
<span style="color: green; font-weight: bold;">if</span>(vetor[TAM_MAX]<span style="color: #666666;"><</span>vetor[<span style="color: #666666;">0</span>])<span style="color: #408080; font-style: italic;">//localizou a regiao de pico de tensão</span>
{
<span style="color: green; font-weight: bold;">if</span>(analisa_sinal() <span style="color: #666666;"><</span> <span style="color: #666666;">1025</span>) <span style="color: #408080; font-style: italic;">//busca valor de pico valido</span>
{
tensao_pico <span style="color: #666666;">=</span> analisa_sinal(); <span style="color: #408080; font-style: italic;">//valor instantaneo</span>
}
flag_libera<span style="color: #666666;">=0</span>;
}
}
<span style="color: green; font-weight: bold;">else</span>
{<span style="color: #408080; font-style: italic;">//flag de liberação desligado</span>
<span style="color: green; font-weight: bold;">if</span>(vetor[TAM_MAX] <span style="color: #666666;">></span> vetor[<span style="color: #666666;">0</span>])<span style="color: #408080; font-style: italic;">//localizou o inicio de subida</span>
{
flag_libera<span style="color: #666666;">=1</span>;<span style="color: #408080; font-style: italic;">//vasculha o ponto de subida</span>
}
}
rotaciona_vetor();
<span style="color: green; font-weight: bold;">if</span>(tempo_de_envio <span style="color: #666666;">>=</span> TEMPO_ENVIO)
{
<span style="color: #b00040;">int</span> aux<span style="color: #666666;">=0</span>;
aux <span style="color: #666666;">=</span> (tensao_pico<span style="color: #666666;">*49</span>)<span style="color: #666666;">/10</span>;
long_to_char(aux); <span style="color: #408080; font-style: italic;">// valor medio </span>
LED_STATUS <span style="color: #666666;">=</span> <span style="color: #666666;">~</span>LED_STATUS;<span style="color: #408080; font-style: italic;">//pisca a cada envio</span>
tempo_de_envio <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
}
tempo_de_envio<span style="color: #666666;">++</span>;
}
}
</span></pre></div><span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="background-color: white; color: #333333; font-size: 14.85px;">
</span><p></p><p><span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="background-color: white; color: #333333; font-size: 14.85px;">Formatado no site </span><span><a href="http://hilite.me/">http://hilite.me/</a> </span><span face="Arial, Tahoma, Helvetica, FreeSans, sans-serif" style="background-color: white; color: #333333; font-size: 14.85px;">no dia 23/09/2022.</span></p><p><br /></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5944573230336506830.post-47347545092757818482022-07-22T10:44:00.002-07:002022-07-22T10:46:16.951-07:00Comunicação serial com o microcontrolador C8051F832<p> Exemplo de como fazer uma comunicação serial usando o microcontrolador C8051F832 de 16 pinos. <!--HTML generated using hilite.me-->Basta colocar os caractere precedido por "*" para indicar fim de recepção.</p><div style="background: rgb(248, 248, 248); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #408080; font-style: italic;">/*</span>
<span style="color: #408080; font-style: italic;"> * </span>
<span style="color: #408080; font-style: italic;"> * Compilador : Simplicity studio</span>
<span style="color: #408080; font-style: italic;"> * Microcontroladores compativeis : C8051F832</span>
<span style="color: #408080; font-style: italic;"> * Autor: Aguivone Moretti Fógia</span>
<span style="color: #408080; font-style: italic;"> * Versão: 1.0</span>
<span style="color: #408080; font-style: italic;"> * Data : 22_07_2022 -> inicio de teste de comunicação serial</span>
<span style="color: #408080; font-style: italic;"> * Descrição:</span>
<span style="color: #408080; font-style: italic;"> * teste de comunicação serial</span>
<span style="color: #408080; font-style: italic;"> * Basta envia um dado e depois o caracter "*" para indicar fim de recepção</span>
<span style="color: #408080; font-style: italic;"> * exemplo: teste* ira ter como retorno "TESTE"</span>
<span style="color: #408080; font-style: italic;"> */</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Includes</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #bc7a00;">#include "si_toolchain.h"</span>
<span style="color: #bc7a00;">#include <SI_C8051F800_Defs.h> </span><span style="color: #408080; font-style: italic;">// SFR</span>
<span style="color: #bc7a00;">#include <stdio.h></span>
<span style="color: #bc7a00;">#include <string.h></span>
<span style="color: #bc7a00;">#define SYSCLK 24500000 </span><span style="color: #408080; font-style: italic;">// SYSCLK em hertz usando clock interno</span>
<span style="color: #bc7a00;">#define BAUDRATE 19200 </span><span style="color: #408080; font-style: italic;">// Baud rate em bps</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Function PROTOTYPES</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">SYSCLK_Init</span> (<span style="color: #b00040;">void</span>);
<span style="color: #b00040;">void</span> <span style="color: blue;">UART0_Init</span> (<span style="color: #b00040;">void</span>);
<span style="color: #b00040;">void</span> <span style="color: blue;">PORT_Init</span> (<span style="color: #b00040;">void</span>);
SI_INTERRUPT_PROTO(UART0_ISR, INTERRUPT_UART0);
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// variaveis globais</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #bc7a00;">#define UART_TAM_MAX 64</span>
<span style="color: #b00040;">uint8_t</span> UART_Buffer[UART_TAM_MAX] <span style="color: #666666;">=</span> {<span style="color: #666666;">0</span>};
<span style="color: #b00040;">uint8_t</span> UART_buffer_tamanho <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: #b00040;">uint8_t</span> UART_primeira_entrada <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: #b00040;">uint8_t</span> UART_primeira_saida <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: #b00040;">uint8_t</span> Enviar_dados <span style="color: #666666;">=1</span>;
<span style="color: green; font-weight: bold;">static</span> <span style="color: #b00040;">uint8_t</span> Caracter_temporario;
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// SiLabs_Startup()</span>
<span style="color: #408080; font-style: italic;">// ----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Essa rotina roda sempre primeiro que o rotina main</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">SiLabs_Startup</span> (<span style="color: #b00040;">void</span>)
{
PCA0MD <span style="color: #666666;">&=</span> <span style="color: #666666;">~0x40</span>; <span style="color: #408080; font-style: italic;">// WDTE = 0 (desliga watchdog )</span>
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//Rotina principal</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">main</span> (<span style="color: #b00040;">void</span>)
{
PORT_Init(); <span style="color: #408080; font-style: italic;">// inicializa portas</span>
SYSCLK_Init (); <span style="color: #408080; font-style: italic;">// inicializa oscilador</span>
UART0_Init(); <span style="color: #408080; font-style: italic;">// inicializa UART</span>
IE_EA <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>; <span style="color: #408080; font-style: italic;">// habilita interrupções</span>
UART_Buffer[<span style="color: #666666;">0</span>] <span style="color: #666666;">=</span><span style="color: #ba2121;">'D'</span>;
UART_Buffer[<span style="color: #666666;">1</span>] <span style="color: #666666;">=</span><span style="color: #ba2121;">'I'</span>;
UART_Buffer[<span style="color: #666666;">2</span>] <span style="color: #666666;">=</span><span style="color: #ba2121;">'G'</span>;
UART_Buffer[<span style="color: #666666;">3</span>] <span style="color: #666666;">=</span><span style="color: #ba2121;">'I'</span>;
UART_Buffer[<span style="color: #666666;">4</span>] <span style="color: #666666;">=</span><span style="color: #ba2121;">'T'</span>;
UART_Buffer[<span style="color: #666666;">5</span>] <span style="color: #666666;">=</span><span style="color: #ba2121;">'E'</span>;
UART_Buffer[<span style="color: #666666;">6</span>] <span style="color: #666666;">=</span><span style="color: #ba2121;">' '</span>;
UART_Buffer[<span style="color: #666666;">7</span>] <span style="color: #666666;">=</span><span style="color: #ba2121;">'A'</span>;
UART_Buffer[<span style="color: #666666;">8</span>] <span style="color: #666666;">=</span><span style="color: #ba2121;">'L'</span>;
UART_Buffer[<span style="color: #666666;">9</span>] <span style="color: #666666;">=</span><span style="color: #ba2121;">'G'</span>;
UART_Buffer[<span style="color: #666666;">10</span>] <span style="color: #666666;">=</span><span style="color: #ba2121;">'O'</span>;
UART_Buffer[<span style="color: #666666;">11</span>] <span style="color: #666666;">=</span><span style="color: #ba2121;">'!'</span>;
UART_buffer_tamanho <span style="color: #666666;">=</span> <span style="color: #666666;">12</span>; <span style="color: #408080; font-style: italic;">// atualiza tamanho do buffer</span>
UART_primeira_entrada <span style="color: #666666;">=</span> <span style="color: #666666;">12</span>;
Enviar_dados <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>; <span style="color: #408080; font-style: italic;">// limpa flag</span>
SCON0_TI <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>; <span style="color: #408080; font-style: italic;">// indica pra trasnmitir pois tem dados</span>
<span style="color: green; font-weight: bold;">while</span>(<span style="color: #666666;">1</span>)
{
<span style="color: #408080; font-style: italic;">// se houver dados recebido será enviado</span>
<span style="color: green; font-weight: bold;">if</span>((Enviar_dados <span style="color: #666666;">==</span> <span style="color: #666666;">1</span>) <span style="color: #666666;">&&</span> (UART_buffer_tamanho <span style="color: #666666;">!=</span> <span style="color: #666666;">0</span>) <span style="color: #666666;">&&</span> (Caracter_temporario <span style="color: #666666;">==</span> <span style="color: #ba2121;">'*'</span>))<span style="color: #408080; font-style: italic;">//tx pronto /buffer cheio / finalizador de pacote</span>
{
Enviar_dados <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>; <span style="color: #408080; font-style: italic;">// limpa flag</span>
SCON0_TI <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>; <span style="color: #408080; font-style: italic;">// indica pra trasnmitir pois tem dados</span>
}
}
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Initialization Subroutines</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// PORT_Init</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// Return Value : None</span>
<span style="color: #408080; font-style: italic;">// Parameters : None</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// Configure the Crossbar and GPIO ports.</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// P0.4 digital push-pull UART TX = como saida</span>
<span style="color: #408080; font-style: italic;">// P0.5 digital open-drain UART RX = como entrada</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">PORT_Init</span> (<span style="color: #b00040;">void</span>)
{
P0MDOUT <span style="color: #666666;">|=</span> <span style="color: #666666;">0x10</span>; <span style="color: #408080; font-style: italic;">// Enable UTX as push-pull output</span>
XBR0 <span style="color: #666666;">=</span> <span style="color: #666666;">0x01</span>; <span style="color: #408080; font-style: italic;">// Enable UART on P0.4(TX) and P0.5(RX)</span>
XBR1 <span style="color: #666666;">=</span> <span style="color: #666666;">0x40</span>; <span style="color: #408080; font-style: italic;">// Enable crossbar and weak pull-ups</span>
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// SYSCLK_Init</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// Return Value : None</span>
<span style="color: #408080; font-style: italic;">// Parameters : None</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// This routine initializes the system clock to use the internal precision</span>
<span style="color: #408080; font-style: italic;">// oscillator at its maximum frequency and enables the missing clock</span>
<span style="color: #408080; font-style: italic;">// detector.</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">SYSCLK_Init</span> (<span style="color: #b00040;">void</span>)
{
OSCICN <span style="color: #666666;">|=</span> <span style="color: #666666;">0x83</span>; <span style="color: #408080; font-style: italic;">// Enable the precision internal osc.</span>
RSTSRC <span style="color: #666666;">=</span> <span style="color: #666666;">0x06</span>; <span style="color: #408080; font-style: italic;">// habilita detector de falta de clock e</span>
<span style="color: #408080; font-style: italic;">// deixa monitor de VDD habilitado.</span>
CLKSEL <span style="color: #666666;">=</span> <span style="color: #666666;">0x00</span>; <span style="color: #408080; font-style: italic;">// seleciona a precisão interna.</span>
<span style="color: #408080; font-style: italic;">// clock sem divisão</span>
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// UART0_Init</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// Return Value : None</span>
<span style="color: #408080; font-style: italic;">// Parameters : None</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// Configure the UART0 using Timer1, for <BAUDRATE> and 8-N-1.</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">UART0_Init</span> (<span style="color: #b00040;">void</span>)
{
SCON0 <span style="color: #666666;">=</span> <span style="color: #666666;">0x10</span>; <span style="color: #408080; font-style: italic;">// SCON0: 8-bit variable bit rate</span>
<span style="color: #408080; font-style: italic;">// level of STOP bit is ignored</span>
<span style="color: #408080; font-style: italic;">// RX enabled</span>
<span style="color: #408080; font-style: italic;">// ninth bits are zeros</span>
<span style="color: #408080; font-style: italic;">// clear RI0 and TI0 bits</span>
<span style="border: 1px solid rgb(255, 0, 0);">#</span><span style="color: green; font-weight: bold;">if</span> (SYSCLK<span style="color: #666666;">/</span>BAUDRATE<span style="color: #666666;">/2/256</span> <span style="color: #666666;"><</span> <span style="color: #666666;">1</span>)
TH1 <span style="color: #666666;">=</span> <span style="color: #666666;">-</span>(SYSCLK<span style="color: #666666;">/</span>BAUDRATE<span style="color: #666666;">/2</span>);
CKCON <span style="color: #666666;">&=</span> <span style="color: #666666;">~0x0B</span>; <span style="color: #408080; font-style: italic;">// T1M = 1; SCA1:0 = xx</span>
CKCON <span style="color: #666666;">|=</span> <span style="color: #666666;">0x08</span>;
<span style="border: 1px solid rgb(255, 0, 0);">#</span>elif (SYSCLK<span style="color: #666666;">/</span>BAUDRATE<span style="color: #666666;">/2/256</span> <span style="color: #666666;"><</span> <span style="color: #666666;">4</span>)
TH1 <span style="color: #666666;">=</span> <span style="color: #666666;">-</span>(SYSCLK<span style="color: #666666;">/</span>BAUDRATE<span style="color: #666666;">/2/4</span>);
CKCON <span style="color: #666666;">&=</span> <span style="color: #666666;">~0x0B</span>; <span style="color: #408080; font-style: italic;">// T1M = 0; SCA1:0 = 01</span>
CKCON <span style="color: #666666;">|=</span> <span style="color: #666666;">0x01</span>;
<span style="border: 1px solid rgb(255, 0, 0);">#</span>elif (SYSCLK<span style="color: #666666;">/</span>BAUDRATE<span style="color: #666666;">/2/256</span> <span style="color: #666666;"><</span> <span style="color: #666666;">12</span>)
TH1 <span style="color: #666666;">=</span> <span style="color: #666666;">-</span>(SYSCLK<span style="color: #666666;">/</span>BAUDRATE<span style="color: #666666;">/2/12</span>);
CKCON <span style="color: #666666;">&=</span> <span style="color: #666666;">~0x0B</span>; <span style="color: #408080; font-style: italic;">// T1M = 0; SCA1:0 = 00</span>
<span style="border: 1px solid rgb(255, 0, 0);">#</span><span style="color: green; font-weight: bold;">else</span>
TH1 <span style="color: #666666;">=</span> <span style="color: #666666;">-</span>(SYSCLK<span style="color: #666666;">/</span>BAUDRATE<span style="color: #666666;">/2/48</span>);
CKCON <span style="color: #666666;">&=</span> <span style="color: #666666;">~0x0B</span>; <span style="color: #408080; font-style: italic;">// T1M = 0; SCA1:0 = 10</span>
CKCON <span style="color: #666666;">|=</span> <span style="color: #666666;">0x02</span>;
<span style="border: 1px solid rgb(255, 0, 0);">#</span>endif
TL1 <span style="color: #666666;">=</span> TH1; <span style="color: #408080; font-style: italic;">// Initialize Timer1</span>
TMOD <span style="color: #666666;">&=</span> <span style="color: #666666;">~0xf0</span>; <span style="color: #408080; font-style: italic;">// TMOD: timer 1 in 8-bit autoreload</span>
TMOD <span style="color: #666666;">|=</span> <span style="color: #666666;">0x20</span>;
TCON_TR1 <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>; <span style="color: #408080; font-style: italic;">// START Timer1</span>
Enviar_dados <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>; <span style="color: #408080; font-style: italic;">// Flag showing that UART can transmit</span>
IP <span style="color: #666666;">|=</span> <span style="color: #666666;">0x10</span>; <span style="color: #408080; font-style: italic;">// Make UART high priority</span>
IE_ES0 <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>; <span style="color: #408080; font-style: italic;">// Enable UART0 interrupts</span>
SCON0_TI <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Interrupt Service Routines</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// UART0_Interrupt</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// This routine is invoked whenever a character is entered or displayed on the</span>
<span style="color: #408080; font-style: italic;">// Hyperterminal.</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
SI_INTERRUPT(UART0_ISR, UART0_IRQn)
{
<span style="color: green; font-weight: bold;">if</span> (SCON0_RI <span style="color: #666666;">==</span> <span style="color: #666666;">1</span>)
{
<span style="color: green; font-weight: bold;">if</span>( UART_buffer_tamanho <span style="color: #666666;">==</span> <span style="color: #666666;">0</span>)
{<span style="color: #408080; font-style: italic;">// tem dados</span>
UART_primeira_entrada <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
}
SCON0_RI <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>; <span style="color: #408080; font-style: italic;">// limpa flag de interrupção de recepção</span>
Caracter_temporario <span style="color: #666666;">=</span> SBUF0; <span style="color: #408080; font-style: italic;">// Lê o caracter que está no buffer</span>
<span style="color: green; font-weight: bold;">if</span> (UART_buffer_tamanho <span style="color: #666666;"><</span> UART_TAM_MAX)
{
UART_Buffer[UART_primeira_entrada] <span style="color: #666666;">=</span> Caracter_temporario; <span style="color: #408080; font-style: italic;">// coloca no buffer para transmitir</span>
UART_buffer_tamanho<span style="color: #666666;">++</span>; <span style="color: #408080; font-style: italic;">// atualiza tamanho do buffer</span>
UART_primeira_entrada<span style="color: #666666;">++</span>; <span style="color: #408080; font-style: italic;">// atualiza contagem</span>
}
}
<span style="color: green; font-weight: bold;">if</span> (SCON0_TI <span style="color: #666666;">==</span> <span style="color: #666666;">1</span>) <span style="color: #408080; font-style: italic;">// verifica se houve interrupção de transmissão</span>
{
SCON0_TI <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>; <span style="color: #408080; font-style: italic;">// limpa flag</span>
<span style="color: green; font-weight: bold;">if</span> (UART_buffer_tamanho <span style="color: #666666;">!=</span> <span style="color: #666666;">0</span>) <span style="color: #408080; font-style: italic;">// se tiver dados a enviar envia</span>
{
<span style="color: #408080; font-style: italic;">//tem um pacote valido</span>
<span style="color: green; font-weight: bold;">if</span> ( UART_buffer_tamanho <span style="color: #666666;">==</span> UART_primeira_entrada ) {
UART_primeira_saida <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>; }
<span style="color: #408080; font-style: italic;">// armazena informação em Caracter_temporario</span>
Caracter_temporario <span style="color: #666666;">=</span> UART_Buffer[UART_primeira_saida];
<span style="color: green; font-weight: bold;">if</span> ((Caracter_temporario <span style="color: #666666;">>=</span> <span style="color: #666666;">0x61</span>) <span style="color: #666666;">&&</span> (Caracter_temporario <span style="color: #666666;"><=</span> <span style="color: #666666;">0x7A</span>)) { <span style="color: #408080; font-style: italic;">// se não tiver em caixa alta(maiuscula) passa para caixa alta.</span>
Caracter_temporario <span style="color: #666666;">-=</span> <span style="color: #666666;">32</span>; }
SBUF0 <span style="color: #666666;">=</span> Caracter_temporario; <span style="color: #408080; font-style: italic;">// coloca no registrador de transmissão de dados</span>
UART_primeira_saida<span style="color: #666666;">++</span>; <span style="color: #408080; font-style: italic;">// atualiza contagem</span>
UART_buffer_tamanho<span style="color: #666666;">--</span>; <span style="color: #408080; font-style: italic;">// decrementa o tamanho</span>
}
<span style="color: green; font-weight: bold;">else</span>
{
UART_buffer_tamanho <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>; <span style="color: #408080; font-style: italic;">// zera contagem</span>
Enviar_dados <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>; <span style="color: #408080; font-style: italic;">// indica que dados foram enviado</span>
}
}
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// End Of File</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
</pre></div>
<p></p><p>Formato no site http://hilite.me/ no dia 22/07/2022.</p>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5944573230336506830.post-83089125250475309642021-10-14T05:47:00.004-07:002021-10-14T05:47:42.060-07:00Acessando a memoria flash(ROM) do C8051F380 / C8051F382 usando o Simplicity Studio .<p style="text-align: center;">ACESSANDO A MEMÓRIA ROM(flash) DO C8051F380 / C8051F382 </p><p><br /></p><p style="text-align: justify;"> Olá, bom dia atualmente a maioria dos microcontroladores tem uma memória rom interna. Porém ao trabalhar com o C8051F382 percebi que não tem! isso me causou um certo desconforto. buscando por uma solução observei que é possível usar a memoria flash como se fosse uma memoria ROM.</p><p style="text-align: justify;"> Porém o uso da flash apresenta algumas características relevantes, como o fato de só poder apagar blocos de memorias(512 bytes por vez) em vez de uma só posição, outro problema é que para escrever numa posição obrigatoriamente vc deve apagar aquele bloco de memoria, ou seja, supondo que eu queira escrever na posição 1024, precisarei apagar o bloco de memoria que vai de 512 a 1024, o que pode ser desastroso se não avaliar bem onde se vai mexer pois corre o risco de apagar trechos de memorias que fazem parte do programa principal, uma recomendação e dar uma olhada nos arquivos ".list" ,gerado após compilar o código fonte, para ver como esta a localização da áreas usadas.</p><p style="text-align: justify;"> O motivo de obrigatoriamente ter que apagar a memoria flash antes de escrever um novo caracteres é devido ao fato de que quando se trabalha na flash para escrever só aceita escrever "0" nas posições, isso se deve a arquitetura como foi projetado, descobri isso fazendo alguns testes aqui, ou seja supondo que eu queira escrever em hexadecimal o valor "0X11" numa posição, e então eu decida escrever o valor "0X08" , o esperado era ler "0X08" porem isso não acontece e é lido "0X00" ou seja onde é zero ele coloca mas onde é 1 não é colocado, descobri isso num código em assembly dai com esse entendimento apliquei ao código que eu fiz em C.</p><p style="text-align: justify;"> Veja que é possível depois de apagado o bloco da memoria ir escrevendo nas posições, porém se precisar alterar valores já gravados, terá que apagar o bloco de memoria de 512 bytes, apesar de ser uma característica de alguns microcontroladores da Silicon Labs, pode-se recorrer também para o uso de uma memoria externa .</p><p style="text-align: justify;"> Uma vez explicado os risco e a limitação de hardware podemos agora passar para o código fonte. Neste código são utilizados 2 leds, um para indicar processamento e outro pra indicar que houve uma gravação num trecho de memória, assim quando ligar pela primeira vez o led não acende e a partir da segunda vez ficara acesso indicando uma leitura valida na memória, apesar do código ser simples é uma mão na roda pra que está passando por este problema. Aqui está usando o PORT P0.</p><p><span style="font-size: large;">O código fonte :</span></p><!--HTML generated using hilite.me--><div style="background: rgb(248, 248, 248); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #408080; font-style: italic;">// Target: C8051F382</span>
<span style="color: #408080; font-style: italic;">// Tool chain: Simplicity Studio / Keil C51 9.51</span>
<span style="color: #408080; font-style: italic;">// Command Line: None</span>
<span style="color: #408080; font-style: italic;">// Autor: Aguivone Moretti Fogia</span>
<span style="color: #408080; font-style: italic;">// Data: 14/10/2021</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">//exemplo de como usar a memoria flash como uma memoria ROM, apesar de não ser muito bom essa ideia pois</span>
<span style="color: #408080; font-style: italic;">//caso ocorra um ruido ele pode alterar outras areas de memoria.</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Includes</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #bc7a00;">#include <SI_C8051F380_Register_Enums.h></span>
<span style="color: #bc7a00;">#include "F380_FlashPrimitives.h"</span>
<span style="color: #bc7a00;">#include "F380_FlashUtils.h"</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Global Constants</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #bc7a00;">#define SYSCLK 12000000 </span><span style="color: #408080; font-style: italic;">// Internal oscillator frequency in Hz</span>
<span style="color: #408080; font-style: italic;">//leds vermelho e sinal de saida</span>
SI_SBIT(LED_gravado, SFR_P0, <span style="color: #666666;">0</span>); <span style="color: #408080; font-style: italic;">// LED='0' Ligado</span>
SI_SBIT(LED_pisca, SFR_P0, <span style="color: #666666;">1</span>); <span style="color: #408080; font-style: italic;">// LED='1' Desligado</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Function Prototypes</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
SI_INTERRUPT_PROTO(PCA0_ISR, PCA0_IRQn);
<span style="color: #b00040;">void</span> <span style="color: blue;">OSCILLATOR_Init</span> (<span style="color: #b00040;">void</span>);
<span style="color: #b00040;">void</span> <span style="color: blue;">PORT_Init</span> (<span style="color: #b00040;">void</span>);
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// SiLabs_Startup() Routine</span>
<span style="color: #408080; font-style: italic;">// ----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// This function is called immediately after reset, before the initialization</span>
<span style="color: #408080; font-style: italic;">// code is run in SILABS_STARTUP.A51 (which runs before main() ). This is a</span>
<span style="color: #408080; font-style: italic;">// useful place to disable the watchdog timer, which is enable by default</span>
<span style="color: #408080; font-style: italic;">// and may trigger before main() in some instances.</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">SiLabs_Startup</span> (<span style="color: #b00040;">void</span>)
{
PCA0MD <span style="color: #666666;">=</span> <span style="color: #666666;">0x00</span>; <span style="color: #408080; font-style: italic;">// Disable watchdog timer</span>
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// main() Routine</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">main</span> (<span style="color: #b00040;">void</span>)
{
<span style="color: #b00040;">uint16_t</span> LOOP;
<span style="color: #b00040;">uint16_t</span> LOOP_max <span style="color: #666666;">=65000</span>;
PORT_Init (); <span style="color: #408080; font-style: italic;">// Initialize crossbar and GPIO</span>
OSCILLATOR_Init (); <span style="color: #408080; font-style: italic;">// Initialize oscillator</span>
LOOP <span style="color: #666666;">=0</span>;
IE_EA <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: green; font-weight: bold;">if</span>(FLASH_ByteRead(<span style="color: #666666;">0x5FFE</span>)<span style="color: #666666;">==</span> <span style="color: #666666;">0x12</span>) <span style="color: #408080; font-style: italic;">//olhe o datasheet para escolher um local de memoria existente,se for inexistente ele pode travar.</span>
{
LED_gravado<span style="color: #666666;">=0</span>; <span style="color: #408080; font-style: italic;">//liga led indicando que posicão da memoria foi gravada</span>
}
<span style="color: green; font-weight: bold;">else</span>
{
LED_gravado<span style="color: #666666;">=1</span>; <span style="color: #408080; font-style: italic;">//desliga led</span>
FLASH_PageErase(<span style="color: #666666;">0x5FFE</span>);<span style="color: #408080; font-style: italic;">//apaga bloco de 512bytes por vez (setando tudo para 1)</span>
<span style="color: #408080; font-style: italic;">// escreve valor na mmemoria - sempre deve apagar a memoria pois ele so escreve zero</span>
<span style="color: #408080; font-style: italic;">//é uma limitação do hardware.</span>
FLASH_ByteWrite(<span style="color: #666666;">0x5FFE</span>, <span style="color: #666666;">0x12</span>); <span style="color: #408080; font-style: italic;">//grava 0X12H na memoria</span>
<span style="color: #408080; font-style: italic;">//na proxima vez que ligar já busca na memoria este valor</span>
}
<span style="color: green; font-weight: bold;">while</span> (<span style="color: #666666;">1</span>)
{<span style="color: #408080; font-style: italic;">//pisca led</span>
LOOP<span style="color: #666666;">++</span>;
<span style="color: green; font-weight: bold;">if</span>(LOOP<span style="color: #666666;">></span>LOOP_max)
{
LED_pisca<span style="color: #666666;">=0</span>; <span style="color: #408080; font-style: italic;">//liga led (pois esta ligado ao vcc)</span>
LOOP<span style="color: #666666;">=0</span>;
}
<span style="color: green; font-weight: bold;">if</span>(LOOP <span style="color: #666666;">==</span>(LOOP_max<span style="color: #666666;">/2</span>))
{
LED_pisca<span style="color: #666666;">=1</span>; <span style="color: #408080; font-style: italic;">//desliga led</span>
}
}
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// OSCILLATOR_Init</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// Return Value : None</span>
<span style="color: #408080; font-style: italic;">// Parameters : None</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// This function initializes the system clock to use the internal oscillator</span>
<span style="color: #408080; font-style: italic;">// at 12 MHz.</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">OSCILLATOR_Init</span> (<span style="color: #b00040;">void</span>)
{
OSCICN <span style="color: #666666;">=</span> <span style="color: #666666;">0x83</span>; <span style="color: #408080; font-style: italic;">// Set internal oscillator to run (desabilitou osc interno)</span>
<span style="color: #408080; font-style: italic;">// at its maximum frequency(pois setou os 2 ultimos bit)</span>
CLKSEL <span style="color: #666666;">=</span> <span style="color: #666666;">0x00</span>; <span style="color: #408080; font-style: italic;">// Select the internal osc. as (SYSCLK/4)</span>
<span style="color: #408080; font-style: italic;">// the SYSCLK source</span>
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// PORT_Init</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// Return Value : None</span>
<span style="color: #408080; font-style: italic;">// Parameters : None</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// This function configures the crossbar and GPIO ports.</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// P0.0 digital open-drain PCA0 CEX0</span>
<span style="color: #408080; font-style: italic;">// P0.1 digital push-pull</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">PORT_Init</span> (<span style="color: #b00040;">void</span>)
{
OSCICN <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X81; <span style="color: #408080; font-style: italic;">// IHFOsc Enable, OpcDiv:3MHz</span>
CLKMUL <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>XC0; <span style="color: #408080; font-style: italic;">// talvez nem precise neste microcontrolador -> habilita e inicializa pll</span>
CLKSEL <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X03; <span style="color: #408080; font-style: italic;">// SYSCLK derived from the Internal High-Frequency Oscillator.</span>
PFE0CN <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X20; <span style="color: #408080; font-style: italic;">//(para High Speed) Prefetch Engine Control,otimiza tempo de execução lendo 2 bytes de execução por vez</span>
<span style="color: #408080; font-style: italic;">/* FLSCL.FOSE(7) = 0 for < 10MHz and 1 for SYSCLK > 10MHz</span>
<span style="color: #408080; font-style: italic;"> FLSCL.FLRT(4) = 0 for < 25MHz and 1 for SYSCLK > 25MHz */</span>
FLSCL <span style="color: #666666;">=</span> <span style="color: #666666;">0x90</span>;
CKCON <span style="color: #666666;">=</span> <span style="color: #666666;">0x30</span>;
SPI0CN <span style="color: #666666;">=</span> <span style="color: #666666;">0x02</span>; <span style="color: #408080; font-style: italic;">//Select Mode 3-Wire pra liberar pino NSS</span>
P0MDIN <span style="color: #666666;">=</span> <span style="color: #666666;">0xFF</span>; <span style="color: #408080; font-style: italic;">// are digital</span>
P1MDIN <span style="color: #666666;">=</span> <span style="color: #666666;">0xFF</span>; <span style="color: #408080; font-style: italic;">// are digital</span>
P2MDIN <span style="color: #666666;">=</span> <span style="color: #666666;">0xFF</span>; <span style="color: #408080; font-style: italic;">// are digital</span>
P3MDIN <span style="color: #666666;">=</span> <span style="color: #666666;">0xFF</span>; <span style="color: #408080; font-style: italic;">// are digital</span>
P4MDIN <span style="color: #666666;">=</span> <span style="color: #666666;">0xFF</span>; <span style="color: #408080; font-style: italic;">// are digital</span>
P0MDOUT <span style="color: #666666;">=</span> <span style="color: #666666;">0x10</span>; <span style="color: #408080; font-style: italic;">// enable Switches as open-drain</span>
P1MDOUT <span style="color: #666666;">=</span> <span style="color: #666666;">0x00</span>; <span style="color: #408080; font-style: italic;">// enable Switches as open-drain</span>
P2MDOUT <span style="color: #666666;">=</span> <span style="color: #666666;">0x00</span>; <span style="color: #408080; font-style: italic;">// enable Switches as open-drain</span>
P3MDOUT <span style="color: #666666;">=</span> <span style="color: #666666;">0x00</span>; <span style="color: #408080; font-style: italic;">// enable Switches as open-drain</span>
P4MDOUT <span style="color: #666666;">=</span> <span style="color: #666666;">0x04</span>; <span style="color: #408080; font-style: italic;">// enable Switches as open-drain</span>
P0SKIP <span style="color: #666666;">=</span> <span style="color: #666666;">0xCF</span>; <span style="color: #408080; font-style: italic;">// TXeRX precisa do Skip pra funcionar</span>
P1SKIP <span style="color: #666666;">=</span> <span style="color: #666666;">0xFF</span>;
P2SKIP <span style="color: #666666;">=</span> <span style="color: #666666;">0xFF</span>;
P3SKIP <span style="color: #666666;">=</span> <span style="color: #666666;">0xCF</span>;
XBR0 <span style="color: #666666;">=</span> <span style="color: #666666;">0x01</span>; <span style="color: #408080; font-style: italic;">// CP1AE,CP1E,CP0AE,CP0E,SYSCKE,SMB0E,SPI0E,(UART0E)</span>
XBR2 <span style="color: #666666;">=</span> <span style="color: #666666;">0x00</span>; <span style="color: #408080; font-style: italic;">// RESRV,RSRV,RESRV,RESRV,RESRV,RESRV,SMB1E, UART1E</span>
XBR1 <span style="color: #666666;">=</span> <span style="color: #666666;">0xC2</span>; <span style="color: #408080; font-style: italic;">// WEAKPUD,(XBARE),T1E,T0E,ECIE,(PCA0ME):000:Nenhum,001:CEX0,010:CEX0eCEX1,...</span>
<span style="color: #408080; font-style: italic;">// VDM0CN -> monitor de tensão de reset</span>
VDM0CN <span style="color: #666666;">=</span> <span style="color: #666666;">0x80</span>; <span style="color: #408080; font-style: italic;">//Colocado porque senão da problema na gravacao da flash(já estava isso)</span>
P4 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span> ; <span style="color: #408080; font-style: italic;">//portas de p4 desligadas</span>
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// End Of File</span>
</pre></div>
<p><span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif;">formatado por http://hilite.me/ 14/10/2021</span></p>Unknownnoreply@blogger.com0Goiânia, GO, Brasil-16.6868912 -49.2647943-44.997125036178844 -84.4210443 11.623342636178844 -14.108544299999998tag:blogger.com,1999:blog-5944573230336506830.post-73969120282906148222021-09-07T17:24:00.006-07:002021-10-14T04:52:19.463-07:00Controle remoto via WIFI - nodemcu (ESP8266) - Modo cliente e servidor<p style="text-align: justify;"> Olá pessoal que acompanha este blog!</p><p style="text-align: justify;"><span> Vou demonstrar aqui como fazer um controle remoto de 3 canais usando o modulo wifi ESP8266 pela interface do Arduino, um das placas estará rodando como servidor web e a outra como cliente web. </span></p><p style="text-align: justify;"> Para reduzir o tempo de resposta optei por não envia pagina nenhuma apenas o comando para informar o estado dos 3 botões que foram colocados na placa do nodemcu, por ser muito simples e basico não vou colocar o esquemático apenas a imagem da protoboard, creio que seja o suficiente para que vcs entendam o circuito.</p><p><span></span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdMPi6pUpInYXAthVXOiTVOeN6e5YOhlHE2nZBgoBB_cV89b7UlHU7jnfLEvLGXv80sZf30IHhFywjo89tnmTJg8FTHy6495u2g38Hupa54rLeEpjkfBHoP3e49ilURawH-sFrQAJ3XJg/s1128/WhatsApp+Image+2021-09-07+at+20.41.45+%25281%2529.jpeg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="976" data-original-width="1128" height="277" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdMPi6pUpInYXAthVXOiTVOeN6e5YOhlHE2nZBgoBB_cV89b7UlHU7jnfLEvLGXv80sZf30IHhFywjo89tnmTJg8FTHy6495u2g38Hupa54rLeEpjkfBHoP3e49ilURawH-sFrQAJ3XJg/s320/WhatsApp+Image+2021-09-07+at+20.41.45+%25281%2529.jpeg" width="320" /></a><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzYa0NoB55vQL1RQRQL-ufUR1GtlAhlbSEiw5jur0fA-zFxBGJUacqE0V2Pxp3oG7EGOfd5jPpxlu10phdueaytlGgy9Rx_TCtxorwOwonPmX_ydzfHPAq8859krraF47sA8iEj6k9WNg/s920/WhatsApp+Image+2021-09-07+at+20.41.45.jpeg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="888" data-original-width="920" height="309" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzYa0NoB55vQL1RQRQL-ufUR1GtlAhlbSEiw5jur0fA-zFxBGJUacqE0V2Pxp3oG7EGOfd5jPpxlu10phdueaytlGgy9Rx_TCtxorwOwonPmX_ydzfHPAq8859krraF47sA8iEj6k9WNg/s320/WhatsApp+Image+2021-09-07+at+20.41.45.jpeg" width="320" /></a></div><br /></div><span> A placa é alimentada com 5V da usb ou 5V de uma fonte externa pelo pino Vin e GND, os leds são ligados a resistores de 220R ao GND e aos pinos D1,D2 e D3.Os botões São ligado ao GND e ao pinos D1,D2,D3 diretamente pois não precisam de resistores externos de pull up´s. Coloquei as placas uma ao lado da outra pra facilitar a visualização e o vídeo veja abaixo ( <a href="https://youtu.be/KVtNlUg0EF0">https://youtu.be/KVtNlUg0EF0</a>):</span><p></p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="328" src="https://www.youtube.com/embed/KVtNlUg0EF0" width="394" youtube-src-id="KVtNlUg0EF0"></iframe></div><div class="separator" style="clear: both; text-align: center;"><br /></div><p></p><p><span><span style="font-size: medium;"><b>O código fonte:</b></span></span></p><p><span><span style="font-size: medium;"><b>Código do servidor (lê os botões):</b></span><!--HTML generated using hilite.me--></span></p><div style="background: rgb(248, 248, 248); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span><span style="color: #408080; font-style: italic;">//desenvolvedor: Aguivone M. Fogia</span>
<span style="color: #408080; font-style: italic;">//Data : 07/09/2021 // Deu certo</span>
<span style="color: #408080; font-style: italic;">//Blog: Microcontroladores-C </span>
<span style="color: #408080; font-style: italic;">//exemplo com NodeMCU - modo servidor</span>
<span style="color: #bc7a00;">#include <ESP8266WiFi.h></span>
<span style="color: #bc7a00;">#include <ESP8266WebServer.h></span><span style="color: #408080; font-style: italic;">//caso use o modo servidor</span>
<span style="color: #408080; font-style: italic;">//------------------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// definição dos pinos</span>
<span style="color: #408080; font-style: italic;">//------------------------------------------------------------------------------------</span>
<span style="color: #bc7a00;">#define LED 2 </span><span style="color: #408080; font-style: italic;">// led do modulo wifi</span>
<span style="color: #bc7a00;">#define BOT_1 D1 </span><span style="color: #408080; font-style: italic;">// botão 1</span>
<span style="color: #bc7a00;">#define BOT_2 D2 </span><span style="color: #408080; font-style: italic;">// botão 2</span>
<span style="color: #bc7a00;">#define BOT_3 D3 </span><span style="color: #408080; font-style: italic;">// botão 3</span>
WiFiServer <span style="color: blue;">server</span>(<span style="color: #666666;">80</span>);<span style="color: #408080; font-style: italic;">//usa porta 80</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">setup</span>()
{
pinMode(LED, OUTPUT); <span style="color: #408080; font-style: italic;">// inicializa o led da placa</span>
pinMode(BOT_1, INPUT_PULLUP); <span style="color: #408080; font-style: italic;">// habilita pull up interno do pino</span>
pinMode(BOT_2, INPUT_PULLUP); <span style="color: #408080; font-style: italic;">// habilita pull up interno do pino</span>
pinMode(BOT_3, INPUT_PULLUP); <span style="color: #408080; font-style: italic;">/// habilita pull up interno do pino</span>
setupWiFi();
}
<span style="color: #b00040;">void</span> <span style="color: blue;">loop</span>()
{
<span style="color: #408080; font-style: italic;">// checa se tem algum dispositivo conectado!</span>
WiFiClient client <span style="color: #666666;">=</span> server.available();
<span style="color: green; font-weight: bold;">if</span> (<span style="color: #666666;">!</span>client)
{
digitalWrite(LED, LOW);
delay(<span style="color: #666666;">100</span>);
digitalWrite(LED, HIGH);
delay(<span style="color: #666666;">100</span>); <span style="color: #408080; font-style: italic;">//espera conexão </span>
<span style="color: green; font-weight: bold;">return</span>;
}
<span style="color: #408080; font-style: italic;">// Lê a primeir linha dos dados recebidos pelo pacote ethernet</span>
String req <span style="color: #666666;">=</span> client.readStringUntil(<span style="color: #ba2121;">'\r'</span>);
client.flush();
<span style="color: #408080; font-style: italic;">// prepara pagina ehtenet</span>
String s <span style="color: #666666;">=</span> <span style="color: #ba2121;">"S-"</span>;
<span style="color: green; font-weight: bold;">if</span> (digitalRead(BOT_1) <span style="color: #666666;">==</span> LOW) <span style="color: #408080; font-style: italic;">//botão pressionado</span>
{
s <span style="color: #666666;">+=</span> <span style="color: #ba2121;">"1"</span>;
}
<span style="color: green; font-weight: bold;">else</span>
{
s <span style="color: #666666;">+=</span> <span style="color: #ba2121;">"0"</span>;
}
<span style="color: green; font-weight: bold;">if</span> (digitalRead(BOT_2) <span style="color: #666666;">==</span> LOW) <span style="color: #408080; font-style: italic;">//botão pressionado</span>
{
s <span style="color: #666666;">+=</span> <span style="color: #ba2121;">"1"</span>;
}
<span style="color: green; font-weight: bold;">else</span>
{
s <span style="color: #666666;">+=</span> <span style="color: #ba2121;">"0"</span>;
}
<span style="color: green; font-weight: bold;">if</span> (digitalRead(BOT_3) <span style="color: #666666;">==</span> LOW) <span style="color: #408080; font-style: italic;">//botão pressionado</span>
{
s <span style="color: #666666;">+=</span> <span style="color: #ba2121;">"1"</span>;
}
<span style="color: green; font-weight: bold;">else</span>
{
s <span style="color: #666666;">+=</span> <span style="color: #ba2121;">"0"</span>;
}
s <span style="color: #666666;">+=</span> <span style="color: #ba2121;">"*</span><span style="color: #bb6622; font-weight: bold;">\n</span><span style="color: #ba2121;">"</span>;
<span style="color: #408080; font-style: italic;">// envia dados</span>
client.print(s);
delay(<span style="color: #666666;">100</span>); <span style="color: #408080; font-style: italic;">//tempo de tratamento por parte do cliente</span>
<span style="color: #408080; font-style: italic;">//cliente desconectado</span>
<span style="color: #408080; font-style: italic;">// a cada requisição a pagina é enviada e o cliente é desconectado</span>
}
<span style="color: #b00040;">void</span> <span style="color: blue;">setupWiFi</span>()
{
<span style="color: #408080; font-style: italic;">//////////////////////</span>
<span style="color: #408080; font-style: italic;">// definições da WiFi //</span>
<span style="color: #408080; font-style: italic;">//////////////////////</span>
<span style="color: green; font-weight: bold;">const</span> <span style="color: #b00040;">char</span><span style="color: #666666;">*</span> WiFi_Senha <span style="color: #666666;">=</span> <span style="color: #ba2121;">"123456789"</span>;<span style="color: #408080; font-style: italic;">//senha que você quer usar(deve ser em branco(aberta) ou maior que 8 caráteres,senão não funciona e não troca o nome da wifi)</span>
<span style="color: green; font-weight: bold;">const</span> <span style="color: #b00040;">char</span><span style="color: #666666;">*</span> WiFi_Nome <span style="color: #666666;">=</span> <span style="color: #ba2121;">"MICROCONTROLADORES-C"</span>;<span style="color: #408080; font-style: italic;">//nome que você quer dar a sua rede </span>
IPAddress ip(<span style="color: #666666;">192</span>,<span style="color: #666666;">168</span>,<span style="color: #666666;">50</span>,<span style="color: #666666;">4</span>);<span style="color: #408080; font-style: italic;">//ok</span>
IPAddress gateway(<span style="color: #666666;">192</span>,<span style="color: #666666;">168</span>,<span style="color: #666666;">50</span>,<span style="color: #666666;">1</span>);<span style="color: #408080; font-style: italic;">//ok</span>
IPAddress subnet(<span style="color: #666666;">255</span>,<span style="color: #666666;">255</span>,<span style="color: #666666;">255</span>,<span style="color: #666666;">0</span>);<span style="color: #408080; font-style: italic;">//ok</span>
<span style="color: #408080; font-style: italic;">//////inicializa a wifi////////////////////////////////////////////// </span>
<span style="color: #b00040;">uint8_t</span> mac[WL_MAC_ADDR_LENGTH];
WiFi.softAPmacAddress(mac);<span style="color: #408080; font-style: italic;">//mac qualquer pra testar</span>
WiFi.softAPConfig(ip, gateway, subnet);
WiFi.mode(WIFI_STA);<span style="color: #408080; font-style: italic;">//modo acess point e servidor</span>
<span style="color: #408080; font-style: italic;">// WiFi.mode(WIFI_AP_STA);//modo acess point e servidor</span>
WiFi.softAP(WiFi_Nome, WiFi_Senha);
WiFi.begin();
server.begin();
}
</span></pre></div><span>
</span><p></p><p><b style="font-size: large;">Código do cliente(aciona os leds):</b></p><!--HTML generated using hilite.me--><div style="background: rgb(248, 248, 248); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #408080; font-style: italic;">//desenvolvedor: Aguivone M. Fogia</span>
<span style="color: #408080; font-style: italic;">//Data : 07/09/2021 // Deu certo</span>
<span style="color: #408080; font-style: italic;">//Blog: Microcontroladores-C </span>
<span style="color: #408080; font-style: italic;">//exemplo com NodeMCU - modo cliente</span>
<span style="color: #bc7a00;">#include <ESP8266WiFi.h></span>
<span style="color: #bc7a00;">#define LED 2 </span><span style="color: #408080; font-style: italic;">// led do modulo wifi</span>
<span style="color: #bc7a00;">#define LED1 D1 </span>
<span style="color: #bc7a00;">#define LED2 D2 </span>
<span style="color: #bc7a00;">#define LED3 D3 </span>
<span style="color: #b00040;">char</span> nome_wifi[] <span style="color: #666666;">=</span> <span style="color: #ba2121;">"MICROCONTROLADORES-C"</span>; <span style="color: #408080; font-style: italic;">// nome da rede wifi</span>
<span style="color: #b00040;">char</span> senha[] <span style="color: #666666;">=</span> <span style="color: #ba2121;">"123456789"</span>; <span style="color: #408080; font-style: italic;">// senha deve ter no minimo 8 caracteres </span>
<span style="color: green; font-weight: bold;">const</span> <span style="color: #b00040;">char</span><span style="color: #666666;">*</span> host <span style="color: #666666;">=</span> <span style="color: #ba2121;">"192.168.50.4"</span>;
<span style="color: #b00040;">void</span> <span style="color: blue;">setup</span>()
{
Serial.begin(<span style="color: #666666;">115200</span>);
pinMode(LED, OUTPUT); <span style="color: #408080; font-style: italic;">// inicializa o led da placa</span>
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
Serial.println();
Serial.printf(<span style="color: #ba2121;">"Connecting to %s "</span>, nome_wifi);
WiFi.begin(nome_wifi,senha);
<span style="color: green; font-weight: bold;">while</span> (WiFi.status() <span style="color: #666666;">!=</span> WL_CONNECTED)
{
digitalWrite(LED, LOW);<span style="color: #408080; font-style: italic;">//sem conexão pisca led da placa do node</span>
delay(<span style="color: #666666;">300</span>);
digitalWrite(LED, HIGH);
delay(<span style="color: #666666;">300</span>); <span style="color: #408080; font-style: italic;">//espera conexão</span>
}
Serial.println(<span style="color: #ba2121;">" connected"</span>);
}
<span style="color: #b00040;">void</span> <span style="color: blue;">loop</span>()
{
WiFiClient client;
Serial.printf(<span style="color: #ba2121;">"</span><span style="color: #bb6622; font-weight: bold;">\n</span><span style="color: #ba2121;">[Connecting to %s ... "</span>, host);
<span style="color: green; font-weight: bold;">if</span> (client.connect(host, <span style="color: #666666;">80</span>))
{
Serial.println(<span style="color: #ba2121;">"connected]"</span>);
Serial.println(<span style="color: #ba2121;">"[Sending a request]"</span>);
client.print(String(<span style="color: #ba2121;">"GET /"</span>) <span style="color: #666666;">+</span> <span style="color: #ba2121;">" HTTP/1.1</span><span style="color: #bb6622; font-weight: bold;">\r\n</span><span style="color: #ba2121;">"</span> <span style="color: #666666;">+</span>
<span style="color: #ba2121;">"Host: "</span> <span style="color: #666666;">+</span> host <span style="color: #666666;">+</span> <span style="color: #ba2121;">"</span><span style="color: #bb6622; font-weight: bold;">\r\n</span><span style="color: #ba2121;">"</span> <span style="color: #666666;">+</span>
<span style="color: #ba2121;">"Connection: close</span><span style="color: #bb6622; font-weight: bold;">\r\n</span><span style="color: #ba2121;">"</span> <span style="color: #666666;">+</span>
<span style="color: #ba2121;">"</span><span style="color: #bb6622; font-weight: bold;">\r\n</span><span style="color: #ba2121;">"</span>
);
Serial.println(<span style="color: #ba2121;">"[Response:]"</span>);
<span style="color: green; font-weight: bold;">while</span> (client.connected() <span style="color: #666666;">||</span> client.available())
{
<span style="color: green; font-weight: bold;">if</span> (client.available())
{
String pacote <span style="color: #666666;">=</span> client.readStringUntil(<span style="color: #ba2121;">'\n'</span>);
Serial.println(pacote);
<span style="color: green; font-weight: bold;">if</span>(pacote.indexOf(<span style="color: #ba2121;">"*"</span>)<span style="color: #666666;">></span> <span style="color: #666666;">0</span>)
{
<span style="color: #b00040;">int</span> pos <span style="color: #666666;">=</span> pacote.indexOf(<span style="color: #ba2121;">"*"</span>);
<span style="color: green; font-weight: bold;">if</span>(pacote[pos<span style="color: #666666;">-1</span>]<span style="color: #666666;">==</span><span style="color: #ba2121;">'1'</span>)
{
digitalWrite(LED1,HIGH);
}
<span style="color: green; font-weight: bold;">else</span>
{
digitalWrite(LED1,LOW);
}
<span style="color: green; font-weight: bold;">if</span>(pacote[pos<span style="color: #666666;">-2</span>]<span style="color: #666666;">==</span><span style="color: #ba2121;">'1'</span>)
{
digitalWrite(LED2,HIGH);
}
<span style="color: green; font-weight: bold;">else</span>
{
digitalWrite(LED2,LOW);
}
<span style="color: green; font-weight: bold;">if</span>(pacote[pos<span style="color: #666666;">-3</span>]<span style="color: #666666;">==</span><span style="color: #ba2121;">'1'</span>)
{
digitalWrite(LED3,HIGH);
}
<span style="color: green; font-weight: bold;">else</span>
{
digitalWrite(LED3,LOW);
}
}
<span style="color: green; font-weight: bold;">else</span>
{
digitalWrite(LED1,LOW);
digitalWrite(LED2,LOW);
digitalWrite(LED3,LOW);
}
client.flush();
}
}
client.stop();
Serial.println(<span style="color: #ba2121;">"</span><span style="color: #bb6622; font-weight: bold;">\n</span><span style="color: #ba2121;">[Disconnected]"</span>);
}
<span style="color: green; font-weight: bold;">else</span>
{
Serial.println(<span style="color: #ba2121;">"connection failed!]"</span>);
}
delay(<span style="color: #666666;">200</span>);
}
</pre></div>
<p><span><span style="font-size: medium;">formatado por http://hilite.me/ 07/09/2021</span></span></p><p><span><span style="font-size: medium;">Até a próxima! Que a paz de cristo esteja com vcs.<br /></span><span><br /></span></span></p>Unknownnoreply@blogger.com0Goiânia, GO, Brasil-16.6868912 -49.2647943-48.706051543450329 -84.4210443 15.332269143450322 -14.108544299999998tag:blogger.com,1999:blog-5944573230336506830.post-76324031592413345862021-09-01T08:55:00.004-07:002021-09-01T08:57:44.700-07:00Voltímetro pela porta serial com 8051F382 - Simplicity Studio<p> Olá, pessoal !</p><p><span> P</span>assando pra deixar mas um exemplo de código, aqui demonstrando como usar o modulo analógico digital do microcontrolador C8051F382, e imprimir isto na porta serial RS232.</p><p><span style="font-size: large;">O código fonte: </span> </p><div style="background: rgb(248, 248, 248); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #408080; font-style: italic;">// Target: C8051F382</span>
<span style="color: #408080; font-style: italic;">// Tool chain: Simplicity Studio / Keil C51 9.51</span>
<span style="color: #408080; font-style: italic;">// Command Line: None</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// Release 1.0</span>
<span style="color: #408080; font-style: italic;">// 12_05_2021</span>
<span style="color: #408080; font-style: italic;">// autor:Aguivone M. Fógia</span>
<span style="color: #408080; font-style: italic;">// exemplo de como usar o ADC( e comunicação serial</span>
<span style="color: #408080; font-style: italic;">// usando o port 2.7</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Includes</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #bc7a00;">#include <SI_C8051F380_Register_Enums.h></span>
<span style="color: #bc7a00;">#include <stdio.h></span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Global CONSTANTS</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #bc7a00;">#define SYSCLK 12000000 </span><span style="color: #408080; font-style: italic;">// SYSCLK frequency in Hz</span>
<span style="color: #bc7a00;">#define BAUDRATE 115200 </span><span style="color: #408080; font-style: italic;">// Baud rate of UART in bps</span>
<span style="color: #bc7a00;">#define INT_DEC 256 </span><span style="color: #408080; font-style: italic;">// Integrate and decimate ratio</span>
<span style="color: #bc7a00;">#define TIMER0_RELOAD_HIGH 0 </span><span style="color: #408080; font-style: italic;">// Timer0 High register</span>
<span style="color: #bc7a00;">#define TIMER0_RELOAD_LOW 255 </span><span style="color: #408080; font-style: italic;">// Timer0 Low register</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Function PROTOTYPES</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
SI_INTERRUPT_PROTO(ADC0_ISR, ADC0EOC_IRQn);
SI_INTERRUPT_PROTO(Timer2_ISR, TIMER2_IRQn);
<span style="color: #b00040;">void</span> <span style="color: blue;">Oscillator_Init</span> (<span style="color: #b00040;">void</span>);
<span style="color: #b00040;">void</span> <span style="color: blue;">Port_Init</span> (<span style="color: #b00040;">void</span>);
<span style="color: #b00040;">void</span> <span style="color: blue;">Timer2_Init</span>(<span style="color: #b00040;">void</span>);
<span style="color: #b00040;">void</span> <span style="color: blue;">ADC0_Init</span>(<span style="color: #b00040;">void</span>);
<span style="color: #b00040;">void</span> <span style="color: blue;">UART0_Init</span> (<span style="color: #b00040;">void</span>);
<span style="color: #b00040;">unsigned</span> <span style="color: #b00040;">char</span> porta4 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>XFF;
<span style="color: #b00040;">void</span> <span style="color: blue;">delay_ms</span>(<span style="color: #b00040;">int16_t</span> ms);
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Global Variables</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">int32_t</span> RESULT; <span style="color: #408080; font-style: italic;">// ADC0 decimated value, one for each</span>
<span style="color: #408080; font-style: italic;">// analog input</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// SiLabs_Startup() Routine</span>
<span style="color: #408080; font-style: italic;">// ----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">SiLabs_Startup</span> (<span style="color: #b00040;">void</span>)
{
PCA0MD <span style="color: #666666;">&=</span> <span style="color: #666666;">~0x40</span>; <span style="color: #408080; font-style: italic;">// WDTE = 0 (clear watchdog timer</span>
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// MAIN Routine</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">main</span> (<span style="color: #b00040;">void</span>)
{
<span style="color: #b00040;">uint32_t</span> measurement;
<span style="color: #b00040;">bool</span> flag;
<span style="color: #408080; font-style: italic;">// enable)</span>
Oscillator_Init (); <span style="color: #408080; font-style: italic;">// Initialize system clock to</span>
<span style="color: #408080; font-style: italic;">// 12MHz</span>
Port_Init (); <span style="color: #408080; font-style: italic;">// Initialize crossbar and GPIO</span>
Timer2_Init(); <span style="color: #408080; font-style: italic;">// Init Timer2 to generate</span>
<span style="color: #408080; font-style: italic;">// overflows to trigger ADC</span>
UART0_Init(); <span style="color: #408080; font-style: italic;">// Initialize UART0 for printf's</span>
ADC0_Init(); <span style="color: #408080; font-style: italic;">// Initialize ADC0</span>
IE_EA <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>; <span style="color: #408080; font-style: italic;">// Enable global interrupts</span>
<span style="color: green; font-weight: bold;">while</span> (<span style="color: #666666;">1</span>)
{
IE_EA <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>; <span style="color: #408080; font-style: italic;">// Disable interrupts</span>
printf(<span style="color: #ba2121;">"</span><span style="color: #bb6622; font-weight: bold;">\f</span><span style="color: #ba2121;">"</span>);
<span style="color: #408080; font-style: italic;">// The 10-bit ADC value is averaged across INT_DEC measurements.</span>
<span style="color: #408080; font-style: italic;">// The result is then stored in RESULT, and is right-justified</span>
<span style="color: #408080; font-style: italic;">// The measured voltage applied to the port pins is then:</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// Vref (mV)</span>
<span style="color: #408080; font-style: italic;">// measurement (mV) = --------------- * Result (bits)</span>
<span style="color: #408080; font-style: italic;">// (2^10)-1 (bits)</span>
measurement <span style="color: #666666;">=</span> RESULT <span style="color: #666666;">*</span> <span style="color: #666666;">4.887</span>;
printf(<span style="color: #ba2121;">"Tensao lida: %4ld mV</span><span style="color: #bb6622; font-weight: bold;">\n</span><span style="color: #ba2121;">"</span>,measurement);
IE_EA <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>; <span style="color: #408080; font-style: italic;">// Re-enable interrupts</span>
delay_ms(<span style="color: #666666;">10</span>);
<span style="color: green; font-weight: bold;">if</span>(flag<span style="color: #666666;">==1</span>)
{
P4 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
flag <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
}
<span style="color: green; font-weight: bold;">else</span>
{
P4 <span style="color: #666666;">=</span> <span style="color: #666666;">255</span>;
flag <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;
}
}
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Initialization Subroutines</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// SYSCLK_Init</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// Return Value : None</span>
<span style="color: #408080; font-style: italic;">// Parameters : None</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// This routine initializes the system clock to use the internal 12MHz</span>
<span style="color: #408080; font-style: italic;">// oscillator as its clock source. Also enables missing clock detector reset.</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">Oscillator_Init</span> (<span style="color: #b00040;">void</span>)
{
OSCICN <span style="color: #666666;">=</span> <span style="color: #666666;">0x83</span>; <span style="color: #408080; font-style: italic;">// Configure internal oscillator for</span>
<span style="color: #408080; font-style: italic;">// its highest frequency</span>
RSTSRC <span style="color: #666666;">=</span> <span style="color: #666666;">0x04</span>; <span style="color: #408080; font-style: italic;">// Enable missing clock detector</span>
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Port_Init</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// Return Value : None</span>
<span style="color: #408080; font-style: italic;">// Parameters : None</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// Configure the Crossbar and GPIO ports.</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// P0.4 - UART TX (push-pull)</span>
<span style="color: #408080; font-style: italic;">// P0.5 - UART RX</span>
<span style="color: #408080; font-style: italic;">// P2.7 - analog input (ADC0)</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">Port_Init</span> (<span style="color: #b00040;">void</span>)
{
P2SKIP <span style="color: #666666;">=</span> <span style="color: #666666;">0x80</span>; <span style="color: #408080; font-style: italic;">// pula a entrada analogica</span>
XBR0 <span style="color: #666666;">=</span> <span style="color: #666666;">0x01</span>; <span style="color: #408080; font-style: italic;">// CP1AE,CP1E,CP0AE,CP0E,SYSCKE,SMB0E,SPI0E,(UART0E)</span>
XBR2 <span style="color: #666666;">=</span> <span style="color: #666666;">0x00</span>; <span style="color: #408080; font-style: italic;">// RESRV,RSRV,RESRV,RESRV,RESRV,RESRV,SMB1E, UART1E</span>
XBR1 <span style="color: #666666;">=</span> <span style="color: #666666;">0xC2</span>; <span style="color: #408080; font-style: italic;">// WEAKPUD,(XBARE),T1E,T0E,ECIE,(PCA0ME):000:Nenhum,001:CEX0,010:CEX0eCEX1,...</span>
VDM0CN <span style="color: #666666;">=</span> <span style="color: #666666;">0x80</span>; <span style="color: #408080; font-style: italic;">// Colocado porque senão da problema na gravacao da flash(já estava isso)</span>
RSTSRC <span style="color: #666666;">=</span> <span style="color: #666666;">0x02</span>; <span style="color: #408080; font-style: italic;">// ativa reset de falha de oscilação.</span>
P0MDOUT <span style="color: #666666;">|=</span> <span style="color: #666666;">0x10</span>; <span style="color: #408080; font-style: italic;">// Enable TX0 as a push-pull output</span>
P1MDOUT <span style="color: #666666;">=</span> <span style="color: #666666;">0x00</span>; <span style="color: #408080; font-style: italic;">// enable Switches as open-drain</span>
P2MDOUT <span style="color: #666666;">=</span> <span style="color: #666666;">0x00</span>; <span style="color: #408080; font-style: italic;">// enable Switches as open-drain</span>
P3MDOUT <span style="color: #666666;">=</span> <span style="color: #666666;">0x00</span>; <span style="color: #408080; font-style: italic;">// enable Switches as open-drain</span>
P4MDOUT <span style="color: #666666;">=</span> <span style="color: #666666;">0x04</span>; <span style="color: #408080; font-style: italic;">// enable Switches as open-drain</span>
<span style="color: #408080; font-style: italic;">//configura portas</span>
P0MDIN <span style="color: #666666;">=</span> <span style="color: #666666;">0xFF</span>; <span style="color: #408080; font-style: italic;">// are digital</span>
P1MDIN <span style="color: #666666;">=</span> <span style="color: #666666;">0xFF</span>; <span style="color: #408080; font-style: italic;">// are digital</span>
P2MDIN <span style="color: #666666;">=</span> <span style="color: #666666;">0x7F</span>; <span style="color: #408080; font-style: italic;">//seta pino P2.7 como entrada analogica</span>
P3MDIN <span style="color: #666666;">=</span> <span style="color: #666666;">0xFF</span>; <span style="color: #408080; font-style: italic;">// are digital</span>
P4MDIN <span style="color: #666666;">=</span> <span style="color: #666666;">0xFF</span>; <span style="color: #408080; font-style: italic;">// are digital</span>
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Timer2_Init</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// Return Value : None</span>
<span style="color: #408080; font-style: italic;">// Parameters : None</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// Configure Timer2 to 16-bit auto-reload and generate an interrupt at 10 us</span>
<span style="color: #408080; font-style: italic;">// intervals. Timer2 overflows automatically triggers ADC0 conversion.</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">Timer2_Init</span> (<span style="color: #b00040;">void</span>)
{
TMR2CN <span style="color: #666666;">=</span> <span style="color: #666666;">0x00</span>; <span style="color: #408080; font-style: italic;">// Stop Timer2; Clear TF2;</span>
<span style="color: #408080; font-style: italic;">// use SYSCLK as timebase, 16-bit</span>
<span style="color: #408080; font-style: italic;">// auto-reload</span>
CKCON <span style="color: #666666;">|=</span> <span style="color: #666666;">0x10</span>; <span style="color: #408080; font-style: italic;">// Select SYSCLK for timer 2 source</span>
TMR2RL <span style="color: #666666;">=</span> <span style="color: #666666;">65535</span> <span style="color: #666666;">-</span> (SYSCLK <span style="color: #666666;">/</span> <span style="color: #666666;">10000</span>); <span style="color: #408080; font-style: italic;">// Init reload value for 10 us</span>
TMR2 <span style="color: #666666;">=</span> <span style="color: #666666;">0xffff</span>; <span style="color: #408080; font-style: italic;">// Set to reload immediately</span>
IE_ET2 <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>; <span style="color: #408080; font-style: italic;">// Enable Timer2 interrupts</span>
TMR2CN_TR2 <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>; <span style="color: #408080; font-style: italic;">// Start Timer2</span>
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// ADC0_Init</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// Return Value : None</span>
<span style="color: #408080; font-style: italic;">// Parameters : None</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// Configures ADC0 to make single-ended analog measurements on Port 2 according</span>
<span style="color: #408080; font-style: italic;">// to the values of <ANALOG_INPUTS> and <PIN_TABLE>.</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">ADC0_Init</span> (<span style="color: #b00040;">void</span>)
{
ADC0CN <span style="color: #666666;">=</span> <span style="color: #666666;">0x02</span>; <span style="color: #408080; font-style: italic;">// ADC0 disabled, normal tracking,</span>
<span style="color: #408080; font-style: italic;">// conversion triggered on TMR2 overflow</span>
REF0CN <span style="color: #666666;">=</span> <span style="color: #666666;">0x03</span>; <span style="color: #408080; font-style: italic;">// Enable internal VREF</span>
AMX0P <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X1A; <span style="color: #408080; font-style: italic;">// ADC0 input = P2.7 (para microcontrolador de 48 pinos)</span>
AMX0N <span style="color: #666666;">=</span> <span style="color: #666666;">0x1F</span>; <span style="color: #408080; font-style: italic;">// ADC0 negative input = GND</span>
<span style="color: #408080; font-style: italic;">// i.e., single ended mode</span>
ADC0CF <span style="color: #666666;">=</span> ((SYSCLK<span style="color: #666666;">/3000000</span>)<span style="color: #666666;">-1</span>)<span style="color: #666666;"><<3</span>; <span style="color: #408080; font-style: italic;">// Set SAR clock to 3MHz</span>
ADC0CF <span style="color: #666666;">|=</span> <span style="color: #666666;">0x00</span>; <span style="color: #408080; font-style: italic;">// Right-justify results</span>
EIE1 <span style="color: #666666;">|=</span> <span style="color: #666666;">0x08</span>; <span style="color: #408080; font-style: italic;">// Enable ADC0 EOC interrupt</span>
ADC0CN_ADEN <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>; <span style="color: #408080; font-style: italic;">// Enable ADC0</span>
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// UART0_Init</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// Return Value : None</span>
<span style="color: #408080; font-style: italic;">// Parameters : None</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// Configure the UART0 using Timer1, for <BAUDRATE> and 8-N-1.</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">UART0_Init</span> (<span style="color: #b00040;">void</span>)
{
SCON0 <span style="color: #666666;">=</span> <span style="color: #666666;">0x10</span>; <span style="color: #408080; font-style: italic;">// SCON0: 8-bit variable bit rate</span>
<span style="color: #408080; font-style: italic;">// level of STOP bit is ignored</span>
<span style="color: #408080; font-style: italic;">// RX enabled</span>
<span style="color: #408080; font-style: italic;">// ninth bits are zeros</span>
<span style="color: #408080; font-style: italic;">// clear SCON0_RI and SCON0_TI bits</span>
<span style="color: #408080; font-style: italic;">// seta automaticamente o valor a ser colocado no TH1</span>
<span style="color: green; font-weight: bold;">if</span> (SYSCLK<span style="color: #666666;">/</span>BAUDRATE<span style="color: #666666;">/2/256</span> <span style="color: #666666;"><</span> <span style="color: #666666;">1</span>) {
TH1 <span style="color: #666666;">=</span> <span style="color: #666666;">-</span>(SYSCLK<span style="color: #666666;">/</span>BAUDRATE<span style="color: #666666;">/2</span>);
CKCON <span style="color: #666666;">|=</span> <span style="color: #666666;">0x08</span>; <span style="color: #408080; font-style: italic;">// T1M = 1; SCA1:0 = xx</span>
} <span style="color: green; font-weight: bold;">else</span> <span style="color: green; font-weight: bold;">if</span> (SYSCLK<span style="color: #666666;">/</span>BAUDRATE<span style="color: #666666;">/2/256</span> <span style="color: #666666;"><</span> <span style="color: #666666;">4</span>) {
TH1 <span style="color: #666666;">=</span> <span style="color: #666666;">-</span>(SYSCLK<span style="color: #666666;">/</span>BAUDRATE<span style="color: #666666;">/2/4</span>);
CKCON <span style="color: #666666;">&=</span> <span style="color: #666666;">~0x0B</span>; <span style="color: #408080; font-style: italic;">// T1M = 0; SCA1:0 = 01</span>
CKCON <span style="color: #666666;">|=</span> <span style="color: #666666;">0x01</span>;
} <span style="color: green; font-weight: bold;">else</span> <span style="color: green; font-weight: bold;">if</span> (SYSCLK<span style="color: #666666;">/</span>BAUDRATE<span style="color: #666666;">/2/256</span> <span style="color: #666666;"><</span> <span style="color: #666666;">12</span>) {
TH1 <span style="color: #666666;">=</span> <span style="color: #666666;">-</span>(SYSCLK<span style="color: #666666;">/</span>BAUDRATE<span style="color: #666666;">/2/12</span>);
CKCON <span style="color: #666666;">&=</span> <span style="color: #666666;">~0x0B</span>; <span style="color: #408080; font-style: italic;">// T1M = 0; SCA1:0 = 00</span>
} <span style="color: green; font-weight: bold;">else</span> <span style="color: green; font-weight: bold;">if</span> (SYSCLK<span style="color: #666666;">/</span>BAUDRATE<span style="color: #666666;">/2/256</span> <span style="color: #666666;"><</span> <span style="color: #666666;">48</span>) {
TH1 <span style="color: #666666;">=</span> <span style="color: #666666;">-</span>(SYSCLK<span style="color: #666666;">/</span>BAUDRATE<span style="color: #666666;">/2/48</span>);
CKCON <span style="color: #666666;">&=</span> <span style="color: #666666;">~0x0B</span>; <span style="color: #408080; font-style: italic;">// T1M = 0; SCA1:0 = 10</span>
CKCON <span style="color: #666666;">|=</span> <span style="color: #666666;">0x02</span>;
} <span style="color: green; font-weight: bold;">else</span> {
<span style="color: green; font-weight: bold;">while</span> (<span style="color: #666666;">1</span>); <span style="color: #408080; font-style: italic;">// Error. Unsupported baud rate</span>
}
TL1 <span style="color: #666666;">=</span> TH1; <span style="color: #408080; font-style: italic;">// Init Timer1</span>
TMOD <span style="color: #666666;">&=</span> <span style="color: #666666;">~0xF0</span>; <span style="color: #408080; font-style: italic;">// TMOD: timer 1 in 8-bit autoreload</span>
TMOD <span style="color: #666666;">|=</span> <span style="color: #666666;">0x20</span>;
TCON_TR1 <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>; <span style="color: #408080; font-style: italic;">// START Timer1</span>
SCON0_TI <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>; <span style="color: #408080; font-style: italic;">// Indicate TX0 ready</span>
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Interrupt Service Routines</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Timer2_ISR</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//usa overflow para verificar o ADC</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">//incrementa o proximo ADC a ser lido quando for ler 2 ou mais ADCS</span>
SI_INTERRUPT(Timer2_ISR, TIMER2_IRQn)
{
TMR2CN_TF2H <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>; <span style="color: #408080; font-style: italic;">//limpa interrupção do timer 2</span>
<span style="color: #408080; font-style: italic;">//para 1 adc somente pode até desligar esse timer</span>
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// ADC0_ISR</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// This ISR averages <INT_DEC> samples for each analog MUX input then prints</span>
<span style="color: #408080; font-style: italic;">// the results to the terminal. The ISR is called after each ADC conversion,</span>
<span style="color: #408080; font-style: italic;">// which is triggered by Timer2.</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
SI_INTERRUPT(ADC0_ISR, ADC0EOC_IRQn)
{
ADC0CN_ADINT <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>; <span style="color: #408080; font-style: italic;">// Clear ADC conversion complete</span>
RESULT <span style="color: #666666;">=</span> ADC0; <span style="color: #408080; font-style: italic;">// Read the ADC value and add it to the</span>
<span style="color: #408080; font-style: italic;">// running total</span>
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Support Subroutines</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Timer0_Init</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// Return Value : None</span>
<span style="color: #408080; font-style: italic;">// Parameters :</span>
<span style="color: #408080; font-style: italic;">// 1) int16_t ms - number of milliseconds to wait</span>
<span style="color: #408080; font-style: italic;">// range is positive range of an int: 0 to 32767</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// This function configures the Timer0 as a 16-bit timer, interrupt enabled.</span>
<span style="color: #408080; font-style: italic;">// Using the internal osc. at 12MHz with a prescaler of 1:8 and reloading the</span>
<span style="color: #408080; font-style: italic;">// T0 registers with TIMER0_RELOAD_HIGH/LOW, it will wait for <ms></span>
<span style="color: #408080; font-style: italic;">// milliseconds.</span>
<span style="color: #408080; font-style: italic;">// Note: The Timer0 uses a 1:12 prescaler</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> delay_ms(<span style="color: #b00040;">int16_t</span> ms)
{
TH0 <span style="color: #666666;">=</span> TIMER0_RELOAD_HIGH; <span style="color: #408080; font-style: italic;">// Init Timer0 High register</span>
TL0 <span style="color: #666666;">=</span> TIMER0_RELOAD_LOW ; <span style="color: #408080; font-style: italic;">// Init Timer0 Low register</span>
TMOD <span style="color: #666666;">|=</span> <span style="color: #666666;">0x01</span>; <span style="color: #408080; font-style: italic;">// Timer0 in 16-bit mode</span>
CKCON <span style="color: #666666;">&=</span> <span style="color: #666666;">0xFC</span>; <span style="color: #408080; font-style: italic;">// Timer0 uses a 1:12 prescaler</span>
TCON_TR0 <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>; <span style="color: #408080; font-style: italic;">// Timer0 ON</span>
<span style="color: green; font-weight: bold;">while</span>(ms)
{
TCON_TF0 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>; <span style="color: #408080; font-style: italic;">// Clear flag to initialize</span>
<span style="color: green; font-weight: bold;">while</span>(<span style="color: #666666;">!</span>TCON_TF0); <span style="color: #408080; font-style: italic;">// Wait until timer overflows</span>
ms<span style="color: #666666;">--</span>; <span style="color: #408080; font-style: italic;">// Decrement ms</span>
}
TCON_TR0 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>; <span style="color: #408080; font-style: italic;">// Timer0 OFF</span>
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// End Of File</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
</pre></div>
<p></p><p>formatado por : http://hilite.me/ 01/09/2021.</p><p><br /></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5944573230336506830.post-49058672578955561782021-09-01T08:42:00.002-07:002021-09-01T08:57:17.215-07:00Acessando a porta serial RS232 com o 8051F382 - Simplicity studio<p><span> Olá, pessoal!</span></p><p><span> </span>Neste exemplo tudo enviado ao microcontrolador é repetido de volta pela porta serial, nos exemplos não utilizo cristal externo pois o chip já possui um interno.
<!--HTML generated using hilite.me--></p><p><span style="font-size: large;">O código fonte :</span></p><div style="background: rgb(248, 248, 248); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #408080; font-style: italic;">// Target: C8051F382</span>
<span style="color: #408080; font-style: italic;">// Tool chain: Simplicity Studio / Keil C51 9.51</span>
<span style="color: #408080; font-style: italic;">// Autor: Aguivone M. Fogia</span>
<span style="color: #408080; font-style: italic;">// Data: 01/09/2021</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Includes</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #bc7a00;">#include <SI_C8051F380_Register_Enums.h></span>
<span style="color: #bc7a00;">#include <stdio.h></span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Global CONSTANTS</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #bc7a00;">#define SYSCLK 12000000 </span><span style="color: #408080; font-style: italic;">// SYSCLK frequency in Hz</span>
<span style="color: #bc7a00;">#define BAUDRATE 9600 </span><span style="color: #408080; font-style: italic;">// Baud rate of UART in bps</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Function PROTOTYPES</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
SI_INTERRUPT_PROTO(UART0_Interrupt, UART0_IRQn);
<span style="color: #b00040;">void</span> <span style="color: blue;">SYSCLK_Init</span> (<span style="color: #b00040;">void</span>);
<span style="color: #b00040;">void</span> <span style="color: blue;">UART0_Init</span> (<span style="color: #b00040;">void</span>);
<span style="color: #b00040;">void</span> <span style="color: blue;">PORT_Init</span> (<span style="color: #b00040;">void</span>);
<span style="color: #b00040;">void</span> <span style="color: blue;">escreve_frase</span>(<span style="color: #b00040;">uint8_t</span> dados[] ,<span style="color: #b00040;">uint8_t</span> tam);
<span style="color: #b00040;">void</span> <span style="color: blue;">escreve_recebido</span>(<span style="color: #b00040;">uint8_t</span> tam);
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Global Variables</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #bc7a00;">#define UART_BUFFERSIZE 10</span>
<span style="color: #b00040;">uint8_t</span> UART_Buffer[UART_BUFFERSIZE];
<span style="color: #b00040;">uint8_t</span> UART_Buffer_tx[UART_BUFFERSIZE];<span style="color: #408080; font-style: italic;">//para transmissão</span>
<span style="color: #b00040;">uint8_t</span> UART_Buffer_Size <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: #b00040;">uint8_t</span> UART_Input_First <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: #b00040;">uint8_t</span> UART_Output_First <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: #b00040;">uint8_t</span> pos_buffer<span style="color: #666666;">=0</span>;
<span style="color: #b00040;">uint8_t</span> tam_buffer_tx<span style="color: #666666;">=0</span>;
<span style="color: #b00040;">uint8_t</span> pos_buffer_tx<span style="color: #666666;">=0</span>;
<span style="color: green; font-weight: bold;">static</span> <span style="color: #b00040;">char</span> RX_232;
<span style="color: green; font-weight: bold;">static</span> <span style="color: #b00040;">char</span> TX_232;
<span style="color: #b00040;">bool</span> tem_recp <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: #b00040;">bool</span> rec_232 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: #b00040;">bool</span> trans_232 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: #408080; font-style: italic;">//entradas</span>
SI_SBIT(SW1, SFR_P0, <span style="color: #666666;">6</span>); <span style="color: #408080; font-style: italic;">// SW1 ='0' means switch pressed</span>
SI_SBIT(SW2, SFR_P0, <span style="color: #666666;">7</span>); <span style="color: #408080; font-style: italic;">// SW2 ='0' means switch pressed</span>
<span style="color: #b00040;">unsigned</span> <span style="color: #b00040;">char</span> porta4 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>XFF;
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// SiLabs_Startup() Routine</span>
<span style="color: #408080; font-style: italic;">// ----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// This function is called immediately after reset, before the initialization</span>
<span style="color: #408080; font-style: italic;">// code is run in SILABS_STARTUP.A51 (which runs before main() ). This is a</span>
<span style="color: #408080; font-style: italic;">// useful place to disable the watchdog timer, which is enable by default</span>
<span style="color: #408080; font-style: italic;">// and may trigger before main() in some instances.</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">SiLabs_Startup</span> (<span style="color: #b00040;">void</span>)
{
PCA0MD <span style="color: #666666;">&=</span> <span style="color: #666666;">~0x40</span>; <span style="color: #408080; font-style: italic;">// WDTE = 0 (clear watchdog timer</span>
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// MAIN Routine</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">main</span> (<span style="color: #b00040;">void</span>)
{
<span style="color: #408080; font-style: italic;">// enable)</span>
PORT_Init(); <span style="color: #408080; font-style: italic;">// Initialize Port I/O</span>
SYSCLK_Init (); <span style="color: #408080; font-style: italic;">// Initialize Oscillator</span>
UART0_Init();
IE_EA <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;
escreve_frase(<span style="color: #ba2121;">"Iniciando!"</span>,<span style="color: #666666;">10</span>);
<span style="color: green; font-weight: bold;">while</span>(<span style="color: #666666;">1</span>)
{
<span style="color: #408080; font-style: italic;">// If the complete word has been entered via the terminal followed by</span>
<span style="color: #408080; font-style: italic;">// carriage return or newline</span>
<span style="color: green; font-weight: bold;">if</span>(tem_recp)<span style="color: #408080; font-style: italic;">//recebeu dados</span>
{
escreve_recebido(pos_buffer);
tem_recp <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;<span style="color: #408080; font-style: italic;">//sinaliza que já leu</span>
}
}
}
<span style="color: #b00040;">void</span> <span style="color: blue;">escreve_frase</span>(<span style="color: #b00040;">char</span> dados[] ,<span style="color: #b00040;">uint8_t</span> tam)
{
tam_buffer_tx <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: green; font-weight: bold;">while</span>(tam <span style="color: #666666;">></span> tam_buffer_tx)
{
UART_Buffer_tx[tam_buffer_tx] <span style="color: #666666;">=</span> dados[tam_buffer_tx];<span style="color: #408080; font-style: italic;">//transfere dados</span>
tam_buffer_tx<span style="color: #666666;">++</span>;
}
trans_232 <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;<span style="color: #408080; font-style: italic;">//sinaliza que deve transmitir</span>
SCON0_TI <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>; <span style="color: #408080; font-style: italic;">//para dar inicio a transmissão</span>
}
<span style="color: #b00040;">void</span> <span style="color: blue;">escreve_recebido</span>(<span style="color: #b00040;">uint8_t</span> tam)
{
tam_buffer_tx <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: green; font-weight: bold;">while</span>(tam <span style="color: #666666;">></span> tam_buffer_tx)
{
UART_Buffer_tx[tam_buffer_tx] <span style="color: #666666;">=</span> UART_Buffer[tam_buffer_tx];<span style="color: #408080; font-style: italic;">//transfere dados</span>
tam_buffer_tx<span style="color: #666666;">++</span>;
}
trans_232 <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;<span style="color: #408080; font-style: italic;">//sinaliza que deve transmitir</span>
SCON0_TI <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>; <span style="color: #408080; font-style: italic;">//para dar inicio a transmissão</span>
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Initialization Subroutines</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// PORT_Init</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// Return Value : None</span>
<span style="color: #408080; font-style: italic;">// Parameters : None</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// Configure the Crossbar and GPIO ports.</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// P0.4 digital push-pull UART TX</span>
<span style="color: #408080; font-style: italic;">// P0.5 digital open-drain UART RX</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">PORT_Init</span> (<span style="color: #b00040;">void</span>)
{
P0MDOUT <span style="color: #666666;">|=</span> <span style="color: #666666;">0x10</span>; <span style="color: #408080; font-style: italic;">// Enable UTX as push-pull output</span>
XBR0 <span style="color: #666666;">=</span> <span style="color: #666666;">0x01</span>; <span style="color: #408080; font-style: italic;">// Enable UART on P0.4(TX) and P0.5(RX)</span>
XBR1 <span style="color: #666666;">=</span> <span style="color: #666666;">0x40</span>; <span style="color: #408080; font-style: italic;">// Enable crossbar and weak pull-ups</span>
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// SYSCLK_Init</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// Return Value : None</span>
<span style="color: #408080; font-style: italic;">// Parameters : None</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// This routine initializes the system clock to use the internal oscillator</span>
<span style="color: #408080; font-style: italic;">// at its maximum frequency.</span>
<span style="color: #408080; font-style: italic;">// Also enables the Missing Clock Detector.</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">SYSCLK_Init</span> (<span style="color: #b00040;">void</span>)
{
OSCICN <span style="color: #666666;">|=</span> <span style="color: #666666;">0x03</span>; <span style="color: #408080; font-style: italic;">// Configure internal oscillator for</span>
<span style="color: #408080; font-style: italic;">// its maximum frequency</span>
RSTSRC <span style="color: #666666;">=</span> <span style="color: #666666;">0x04</span>; <span style="color: #408080; font-style: italic;">// Enable missing clock detector</span>
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// UART0_Init</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// Return Value : None</span>
<span style="color: #408080; font-style: italic;">// Parameters : None</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// Configure the UART0 using Timer1, for <BAUDRATE> and 8-N-1.</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">UART0_Init</span> (<span style="color: #b00040;">void</span>)
{
SCON0 <span style="color: #666666;">=</span> <span style="color: #666666;">0x10</span>; <span style="color: #408080; font-style: italic;">// SCON0: 8-bit variable bit rate</span>
<span style="color: #408080; font-style: italic;">// level of STOP bit is ignored</span>
<span style="color: #408080; font-style: italic;">// RX enabled</span>
<span style="color: #408080; font-style: italic;">// ninth bits are zeros</span>
<span style="color: #408080; font-style: italic;">// clear SCON0_RI and SCON0_TI bits</span>
<span style="color: green; font-weight: bold;">if</span> (SYSCLK<span style="color: #666666;">/</span>BAUDRATE<span style="color: #666666;">/2/256</span> <span style="color: #666666;"><</span> <span style="color: #666666;">1</span>) {
TH1 <span style="color: #666666;">=</span> <span style="color: #666666;">-</span>(SYSCLK<span style="color: #666666;">/</span>BAUDRATE<span style="color: #666666;">/2</span>);
CKCON <span style="color: #666666;">&=</span> <span style="color: #666666;">~0x0B</span>; <span style="color: #408080; font-style: italic;">// T1M = 1; SCA1:0 = xx</span>
CKCON <span style="color: #666666;">|=</span> <span style="color: #666666;">0x08</span>;
} <span style="color: green; font-weight: bold;">else</span> <span style="color: green; font-weight: bold;">if</span> (SYSCLK<span style="color: #666666;">/</span>BAUDRATE<span style="color: #666666;">/2/256</span> <span style="color: #666666;"><</span> <span style="color: #666666;">4</span>) {
TH1 <span style="color: #666666;">=</span> <span style="color: #666666;">-</span>(SYSCLK<span style="color: #666666;">/</span>BAUDRATE<span style="color: #666666;">/2/4</span>);
CKCON <span style="color: #666666;">&=</span> <span style="color: #666666;">~0x0B</span>; <span style="color: #408080; font-style: italic;">// T1M = 0; SCA1:0 = 01</span>
CKCON <span style="color: #666666;">|=</span> <span style="color: #666666;">0x01</span>;
} <span style="color: green; font-weight: bold;">else</span> <span style="color: green; font-weight: bold;">if</span> (SYSCLK<span style="color: #666666;">/</span>BAUDRATE<span style="color: #666666;">/2/256</span> <span style="color: #666666;"><</span> <span style="color: #666666;">12</span>) {
TH1 <span style="color: #666666;">=</span> <span style="color: #666666;">-</span>(SYSCLK<span style="color: #666666;">/</span>BAUDRATE<span style="color: #666666;">/2/12</span>);
CKCON <span style="color: #666666;">&=</span> <span style="color: #666666;">~0x0B</span>; <span style="color: #408080; font-style: italic;">// T1M = 0; SCA1:0 = 00</span>
} <span style="color: green; font-weight: bold;">else</span> {
TH1 <span style="color: #666666;">=</span> <span style="color: #666666;">-</span>(SYSCLK<span style="color: #666666;">/</span>BAUDRATE<span style="color: #666666;">/2/48</span>);
CKCON <span style="color: #666666;">&=</span> <span style="color: #666666;">~0x0B</span>; <span style="color: #408080; font-style: italic;">// T1M = 0; SCA1:0 = 10</span>
CKCON <span style="color: #666666;">|=</span> <span style="color: #666666;">0x02</span>;
}
TL1 <span style="color: #666666;">=</span> TH1; <span style="color: #408080; font-style: italic;">// init Timer1</span>
TMOD <span style="color: #666666;">&=</span> <span style="color: #666666;">~0xf0</span>; <span style="color: #408080; font-style: italic;">// TMOD: timer 1 in 8-bit autoreload</span>
TMOD <span style="color: #666666;">|=</span> <span style="color: #666666;">0x20</span>;
TCON_TR1 <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>; <span style="color: #408080; font-style: italic;">// START Timer1</span>
IP <span style="color: #666666;">|=</span> <span style="color: #666666;">0x10</span>; <span style="color: #408080; font-style: italic;">// Make UART high priority</span>
IE_ES0 <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>; <span style="color: #408080; font-style: italic;">// Enable UART0 interrupts</span>
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Interrupt Service Routines</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// UART0_Interrupt</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// This routine is invoked whenever a character is entered or displayed on the</span>
<span style="color: #408080; font-style: italic;">// Hyperterminal.</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
SI_INTERRUPT(UART0_Interrupt, UART0_IRQn)
{
<span style="color: green; font-weight: bold;">if</span> (SCON0_RI <span style="color: #666666;">==</span> <span style="color: #666666;">1</span>)
{
SCON0_RI <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
RX_232 <span style="color: #666666;">=</span> SBUF0;
<span style="color: green; font-weight: bold;">if</span>(pos_buffer <span style="color: #666666;">></span> UART_BUFFERSIZE) <span style="color: #408080; font-style: italic;">// tem um bug no compilador ou chip que faz reseta</span>
{<span style="color: #408080; font-style: italic;">//erro descarta</span>
rec_232<span style="color: #666666;">=0</span>; <span style="color: #408080; font-style: italic;">//não recebendo</span>
pos_buffer<span style="color: #666666;">=0</span>;<span style="color: #408080; font-style: italic;">//limpa buffer</span>
tem_recp <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;<span style="color: #408080; font-style: italic;">//sinaliza fim de pacote</span>
}
<span style="color: green; font-weight: bold;">if</span>(rec_232 <span style="color: #666666;">&&</span> RX_232 <span style="color: #666666;">==</span> <span style="color: #ba2121;">'*'</span>)
{<span style="color: #408080; font-style: italic;">//esta recebendo e chegou delimitador de fim</span>
rec_232<span style="color: #666666;">=0</span>; <span style="color: #408080; font-style: italic;">//não recebendo</span>
tem_recp <span style="color: #666666;">=</span> <span style="color: #666666;">1</span>;<span style="color: #408080; font-style: italic;">//sinaliza fim de pacote</span>
}
<span style="color: green; font-weight: bold;">if</span>(rec_232)
{<span style="color: #408080; font-style: italic;">//esta recebendo</span>
UART_Buffer[pos_buffer] <span style="color: #666666;">=</span> RX_232;
pos_buffer<span style="color: #666666;">++</span>;
}
<span style="color: green; font-weight: bold;">if</span>(RX_232 <span style="color: #666666;">==</span> <span style="color: #ba2121;">'#'</span>)
{
pos_buffer<span style="color: #666666;">=0</span>;<span style="color: #408080; font-style: italic;">//sinaliza recepção</span>
rec_232<span style="color: #666666;">=1</span>; <span style="color: #408080; font-style: italic;">//recebendo</span>
}
}
<span style="color: green; font-weight: bold;">if</span> (SCON0_TI) <span style="color: #408080; font-style: italic;">// Check if transmit flag is set</span>
{
SCON0_TI <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>; <span style="color: #408080; font-style: italic;">// Clear interrupt flag</span>
<span style="color: green; font-weight: bold;">if</span>(trans_232 <span style="color: #666666;">==</span> <span style="color: #666666;">1</span>)
{
<span style="color: green; font-weight: bold;">if</span> (pos_buffer_tx <span style="color: #666666;"><</span> tam_buffer_tx)
{
<span style="color: #408080; font-style: italic;">// Store a character in the variable byte</span>
TX_232 <span style="color: #666666;">=</span> UART_Buffer_tx[pos_buffer_tx];
pos_buffer_tx<span style="color: #666666;">++</span>; <span style="color: #408080; font-style: italic;">// Decrease array size</span>
SBUF0 <span style="color: #666666;">=</span> TX_232; <span style="color: #408080; font-style: italic;">// Transmit to Hyperterminal</span>
}
<span style="color: green; font-weight: bold;">else</span>
{
trans_232 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>; <span style="color: #408080; font-style: italic;">//fim de transmissao</span>
pos_buffer_tx <span style="color: #666666;">=0</span>;
}
}
}
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// End Of File</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
</pre></div>
<p></p><p>Formatado por : http://hilite.me/ 01/09/2021</p><p><br /></p><p><br /></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5944573230336506830.post-86477656336365014072021-08-27T10:27:00.004-07:002021-09-01T08:58:03.544-07:00Acionando os pinos de I/O do C8051F382 em C <div>Olá pessoal! </div><div><span> </span><span> </span>Marcando meu retorno aos exemplos de chips e tecnologias utilizadas na área de pesquisa e desenvolvimento vou colocar alguns exemplos de como utilizar os microcontroladores da Silicon Labs, em especifico os da serie C8051F38XX que apresentam um alto desempenho porém tem como empecilho a falta de uma memória rom interna como os PIC´s e AVR´s, outro ponto negativo é o gravador desses microcontroladores que são mais caros e mais difíceis de encontrar.</div><div><span> </span><span> O software de programação utilizado será o Simplicity Studio e o toochain "</span>Keil C51 9.51", quanto a este software gostei muito pois apresenta poucos bugs e as funções em C são bem tranquilas de se utilizar.</div><div>como programa inicial vou postar um exemplo de como acionar os pinos deste microcontrolador, uma observação é o PORT4 que apresenta um comportamento diferenciado em relação ao outros pinos.</div><div> Um complicador em relação a outros modelos de microcontroladores é o "Digital<div>Crossbar" que deve ser setado corretamente pois conforme se configura os pinos com funções especiais ele acaba por mudar também a função dos outros pinos com funções especiais, ou seja se vc configura um pino como interrupção ele poderá te impedir de usar um outro pino que tem uma outra função, te obrigando a escolher outro pino, porem uma vantagem é poder "chavear funções de hardware para mais pinos. A figura a seguir mostra como é essa arquitetura(retirado do datasheet do fabricante).Esse recurso pode ser desabilitado por meio dos registradores PXSKIP (onde em X é colocado o PORT em questão).</div><div><span> </span><span> <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuNTiAqW4y53ffi7Mkvw_wObM8EhQryW-yQ7EpvM8JwGionk3gACxKG26FpdTvttm-HqIrNd0fUsaGh11nsLX0GUDvJwG_Qo0N0OJKA9hp6SyGZ3KTniPemcejR3QaTplCn5A4EusBejQ/s1056/Sem+t%25C3%25ADtulo.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="918" data-original-width="1056" height="557" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuNTiAqW4y53ffi7Mkvw_wObM8EhQryW-yQ7EpvM8JwGionk3gACxKG26FpdTvttm-HqIrNd0fUsaGh11nsLX0GUDvJwG_Qo0N0OJKA9hp6SyGZ3KTniPemcejR3QaTplCn5A4EusBejQ/w640-h557/Sem+t%25C3%25ADtulo.jpg" width="640" /></a></div><span> </span><span> Segue abaixo um exemplo de código que usa o PORT0 e o PORT4, para ler 2 botões e acionar leds através destes pinos.</span></span></div><div><span><span><br /></span></span></div><div><div><b><span style="font-size: medium;">O Código fonte :</span></b></div></div></div><div><br /></div>
<!--HTML generated using hilite.me--><div style="background: rgb(248, 248, 248); border-color: gray; border-image: initial; border-style: solid; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"><pre style="line-height: 125%; margin: 0px;"><span style="color: #408080; font-style: italic;">// Target: C8051F382</span>
<span style="color: #408080; font-style: italic;">// Tool chain: Simplicity Studio / Keil C51 9.51</span>
<span style="color: #408080; font-style: italic;">// Autor: Aguivone Moretti Fogia</span>
<span style="color: #408080; font-style: italic;">// Data: 27/08/2021</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">//exemplo de como usar botoes e leds</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Includes</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #bc7a00;">#include <SI_C8051F380_Register_Enums.h></span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Global Constants</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #bc7a00;">#define SYSCLK 12000000 </span><span style="color: #408080; font-style: italic;">// Internal oscillator frequency in Hz</span>
<span style="color: #408080; font-style: italic;">//entradas porta 0</span>
SI_SBIT(BOT1, SFR_P0, <span style="color: #666666;">6</span>); <span style="color: #408080; font-style: italic;">// BOT1 ='0' botão pressionado</span>
SI_SBIT(BOT2, SFR_P0, <span style="color: #666666;">7</span>); <span style="color: #408080; font-style: italic;">// BOT2 ='0' botao pressionado</span>
<span style="color: #b00040;">unsigned</span> <span style="color: #b00040;">char</span> porta4 <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>XFF;
<span style="color: #408080; font-style: italic;">//Saidas porta 0</span>
SI_SBIT(LED1, SFR_P0, <span style="color: #666666;">0</span>); <span style="color: #408080; font-style: italic;">// LED='0' Ligado //pois ligado ao VCC</span>
SI_SBIT(LED2, SFR_P0, <span style="color: #666666;">1</span>); <span style="color: #408080; font-style: italic;">// LED='1' Desligado</span>
<span style="color: #408080; font-style: italic;">// A porta 4 tem um funcionamento diferente em relação as outras</span>
<span style="color: #408080; font-style: italic;">//ledes ligado ao port 4</span>
<span style="color: #bc7a00;">#define LED3 0x7F</span>
<span style="color: #bc7a00;">#define LED4 0xBF</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Function Prototypes</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
SI_INTERRUPT_PROTO(PCA0_ISR, PCA0_IRQn);
<span style="color: #b00040;">void</span> <span style="color: blue;">OSCILLATOR_Init</span> (<span style="color: #b00040;">void</span>);
<span style="color: #b00040;">void</span> <span style="color: blue;">PORT_Init</span> (<span style="color: #b00040;">void</span>);
<span style="color: #b00040;">void</span> <span style="color: blue;">Liga_Port4</span>(<span style="color: green; font-weight: bold;">const</span> <span style="color: #b00040;">char</span> pino);
<span style="color: #b00040;">void</span> <span style="color: blue;">Desliga_Port4</span>(<span style="color: green; font-weight: bold;">const</span> <span style="color: #b00040;">char</span> pino);
<span style="color: #b00040;">bool</span> flag_teste;
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// SiLabs_Startup() Routine</span>
<span style="color: #408080; font-style: italic;">// ----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// This function is called immediately after reset, before the initialization</span>
<span style="color: #408080; font-style: italic;">// code is run in SILABS_STARTUP.A51 (which runs before main() ). This is a</span>
<span style="color: #408080; font-style: italic;">// useful place to disable the watchdog timer, which is enable by default</span>
<span style="color: #408080; font-style: italic;">// and may trigger before main() in some instances.</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">SiLabs_Startup</span> (<span style="color: #b00040;">void</span>)
{
PCA0MD <span style="color: #666666;">=</span> <span style="color: #666666;">0x00</span>; <span style="color: #408080; font-style: italic;">// Disable watchdog timer</span>
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// main() Routine</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">main</span> (<span style="color: #b00040;">void</span>)
{
<span style="color: #b00040;">uint16_t</span> LOOP;
<span style="color: #b00040;">uint16_t</span> LOOP_max <span style="color: #666666;">=65000</span>;
PORT_Init (); <span style="color: #408080; font-style: italic;">// Initialize crossbar and GPIO</span>
OSCILLATOR_Init (); <span style="color: #408080; font-style: italic;">// Initialize oscillator</span>
LOOP <span style="color: #666666;">=0</span>;
IE_EA <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
flag_teste <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>;
<span style="color: green; font-weight: bold;">while</span> (<span style="color: #666666;">1</span>)
{
LOOP<span style="color: #666666;">++</span>;
<span style="color: green; font-weight: bold;">if</span>(LOOP<span style="color: #666666;">></span>LOOP_max)
{
Liga_Port4(LED3);
LED1<span style="color: #666666;">=0</span>; <span style="color: #408080; font-style: italic;">//liga led</span>
LOOP<span style="color: #666666;">=0</span>;
}
<span style="color: green; font-weight: bold;">if</span>(LOOP <span style="color: #666666;">==</span>(LOOP_max<span style="color: #666666;">/2</span>))
{
Desliga_Port4(LED3);
LED1<span style="color: #666666;">=1</span>; <span style="color: #408080; font-style: italic;">//desliga led</span>
}
<span style="color: green; font-weight: bold;">if</span>(BOT1)
{
Liga_Port4(LED4);
}
<span style="color: green; font-weight: bold;">else</span>
{
Desliga_Port4(LED4);
}
<span style="color: green; font-weight: bold;">if</span>(BOT2)
{
LED2<span style="color: #666666;">=0</span>; <span style="color: #408080; font-style: italic;">//liga led</span>
}
<span style="color: green; font-weight: bold;">else</span>
{
LED2<span style="color: #666666;">=1</span>;<span style="color: #408080; font-style: italic;">//desliga led</span>
}
}
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// tratamento especial para port 4</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">Desliga_Port4</span>(<span style="color: green; font-weight: bold;">const</span> <span style="color: #b00040;">char</span> pino)
{<span style="color: #408080; font-style: italic;">//desliga em nivel alto</span>
porta4 <span style="color: #666666;">=</span> porta4 <span style="color: #666666;">|</span> (<span style="color: #666666;">~</span>pino);
P4 <span style="color: #666666;">=</span> porta4;
}
<span style="color: #b00040;">void</span> <span style="color: blue;">Liga_Port4</span>(<span style="color: green; font-weight: bold;">const</span> <span style="color: #b00040;">char</span> pino)
{
porta4 <span style="color: #666666;">=</span> porta4 <span style="color: #666666;">&</span> pino;
P4 <span style="color: #666666;">=</span> porta4;
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// Initialization Subroutines</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// OSCILLATOR_Init</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// Return Value : None</span>
<span style="color: #408080; font-style: italic;">// Parameters : None</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// This function initializes the system clock to use the internal oscillator</span>
<span style="color: #408080; font-style: italic;">// at 12 MHz.</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">OSCILLATOR_Init</span> (<span style="color: #b00040;">void</span>)
{
OSCICN <span style="color: #666666;">=</span> <span style="color: #666666;">0x83</span>; <span style="color: #408080; font-style: italic;">// Set internal oscillator to run (desabilitou osc interno)</span>
<span style="color: #408080; font-style: italic;">// at its maximum frequency(pois setou os 2 ultimos bit)</span>
CLKSEL <span style="color: #666666;">=</span> <span style="color: #666666;">0x00</span>; <span style="color: #408080; font-style: italic;">// Select the internal osc. as (SYSCLK/4)</span>
<span style="color: #408080; font-style: italic;">// the SYSCLK source</span>
}
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">// PORT_Init</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// Return Value : None</span>
<span style="color: #408080; font-style: italic;">// Parameters : None</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// This function configures the crossbar and GPIO ports.</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">// P0.0 digital open-drain PCA0 CEX0</span>
<span style="color: #408080; font-style: italic;">// P0.1 digital push-pull</span>
<span style="color: #408080; font-style: italic;">//</span>
<span style="color: #408080; font-style: italic;">//-----------------------------------------------------------------------------</span>
<span style="color: #b00040;">void</span> <span style="color: blue;">PORT_Init</span> (<span style="color: #b00040;">void</span>)
{
OSCICN <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X81; <span style="color: #408080; font-style: italic;">// IHFOsc Enable, OpcDiv:3MHz</span>
CLKMUL <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>XC0; <span style="color: #408080; font-style: italic;">// talvez nem precise neste microcontrolador -> habilita e inicializa pll</span>
CLKSEL <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X03; <span style="color: #408080; font-style: italic;">// SYSCLK derived from the Internal High-Frequency Oscillator.</span>
PFE0CN <span style="color: #666666;">=</span> <span style="color: #666666;">0</span>X20; <span style="color: #408080; font-style: italic;">//(para High Speed) Prefetch Engine Control,otimiza tempo de execução lendo 2 bytes de execução por vez</span>
<span style="color: #408080; font-style: italic;">/* FLSCL.FOSE(7) = 0 for < 10MHz and 1 for SYSCLK > 10MHz</span>
<span style="color: #408080; font-style: italic;"> FLSCL.FLRT(4) = 0 for < 25MHz and 1 for SYSCLK > 25MHz */</span>
FLSCL <span style="color: #666666;">=</span> <span style="color: #666666;">0x90</span>;
CKCON <span style="color: #666666;">=</span> <span style="color: #666666;">0x30</span>;
SPI0CN <span style="color: #666666;">=</span> <span style="color: #666666;">0x02</span>; <span style="color: #408080; font-style: italic;">//Select Mode 3-Wire pra liberar pino NSS</span>
P0MDIN <span style="color: #666666;">=</span> <span style="color: #666666;">0xFF</span>; <span style="color: #408080; font-style: italic;">// are digital</span>
P1MDIN <span style="color: #666666;">=</span> <span style="color: #666666;">0xFF</span>; <span style="color: #408080; font-style: italic;">// are digital</span>
P2MDIN <span style="color: #666666;">=</span> <span style="color: #666666;">0xFF</span>; <span style="color: #408080; font-style: italic;">// are digital</span>
P3MDIN <span style="color: #666666;">=</span> <span style="color: #666666;">0xFF</span>; <span style="color: #408080; font-style: italic;">// are digital</span>
P4MDIN <span style="color: #666666;">=</span> <span style="color: #666666;">0xFF</span>; <span style="color: #408080; font-style: italic;">// are digital</span>
P0MDOUT <span style="color: #666666;">=</span> <span style="color: #666666;">0x10</span>; <span style="color: #408080; font-style: italic;">// enable Switches as open-drain</span>
P1MDOUT <span style="color: #666666;">=</span> <span style="color: #666666;">0x00</span>; <span style="color: #408080; font-style: italic;">// enable Switches as open-drain</span>
P2MDOUT <span style="color: #666666;">=</span> <span style="color: #666666;">0x00</span>; <span style="color: #408080; font-style: italic;">// enable Switches as open-drain</span>
P3MDOUT <span style="color: #666666;">=</span> <span style="color: #666666;">0x00</span>; <span style="color: #408080; font-style: italic;">// enable Switches as open-drain</span>
P4MDOUT <span style="color: #666666;">=</span> <span style="color: #666666;">0x04</span>; <span style="color: #408080; font-style: italic;">// enable Switches as open-drain</span>
P0SKIP <span style="color: #666666;">=</span> <span style="color: #666666;">0xCF</span>; <span style="color: #408080; font-style: italic;">// TXeRX precisa do Skip pra funcionar</span>
P1SKIP <span style="color: #666666;">=</span> <span style="color: #666666;">0xFF</span>;
P2SKIP <span style="color: #666666;">=</span> <span style="color: #666666;">0xFF</span>;
P3SKIP <span style="color: #666666;">=</span> <span style="color: #666666;">0xCF</span>;
XBR0 <span style="color: #666666;">=</span> <span style="color: #666666;">0x01</span>; <span style="color: #408080; font-style: italic;">// CP1AE,CP1E,CP0AE,CP0E,SYSCKE,SMB0E,SPI0E,(UART0E)</span>
XBR2 <span style="color: #666666;">=</span> <span style="color: #666666;">0x00</span>; <span style="color: #408080; font-style: italic;">// RESRV,RSRV,RESRV,RESRV,RESRV,RESRV,SMB1E, UART1E</span>
XBR1 <span style="color: #666666;">=</span> <span style="color: #666666;">0xC2</span>; <span style="color: #408080; font-style: italic;">// WEAKPUD,(XBARE),T1E,T0E,ECIE,(PCA0ME):000:Nenhum,001:CEX0,010:CEX0eCEX1,...</span>
<span style="color: #408080; font-style: italic;">// VDM0CN -> monitor de tensão de reset</span>
VDM0CN <span style="color: #666666;">=</span> <span style="color: #666666;">0x80</span>; <span style="color: #408080; font-style: italic;">//Colocado porque senão da problema na gravacao da flash(já estava isso)</span>
P4 <span style="color: #666666;">=</span> <span style="color: #666666;">0xD8</span> ; <span style="color: #408080; font-style: italic;">//portas de p4 desligadas</span>
<span style="color: #408080; font-style: italic;">// P4 = 0 ; //portas de p4 ligadas</span>
}
<span style="color: #408080;"><i>Formatado por : http://hilite.me/ 27/08/2021</i></span></pre></div>
Formatado por : http://hilite.me/ 27/08/2021
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5944573230336506830.post-19315017567010804982019-12-08T15:27:00.000-08:002019-12-08T15:33:47.765-08:00Medidor do fator de potência com o PIC 18F4550 - Wattímetro e frequêncímetro.<span style="font-family: "arial" , "helvetica" , sans-serif;">Olá pessoal!</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;"> Neste exemplo os conceitos abordados serão:</span><br />
<ul>
<li><span style="font-family: "arial" , "helvetica" , sans-serif;">Uso do conversor analógico digital</span></li>
<li><span style="font-family: "arial" , "helvetica" , sans-serif;">Implementação da comunicação em 4 bits utilizando LCD(funciona para 16X2 ou 4X20).</span></li>
<li><span style="font-family: "arial" , "helvetica" , sans-serif;">Leitura de tensão AC e DC .</span></li>
<li><span style="font-family: "arial" , "helvetica" , sans-serif;">Medir o fator de potência.</span></li>
</ul>
<span style="font-family: "arial" , "helvetica" , sans-serif;"> A intenção é criar um voltímetro,amperímetro,wattímetro,frequencímetro e medidor do fato de potência que por consequência deve ler tensão e corrente DC E AC.O programa se torna extenso mas se for entendido por partes ficará mais fácil o que cada bloco de código faz.</span><br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"> Para o amperímetro é usado um resistor de 1 R ligado a uma carga(neste caso foi usado uma associação indutor e resistor para ter defasagem das senoides, para o voltímetro foi usado um divisor de tensão que mede até 30V porém não fica tão preciso devido ao numero de bits do conversor AD interno(10 bits).Para o Wattímetro é usado apenas os dados de tensão e corrente para fornecer a potencia instantânea, já para o caso de tensão DC a potencia media é feita ao longo do tempo(pois pode haver variações de tensão e corrente).O circuito montado para testes e simulação é mostrado na figura a seguir:</span><br />
<div style="text-align: center;">
<span style="font-family: "arial" , "helvetica" , sans-serif;"> <span style="font-size: x-small;"><b>Figura 1 - Esquemático geral(elaboração própria)</b></span></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcnV8pRo2F7tiL3eGU_QGatPVXm-PXsycG_NxOszyoCsDa6XiDSzrPu5PV9b32VhXzQ6unDf5sJsR-9pYIBGkhVjDKBh9AquPymgMeHAMOelWqIK6H1VWd8m6yaz-lRP45FbZvDrYs6bs/s1600/multimetro_geral.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="544" data-original-width="1144" height="304" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcnV8pRo2F7tiL3eGU_QGatPVXm-PXsycG_NxOszyoCsDa6XiDSzrPu5PV9b32VhXzQ6unDf5sJsR-9pYIBGkhVjDKBh9AquPymgMeHAMOelWqIK6H1VWd8m6yaz-lRP45FbZvDrYs6bs/s640/multimetro_geral.jpg" width="640" /></a></div>
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
Para medir o fator de potencia poderia ter sido feito internamente, com o microcontrolador, porém montar um simples circuito detector de zero com uma porta XOR é uma solução interessante, pois então só é preciso pegar a forma de onda que é proporcional a defasagem do sinal na saida da porta XOR. Porém durante os testes foi observado que esta porta XOR gera dois pulsos, e que o segundo é do momento que as ondas descem, o que gera imprecisão devido ao tempo de decaimento da tensão na saída da porta, na figura 2,em amarelo sinal de saída de XOR, em azul a tensão em vermelho a corrente do circuito.Com este circuito interno foi utilizado apenas uma porta do microcontrolador para medir a largura do sinal(período) e do pulso(fator de potência), por meio das interrupções do ccp1.<br />
<br />
<b style="font-family: Arial, Helvetica, sans-serif; font-size: small; text-align: center;"> Figura 2 - Sinais lidos no circuito de detecção de zero(elaboração própria)</b><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdUwo3lZ9dPKdMXBxCegFSHaHdKojIi-VMHsJLJpGHfY6ez7qHOEEWQNVtTtA_XQdwLU0TqdkI3zBy51fDxi3YkMnLTL9mx0SvPblnTfITLfjLUTHO9BE_zOdUNYqzsRNKmT5BA_StRUg/s1600/formas+de+ondas.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="502" data-original-width="1002" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdUwo3lZ9dPKdMXBxCegFSHaHdKojIi-VMHsJLJpGHfY6ez7qHOEEWQNVtTtA_XQdwLU0TqdkI3zBy51fDxi3YkMnLTL9mx0SvPblnTfITLfjLUTHO9BE_zOdUNYqzsRNKmT5BA_StRUg/s400/formas+de+ondas.jpg" width="400" /></a></div>
<br />
Outra observação é que para simular no proteus, ora se usa a fonte DC, ora se usa a fonte AC em simulações separadas, para alternar entre o modo AC e DC basta apertar o botão de seleção,na figura a seguir é mostrado as simulações AC e DC.No modo AC a tensão e corrente medida são as de pico, para converter para RMS(que é a mostrada nos multímetros), basta dividir por raiz de 2, conforme figura AC ,figura 4.<br />
<div style="text-align: center;">
<b style="font-family: Arial, Helvetica, sans-serif; font-size: small; text-align: center;">Figura 3 - Modo DC(elaboração própria)</b></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgO6qNQw_m2IRi6JpHMwkilu-vMJWiDtEH8m3z7r_Y792tLyKe5zApKf0WJGdKKpQMHyETv0rUVSQE4L4krnPWboZytsj_kfZ1hQpRtKmIIvPiyqpmro3Mkt8wyBg2lCGHfh88cL1y3IzM/s1600/multimetro_DC.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="" border="0" data-original-height="448" data-original-width="770" height="232" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgO6qNQw_m2IRi6JpHMwkilu-vMJWiDtEH8m3z7r_Y792tLyKe5zApKf0WJGdKKpQMHyETv0rUVSQE4L4krnPWboZytsj_kfZ1hQpRtKmIIvPiyqpmro3Mkt8wyBg2lCGHfh88cL1y3IzM/s400/multimetro_DC.jpg" title="Figura 2 - Modo DC (elaboração própria)" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<b style="font-family: Arial, Helvetica, sans-serif; font-size: small;">Figura 4 - Modo AC (elaboração própria)</b></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKTFz_iAcLfKdWnM6vE9aWRUKihRNIRHPsUGVlhom_toAQvzWgPkVFKMpOsnKXmBkNKL9l_eBXyuzQkETpSItcUpVIaorHB1Xh6Wkm5YV2q3uFAyIp9MNXCxZU87usudOvQ9oSslBMKRg/s1600/multimetro+modo+AC.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="536" data-original-width="970" height="220" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKTFz_iAcLfKdWnM6vE9aWRUKihRNIRHPsUGVlhom_toAQvzWgPkVFKMpOsnKXmBkNKL9l_eBXyuzQkETpSItcUpVIaorHB1Xh6Wkm5YV2q3uFAyIp9MNXCxZU87usudOvQ9oSslBMKRg/s400/multimetro+modo+AC.jpg" width="400" /></a></div>
<br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">O circuito funcionando é visto na figura 5, veja que ele tem 2 botões sendo um para reset do microcontrolador e outro para alternar os modo de funcionamento. </span><br />
<span style="text-align: center;"><b style="font-family: Arial, Helvetica, sans-serif; font-size: small;"> Figura 5 - foto do </b><span style="font-family: "arial" , "helvetica" , sans-serif; font-size: x-small;"><b>protótipo</b></span><b style="font-family: Arial, Helvetica, sans-serif; font-size: small;"> implementado(elaboração própria)</b></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyPjv4KlzISyZNryNapbYq3fxQi2N29X9mIjsPLXXS6xHCHrrrEpSNmYYl4ozoK2ERzQsCr04mzXCpc9m1KK3xSQevsyKriFxwG3Ye0-VQdXbbcSSG2ebLgCNrNZSKkuuP8_s28qlDrfU/s1600/foto2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="386" data-original-width="334" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyPjv4KlzISyZNryNapbYq3fxQi2N29X9mIjsPLXXS6xHCHrrrEpSNmYYl4ozoK2ERzQsCr04mzXCpc9m1KK3xSQevsyKriFxwG3Ye0-VQdXbbcSSG2ebLgCNrNZSKkuuP8_s28qlDrfU/s400/foto2.jpg" width="345" /></a></div>
<br />
<b><span style="font-size: large;">O código fonte:</span></b><br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: "andale mono" , "lucida console" , "monaco" , "fixed" , monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code>/*
* Author: Aguivone Moretti Fógia
* descrição: Multimetro que mede fator de potencia
* freq.de clock: 20MHZ
* data:08/12/2019
* testado fisicamente.
*/
#include "MCC18_18F4550.h"
#include "tempo_20mhz.h"
#include "LCD_4bits.h"
unsigned char Buffer_lcd[16]; // variavel usada pelo LCD
//variaveia globais para cpp1////////////////////////////////
unsigned int tempo_pulso=0;
unsigned int periodo=0;
unsigned char estado_amostras=0;
unsigned int tempo_ccp1=0;
//variaveis globais para ADC
unsigned char modo_tensao=0;//padrão CC
unsigned char descarta_FP=0;
float PM[5];//pega os ultimos 5 valores para potencia media DC
//defines usados
#define sin1_FP PORTCbits.RC4
#define sin2_FP PORTCbits.RC5
#define BOT_SEL PORTEbits.RE2
#define LED_STATUS PORTEbits.RE1
#define LED_MODO PORTEbits.RE0 //sinaliza modo AC e pisca a cada pulso de clock
//equações usadas
#define EQ_TENSAO (float)((lido_adc*35.2)/1023) //para divisor de 10K - 1K - Máx: 33V
#define EQ_CORRENTE (float)((lido_adc*5.0)/1023)
#define EQ_FP (float)((90.0*tempo_pulso)/periodo) //fator de potencia
#define EQ_FREQ (float)((1/(0.0000002*periodo*2.0))/8)//para 20Mhz - divide por 8 pois o T1CON está assim//frequencia
unsigned char sinal_FP= ' ';
////prototipos de funções ///////////////////////
void Inic_Regs (void);
void Read_ADC_DC(void);
void Read_ADC_CA(void);
void high_isr (void);
void Tela_inicial(unsigned char modo);
void verifica_botao(void);
//void low_isr (void);
//vetor de interrupção de alta prioridade
#pragma code high_vector=0x08
void interrupt_at_high_vector(void)
{
_asm GOTO high_isr _endasm //desvia programa para rotina de tratamento da interrupção
}
#pragma code
//*****************************
//Rotina de tratamento de interrupção (ISR)
#pragma interrupt high_isr
void high_isr (void)
{
if(PIR1bits.CCP1IF)
{
if(estado_amostras==0)
{//prepara contagem
TMR1L =0;//Zera timer 1
TMR1H =0;//Zera timer 1
if((sin2_FP)&&(sin1_FP))//se os dois estiver em um indica que está na descida do sinal e isso gera imprecisão
{//descarta
estado_amostras=0;
}
else
{//sinal subindo
if(sin1_FP)
{sinal_FP= '-';}
else{sinal_FP= '+';}
CCP1CON = 0X04;//captura a cada borda de descida
estado_amostras=1;
}
}
else
{
if(estado_amostras==1)
{//borda de descida - pega valor do pulso
tempo_pulso =((((unsigned int)CCPR1H)<<8)|CCPR1L);
estado_amostras = 2;
CCP1CON = 0X05;//captura a cada borda de subida
_delay_ms(1);//
if((sin2_FP==0)||(sin1_FP==0))//se os dois estiver em zero indica que está na descida do sinal e isso gera imprecisão
{//sinal invalido
estado_amostras = 0;
}
}
else
{//fim de coleta
if(estado_amostras == 2)
{
periodo =((((unsigned int)CCPR1H)<<8)|CCPR1L);
estado_amostras=3;//pra sinalizar fim de amostragem
PIE1bits.CCP1IE = 0;//não precisa mais das interrupçõe do CCP1
PORTDbits.RD3 = 0;
}
}
}
PIR1bits.CCP1IF = 0;//limpa flag
}
}
/////rotina principal/////////////////////////////
void main()
{
Inic_Regs();
inicializa_LCD();
Tela_inicial('D');
modo_tensao=0;
while(1)
{
verifica_botao();
if(modo_tensao)//modo AC
{
Read_ADC_CA();
tempo_ccp1=0;
estado_amostras=0;//libera nova coleta
PIE1bits.CCP1IE = 1;//liga interrupcão do ccp1
while(tempo_ccp1<100)//demora em media 100ms
{
if(estado_amostras==3)
{//tem coleta mostra o valor
float temp;
unsigned int parte_inteira; //declaração de variável local
unsigned int parte_decimal; //declaração de variável local
if(descarta_FP == 0)
{
temp=EQ_FP;//pois divide por (2*semicilo)
}
else
{
temp=0;//tensão ou corrente sem leitura
}
parte_inteira = (int)temp; //pega parte inteira do valor
parte_decimal =(unsigned int)((temp - parte_inteira) * 10); //resgata parte fracionária do valor ,2 casa decimais
sprintf(Buffer_lcd,"%c%u.%u",sinal_FP,parte_inteira,parte_decimal); //converte valor em string e armazena no vetor buf
impri_lcd(4,'3');
if(descarta_FP == 0)
{
temp=(EQ_FREQ);//para 20Mhz - divide por 8 pois o T1CON está assim
}
else
{
temp=(EQ_FREQ*2);//tensão ou corrente sem leitura -> onda fica igual a corrente ou a tensão
}
parte_inteira = (int)temp; //pega parte inteira do valor
parte_decimal =(unsigned int)((temp - parte_inteira) * 10); //resgata parte fracionária do valor ,2 casa decimais
sprintf(Buffer_lcd,"%u.%u",parte_inteira,parte_decimal); //converte valor em string e armazena no vetor buf
impri_lcd(3,'4'); //frequencia
_delay_ms(250);//lê a cada 0.5s
PIE1bits.CCP1IE = 1;//liga interrupcão do ccp1
_delay_us(10);//espera tempo para CCP1 se preparar
estado_amostras=0;//libera nova coleta
}
if(estado_amostras==2)
{
if((sin2_FP==0)||(sin1_FP==0))//se os dois estiver em um indica que está na descida do sinal
//(do segundo sinal) e isso gera imprecisão
{//sinal invalido
estado_amostras = 0;
}
}
_delay_ms(1);
tempo_ccp1++;
}//fim do laçõ ccp1
PIE1bits.CCP1IE = 0;//desliga interrupcão do ccp1 pra garantir
}
else//modo DC
{
Read_ADC_DC();
}
_delay_ms(500);
LED_STATUS=~LED_STATUS;
}//fim do while
}//fim do laço main
/////////////////////////////////////////////////////////////////////////////////
void verifica_botao(void)
{
if(!BOT_SEL)//testa botão de seleção -> AC/DC
{
_delay_ms(200);//debouce
if(!BOT_SEL)
{
if(modo_tensao)
{//modo DC
Tela_inicial('D');
modo_tensao=0;
LED_MODO =0;
PIE1bits.CCP1IE = 0;//desliga interrupcão do ccp1
}
else
{//modo AC
Tela_inicial('A');
LED_MODO =1;
modo_tensao=1;
estado_amostras=0;//libera nova coleta
PIE1bits.CCP1IE = 1;//liga interrupcão do ccp1
}
_delay_ms(200);//debouce
}
}
}
void Inic_Regs(void)
{
TRISA = 0x03; //PORTA saida, exceto RA0(tensão) e RA1(corrente) será usado para entradas analogicas
TRISB = 0x00; //PORTB saida
TRISC = 0x34; //PORTC saida e pino c2 entrada ccp1,pino C4 e C5 informa sinal do fator de potencia
TRISD = 0x00; //PORTD saida
TRISE = 0x04; //PORTE saida,botão no RE2
PORTA = 0x00; //limpa PORTA
PORTB = 0x00; //limpa PORTB
PORTC = 0x00; //limpa PORTC
PORTD = 0x00; //limpa PORTD:
PORTE = 0x00; //limpa PORTE
//********************************************************************
ADCON0 = 0X01; //liga modulo analogico digital e configura entrada de sinal para o pino RA0(AN0)
ADCON1=0b00001011; // Vref- seta ao Vss e Vref+ ao Vdd , somente Ra0 ate Ra4 analogico
//ADCON2 = 0b101101010; // justificado a direita // clk Fosc/32
ADCON2=0b10101001;
// tempo de aquisição 12TAD(assim funciona pra qualquer cristal, porem fica mais lento, se precisar deve ser ajustado)
INTCON=0b11000000;//liga interrupção de periferico e geral
T3CON = 0;//mantem o ccp1 e ccp2 ligado ao timer1
T1CON = 0b10110001;//modo de 16bits - fosc/dividido por 8 - timer ligado (lé no maximo500khz para clock de 8MHZ))
CCP1CON = 0b00000101;//captura a cada borda de subida
IPR1= 0X05;//coloca estouro de timer e ccp1 como alta prioridade
PIR1bits.CCP1IF = 0;//limpa flag do ccp1
PIE1bits.CCP1IE = 1;//liga interrupcão do ccp1
PIE1bits.TMR1IE = 0;//deixa interrupção de timer desligado(não vai prescisar))
}
//configura tela inicial
void Tela_inicial(unsigned char modo)
{
if(modo == 'A')
{
sprintf(Buffer_lcd,"Vrms= V -> AC ");
impri_lcd(0,'1');
sprintf(Buffer_lcd,"Vp= V Ip= A");
}else
{
sprintf(Buffer_lcd,"Multimetro -> DC ");
impri_lcd(0,'1');
sprintf(Buffer_lcd,"Vdc= V Idc= A");
}
impri_lcd(0,'2');
sprintf(Buffer_lcd,"Fp= Pi= W");
impri_lcd(0,'3');
sprintf(Buffer_lcd,"F= hz Pm= W");
impri_lcd(0,'4');
}
//faz leitura de amostras em corrente continua
void Read_ADC_CA(void)
{
unsigned int lido_adc;
float temp,tensao;
unsigned int parte_inteira; //declaração de variável local
unsigned int parte_decimal; //declaração de variável local
unsigned int hist_leitura[5]={0,0,0,0,0};//pega 5 amostras para não estourar a variavel
unsigned char fim_captura=245;//esse valor pede pra encontrar quando a onda está subindo
unsigned int num_de_tentativas = 0;
descarta_FP=0;//libera leitura do fator de potencia
//////////Lê tensão////////////////////
ADCON0 = 0X01; //RA0
_delay_us(40);//espera tensão estabilizar
hist_leitura[0] = 0XFFFF;//coloca valor maximo para garantir
while((fim_captura == 245)&&(modo_tensao==1))
{
ADCON0bits.GO = 1; //RA1 habilita conversão
while (ADCON0bits.DONE == 1); //espera finalizar leitura
hist_leitura[1] = (((int)ADRESH)<<8)|(ADRESL);
if((hist_leitura[1]>hist_leitura[0])&&(hist_leitura[1]<10))//pra garantir que está no começo da onda
{
fim_captura = 0;//finalizou processo onda está subindo
}
hist_leitura[0]= hist_leitura[1];//recebe valor atual
verifica_botao();
num_de_tentativas++;
if(num_de_tentativas>1000)//anti travamento
{
fim_captura = 253;//indica que não leu tensão
}
}
while((fim_captura < 250)&&(modo_tensao==1))
{
ADCON0bits.GO = 1; //RA1 habilita conversão
while (ADCON0bits.DONE == 1); //espera finalizar leitura
hist_leitura[fim_captura] = (((int)ADRESH)<<8)|(ADRESL);
if(fim_captura == 0)
{
if(hist_leitura[0]<hist_leitura[4])
{
fim_captura = 252;//finalizou processo
lido_adc = ((hist_leitura[4]+hist_leitura[3]+hist_leitura[2])/3);//tira uma média das 3 ultimas amostras
}
}
else
{
if(hist_leitura[fim_captura]<hist_leitura[fim_captura-1])
{
unsigned char conta = 0;
lido_adc =0;
while(conta<5)//0 a 4
{
if(conta != fim_captura)//ignora valor atual
{
lido_adc = lido_adc + hist_leitura[conta];
}
conta++;
}
lido_adc = lido_adc/4;//tira media
fim_captura = 252;//finalizou processo
}
}
if(fim_captura<250)
{
fim_captura++;
if(fim_captura > 4)
{
fim_captura = 0;
}
}
verifica_botao();
}
if(fim_captura == 253)
{
temp = 0;
descarta_FP=1;
}else
{
temp = EQ_TENSAO ;
}
//*******************************************************************
if(temp < 0) //valor é menor que 0?
{ temp = temp * (-1); //inverte o sinal de float
}
//*******************************************************************
parte_inteira = (int)temp; //pega parte inteira do valor
tensao =temp;
//*******************************************************************
parte_decimal =(unsigned int)((temp - parte_inteira) * 100); //resgata parte fracionária do valor ,2 casa decimais
Tela_inicial('A');//limpa campos
sprintf(Buffer_lcd,"%u.%u",parte_inteira,parte_decimal); //converte valor em string e armazena no vetor buf
impri_lcd(3,'2');
temp=(tensao/1.4142);
parte_inteira = (int)temp; //pega parte inteira do valor
//*******************************************************************
parte_decimal =(unsigned int)((temp - parte_inteira) * 100); //resgata parte fracionária do valor ,2 casa decimais
sprintf(Buffer_lcd,"%u.%u",parte_inteira,parte_decimal); //converte valor em string e armazena no vetor buf
impri_lcd(5,'1');
//////////Lê corrente////////////////////
hist_leitura[0]=0;
hist_leitura[1]=0;
hist_leitura[2]=0;
hist_leitura[3]=0;
hist_leitura[4]=0;
ADCON0 = 0X05; ///liga RA1
_delay_us(40);//espera tensão estabilizar
fim_captura = 245;
hist_leitura[0] = 0XFFFF;//coloca valor maximo para garantir
num_de_tentativas=0;
while((fim_captura == 245)&&(modo_tensao==1))
{
ADCON0bits.GO = 1; //RA1 habilita conversão
while (ADCON0bits.DONE == 1); //espera finalizar leitura
hist_leitura[1] = (((unsigned int)ADRESH)<<8)|(ADRESL);
if((hist_leitura[1]>hist_leitura[0])&&(hist_leitura[1]<10))//pra garantir que está no começo da onda
{
fim_captura = 0;//finalizou processo onda está subindo
}
hist_leitura[0]= hist_leitura[1];//recebe valor atual
verifica_botao();
num_de_tentativas++;
if(num_de_tentativas>1000)//anti travamento
{
fim_captura = 253;//indica que não leu tensão
}
}
while((fim_captura < 250)&&(modo_tensao==1))
{
ADCON0bits.GO = 1; //RA0 habilita conversão
while (ADCON0bits.DONE == 1); //espera finalizar leitura
hist_leitura[fim_captura] = (((int)ADRESH)<<8)|(ADRESL);
if(fim_captura == 0)
{
if(hist_leitura[0]<hist_leitura[4])
{
fim_captura = 252;//finalizou processo
lido_adc = ((hist_leitura[4]+hist_leitura[3]+hist_leitura[2])/3);//tira uma média das 3 ultimas amostras
}
}
else
{
if(hist_leitura[fim_captura]<hist_leitura[fim_captura-1])
{
unsigned char conta = 0;
lido_adc =0;
while(conta<5)//0 a 4
{
if(conta != fim_captura)//ignora valor atual
{
lido_adc = lido_adc + hist_leitura[conta];
}
conta++;
}
lido_adc = lido_adc/4;//tira media
fim_captura = 252;//finalizou processo
}
}
if(fim_captura<250)
{
fim_captura++;
if(fim_captura > 4)
{
fim_captura = 0;
}
}
verifica_botao();
}
if(fim_captura == 253)
{
temp = 0;
descarta_FP=1;
}else
{
temp = EQ_CORRENTE;
}
//*******************************************************************
if(temp < 0) //valor é menor que 0?
{ temp = temp * (-1); //inverte o sinal de float
}
//*******************************************************************
parte_inteira = (int)temp; //pega parte inteira do valor
//*******************************************************************
parte_decimal =(unsigned int)((temp - parte_inteira) * 100); //resgata parte fracionária do valor ,2 casa decimais
sprintf(Buffer_lcd,"%u.%u",parte_inteira,parte_decimal); //converte valor em string e armazena no vetor buf
impri_lcd(14,'2');
temp = tensao*temp;
parte_inteira = (int)temp; //pega parte inteira do valor
parte_decimal =(unsigned int)((temp - parte_inteira) * 10);//somente uma casa decimal
sprintf(Buffer_lcd,"%u.%u",parte_inteira,parte_decimal); //converte valor em string e armazena no vetor buf
impri_lcd(14,'3');
//potencia media ac
temp = temp/2;
parte_inteira = (int)temp; //pega parte inteira do valor
parte_decimal =(unsigned int)((temp - parte_inteira) * 10);//somente uma casa decimal
sprintf(Buffer_lcd,"%u.%u",parte_inteira,parte_decimal); //converte valor em string e armazena no vetor buf
impri_lcd(14,'4');
}
//faz leitura de amostras em corrente continua
void Read_ADC_DC(void)
{
unsigned int lido_adc;
float temp,tensao;
unsigned int parte_inteira; //declaração de variável local
unsigned int parte_decimal; //declaração de variável local
unsigned int amostras[5];
//////////Lê tensão////////////////////
ADCON0 = 0X01;//RA0
_delay_us(40);//espera tensão estabilizar
lido_adc = 0;
while(lido_adc<5)
{
ADCON0bits.GO = 1; //RA0
while (ADCON0bits.DONE == 1); //espera finalizar leitura
amostras[lido_adc] = (((unsigned int)ADRESH)<<8)|(ADRESL);
lido_adc++;
}
temp = amostras[0] +amostras[1] +amostras[2] +amostras[3] +amostras[4];
lido_adc =(unsigned int)temp/5;
temp = EQ_TENSAO;
Tela_inicial('D');//limpa campos
//*******************************************************************
if(temp < 0) //valor é menor que 0?
{ temp = temp * (-1); //inverte o sinal de float
}
//*******************************************************************
parte_inteira = (int)temp; //pega parte inteira do valor
tensao =temp;
//*******************************************************************
parte_decimal =(unsigned int)((temp - parte_inteira) * 100); //resgata parte fracionária do valor ,2 casa decimais
sprintf(Buffer_lcd,"%u.%u",parte_inteira,parte_decimal); //converte valor em string e armazena no vetor buf
impri_lcd(4,'2');
//////////Lê corrente ////////////////////
ADCON0 = 0X05; ///liga RA1
_delay_us(40);//espera tensão estabilizar
lido_adc = 0;
while(lido_adc<5)
{
ADCON0bits.GO = 1; //RA0
while (ADCON0bits.DONE == 1); //espera finalizar leitura
amostras[lido_adc] = (((unsigned int)ADRESH)<<8)|(ADRESL);
lido_adc++;
}
temp = amostras[0] +amostras[1] +amostras[2] +amostras[3] +amostras[4];
lido_adc =(unsigned int)temp/5;
temp = EQ_CORRENTE;
//*******************************************************************
if(temp < 0) //valor é menor que 0?
{ temp = temp * (-1); //inverte o sinal de float
}
//*******************************************************************
parte_inteira = (int)temp; //pega parte inteira do valor
//*******************************************************************
parte_decimal =(unsigned int)((temp - parte_inteira) * 100); //resgata parte fracionária do valor ,2 casa decimais
sprintf(Buffer_lcd,"%u.%u",parte_inteira,parte_decimal); //converte valor em string e armazena no vetor buf
impri_lcd(15,'2');
temp = tensao*temp;
parte_inteira = (int)temp; //pega parte inteira do valor
parte_decimal =(unsigned int)((temp - parte_inteira) * 10);//somente uma casa decimal
sprintf(Buffer_lcd,"%u.%u",parte_inteira,parte_decimal); //converte valor em string e armazena no vetor buf
impri_lcd(14,'3');
PM[3]= PM[4];
PM[2]= PM[3];
PM[1]= PM[2];
PM[0]= PM[1];
PM[4]= temp+ PM[0]+PM[1]+ PM[2]+ PM[3];
tensao =temp;
temp= PM[4]/5;//potencia media reaproveitando variavel
PM[4]=tensao;
parte_inteira = (int)temp; //pega parte inteira do valor
parte_decimal =(unsigned int)((temp - parte_inteira) * 10);//somente uma casa decimal
sprintf(Buffer_lcd,"%u.%u",parte_inteira,parte_decimal); //converte valor em string e armazena no vetor buf
impri_lcd(14,'4');
}
</code></pre>
<br />
Arquivo MCC18_18F4550_H.h<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: "andale mono" , "lucida console" , "monaco" , "fixed" , monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code>
/*
* File: main_lcd.c
* Author: aguivone
* descrição: como usar display lcd no modo 4 bits
* freq.de clock: 20MHZ
* data:31/10/2019
* não esquecer de coloca o arquivo MCC18_18F4550.h
*/
#include <stdio.h>
#include <p18f4550.h>
#include <string.h>
#include <delays.h>
#ifndef __MCC18_18F4550___H
#define __MCC18_18F4550___H
// CONFIG1L
#pragma config PLLDIV = 1 // PLL Prescaler Selection bits (No prescale (4 MHz oscillator input drives PLL directly))
#pragma config CPUDIV = OSC1_PLL2// System Clock Postscaler Selection bits ([Primary Oscillator Src: /1][96 MHz PLL Src: /2])
#pragma config USBDIV = 1 // USB Clock Selection bit (used in Full-Speed USB mode only; UCFG:FSEN = 1) (USB clock source comes directly from the primary oscillator block with no postscale)
// CONFIG1H
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator (HS))
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
#pragma config IESO = OFF // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)
// CONFIG2L
#pragma config PWRT = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOR = OFF // Brown-out Reset Enable bits (Brown-out Reset disabled in hardware and software)
#pragma config BORV = 3 // Brown-out Reset Voltage bits (Minimum setting 2.05V)
#pragma config VREGEN = OFF // USB Voltage Regulator Enable bit (USB voltage regulator disabled)
// CONFIG2H
#pragma config WDT = OFF // Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit))
#pragma config WDTPS = 32768 // Watchdog Timer Postscale Select bits (1:32768)
// CONFIG3H
#pragma config CCP2MX = ON // CCP2 MUX bit (CCP2 input/output is multiplexed with RC1)
#pragma config PBADEN = ON // PORTB A/D Enable bit (PORTB<4:0> pins are configured as analog input channels on Reset)
#pragma config LPT1OSC = OFF // Low-Power Timer 1 Oscillator Enable bit (Timer1 configured for higher power operation)
#pragma config MCLRE = ON // MCLR Pin Enable bit (MCLR pin enabled; RE3 input pin disabled)
// CONFIG4L
#pragma config STVREN = ON // Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
#pragma config LVP = OFF // Single-Supply ICSP Enable bit (Single-Supply ICSP disabled)
#pragma config ICPRT = OFF // Dedicated In-Circuit Debug/Programming Port (ICPORT) Enable bit (ICPORT disabled)
#pragma config XINST = OFF // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))
// CONFIG5L
#pragma config CP0 = OFF // Code Protection bit (Block 0 (000800-001FFFh) is not code-protected)
#pragma config CP1 = OFF // Code Protection bit (Block 1 (002000-003FFFh) is not code-protected)
#pragma config CP2 = OFF // Code Protection bit (Block 2 (004000-005FFFh) is not code-protected)
#pragma config CP3 = OFF // Code Protection bit (Block 3 (006000-007FFFh) is not code-protected)
// CONFIG5H
#pragma config CPB = OFF // Boot Block Code Protection bit (Boot block (000000-0007FFh) is not code-protected)
#pragma config CPD = OFF // Data EEPROM Code Protection bit (Data EEPROM is not code-protected)
// CONFIG6L
#pragma config WRT0 = OFF // Write Protection bit (Block 0 (000800-001FFFh) is not write-protected)
#pragma config WRT1 = OFF // Write Protection bit (Block 1 (002000-003FFFh) is not write-protected)
#pragma config WRT2 = OFF // Write Protection bit (Block 2 (004000-005FFFh) is not write-protected)
#pragma config WRT3 = OFF // Write Protection bit (Block 3 (006000-007FFFh) is not write-protected)
// CONFIG6H
#pragma config WRTC = OFF // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) are not write-protected)
#pragma config WRTB = OFF // Boot Block Write Protection bit (Boot block (000000-0007FFh) is not write-protected)
#pragma config WRTD = OFF // Data EEPROM Write Protection bit (Data EEPROM is not write-protected)
// CONFIG7L
#pragma config EBTR0 = OFF // Table Read Protection bit (Block 0 (000800-001FFFh) is not protected from table reads executed in other blocks)
#pragma config EBTR1 = OFF // Table Read Protection bit (Block 1 (002000-003FFFh) is not protected from table reads executed in other blocks)
#pragma config EBTR2 = OFF // Table Read Protection bit (Block 2 (004000-005FFFh) is not protected from table reads executed in other blocks)
#pragma config EBTR3 = OFF // Table Read Protection bit (Block 3 (006000-007FFFh) is not protected from table reads executed in other blocks)
// CONFIG7H
#pragma config EBTRB = OFF // Boot Block Table Read Protection bit (Boot block (000000-0007FFh) is not protected from table reads executed in other blocks)
#endif /* __MCC18_18F4550___H */
</code></pre>
<br />
Arquivo tempo.h<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: "andale mono" , "lucida console" , "monaco" , "fixed" , monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code>/*
* File: tempo.h
* Author: aguiv
*
* Created on 8 de Novembro de 2019, 15:54
*/
#include <delays.h>
#ifndef TEMPO_H
#define TEMPO_H
void _delay_us(int valor);
void _delay_ms(int valor);
#include "tempo_20MHz.c"
#endif /* TEMPO_H */
</code></pre>
<br />
Aquivo tempo_20MHz.c<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: "andale mono" , "lucida console" , "monaco" , "fixed" , monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code>/*
* File: tempo.c
* Author: aguivone
*
* Created on 8 de Novembro de 2019, 16:02
*/
// usado para criar funções de tempo
void _delay_us(int valor)
{
while(valor>0)
{
Nop();Nop();Nop();Nop();Nop();//Nop();Nop();Nop();
//para 32-> 8 ciclos ,20MHZ -> 5 ciclos dão 1us , para 8mhz -> 2ciclo, para 4mhz ->>1ciclo
valor--;
}
}
void _delay_ms(int valor)
{
while(valor>0)
{
Delay1KTCYx(5);
//para 32MHZ -> coloque 8
//para 20MHZ -> 5000 ciclos dão 1ms -> coloque 5
// 8mhz -> 2000 -> coloque 2
// 4mhz -> 1000 -> coloque 1
valor--;
}
}
//delay de segundos
void _delay_s(int valor)
{
while(valor>0)
{
_delay_ms(1000);
valor--;
}
}
</code></pre>
<br />
Aquivo da biblioteca do LCD - LCD_4bits.h<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code><span style="font-family: "andale mono" , "lucida console" , "monaco" , "fixed" , monospace; font-size: 12px;">/*
* File: LCD_4bits.h
* Author: aguivone
*
* Created on 8 de Novembro de 2019, 16:07
*/
//biblioteca para acessar o display de LCD no modo 4 bits
//o pino r/w é conectado ao terra pois não é feita nenhuma leitura no display
//configuração:
//
// pino display / pino da porta selecionada
//
// D4 = bit 0 da porta
// D5 = bit 1 da porta
// D6 = bit 2 da porta
// D7 = bit 3 da porta
//
// RS = bit 4 da porta
// EN = bit 5 da porta
//
#include <stdio.h>
#include <p18f4550.h> //se for necessario troque este
#include <string.h>
#ifndef LCD_4BITS_H
#define LCD_4BITS_H
//variaveis locais
extern unsigned char Buffer_lcd[16]; //lembre de criar esta variavel no codigo principal
/////////////////////////////////////pinos do microcontrolador usado no lcd ///////////////////////////////////////////
//define qual porta vai usar neste caso port D
///acepic////////////
/*
#define BIT_0 PORTDbits.RD4
#define BIT_1 PORTDbits.RD5
#define BIT_2 PORTDbits.RD6
#define BIT_3 PORTDbits.RD7
#define RS PORTEbits.RE0
#define EN PORTEbits.RE1
*/
//prototipo montado na protoboard/////////
#define BIT_0 PORTDbits.RD4
#define BIT_1 PORTDbits.RD5
#define BIT_2 PORTDbits.RD6
#define BIT_3 PORTDbits.RD7
#define RS PORTDbits.RD0
#define EN PORTDbits.RD1
union{
unsigned char VALOR;
struct{
unsigned b0:1;
unsigned b1:1;
unsigned b2:1;
unsigned b3:1;
unsigned b4:1;
unsigned b5:1;
unsigned b6:1;
unsigned b7:1;
};
}LCD;
void porta_lcd(unsigned char ucDado);
void escreve_LCD(unsigned char ucDado,unsigned char ucVlr);
void inicializa_LCD(void);
void impri_lcd(int iPos_inicial ,unsigned char ucLinha);
void impri_caracter_lcd(unsigned char ucCaracter,int iPos_inicial ,unsigned char ucLinha);
#include "LCD_4bits.c"
#endif /* LCD_4BITS_H */
</span><span style="font-family: "arial" , "helvetica" , sans-serif;">
</span></code></pre>
<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;">Até a próxima! obrigado!</span><br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5944573230336506830.post-21918783674768114282019-12-08T14:11:00.001-08:002019-12-08T15:37:49.781-08:00Usando lcd no modo 4 bits, Wattímetro,voltímetro e amperímetro.<span style="font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "arial" , "helvetica" , sans-serif;"> Olá pessoal que acompanha o blog!</span><br />
<div style="text-align: justify;">
<span style="font-family: "arial" , "helvetica" , sans-serif;"> Neste exemplo os conceitos abordados, no uso do compilador C18, serão o uso do conversor analógico digital e a implementação da comunicação em 4 bits utilizando LCD(funciona para 16X2 ou 4X20). A intenção é criar wattímetro que por consequência deve ler tensão e corrente, lembre-se que este circuito serve apenas para corrente continua. </span></div>
<br />
<span style="font-size: large;"><b>O código fonte :</b></span><br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: "andale mono" , "lucida console" , "monaco" , "fixed" , monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code>
/*
* File: main_lcd.c
* Author: aguivone
* descrição: como usar display lcd no modo 4 bits no compilador C18
* freq.de clock: 20MHZ
* data:08/12/2019
*/
#include <stdio.h>
#include <p18f4550.h>
#include <string.h>
#include <delays.h>
//variaveis locais
unsigned char Buffer_lcd[16];
/////////////////////////////////////pinos do microcontrolador usado no lcd ///////////////////////////////////////////
//o pino r/w é conectado ao terra pois não é feita nenhuma leitura no display
//configuração:
//
// pino display / pino da porta selecionada
//
// D4 = bit 0 da porta
// D5 = bit 1 da porta
// D6 = bit 2 da porta
// D7 = bit 3 da porta
//
// RS = bit 4 da porta
// EN = bit 5 da porta
//
//define qual porta vai usar neste caso port D
#define BIT_0 PORTDbits.RD0
#define BIT_1 PORTDbits.RD1
#define BIT_2 PORTDbits.RD2
#define BIT_3 PORTDbits.RD3
#define RS PORTDbits.RD4
#define EN PORTDbits.RD5
//////////////usado para escrever em cada bit da porta com o lcd.
union{
unsigned char VALOR;
struct{
unsigned b0:1;
unsigned b1:1;
unsigned b2:1;
unsigned b3:1;
unsigned b4:1;
unsigned b5:1;
unsigned b6:1;
unsigned b7:1;
};
}LCD;
////prototipos de funções //////////////////////////////////////////////////////////////////
void Inic_Regs (void);
void _delay_us(int valor);
void _delay_ms(int valor);
unsigned char valor_bit(char cDa,char cBit);
void porta_lcd(unsigned char ucDado);
void escreve_LCD(unsigned char ucDado,unsigned char ucVlr);
void inicializa_LCD(void);
void impri_lcd(int iPos_inicial ,unsigned char ucLinha);
void impri_caracter_lcd(unsigned char ucCaracter,int iPos_inicial ,unsigned char ucLinha);
void Read_ADC (void);
////////função principal /////////////////////////////////////////////////////////////////////
void main()
{
Inic_Regs();
inicializa_LCD();
sprintf(Buffer_lcd,"Volts Corr. Pot.");
impri_lcd(0,'1');
sprintf(Buffer_lcd," 0 0 0 ");
impri_lcd(0,'2');
while(1)
{
Read_ADC();
_delay_ms(300);//lê a cada 2s
}//fim do laçõ while
}//fim do laço main
/////////////inicializa as portas //////////////////////////////////////
void Inic_Regs(void)
{
TRISA = 0x03; //PORTA saida, exceto RA0(tensão) e RA1(corrente) será usado para entradas analogicas
TRISB = 0x00; //PORTB saida
TRISC = 0x00; //PORTC saida
TRISD = 0x00; //PORTD saida
TRISE = 0x00; //PORTE saida
ADCON0 = 0X01; //liga modulo analogico digital e configura entrada de sinal para o pino RA0(AN0)
ADCON1=0b00001110; // Vref- seta ao Vss e Vref+ ao Vdd , somente Ra0 e Ra1 analogico
//ADCON2 = 0b101101010; // justificado a direita // clk Fosc/32
ADCON2=0b10101001;
// tempo de aquisição 12TAD(assim funciona pra qualquer cristal, porem fica mais lento, se precisar deve ser ajustado)
PORTA = 0x00; //limpa PORTA
PORTB = 0x00; //limpa PORTB
PORTC = 0x00; //limpa PORTC
PORTD = 0x00; //limpa PORTD:
PORTE = 0x00; //limpa PORTE
//********************************************************************
}
//////////////funções de tempo ///////////////////////////////////////////////////////////////
//===================================================================================
//Função: _delay_us())
//Parâmetros: inteiro
//Retorno: não tem retorno.
//Descrição: perde tempo em microsegundoas.
//===================================================================================
void _delay_us(int valor)
{
while(valor>0)
{
Nop();Nop();Nop();Nop();Nop();//para 20MHZ -> 5 ciclos dão 1us// para 8mhz -> 0,5 -> 2 ciclos
valor--;
}
}
//===================================================================================
//Função: _delay_ms())
//Parâmetros: inteiro
//Retorno: não tem retorno.
//Descrição: perde tempo em milisegundos.
//===================================================================================
void _delay_ms(int valor)
{
while(valor>0)
{
Delay1KTCYx(5);//para 20MHZ -> 5000 ciclos dão 1ms -> [5]// 8mhz -> 2000 -> [2].
valor--;
}
}
//===================================================================================
//Função: _porta_lcd
//Parâmetros: char cDado
//Retorno: não tem retorno.
//Descrição: envia um comando de configuração veja que os tempos devem ser maiores .
//===================================================================================
void porta_lcd(unsigned char ucDado)//byte a ser enviado
{
LCD.VALOR = ucDado;
//envia os bytes mais altos
RS = 0; //habilita comandos
BIT_0 = LCD.b4;
BIT_1 = LCD.b5;
BIT_2 = LCD.b6;
BIT_3 = LCD.b7;
EN = 1;
_delay_ms(15);
EN = 0;
_delay_ms(15);
//envia os bytes mais baixos
BIT_0 = LCD.b0;
BIT_1 = LCD.b1;
BIT_2 = LCD.b2;
BIT_3 = LCD.b3;
EN = 1;
_delay_ms(15);
EN = 0;
_delay_ms(15);
}
//===================================================================================
//Função: _escreve_LCD
//Parâmetros: char cDado,
// int iVlr
//Retorno: não tem retorno.
//Descrição: escreve um caracter no display ou envia um comando.
//===================================================================================
void escreve_LCD(unsigned char ucDado,unsigned char ucVlr)//byte a ser enviado ,escreve caracter(0) ou comando(1)
{
if(ucVlr == '0')
{
RS = 0; //habilita comandos
}
else
{
RS = 1; //habilita dados
}
LCD.VALOR = ucDado;
_delay_us(5);//tempo para display atualizar
//envia os bytes mais altos
BIT_0 = LCD.b4;
BIT_1 = LCD.b5;
BIT_2 = LCD.b6;
BIT_3 = LCD.b7;
EN = 1;
_delay_us(50);//tempo estabilizar o pino
EN = 0;
_delay_us(50);//tempo estabilizar o pino
//envia os bytes mais baixos
BIT_0 = LCD.b0;
BIT_1 = LCD.b1;
BIT_2 = LCD.b2;
BIT_3 = LCD.b3;
EN = 1;
_delay_us(50);//tempo estabilizar o pino
EN = 0;
_delay_us(200);
}
//===================================================================================
//Função: _inicializa_LCD
//Parâmetros: não tem
//Retorno: não tem retorno.
//Descrição: faz a configuração inicial do display, verifique os datasheet dos fabricantes.
//===================================================================================
void inicializa_LCD(void)
{
EN = 0;
_delay_ms(15);//tempo para estabilizar a tensão e preparar o display
porta_lcd(0X02);//cursor home - posiciona no inicio
porta_lcd(0X28);//configura para usar modo 4bits,manda usar 2 linhas e matriza de caracter de 5X7.
porta_lcd(0X01);//limpa display
porta_lcd(0X06);//deslocamento do cursor para direita ,sem deslocamento de caracter automaticamente.
porta_lcd(0X0C);//liga display :0XC0 -> cursor desligado, 0X0F ->intermitente,0E -> fixo ,08 -> desligado.
RS = 1; //habilita dados
}
//===================================================================================
//Função: _impri_caracter_lcd
//Parâmetros: char cCaracter, -> caracter a ser escrito
// int iPos_inicial, indica em qual posição deve colocar o caracter
// int iLinha, indica qual o a linha do display vai usar
//Retorno: não tem retorno.
//Descrição: usada para escrever um caracter em um display de lcd.
//===================================================================================
void impri_caracter_lcd(unsigned char ucCaracter,int iPos_inicial ,unsigned char ucLinha)
{
switch(ucLinha)
{
case '1' :{escreve_LCD(0X80 + iPos_inicial,'0');}break;//linha1
case '2' :{escreve_LCD(0XC0 + iPos_inicial,'0');}break;//linha2
case '3' :{escreve_LCD(0X94 + iPos_inicial,'0');}break;//linha3
case '4' :{escreve_LCD(0XD4 + iPos_inicial,'0');}//linha4
}
escreve_LCD(ucCaracter,'1');
}
//===================================================================================
//Função: _impri_lcd
//Parâmetros: const char *ccFrase, mensagem que deve ser escrita usando "(aspas) para delimitar o tamanho
// int iPos_inicial, indica em qual posição deve começar a colocar a mensagem
// int iLinha, indica qual o a linha do display vai usar
//Retorno: não tem retorno.
//Descrição: usada para escrever uma string(vetor de caracteres) em um display de lcd com parametro string.
//===================================================================================
//void impri_lcd(unsigned char frase[],int iPos_inicial ,unsigned char ucLinha)// cuidado para não exceder a quantidade de caracter
void impri_lcd(int iPos_inicial ,unsigned char ucLinha)
{
unsigned int indice=0;
unsigned int tamanho = strlen(Buffer_lcd);
switch(ucLinha)
{
case '1' :{escreve_LCD(0X80 + iPos_inicial,'0');}break;//linha1
case '2' :{escreve_LCD(0XC0 + iPos_inicial,'0');}break;//linha2
case '3' :{escreve_LCD(0X94 + iPos_inicial,'0');}break;//linha3
case '4' :{escreve_LCD(0XD4 + iPos_inicial,'0');}//linha4
}
while(indice<tamanho)
{
if(Buffer_lcd[indice]!='\0')
{
if((Buffer_lcd[indice]!='"') && (indice<21))//dados
{
escreve_LCD(Buffer_lcd[indice],'1');
}
}
else
{
indice = tamanho;//finaliza impressão
}
indice++;
}
}
void Read_ADC (void)
{
int lido_adc;
float temp,tensao;
unsigned int parte_inteira; //declaração de variável local
unsigned int parte_decimal; //declaração de variável local
//////////Lê tensão////////////////////
ADCON0 = 0X05;
_delay_us(40);//espera tensão estabilizar
ADCON0bits.GO = 1; //RA1
while (ADCON0bits.DONE == 1); //espera finalizar leitura
// lido_adc = ((((int)ADRESH <<8)|(ADRESL))&0x03FF); //Lê os valores em hexa
lido_adc = (((int)ADRESH)<<8)|(ADRESL);
temp = (float)((lido_adc*5.0)/1023);
//*******************************************************************
if(temp < 0) //valor é menor que 0?
{ temp = temp * (-1); //inverte o sinal de float
}
//*******************************************************************
parte_inteira = (int)temp; //pega parte inteira do valor
tensao =temp;
//*******************************************************************
parte_decimal =(unsigned int)((temp - parte_inteira) * 100); //resgata parte fracionária do valor ,2 casa decimais
sprintf(Buffer_lcd,"%u.%u",parte_inteira,parte_decimal); //converte valor em string e armazena no vetor buf
impri_lcd(0,'2');
//////////Lê corrente ////////////////////
ADCON0 = 0X01; ///liga RA0
_delay_us(40);//espera tensão estabilizar
ADCON0bits.GO = 1; //RA1
while (ADCON0bits.DONE == 1); //espera finalizar leitura
// lido_adc = ((((int)ADRESH <<8)|(ADRESL))&0x03FF); //Lê os valores em hexa
lido_adc = (((int)ADRESH)<<8)|(ADRESL);
temp = (float)((lido_adc*5.0)/1023);
//*******************************************************************
if(temp < 0) //valor é menor que 0?
{ temp = temp * (-1); //inverte o sinal de float
}
//*******************************************************************
parte_inteira = (int)temp; //pega parte inteira do valor
//*******************************************************************
parte_decimal =(unsigned int)((temp - parte_inteira) * 100); //resgata parte fracionária do valor ,2 casa decimais
sprintf(Buffer_lcd,"%u.%u",parte_inteira,parte_decimal); //converte valor em string e armazena no vetor buf
impri_lcd(6,'2');
temp = tensao*temp;
parte_inteira = (int)temp; //pega parte inteira do valor
parte_decimal =(unsigned int)((temp - parte_inteira) * 10);//somente uma casa decimal
sprintf(Buffer_lcd,"%u.%u",parte_inteira,parte_decimal); //converte valor em string e armazena no vetor buf
impri_lcd(12,'2');
}
</code></pre>
<br />
A simulação do proteus:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWXdJzYTH9v4PKKPs7f9qCiXMr8KxfSTzSKNAZJ7sAE63CTX4G-xAuwEPZC3J5mAZEocC1msVgT3zuF6Ogq9-J0xN6S5zvHYvk6FPTys2dKhpjjGarPxwiclV6AyvJT_P0LAzABNI07nE/s1600/simula%25C3%25A7%25C3%25A3o_wattimetro.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="500" data-original-width="846" height="378" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWXdJzYTH9v4PKKPs7f9qCiXMr8KxfSTzSKNAZJ7sAE63CTX4G-xAuwEPZC3J5mAZEocC1msVgT3zuF6Ogq9-J0xN6S5zvHYvk6FPTys2dKhpjjGarPxwiclV6AyvJT_P0LAzABNI07nE/s640/simula%25C3%25A7%25C3%25A3o_wattimetro.jpg" width="640" /></a></div>
<br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"> Muito obrigado,e até a próxima!</span><br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5944573230336506830.post-28820787285798687982019-01-31T03:06:00.001-08:002019-01-31T03:08:01.460-08:00PWM de 20KHZ com o PIC 12F683 - Saída variável de 0 a 10V.<br />
Olá pessoal que acompanha o blog! depois de um bom tempo sem nenhum post, temos mais um projeto realizado por nosso colaborador Renato Lôbo, que nos traz um circuito que controla a saída por meio do uso da modulação PWM.<br />
O funcionamento se baseia na leitura da tensão que vem do potenciômetro(que neste caso varia de 0 a 5V) e então o microcontrolador irá gerar um sinal de pwm na frequência de 20Khz e com largura de pulso proporcional a entrada(ou seja para 0 a 5V temos 0 a 10V) veja Figura 1, O filtro passa baixas na saída(R3 e C2) faz com que o sinal de onda quadrada se aproxime do sinal analógico, dando uma "suavizada" no contorno do sinal que tera um ganho de potencia por meio do transistor BC337.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiM1fIgl8BkPVzGgnOcctyYtk_tx12lh1atPKaY_QVrMXd7lMZRXawqdXgqWlHNyl1QonzdBZkNX8CBVWLFtfdTAXDpwP-LccRY6oGVhdLUEg81Fobfb9OuzB96AAPTMqweIxr79qquCBc/s1600/IMG_20190129_111530254.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiM1fIgl8BkPVzGgnOcctyYtk_tx12lh1atPKaY_QVrMXd7lMZRXawqdXgqWlHNyl1QonzdBZkNX8CBVWLFtfdTAXDpwP-LccRY6oGVhdLUEg81Fobfb9OuzB96AAPTMqweIxr79qquCBc/s320/IMG_20190129_111530254.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
Figura 1 - sinal gerado pelo microcontrolador.</div>
<br />
<b><span style="font-size: large;"> O código fonte.</span></b><br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: "andale mono" , "lucida console" , "monaco" , "fixed" , monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code>Paste your////////////////////////////////////////////////////////////////////////////////
// Projeto: PWM de 20Khz //
// Nome: Renato Lôbo Rodrigues //
// Data: 27/01/19 //
// Email: lobosoft@oi.com.br //
////////////////////////////////////////////////////////////////////////////////
#include <12F683.h>
#use delay (clock = 8Mhz)
//Configure os fusíveis em acordo com o pic selecionado
#fuses NOWDT
#fuses PUT
#fuses NOBROWNOUT
#fuses NOMCLR
#fuses INTRC_IO
#fuses PROTECT
//Estes registros encontra-se nas funções especiais de cada modelo de pic.
#bit tris_bot1 = 0x85.0 //direção do pino A0
#bit bot1 = 0x05.0 //pino A0
#bit tris_bot2 = 0x85.1 //direção do pino A1
#bit bot2 = 0x05.1 //pino A1
#bit tris_pwm = 0x85.2 //direção do pino A2
#bit p_pwm = 0x05.2 //pino A2
#bit tris_led = 0x85.5 //direção do pino A5
#bit led = 0x05.5 //pino A5
#bit tris_adc = 0x85.4 //direção do pino A4
#bit adc = 0x05.4 //pino A5
//Registro dos comparadores
#byte CMCON0 = 0x19 //Controle dos comparadores
//Registros do ADC
#byte ADCON0 = 0x1F //Controle do ADC
#bit ADCON0_GO_DONE = ADCON0.1 //Status de conversão
#byte ANSEL = 0x9F //Selecioa os pinos Analógicos
#byte ADRESH = 0x1E //endereço do byte mais significativo
#byte ADRESL = 0x9E //endereço do byte menos significativo
//Registros de interrupção
#byte INTCON = 0x0B //Controle de interrupção
#bit INTCON_GIE = INTCON.7 //Registro geral
//#bit INTCON_PEIE = INTCON.6 //Interrupção de periferico
//Registros de PULL_UP
#byte OPTION_REG = 0x81 //Registros de Opção
#bit OPT_REG_GPPU = OPTION_REG.7 //habilitar ou desabilitar os Pull_up dos pinos
#byte WPU = 0x95 //Configurar os pinos que vão ser habilitados
//Registros do CCP1
#byte CCP1CON = 0x15 //Registro do CCP1
//#bit CCP1CON_DC1B1 = CCP1CON.5 //Bit 1 para byte menos significativo
//#bit CCP1CON_DC1B0 = CCP1CON.4 //Bit 0 para byte menos significativo
#byte CCPR1L = 0x13 //Byte mais significativo
//Registros do Timer2 para PWM
#byte T2CON = 0x12 //Controle do timer 2
#byte PR2 = 0x92 //periodo do PWM
int16 pwm = 0;
//______________________________________________________________________________
//Rotina principal
void main()
{
int1 st1 = false; //status do botão
int1 st2 = false; //status do botão
int toc = false; //inicia regulando no potenciometro
int16 valor_adc = 0; //inicia com zero
tris_bot1 = 1; //pino A0 como entrada
tris_bot2 = 1; //pino A1 como entrada
tris_adc = 1; //pino A4 entrada analogica
tris_pwm = 0; //pino A2 do pwm como saída
pwm = 0; //inicia o pwm com zero
tris_led = 0; //pino A5 do led como saída
led = 0; //led apagado
OPT_REG_GPPU = 0; //zero = habilita os pull-up
WPU = 3; //00000011 liga pul-up dos pinos A0 e A1
//||||||||_Pino A0
//|||||||_Pino A1
//||||||_Pino A2
//|||||_Não usado, pino A3 não tem Pull_up interno
//||||_Pino A4
//|||_Pino A5
//||_dois bit não usado
CMCON0 = 7; //000000111 Comparadores Desligados
//|||||||||_Tres bits "um" desliga todos os comparador
//||||||_Não usado para esse caso
ADCON0 = 141; //10001101 Controle do ADC
//||||||||_liga ou desliga o ADC
//|||||||_Status de conversão, zero terminou a conversão
//||||||_Tres bits para determminar o canal usado
//|||_Não implementado
//||_VDD
//|_Formatado a direita
ANSEL = 88; //10001000 frequência de atualização e pino A4 como ADC
//||||||||_Quatro bit seta o pinos analogicos
//||||_Tres bits seta a frequencia de conversão
//|_Não usado
INTCON_GIE = 1; //Habilita Registro Geral
CCP1CON = 12; //00001100 Habilita o modo PWM
//||||||||_Quatro bits define o uso do PWM do CCP1
//||||_Dois bit do Duty
//||_Não usado
CCPR1L = 0; //Byte mais significativo
T2CON = 4; //00000100
//||||||||_2 bit prescaler do time 2 = 1
//||||||_ bit liga o timer2
//|||||_Quatro bit do Postscaler = 1
//|_não usado
PR2 = 49; //49 calculado para PWM com frequência de 20 Khz
//Setando o Duty
//CCPR1L = pwm>>2; //DUTY(;
//CCP1CON = (pwm <<4) | 12;
while(true) //laço infinito
{
ADCON0_GO_DONE = 1;
while(ADCON0_GO_DONE)//Espera até terminar a conversão analogica para digital
valor_adc = ((int16)ADRESH<<8)|(ADRESL); //Formatado a direita
if(!toc) pwm = valor_adc/5.0895; //1023/201
CCPR1L = pwm>>2; //Duty
//CCP1CON = (pwm<<4) | 12; //dois bits do Duty
CCP1CON = (pwm<<4) | 12;
if ( bot1) st1=false;
if (!bot1 && st1==false)
{
st1=true;
led = 1 ; //Acende o led1
if(pwm>=10) pwm=pwm-10;
if(pwm<=10)pwm=0;
CCPR1L = pwm>>2; //Duty
CCP1CON = (pwm <<4) | 12; //dois bits do Duty
toc = true;
delay_ms(10);
led = 0 ;
}
if ( bot2) st2=false;
if (!bot2 && st2==false)
{
st2=true;
led = 1 ; //Acende o led1
if(pwm<191) pwm=pwm+10;
if(pwm>=191)pwm=201;
CCPR1L = pwm>>2; //Duty
CCP1CON = (pwm<<4) | 12; //dois bits do Duty
delay_ms(10);
led = 0 ;
}
if(!bot1 && !bot2) toc = false;
}
} text here.
</code></pre>
<br />
<b><span style="font-size: large;">Esquemático do projeto:</span></b><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWg2Cic2R10pj3J7i37StoRj5v40LNin4ygyymY3VuvQitskzQiCG2ToLyuruWKGftyOjoluUVX0EzAz_-cs1hqdt61lPQL3RdskHpOWmHWEqrStcE4cI-9gQE8l9OvJ3K58LVt1qZ61E/s1600/Esquema+PWM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1518" data-original-width="1600" height="604" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWg2Cic2R10pj3J7i37StoRj5v40LNin4ygyymY3VuvQitskzQiCG2ToLyuruWKGftyOjoluUVX0EzAz_-cs1hqdt61lPQL3RdskHpOWmHWEqrStcE4cI-9gQE8l9OvJ3K58LVt1qZ61E/s640/Esquema+PWM.png" width="640" /></a></div>
<br />
<div style="text-align: center;">
PCB - do protótipo.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEeuENyJAb-8ZwMddVNv027FmnWcStYu3fwLybbxlwsp3GpP-7I0NGcSToVPx7aPtKAvJkJtFOcJL24MZW9LNJO2NgxfoFZKXJtkPsZoG9Zu__7kITPG6uQdn5jDovYgFv-MZW9PPD0Cw/s1600/PWM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="" border="0" data-original-height="1104" data-original-width="925" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEeuENyJAb-8ZwMddVNv027FmnWcStYu3fwLybbxlwsp3GpP-7I0NGcSToVPx7aPtKAvJkJtFOcJL24MZW9LNJO2NgxfoFZKXJtkPsZoG9Zu__7kITPG6uQdn5jDovYgFv-MZW9PPD0Cw/s400/PWM.png" title="PCB" width="333" /></a></div>
<div style="text-align: center;">
O protótipo final ficou conforme a figura a seguir:</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJv5CbNps9alLv-Jlb8nYNzyqE6e6lGi5GiBJucGM-Ip23C3EaPSp74WaAfLpMoH7NbZ-PJ74ljtkNnsKKLCufvHGqPxfYq1-ej5fBpqSDsBKbM8GjdVgU0Qni4z0edvOZyVXVrKQ93kA/s1600/IMG_20190129_111625418+%25281%2529.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJv5CbNps9alLv-Jlb8nYNzyqE6e6lGi5GiBJucGM-Ip23C3EaPSp74WaAfLpMoH7NbZ-PJ74ljtkNnsKKLCufvHGqPxfYq1-ej5fBpqSDsBKbM8GjdVgU0Qni4z0edvOZyVXVrKQ93kA/s400/IMG_20190129_111625418+%25281%2529.jpg" width="400" /></a></div>
<br />
<div style="text-align: center;">
Obrigado e até a próxima!</div>
<div style="text-align: center;">
<br /></div>
Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-5944573230336506830.post-48225340648554498342018-02-07T12:12:00.002-08:002018-02-07T12:12:36.029-08:00NODEMCU+MQTT+ANDROID = IOT (PARTE2)<br />
Olá, pessoal que acompanha o blog lhes trago uma versão melhorada do ultimo exemplo postado, para isto organizei os componentes na protoboard e coloquei um botão, e um sensor LM35 para medir temperatura.Veja abaixo como ficou o novo protótipo.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirPVh_5F8Pj1S_3S7pA1Se5XWHCNaDm8t466I5C6C1oGrgEjZiFDy18EZlHGF53AXcLuZJJ4IOzs1Wgl-4kyNXvIBuCAGFwfZnQqa8vDubDi8UB16FrmwpTMtWuCEuQlYM83GZSyLnFDk/s1600/20180207_151747.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1135" data-original-width="1600" height="281" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirPVh_5F8Pj1S_3S7pA1Se5XWHCNaDm8t466I5C6C1oGrgEjZiFDy18EZlHGF53AXcLuZJJ4IOzs1Wgl-4kyNXvIBuCAGFwfZnQqa8vDubDi8UB16FrmwpTMtWuCEuQlYM83GZSyLnFDk/s400/20180207_151747.jpg" width="400" /></a></div>
//colocar foto<br />
Apesar do LM35 funcionar 4 a 30V(segundo o datasheet) com 3,3V funcionou bem(pelo menos pra medir temperatura ambiente,assim não precisou de nenhum circuito externo além do sensor.<br />
Usei um botão do tipo NA de forma que a entrada selecionada ficasse o tempo todo em nível alto indo para nível baixo quando pressionado.<br />
Adicionei mais um led(led amarelo) para indicar que o programa está rodando.Note que é possível monitorar pela porta serial tudo que acontece(caso queira).<br />
<br />
<b>O Código fonte :</b><br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: "andale mono" , "lucida console" , "monaco" , "fixed" , monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code>//Autor: Aguivone - microcontroladores-C
//Descricao: Placa para acionar 4 reles usado um servidor MQTT.
//Data: 18/01/18
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <ESP8266WiFi.h>
#include <PubSubClient.h> // essa lib deve ser adicionada em seu programa do arduino
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//variaveis usadas na inicialização da wifi
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
const char* ssid = "nome da wifi"; //Aqui o nome da sua rede local wifi
const char* password = "senha"; // Aqui a senha da sua rede local wifi
const char* mqttServer = "algumacoisa.cloudmqtt.com"; // Aqui o endereço do seu servidor fornecido pelo site
const int mqttPort =16000; // Aqui mude para sua porta fornecida pelo site
const char* mqttUser = "xxxxxx"; // Aqui o nome de usuario fornecido pelo site
const char* mqttPassword = "hfjuytsgeh"; // Aqui sua senha fornecida pelo site
unsigned long tempo_rot = 1000;// aprox 1s
unsigned int est_ant_bot = 0;//guarda estado do botão pra não enviar a todo momento uma nova informação
WiFiClient espClient;
PubSubClient client(espClient);
/*
Equivalencia das saidas Digitais entre nodeMCU e ESP8266 (na IDE do Arduino)
-------------------------------------------------
NodeMCU / ESP8266 | NodeMCU / ESP8266 |
D0 = 16 | D6 = 12 |
D1 = 5 | D7 = 13 |
D2 = 4 | D8 = 15 |
D3 = 0 | D9 = 3 |
D4 = 2 | D10 = 1 |
D5 = 14 | |
-------------------------------------------------
*/
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Definindo o nome dos pinos
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
const int LED_STATUS = 12; // led de status
const int TEMP_LM35 = A0; // porta analogica
//////////////configura os pinos dos reles/////////////////////////////
const int RELE1 = 0;
const int RELE2 = 4;
const int LED1 = 5;
const int LED2 = 14;
const int BOT = 13;//botão
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//variaveis globais
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void mqtt_callback(char* topic, byte* dados_tcp, unsigned int length);///dados_tcp = payload
void setup() {
pinMode(RELE1, OUTPUT);
pinMode(RELE2, OUTPUT);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED_STATUS, OUTPUT);
pinMode(BOT, INPUT);
digitalWrite(RELE1,LOW);//desliga todos os reles
digitalWrite(RELE2,LOW);
digitalWrite(LED1,LOW);
digitalWrite(LED2,LOW);
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{ //inicialmente pisca o led da placa do nodemcu(é a mesma do ESP8266).
delay(100);
Serial.println("Conectando a WiFi..");
}
Serial.println("Conectado!");
client.setServer(mqttServer, mqttPort);//configura servidor com as informações passadas
client.setCallback(callback);
while (!client.connected()) {
Serial.println("Conectando ao servidor MQTT...");
if (client.connect("Placa_leds", mqttUser, mqttPassword ))//colocar aqui o nome do dispositivo cliente("Placa_leds")
{
Serial.println("Conectado ao servidor MQTT!");
digitalWrite(LED_STATUS,HIGH);
} else {
Serial.print("Falha ao conectar ");
digitalWrite(LED_STATUS,LOW);
Serial.print(client.state());
delay(2000);
}
}
client.publish("Status - placa_rele","Reiniciado!");
client.publish("Placa_reles","Em funcionamento!");
client.subscribe("RELE"); ///envia autorização para trabalhar com os topicos abaixo
client.subscribe("LED");
client.subscribe("TEMP");
client.subscribe("BOT");
}
//////////////////
void callback(char* topic, byte* dados_tcp, unsigned int length)
{
String msg ; // cria variavel que será responsavel pelo tratamento das informações
for(int i = 0; i < length; i++) //converte array de bytes em string
{ char c = (char)dados_tcp[i];
msg += c;
}
digitalWrite(LED_STATUS,LOW);
delay(100);
digitalWrite(LED_STATUS,HIGH); //só pra indicar que houve recepção
Serial.print("\n\r topico:");//sempre será o escolhido no subscribe
Serial.print(topic);
Serial.print("\n\r Pacote recebido:");
Serial.print(msg);
if (strcmp(topic, "RELE") == 0)//recebeu comando para trabalhar com o dispositivo relé
{
for (int i = 0; i < length; i++) // Varre o vetor(array) inteiro do pacote recebido
{
//toma ação dependendo da string recebida:
if (msg.equals("L1"))
{
digitalWrite(RELE1, HIGH);
}
if (msg.equals("D1"))
{
digitalWrite(RELE1, LOW);
}
if (msg.equals("L2"))
{
digitalWrite(RELE2, HIGH);
}
if (msg.equals("D2"))
{
digitalWrite(RELE2, LOW);
}
}
}
if (strcmp(topic, "LED") == 0)//recebeu comando para trabalhar com o dispositivo led
{
for (int i = 0; i < length; i++) // Varre o vetor(array) inteiro do pacote recebido
{
//toma ação dependendo da string recebida:
if (msg.equals("L1"))
{
digitalWrite(LED1, HIGH);
}
if (msg.equals("D1"))
{
digitalWrite(LED1, LOW);
}
if (msg.equals("L2"))
{
digitalWrite(LED2, HIGH);
}
if (msg.equals("D2"))
{
digitalWrite(LED2, LOW);
}
}
}
}
void loop() {
client.loop();
if(tempo_rot==500)
{
digitalWrite(LED_STATUS,LOW);
}
if(tempo_rot<1)
{
tempo_rot = 1000;//reinicia contagem
digitalWrite(LED_STATUS, HIGH);
float Temperatura = analogRead(TEMP_LM35);
Temperatura = (Temperatura/1024.0) * 330;//converte para graus celsius
Serial.print("\n\r temperatura :");
Serial.println(Temperatura);
char data[6];
char *valor = dtostrf(Temperatura,5,2,data);//float,tamanho da string,numero de casas decimais,variavel temporaria a ser usada
client.publish("TEMP",valor);
if(digitalRead(BOT) == LOW)//botão pressionado?
{
if(est_ant_bot == 1)//botão não estava pressionado
{
client.publish("BOT","ON");
}
est_ant_bot = 0;
}
else
{
if(est_ant_bot == 0)//botão já estava pressionado
{
client.publish("BOT","OFF");
}
est_ant_bot = 1;
}
}
delay(1);
tempo_rot--;
}
</code></pre>
<br />
Quanto ao aplicativo do android esqueci de mencionar que é possível trocar os ícones ,então para este vídeo troquei eles e acrescentei mais um ícone para mostrar o status do botão.No vídeo e demonstrado o uso de um outro app do android(MQTTDASHBOAD) para plotar o gráfico da temperatura.Então vamos ao vídeo abaixo:<br />
<br />
<b>Vídeo</b><b> de demonstração:</b><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<br /><br /><iframe width="320" height="266" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/DAKI7RHoJ-E/0.jpg" src="https://www.youtube.com/embed/DAKI7RHoJ-E?feature=player_embedded" frameborder="0" allowfullscreen></iframe></div>
<br />
Até a próxima pessoal!<br />
<br />Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-5944573230336506830.post-58127164119301652962018-02-05T08:25:00.001-08:002018-02-07T03:52:15.567-08:00NodeMcu + MQTT + ANDROID = IOT. Olá pessoal que acompanha o blog! nos últimos anos temos ouvido falar muito de "internet das coisas" (<i>IOT</i> = internet of things) , uma arquitetura pensada na interação entre dispositivos via internet e estes com o usuário. Este será o primeiro post sobre o assunto e vamos começar com algo simples, vamos colocar 2 leds para representar o acionamento de 2 lâmpadas , e mais 2 leds para representar o acionamento de 2 relés que podem estar ligados a qualquer carga.Isto será feito através de um servidor nas nuvens dedicado a <i>IOT(</i>geralmente chamado de "<i>BROKER</i>"),dentro do conceito do <i>BROKER </i>existe 2 tipos de informação o <i>publish</i> e o <i>subscribe</i> que se refere ao envio e o recebimento de dados respectivamente,veja a figura a seguir.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgV_iiiYXqlzzIva4L3EQtDXXpqPWGYDm-IpBNtG2CiY-z6UHt4zivb037YGtgvjtb8FIdYUZMM2RD1KDb_vN-laxNodwzYqOX9aHLJkEAYD08snWEo8Ap7xTk5CmvQR2t9gRbdlkX2Y4/s1600/esquema.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="574" data-original-width="1084" height="337" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgV_iiiYXqlzzIva4L3EQtDXXpqPWGYDm-IpBNtG2CiY-z6UHt4zivb037YGtgvjtb8FIdYUZMM2RD1KDb_vN-laxNodwzYqOX9aHLJkEAYD08snWEo8Ap7xTk5CmvQR2t9gRbdlkX2Y4/s640/esquema.png" width="640" /></a></div>
Apesar do NodeMcu ser o dispositivo a ser acionado e portanto deveria apenas receber dados (<i>subscribe</i>) mas ele também informa quais os tópicos(tipo de dispositivo acionado) que será usado naquela conexão, alem de poder enviar <i>status </i>de controle, sendo por este motivo representado como uma comunicação de envio e recepção.O protocolo usado para fazer tudo funcionar é chamado de <i>MQTT(Message Queue Telemetry Transport) </i>que será o responsavel por fazer as máquinas conversarem entre si <i>M2M(Machine to Machine)</i>.<br />
<div style="text-align: left;">
Para fazer toda a "mágica" acontecer é preciso ter instalado o software do Arduino com as libs do ESP8266,Abra a janela de preferências na interface Arduino e digite no campo “Additional Board Manager URLs” o seguinte endereço: <a href="https://www.blogger.com/Abra%20a%20janela%20de%20Prefer%C3%AAncias%20e%20digite%20no%20campo%20%E2%80%9CAdditional%20Board%20Manager%20URLs%E2%80%9D%20o%20seguinte%20endere%C3%A7o:%20http://arduino.esp8266.com/stable/package_esp8266com_index.json">http://arduino.esp8266.com/stable/package_esp8266com_index.json </a>, depois é só instalar as bibliotecas indo na aba do gerenciador de placas do Arduino, para usar o <i>MQTT</i> será necessario adicionar a biblioteca "PubSubClient" que pode ser baixada(aqui) e colocada dentro da pasta "libraries" nos arquivos de instalação do Arduino, deve ficar em algo assim "C:\Arduino\arduino-1.8.5\Sketchbook\libraries\PubSubClient" eu preferi deixar a pasta do executável fora da pasta padrão do windows para não ter problemas de acesso a arquivos por parte do programa arduino. Estando com tudo corretamente preparado é só rodar o código fonte que estará anexado a este post.</div>
Para usar o servidor <i>MQTT</i> vc deve criar seu cadastro(existem vários destes procure o que achar melhor),no meu caso usei o "cloudMQTT", apenas uma obrsevação no video errei ao dizer que os servidores estavam localizados nos EUA, na verdade um fica lá(na Virginia) e o outro na Europa(Irlanda), no vídeo de demostração vou dar mais detalhes das configurações dele.<br />
Para usar o Android ou qualquer outro Sistema operacional para Smartphone pode se usar uma solução pronta(existem diversas opções) para gerenciar seu dispositivo, eu usei o "MQTT Dash", no vídeo de demostração abaixo vou dar mais detalhes.<br />
Para melhor acompanhamento do que está acontecendo com o modulo tudo que é feito é também enviado via porta serial (emulada), ou seja através de um terminal serial RS232 podemos acompanhar todos os passos do circuito.Observe que no codigo o comando para ligar e desligar tanto os reles quanto as lâmpadas(led) é o mesmo, ou seja posso padronizar os mesmos comandos para dispositivos diversos não necessitando ter vários comandos(um pra cada dispositivo).<br />
O circuito elétrico de testes da protoboard ficou assim:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKksWKNeYZBp9oZhDqFsR4JyxFTMqOC3M0_S3VTdg5XvNFGpQnN_T-qKsaQajMuNHTXcQfz_T8NtKzK4lvwziYiGdKtRp9J7VQGHIz7y0GHP0AY6WqJun_Fb90aN8ybVRuV9ZH_k_i0VU/s1600/20180204_175053.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1020" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKksWKNeYZBp9oZhDqFsR4JyxFTMqOC3M0_S3VTdg5XvNFGpQnN_T-qKsaQajMuNHTXcQfz_T8NtKzK4lvwziYiGdKtRp9J7VQGHIz7y0GHP0AY6WqJun_Fb90aN8ybVRuV9ZH_k_i0VU/s400/20180204_175053.jpg" width="255" /></a></div>
Mas você deve estar se perguntando por que usar um <i>BROKER</i>(servidor nas nuvens) se poderia usar uma simples pagina <i>HTTP</i>?A resposta é devido a 2 fatores, o primeiro é que usando um webservidor você pode acessar seu dispositivo de qualquer ponto do planeta sem a necessidade de fazer muitas configurações(caso contrario precisaria de liberar a porta de seu modem e usar um serviço de <i>DDNS</i> ou <i>VPN</i>).O segundo motivo é que usando um protocolo como o <i>MQTT</i> que foi pensado,preparado e padronizado para o uso de <i>IOT </i>a comunicação é muito mais rápido do que usar uma pagina <i>HTTP.</i><br />
<b><span style="font-size: large;">O código fonte:</span></b><br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: "andale mono" , "lucida console" , "monaco" , "fixed" , monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code>//Autor: Aguivone - microcontroladores-C
//Descricao: Placa para acionar 4 leds usado um servidor MQTT.
//Data: 18/01/18
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <ESP8266WiFi.h>
#include <PubSubClient.h> // essa lib deve ser adicionada em seu programa do arduino
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//variaveis usadas na inicialização da wifi
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
const char* ssid = "nome da wifi"; //Aqui o nome da sua rede local wifi
const char* password = "senha"; // Aqui a senha da sua rede local wifi
const char* mqttServer = "algumacoisa.cloudmqtt.com"; // Aqui o endereço do seu servidor fornecido pelo site
const int mqttPort =16000; // Aqui mude para sua porta fornecida pelo site
const char* mqttUser = "xxxxxx"; // Aqui o nome de usuario fornecido pelo site
const char* mqttPassword = "hfjuytsgeh"; // Aqui sua senha fornecida pelo site
WiFiClient espClient;
PubSubClient client(espClient);
/*
Equivalencia das saidas Digitais entre nodeMCU e ESP8266 (na IDE do Arduino)
-------------------------------------------------
NodeMCU / ESP8266 | NodeMCU / ESP8266 |
D0 = 16 | D6 = 12 |
D1 = 5 | D7 = 13 |
D2 = 4 | D8 = 15 |
D3 = 0 | D9 = 3 |
D4 = 2 | D10 = 1 |
D5 = 14 | |
-------------------------------------------------
*/
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Definindo o nome dos pinos
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
const int LED_STATUS = 2; // led de status(estou usando o led que já vem no modulo esp.
const int ANALOGICA = A0; // porta analogica
//////////////configura os pinos dos reles/////////////////////////////
const int RELE1 = 0;
const int RELE2 = 4;
const int LED1 = 5;
const int LED2 = 14;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//variaveis globais
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void mqtt_callback(char* topic, byte* dados_tcp, unsigned int length);///dados_tcp = payload
void setup() {
pinMode(RELE1, OUTPUT);
pinMode(RELE2, OUTPUT);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
digitalWrite(RELE1,LOW);//desliga todos os reles
digitalWrite(RELE2,LOW);
digitalWrite(LED1,LOW);
digitalWrite(LED2,LOW);
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{ //inicialmente pisca o led da placa do nodemcu(é a mesma do ESP8266).
delay(100);
Serial.println("Conectando a WiFi..");
}
Serial.println("Conectado!");
client.setServer(mqttServer, mqttPort);//configura servidor com as informações passadas
client.setCallback(callback);
while (!client.connected()) {
Serial.println("Conectando ao servidor MQTT...");
if (client.connect("Placa_leds", mqttUser, mqttPassword ))//colocar aqui o nome do dispositivo cliente("Placa_leds")
{
Serial.println("Conectado ao servidor MQTT!");
digitalWrite(LED_STATUS,HIGH);
} else {
Serial.print("Falha ao conectar ");
digitalWrite(LED_STATUS,LOW);
Serial.print(client.state());
delay(2000);
}
}
client.publish("Status - placa_rele","Reiniciado!");
client.publish("Placa_reles","Em funcionamento!");
client.subscribe("RELE"); ///envia autorização para trabalhar com os topicos led e relé
client.subscribe("LED");
}
//////////////////
void callback(char* topic, byte* dados_tcp, unsigned int length)
{
String msg ; // cria variavel que será responsavel pelo tratamento das informações
for(int i = 0; i < length; i++) //converte array de bytes em string
{ char c = (char)dados_tcp[i];
msg += c;
}
digitalWrite(LED_STATUS,LOW);
delay(100);
digitalWrite(LED_STATUS,HIGH); //só pra indicar que houve recepção
Serial.print("\n\r topico:");//sempre será o escolhido no subscribe
Serial.print(topic);
Serial.print("\n\r Pacote recebido:");
Serial.print(msg);
if (strcmp(topic, "RELE") == 0)//recebeu comando para trabalhar com o dispositivo relé
{
for (int i = 0; i < length; i++) // Varre o vetor(array) inteiro do pacote recebido
{
//toma ação dependendo da string recebida:
if (msg.equals("L1"))
{
digitalWrite(RELE1, HIGH);
}
if (msg.equals("D1"))
{
digitalWrite(RELE1, LOW);
}
if (msg.equals("L2"))
{
digitalWrite(RELE2, HIGH);
}
if (msg.equals("D2"))
{
digitalWrite(RELE2, LOW);
}
}
}
if (strcmp(topic, "LED") == 0)//recebeu comando para trabalhar com o dispositivo led
{
for (int i = 0; i < length; i++) // Varre o vetor(array) inteiro do pacote recebido
{
//toma ação dependendo da string recebida:
if (msg.equals("L1"))
{
digitalWrite(LED1, HIGH);
}
if (msg.equals("D1"))
{
digitalWrite(LED1, LOW);
}
if (msg.equals("L2"))
{
digitalWrite(LED2, HIGH);
}
if (msg.equals("D2"))
{
digitalWrite(LED2, LOW);
}
}
}
}
void loop() {
client.loop();
}
</code></pre>
<b><span style="font-size: large;"><br /></span></b>
<b><span style="font-size: large;">Vídeo de demonstração e algumas explicações:</span></b><br />
<b><span style="font-size: large;"><br /></span></b>
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/WC4jGJDdvz4/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/WC4jGJDdvz4?feature=player_embedded" width="320"></iframe></div>
<br />
<br />
Espero ter ajudado a quem está iniciando neste fantástico mundo da tecnologia da internet das coisas(IOT).espero postar outros exemplos de uso em breve.Unknownnoreply@blogger.com4tag:blogger.com,1999:blog-5944573230336506830.post-68232674421367840012018-01-09T11:48:00.001-08:002018-01-18T10:44:57.697-08:00Implementando um temporizador WIFI, com o NodeMcu.Olá, hoje resolvi demonstrar como gravar o NodeMcu pela interface do arduino, para isto criei um servidor web que mantém um um led aceso conforme um tempo configurado na pagina web que está rodando dentro do próprio modulo, veja que do mesmo modo que é gravado o modulo ESP8266 também é gravado o NodeMcu(o que muda é fisicamente,pois o NodeMcu já vem com todo o hardware necessário para seu funcionamento o que reduz custos e facilita a montagem, principalmente para leigos em eletrônica ),veja que o tempo não é muito preciso pois usa delay de rotinas.<br />
Este é só o começo da serie de projetos que virão a partir do NodeMcu, em breve postarei novos códigos com mais recursos,por hora fiquem com este exemplo.<br />
<br />
<span style="color: blue;"><b>O código fonte:</b></span><br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: "andale mono" , "lucida console" , "monaco" , "fixed" , monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code>#include <dummy.h>
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>//caso use o modo servidor
#include "FS.h"
WiFiServer server(80);//usa porta 80
const int LED_STATUS = 2; // led de status(estou usando o led que já vem no modulo esp.
const int ANALOGICA = A0; // porta analogica
//////////////reles/////////////////////////////
const int RELE1 = 5; // neste exemplo vou usar apenas o rele 1
const int RELE2 = 4;
const int RELE3 = 10;
const int RELE4 = 15;
int tempo_pisca_led=500;
long liga_timer=0;
int tempo = 1;//padrão 1s
///////////////////////////////////////////////////////////////////
//////////configurações principais
///////////////////////////////////////////////////////////////////
void setup()
{
Serial.begin(115200);
conf_pinos();
setupWiFi();
}
/////////////////////////////////////////////////////////////////////
///rotina prinicpal
/////////////////////////////////////////////////////////////////////
void loop()
{
rot_geral();
// checa se tem algum dispositivo conectado!
WiFiClient client = server.available();
if (!client)
{return;}
// Lê a primeir linha dos dados recebidos pelo pacote ethernet
String req = client.readStringUntil('\r');
client.flush(); //limpa buffer de recepção
Serial.println("recebeu pag.");
// prepara pagina ethenet
String buf = "";//cria uma string para colocar a pagina web
//vai adicionando linhas a string criada
buf += "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\n";
buf += "<h1> Servidor Web com ESP8266 </h1>";
buf += "<h3> Temporizador - configure um tempo de 00 a 60 segundos.</h3>";
buf += "<h3> coloque os numero no formato XX(por exemplo 1 = 01..</h3>";
buf += "<h3><p>Iniciar: <a href=\"?b1_on\"><button>ON</button></a> <a href=\"?b1_off\"><button>OFF</button></a></p><br></h3>";
buf += "<form><h3>Segundos: <input type=text name=\"tempo\"\"value=\"mm\"size=3 maxlength=2></h3>";
buf += "<h3><input type=\"submit\" value=\"Configurar. \"></h3>";
buf += "</form><marquee direction=\"right\"> Microcontroladores-c - Temporizador Web </marquee></html>\n";
client.print(buf);//envia os dados pela wifi
client.flush();
///avalia o retorno da pagina HTTP
if (req.indexOf("b1_on") != -1)
{
liga_timer=tempo*5;//pois como o pisca é mais rapido e leva 200 ms por incremento deve multiplicar por 5
Serial.println("Acionou timer tempo:");
Serial.print(liga_timer,DEC);
}
if (req.indexOf("b1_off") != -1)
{
liga_timer=0;
digitalWrite(RELE1, LOW);
Serial.println("rele desligado!");
}
if(req.indexOf("tempo=") != -1)
{
int pos = req.lastIndexOf("tempo=");
Serial.println("tempo");
Serial.print('=');
Serial.print(req[pos+6]);
Serial.print(req[pos+7]);
if((char_to_int(req[pos+6]))*10 + char_to_int(req[pos+7])<61)
{ tempo = (char_to_int(req[pos+6]))*10 + char_to_int(req[pos+7]) ;
Serial.println("foi gravado :");
Serial.print(tempo,DEC);
} //se tempo menor que 60 atualiza valor
}
//cliente desconectado
// a cada requisição a pagina é enviada e o cliente é desconectado
}
unsigned int char_to_int(char val)
{
int valor =0;
if((val>47)||(val<58))
{
valor = val-48;
}
return(valor);
}
void rot_geral()
{
if(liga_timer>0)
{
liga_timer--;
if(liga_timer == 0)
{
// fim do tempo
digitalWrite(RELE1, LOW);
Serial.println("rele desligado!");
}
else
{
digitalWrite(RELE1, HIGH);// liga rele
}
digitalWrite(LED_STATUS,HIGH);
delay(100);
digitalWrite(LED_STATUS,LOW);
delay(100);
}
else
{
digitalWrite(LED_STATUS,HIGH);
delay(tempo_pisca_led);
digitalWrite(LED_STATUS,LOW);
delay(tempo_pisca_led);
}
return;
}
////////////////////////////////////////////////////////////////////
//configura os pinos
////////////////////////////////////////////////////////////////////
void conf_pinos()
{
pinMode(9, INPUT);//sempre será entrada
pinMode(LED_STATUS, OUTPUT);
digitalWrite(LED_STATUS, LOW);
pinMode(RELE1, OUTPUT);
digitalWrite(RELE1, LOW);
pinMode(RELE2, OUTPUT);
digitalWrite(RELE2, LOW);
pinMode(RELE3, OUTPUT);
digitalWrite(RELE3, LOW);
pinMode(RELE4, OUTPUT);
digitalWrite(RELE4, LOW);
return;
}
/////////////////////////////////////////////////////////////////////////
// Parâmetros da WiFi //
////////////////////////////////////////////////////////////////////////
void setupWiFi()
{
//////////////////////
// definições da WiFi //
//////////////////////
const char* WiFi_Senha = "123456789";//senha que você quer usar(deve ser em branco(aberta) ou maior que 8 caráteres,senão não funciona e não troca o nome da wifi)
const char* WiFi_Nome = "Microcontroladores-c";//nome que você quer dar a sua rede
IPAddress ip(192,168,50,4);//ok
IPAddress gateway(192,168,50,1);//ok
IPAddress subnet(255,255,255,0);//ok
//////inicializa a wifi//////////////////////////////////////////////
uint8_t mac[WL_MAC_ADDR_LENGTH];
WiFi.softAPmacAddress(mac);//mac qualquer pra testar
WiFi.softAPConfig(ip, gateway, subnet);
WiFi.softAP(WiFi_Nome, WiFi_Senha);
// WiFi.mode(WIFI_AP);//modo acess point(cliente)
WiFi.mode(WIFI_AP_STA);//modo acess point e servidor
WiFi.begin();
server.begin();
}
</code></pre>
<br />
A demonstração do código funcionando pode ser visto no vídeo abaixo :<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/KqVoeHuqPj8/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/KqVoeHuqPj8?feature=player_embedded" width="320"></iframe></div>
<br />
Até a próxima!<br />
<br />
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5944573230336506830.post-56296751867678217042017-12-25T08:20:00.004-08:002017-12-25T08:20:53.374-08:00Gravador de pic - monte você mesmo!Olá, hoje será abordado um gravador de pic, que foi montado pelo colaborador Renato lobo e funcionou tranquilamente ele consiste de uma placa contendo um microcontrolador 18F2550,devido a sua simplicidade resolvi juntamente com o Renato postar este projeto. Os aquivos para gravação do microcontrolador e o projeto do Eagle estão disponíveis <a href="https://drive.google.com/drive/folders/1ikRywP4pvQm8CQ6icF97cE-XkuPRNiV_?usp=sharing">AQUI</a>.<br />
<br />
Esquemático:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjR79Um8_NEs9OvTbc06-P_VeaInrcngTTequV5I6njsqD4P0S-e65OJgVgvagRXGYdpd8lyDAiFqfP4v2o-CVtNj4P9En5hsoyO1_TlHuATAiy4VhAns9F0lr3Y8NmyyGd5EMWNjOY80M/s1600/image+%25281%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="905" data-original-width="1595" height="361" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjR79Um8_NEs9OvTbc06-P_VeaInrcngTTequV5I6njsqD4P0S-e65OJgVgvagRXGYdpd8lyDAiFqfP4v2o-CVtNj4P9En5hsoyO1_TlHuATAiy4VhAns9F0lr3Y8NmyyGd5EMWNjOY80M/s640/image+%25281%2529.png" width="640" /></a></div>
<br />
As placas do protótipo montado:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfV5kkkHCPSVhwvJVEHuvIygwl3JaeBRQRNJjpuzNrAiNO1RwvQb9UIYbTazSvb2L_B0ykOxPWoi_elyhuDHQeqnGRL_vFJip2XxfMOZTupHVgP3gZzXTJai18Jfgd48V6XUAbbYfVdfk/s1600/image.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="675" data-original-width="1600" height="134" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfV5kkkHCPSVhwvJVEHuvIygwl3JaeBRQRNJjpuzNrAiNO1RwvQb9UIYbTazSvb2L_B0ykOxPWoi_elyhuDHQeqnGRL_vFJip2XxfMOZTupHVgP3gZzXTJai18Jfgd48V6XUAbbYfVdfk/s320/image.png" width="320" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVmm8aroKvb1quK3P2nnpgpKBfCfMqODRaRHI-9v8ZlEMx4kr5GQf5c3qrGo4I6qSIEQ87BXQhqj_3KlQAaY-_z3JK17crTY3jDlkcaSapTU3do8ntF32XMdrWttVQOpmfL7-QVSt1sfE/s1600/image+%25282%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1221" data-original-width="1600" height="244" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVmm8aroKvb1quK3P2nnpgpKBfCfMqODRaRHI-9v8ZlEMx4kr5GQf5c3qrGo4I6qSIEQ87BXQhqj_3KlQAaY-_z3JK17crTY3jDlkcaSapTU3do8ntF32XMdrWttVQOpmfL7-QVSt1sfE/s320/image+%25282%2529.png" width="320" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHuiU9iReIlSKP2_XcdjQdfiaprBuaf50NJMmV3_zWnW31TIaq8W9YNTYjVK1-D-j9uVz-4OE6RhBI4WNUbE62Y72oJeny5CqVVd_DbKH_X0CKCZtKak86x25nAqwe6w3RFxDu1ulNpg0/s1600/WhatsApp+Image+2017-12-21+at+19.49.32+%25281%2529.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="960" data-original-width="1280" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHuiU9iReIlSKP2_XcdjQdfiaprBuaf50NJMmV3_zWnW31TIaq8W9YNTYjVK1-D-j9uVz-4OE6RhBI4WNUbE62Y72oJeny5CqVVd_DbKH_X0CKCZtKak86x25nAqwe6w3RFxDu1ulNpg0/s320/WhatsApp+Image+2017-12-21+at+19.49.32+%25281%2529.jpeg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Demonstração da tela do pc no momento da gravação de firmware:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYLupcUVnQFPP-l8VJ1pdiKEOdoJHYFSGTbaN14NtvJIC8h92S-eGUYiZam1G5tbz2itt9XOMGPVPxvMBMhUPaY4qTJ9lj91YnsW0nuhZ-5o0q9zKRveGuo78Ns7Wx9vbv1vzc7vrpIKM/s1600/WhatsApp+Image+2017-12-21+at+19.49.32.jpeg" imageanchor="1" style="clear: left; display: inline !important; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="960" data-original-width="1280" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYLupcUVnQFPP-l8VJ1pdiKEOdoJHYFSGTbaN14NtvJIC8h92S-eGUYiZam1G5tbz2itt9XOMGPVPxvMBMhUPaY4qTJ9lj91YnsW0nuhZ-5o0q9zKRveGuo78Ns7Wx9vbv1vzc7vrpIKM/s320/WhatsApp+Image+2017-12-21+at+19.49.32.jpeg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<div style="text-align: center;">
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5944573230336506830.post-16691247572902228362017-11-30T16:52:00.001-08:002017-11-30T16:53:30.896-08:00Girando motor de passo unipolar nos dois sentidos Olá, pessoal que acompanha o blog,para hoje temos uma postagem feita pelo nosso colaborador Renato Lôbo, que consiste em controlar um motor com o pic 12F675,<span style="background-color: white; color: #222222; font-family: "arial" , sans-serif; font-size: 12.8px;"> neste projeto o </span><span style="background-color: white; color: #222222; font-family: "arial" , sans-serif; font-size: 12.8px;">motor de passo funcionará com uma velocidade de 20 rpm.Projeto feito</span> usado o compilador CCS.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihgY4xQkDh7JlJHSsl8kIiciOZujWf5hs5JGyNeqDzy24nQHLSX7XDvppmMHUe2UFoY7rdPG2ktH70zInuvT2_nNo_1SxlzOTnKhyYAkFmzBjX0Zvy9DQK7gAzwSwmtno1uvmPa4o4O78/s1600/motor.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="225" data-original-width="225" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihgY4xQkDh7JlJHSsl8kIiciOZujWf5hs5JGyNeqDzy24nQHLSX7XDvppmMHUe2UFoY7rdPG2ktH70zInuvT2_nNo_1SxlzOTnKhyYAkFmzBjX0Zvy9DQK7gAzwSwmtno1uvmPa4o4O78/s200/motor.png" width="200" /></a></div>
O código fonte:<br />
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: "andale mono" , "lucida console" , "monaco" , "fixed" , monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code>////////////////////////////////////////////////////////////////////////////////
// Projeto: Girando motor de passo unipolar (28byj-48) nos dois sentidos. //
// Nome: Renato Lôbo Rodrigues //
// Data: 29/11/17 //
// Email: lobosoft@oi.com.br //
////////////////////////////////////////////////////////////////////////////////
//http://giocarduino.altervista.org/e19-motore-passo-passo.pdf
//dois botões pulsadores no pino 3 e 4 do pic e GND
//0 pino 4 do pic (A3) deve ter um resistor de pull-up
//pino 7 do pic em 1N1 da placa que acompanha o motor 28byj-48
//pino 6 do pic em 1N2
//pino 5 do pic em 1N3
//pino 2 do pic em 1N4
//GND em - da placa
//12V em + da placa
//Configuração PIC
#include <12f675.h>
//inicializando os fusiveis
#fuses INTRC_IO, NOMCLR, NOWDT,PROTECT,PUT,BROWNOUT,CPD
#use delay(clock=4Mhz) //clock interno de 4mhz
#byte tris_portA = 0x85 //sentido dos pinos do portA
#bit bot1= 0x05.3 //botão sentido horario
#bit bot2= 0x05.4 //botão sentido anti-horario
#bit bob_A1 = 0x05.0 //terminais do motor de passo bobina A e B
#bit bob_A2 = 0x05.1 //
#bit bob_B1 = 0x05.2 //
#bit bob_B2 = 0x05.5 //
//se 5 fios lique o center type no GND
//se 6 fios ligue os dois center type no GND
int1 roda = false; //iniciando a variaval roda como falsa
int1 dir = false; //iniciando a variaval dir como falsa
int8 pulso =0; //iniciando a pulso com zero
void motor(int8 num) //configuração de giro do motor em 0.5 passo
{
switch(num)
{
case 0: bob_A1=1;
bob_A2=0;
bob_B1=0;
bob_B2=0;
break;
case 1: bob_A1=1;
bob_A2=1;
bob_B1=0;
bob_B2=0;
break;
case 2: bob_A1=0;
bob_A2=1;
bob_B1=0;
bob_B2=0;
break;
case 3: bob_A1=0;
bob_A2=1;
bob_B1=1;
bob_B2=0;
break;
case 4: bob_A1=0;
bob_A2=0;
bob_B1=1;
bob_B2=0;
break;
case 5: bob_A1=0;
bob_A2=0;
bob_B1=1;
bob_B2=1;
break;
case 6: bob_A1=0;
bob_A2=0;
bob_B1=0;
bob_B2=1;
break;
case 7: bob_A1=1;
bob_A2=0;
bob_B1=0;
bob_B2=1;
break;
case 8: bob_A1=0; //motor desligado
bob_A2=0;
bob_B1=0;
bob_B2=0;
break;
}
}
#int_timer1
void rotina_t1() //na frenquência de 1khz esse motor gira a 20 rpm
{
if(roda)
{
if(dir)
{
if(pulso < 7)pulso++;else pulso=0; //gira anti-horário
}else{
if(pulso > 0)pulso--;else pulso=7; //gira horário
}
motor(pulso); //gira 0.5 passo a cada chamada
roda=false; //avisa que terminou 0 0.5 passo
}
else
{
motor(8);
}
set_timer1(64536 + get_timer1()); //preset de contagem do timer1
}
void main ()
{
int1 st1 = false,st2 = false; //status do botão
setup_comparator(NC_NC_NC_NC); //comparadores desligados
setup_vref(FALSE); //sem valor de referencia
port_a_pullups(0b00010000); //pull-up para pino A3
tris_portA=0b11011000; //entrada e saidos dos pinos
bob_A1=0; //todos pinos do motor inicia em zero
bob_A2=0;
bob_B1=0;
bob_B2=0;
// Timer1 para estouro a cada 1 ms.(Frequência do Ocilador 4Mhz)
enable_interrupts(global);
setup_timer_1(t1_internal | t1_div_by_1);
Enable_interrupts(int_timer1);
set_timer1(64536);
while (TRUE)
{
if(!roda)
{
if( bot1) st1 = false;
if(!bot1 && !st1) //gira horário
{
dir=false;
roda=true;
}
if( bot2) st2 = false;
if(!bot2 && !st2) //gira anti-horário
{
dir=true;
roda = true;
}
}
}
}
</code></pre>
<br />
Obrigado a todos. até a próxima!<br />
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-5944573230336506830.post-24623918214740706212017-08-21T09:11:00.002-07:002017-08-21T09:11:28.956-07:00Contador 0-99 com pic - usando compilador CCS<span style="font-family: Arial, Helvetica, sans-serif;">Olá, para este post vamos ver como fazer um algoritmo que conta de 0 a 99 usando o compilador CCS, um projeto de Renato Lôbo. para isto vcs irão precisar: </span><br />
<pre class="m_5489131466874203114m_-5695099966584450358gmail-csharpcode" style="background-color: white; color: #333333; font-family: Consolas, "Courier New", Courier, monospace; font-size: 14.85px; white-space: pre-wrap;"><span style="font-size: xx-small;">
</span></pre>
<pre class="m_5489131466874203114m_-5695099966584450358gmail-csharpcode" style="background-color: white; color: #333333; white-space: pre-wrap;"><span style="font-family: Arial, Helvetica, sans-serif;">- Pic16F628 da Microchip
- Placa com display duplo de 7 segmentos de catodo comum
- Capacitor de 100nf para desacoplamento
- Cabinhos para ligação
- Matriz de contato
- Fonte de 5v </span></pre>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNWaKeAS61e_5BctyfQ9qd-VaUweS026XvfhQK1kBwOVO3aC12LFyNdF4mDJcwtdsdE0tTQqzKY9r7YC5cReK1T0uA-l_CiWb9z2g876nx-Ro0L4Iceu_PnD9H2Ovm9nRfCEM4zq1_6UI/s1600/blogd.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="600" data-original-width="1124" height="170" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNWaKeAS61e_5BctyfQ9qd-VaUweS026XvfhQK1kBwOVO3aC12LFyNdF4mDJcwtdsdE0tTQqzKY9r7YC5cReK1T0uA-l_CiWb9z2g876nx-Ro0L4Iceu_PnD9H2Ovm9nRfCEM4zq1_6UI/s320/blogd.png" width="320" /></a></div>
<pre class="m_5489131466874203114m_-5695099966584450358gmail-csharpcode" style="background-color: white; color: #333333; white-space: pre-wrap;"><span style="font-family: Arial, Helvetica, sans-serif;">
</span></pre>
<br />
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"><br /></span>
<span style="font-size: large;">O código fonte:</span><br />
<span style="font-size: large;"><br /></span>
<pre class="csharpcode" style="background-color: white; font-family: Consolas, "Courier New", Courier, monospace; font-size: small;"><span class="rem" style="color: green;">////////////////////////////////////////////////////////////////////////////////</span>
<span class="rem" style="color: green;">// Projeto: Usando Varredura no acionamento de display de 7 segmentos. //</span>
<span class="rem" style="color: green;">// Nome: Renato Lôbo Rodrigues //</span>
<span class="rem" style="color: green;">// Data: 20/08/17 //</span>
<span class="rem" style="color: green;">// Email: lobosoft@oi.com.br //</span>
<span class="rem" style="color: green;">////////////////////////////////////////////////////////////////////////////////</span>
#include <16F628A.h>
#use delay (clock = 4Mhz)
<span class="rem" style="color: green;">//Configure os fusíveis em acordo com o pic selecionado</span>
#fuses NOWDT
#fuses PUT
#fuses NOBROWNOUT
#fuses NOMCLR
#fuses INTRC_IO
#fuses PROTECT
#<span class="kwrd" style="color: blue;">byte</span> tris_portA = 0x85
#<span class="kwrd" style="color: blue;">byte</span> tris_portB = 0x86
#bit display0 = 0x05.0 <span class="rem" style="color: green;">//pino A0</span>
#bit display1 = 0x05.1 <span class="rem" style="color: green;">//pino A1</span>
#bit SegA = 0x06.1 <span class="rem" style="color: green;">//pino B1</span>
#bit SegB = 0x06.2 <span class="rem" style="color: green;">//pino B2</span>
#bit SegC = 0x06.3 <span class="rem" style="color: green;">//pino B3</span>
#bit SegD = 0x06.4 <span class="rem" style="color: green;">//pino B4</span>
#bit SegE = 0x06.5 <span class="rem" style="color: green;">//pino B5</span>
#bit SegF = 0x06.6 <span class="rem" style="color: green;">//pino B6</span>
#bit SegG = 0x06.7 <span class="rem" style="color: green;">//pino B7</span>
<span class="kwrd" style="color: blue;">void</span> digito(int8 num)
{
<span class="kwrd" style="color: blue;">switch</span>(num)
{
<span class="kwrd" style="color: blue;">case</span> 0: SegA=1;<span class="rem" style="color: green;">// AAAA</span>
SegB=1;<span class="rem" style="color: green;">// F B</span>
SegC=1;<span class="rem" style="color: green;">// F B</span>
SegD=1;<span class="rem" style="color: green;">// </span>
SegE=1;<span class="rem" style="color: green;">// E C</span>
SegF=1;<span class="rem" style="color: green;">// E C</span>
SegG=0;<span class="rem" style="color: green;">// DDDD</span>
<span class="kwrd" style="color: blue;">break</span>;
<span class="kwrd" style="color: blue;">case</span> 1: SegA=0;<span class="rem" style="color: green;">// </span>
SegB=1;<span class="rem" style="color: green;">// B</span>
SegC=1;<span class="rem" style="color: green;">// B</span>
SegD=0;<span class="rem" style="color: green;">// </span>
SegE=0;<span class="rem" style="color: green;">// C</span>
SegF=0;<span class="rem" style="color: green;">// C</span>
SegG=0;<span class="rem" style="color: green;">// </span>
<span class="kwrd" style="color: blue;">break</span>;
<span class="kwrd" style="color: blue;">case</span> 2: SegA=1;<span class="rem" style="color: green;">// AAAA</span>
SegB=1;<span class="rem" style="color: green;">// B</span>
SegC=0;<span class="rem" style="color: green;">// B</span>
SegD=1;<span class="rem" style="color: green;">// GGGG</span>
SegE=1;<span class="rem" style="color: green;">// E </span>
SegF=0;<span class="rem" style="color: green;">// E </span>
SegG=1;<span class="rem" style="color: green;">// DDDD</span>
<span class="kwrd" style="color: blue;">break</span>;
<span class="kwrd" style="color: blue;">case</span> 3: SegA=1;<span class="rem" style="color: green;">// AAAA</span>
SegB=1;<span class="rem" style="color: green;">// B</span>
SegC=1;<span class="rem" style="color: green;">// B</span>
SegD=1;<span class="rem" style="color: green;">// GGGG</span>
SegE=0;<span class="rem" style="color: green;">// C</span>
SegF=0;<span class="rem" style="color: green;">// C</span>
SegG=1;<span class="rem" style="color: green;">// DDDD</span>
<span class="kwrd" style="color: blue;">break</span>;
<span class="kwrd" style="color: blue;">case</span> 4: SegA=0;<span class="rem" style="color: green;">// </span>
SegB=1;<span class="rem" style="color: green;">// F B</span>
SegC=1;<span class="rem" style="color: green;">// F B</span>
SegD=0;<span class="rem" style="color: green;">// GGGG</span>
SegE=0;<span class="rem" style="color: green;">// C</span>
SegF=1;<span class="rem" style="color: green;">// C</span>
SegG=1;<span class="rem" style="color: green;">// </span>
<span class="kwrd" style="color: blue;">break</span>;
<span class="kwrd" style="color: blue;">case</span> 5: SegA=1;<span class="rem" style="color: green;">// AAAA</span>
SegB=0;<span class="rem" style="color: green;">// F </span>
SegC=1;<span class="rem" style="color: green;">// F </span>
SegD=1;<span class="rem" style="color: green;">// GGGG</span>
SegE=0;<span class="rem" style="color: green;">// C</span>
SegF=1;<span class="rem" style="color: green;">// C</span>
SegG=1;<span class="rem" style="color: green;">// DDDD</span>
<span class="kwrd" style="color: blue;">break</span>;
<span class="kwrd" style="color: blue;">case</span> 6: SegA=1;<span class="rem" style="color: green;">// AAAA</span>
SegB=0;<span class="rem" style="color: green;">// F </span>
SegC=1;<span class="rem" style="color: green;">// F </span>
SegD=1;<span class="rem" style="color: green;">// GGGG</span>
SegE=1;<span class="rem" style="color: green;">// E C</span>
SegF=1;<span class="rem" style="color: green;">// E C</span>
SegG=1;<span class="rem" style="color: green;">// DDDD</span>
<span class="kwrd" style="color: blue;">break</span>;
<span class="kwrd" style="color: blue;">case</span> 7: SegA=1;<span class="rem" style="color: green;">// AAAA</span>
SegB=1;<span class="rem" style="color: green;">// B</span>
SegC=1;<span class="rem" style="color: green;">// B</span>
SegD=0;<span class="rem" style="color: green;">//</span>
SegE=0;<span class="rem" style="color: green;">// C</span>
SegF=0;<span class="rem" style="color: green;">// C</span>
SegG=0;<span class="rem" style="color: green;">// </span>
<span class="kwrd" style="color: blue;">break</span>;
<span class="kwrd" style="color: blue;">case</span> 8: SegA=1;<span class="rem" style="color: green;">// AAAA</span>
SegB=1;<span class="rem" style="color: green;">// F B</span>
SegC=1;<span class="rem" style="color: green;">// F B</span>
SegD=1;<span class="rem" style="color: green;">// GGGG</span>
SegE=1;<span class="rem" style="color: green;">// E C</span>
SegF=1;<span class="rem" style="color: green;">// E C</span>
SegG=1;<span class="rem" style="color: green;">// DDDD</span>
<span class="kwrd" style="color: blue;">break</span>;
<span class="kwrd" style="color: blue;">case</span> 9: SegA=1;<span class="rem" style="color: green;">// AAAA</span>
SegB=1;<span class="rem" style="color: green;">// F B</span>
SegC=1;<span class="rem" style="color: green;">// F B</span>
SegD=1;<span class="rem" style="color: green;">// GGGG</span>
SegE=0;<span class="rem" style="color: green;">// C</span>
SegF=1;<span class="rem" style="color: green;">// C</span>
SegG=1;<span class="rem" style="color: green;">// DDDD</span>
<span class="kwrd" style="color: blue;">break</span>;
}
}
<span class="rem" style="color: green;">//___________________________________________</span>
<span class="rem" style="color: green;">//Rotina principal</span>
<span class="kwrd" style="color: blue;">void</span> main()
{
int1 d = <span class="kwrd" style="color: blue;">false</span>;
int8 dig0 = 0;
int8 dig1 = 0;
int8 valor = 0;
int16 conta = 0;
tris_portA = 0b11111100;
tris_portB = 0b00000001;
<span class="rem" style="color: green;">//DEFINE display0 e TODOS SEGMENTOS LIGADOS PARA TESTE DURANTE 1 SEGUNDO</span>
display0=1;display1=0;
SegA=1;<span class="rem" style="color: green;">// AAAA</span>
SegB=1;<span class="rem" style="color: green;">// F B</span>
SegC=1;<span class="rem" style="color: green;">// F B</span>
SegD=1;<span class="rem" style="color: green;">// GG</span>
SegE=1;<span class="rem" style="color: green;">// E C</span>
SegF=1;<span class="rem" style="color: green;">// E C</span>
SegG=1;<span class="rem" style="color: green;">// DDDD</span>
<span class="rem" style="color: green;">//aguarda 1 segundo</span>
delay_ms(1000);
<span class="rem" style="color: green;">//DEFINE display1 e TODOS SEGMENTOS LIGADOS PARA TESTE DURANTE 1 SEGUNDO</span>
display0=0;display1=1;
SegA=1;<span class="rem" style="color: green;">// AAAA</span>
SegB=1;<span class="rem" style="color: green;">// F B</span>
SegC=1;<span class="rem" style="color: green;">// F B</span>
SegD=1;<span class="rem" style="color: green;">// GG</span>
SegE=1;<span class="rem" style="color: green;">// E C</span>
SegF=1;<span class="rem" style="color: green;">// E C</span>
SegG=1;<span class="rem" style="color: green;">// DDDD</span>
<span class="rem" style="color: green;">//aguarda 1 segundo</span>
delay_ms(1000);
while(<span class="kwrd" style="color: blue;">true</span>) <span class="rem" style="color: green;">//laço infinito</span>
{
<span class="kwrd" style="color: blue;">if</span>(!d) <span class="rem" style="color: green;">//se d é falso</span>
{
display0=1;display1=0; <span class="rem" style="color: green;">//seleciona display0</span>
digito(dig0); <span class="rem" style="color: green;">//chama rotina para digitos de 0 a 9</span>
d=1; <span class="rem" style="color: green;">//troca para display1</span>
}<span class="kwrd" style="color: blue;">else</span>{ <span class="rem" style="color: green;">//se falso</span>
display0=0;display1=1; <span class="rem" style="color: green;">//seleciona display1</span>
digito(dig1); <span class="rem" style="color: green;">//chama rotina para digitos de 0 a 9</span>
d=0; <span class="rem" style="color: green;">//troca para display0</span>
}
conta++; <span class="rem" style="color: green;">//incremento de contagem para acertar um tempo de +/- 1S</span>
<span class="kwrd" style="color: blue;">if</span>(conta>=100) <span class="rem" style="color: green;">//testa se ja venceu o tempo</span>
{
<span class="kwrd" style="color: blue;">if</span>(valor<100){ <span class="rem" style="color: green;">//testa se o valor e maior que 100</span>
valor++; <span class="rem" style="color: green;">//se verdadeiro incrementa o valor</span>
}<span class="kwrd" style="color: blue;">else</span>{
valor=0; <span class="rem" style="color: green;">// se falso atribui zero</span>
}
dig0=valor%10; <span class="rem" style="color: green;">//extrai o resto da divisão para o display0</span>
dig1=valor/10; <span class="rem" style="color: green;">//extrai o inteiro da divisão para o display1</span>
conta=0; <span class="rem" style="color: green;">//atribui zero para iniciar a contagem de tempo</span>
}
delay_ms(10); <span class="rem" style="color: green;">//tempo de espera para troca de display</span>
}
}</pre>
<br />
<span style="font-size: large;">A demonstração:</span><br />
<span style="font-size: large;"><br /></span>
<div class="separator" style="clear: both; text-align: center;">
<iframe width="320" height="266" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/kJI7NpWS-fU/0.jpg" src="https://www.youtube.com/embed/kJI7NpWS-fU?feature=player_embedded" frameborder="0" allowfullscreen></iframe></div>
<br />
<br />Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-5944573230336506830.post-7899251904526415902017-07-31T05:30:00.001-07:002017-07-31T05:32:21.661-07:00Capacímetro com o pic(medidor de capacitância) - compilador CCS<pre class="csharpcode" style="background-color: white; font-family: Consolas, "Courier New", Courier, monospace;"><b><span style="font-size: large;">Material para montagem em matriz de contato:</span></b><span style="font-size: x-small;">
</span></pre>
<pre class="csharpcode" style="background-color: white;"><span style="font-family: Arial, Helvetica, sans-serif; font-size: xx-small;">- Pic16F883 da Microchip
- Cristal de 20Mhz
- LCD de 16 x 2
- 2 Trimpot de 10K
- Resistencia de 180R
- Resistencia de 1k
- Resistencia de 10k
- Resistencia de 100k
- Resistencia de 1M
- Capacitor de 100nf
- 2 Capacitores de 15pF
- Vários capacitores para teste
- Cabinhos para licação
- Matriz de contato
- Fonte de 5v</span></pre>
<pre class="csharpcode" style="background-color: white; font-family: Consolas, "Courier New", Courier, monospace;"><span style="font-size: x-small;">
</span></pre>
<pre class="csharpcode" style="background-color: white; font-family: Consolas, "Courier New", Courier, monospace;"><span style="font-size: large;"><b>Imagem do esquemático no simulador:</b></span></pre>
<pre class="csharpcode" style="background-color: white; font-family: Consolas, "Courier New", Courier, monospace;"><span style="font-size: x-small;">
</span></pre>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDzAK0cfiXxnAPQ95gpX3L9EH2d2i5jMhN18dWFuzvlgs0IgYgdjD1yjlw6C7DL2FtGAg8UPjWDjSFNwp2he_1-QXl96vVQq2G2WhafA3ppduaCSRGWjf_5q33tHyH7XG8-9SLHoZg3rc/s1600/unnamed.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="728" data-original-width="1124" height="414" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDzAK0cfiXxnAPQ95gpX3L9EH2d2i5jMhN18dWFuzvlgs0IgYgdjD1yjlw6C7DL2FtGAg8UPjWDjSFNwp2he_1-QXl96vVQq2G2WhafA3ppduaCSRGWjf_5q33tHyH7XG8-9SLHoZg3rc/s640/unnamed.png" width="640" /></a></div>
<pre class="csharpcode" style="background-color: white;"><span style="font-size: large;"><b><span style="font-family: "consolas" , "courier new" , "courier" , monospace;">
</span></b></span></pre>
<pre class="csharpcode" style="background-color: white;"><span style="font-size: large;"><b><span style="font-family: "consolas" , "courier new" , "courier" , monospace;">Protótipo</span><span style="font-family: "consolas" , "courier new" , "courier" , monospace;"> do projeto:</span></b></span></pre>
<pre class="csharpcode" style="background-color: white; font-family: Consolas, "Courier New", Courier, monospace;"><span style="font-size: x-small;">
</span></pre>
<pre class="csharpcode" style="background-color: white; font-family: Consolas, "Courier New", Courier, monospace;"><span style="font-size: x-small;">
</span></pre>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6DjswEo48jnFdTQ1xl8W1Am9rz9C-qot9UwPjPqvgRC7J2gygGV_x85UGfnD0KABJyIcnkDyySGC9yQXZZb2htwTFMoui3w0CRuGyOomSenCu-xO7unpmJ4Mlzooz0GbYBDdJ41edoF4/s1600/8a254b4e-f2ee-4d10-95f7-8a9dda0091f4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="720" data-original-width="1280" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6DjswEo48jnFdTQ1xl8W1Am9rz9C-qot9UwPjPqvgRC7J2gygGV_x85UGfnD0KABJyIcnkDyySGC9yQXZZb2htwTFMoui3w0CRuGyOomSenCu-xO7unpmJ4Mlzooz0GbYBDdJ41edoF4/s640/8a254b4e-f2ee-4d10-95f7-8a9dda0091f4.jpg" width="640" /></a></div>
<pre class="csharpcode" style="background-color: white; font-family: Consolas, "Courier New", Courier, monospace;"><span style="font-size: x-small;">
</span></pre>
<pre class="csharpcode" style="background-color: white;"><span style="font-family: consolas, "courier new", courier, monospace; font-size: x-small;">
</span><span style="font-family: consolas, "courier new", courier, monospace; font-size: large;"><b>O código Fonte:</b></span><span style="font-size: xx-small;"><span style="font-family: consolas, courier new, courier, monospace; font-size: x-small;">
</span><span style="font-family: Arial, Helvetica, sans-serif;"><span class="rem" style="color: green;">////////////////////////////////////////////////////////////////////////////////</span>
<span class="rem" style="color: green;">//Projeto:Capacimetro.c //</span>
<span class="rem" style="color: green;">//data:27/07/2017 //</span>
<span class="rem" style="color: green;">//créditos: http://www.eletronite.com.br/projetos/capacimetro-com-arduino //</span>
<span class="rem" style="color: green;">//Convertido de arduino para pic: Renato Lobo Rodrigues //</span>
<span class="rem" style="color: green;">// //</span>
<span class="rem" style="color: green;">//lobosoft@oi.com.br //</span>
<span class="rem" style="color: green;">////////////////////////////////////////////////////////////////////////////////</span>
#include <16F883.h>
#DEVICE ADC=10
#use delay (clock = 20Mhz)
<span class="rem" style="color: green;">//Configura os fusiveis</span>
#fuses HS
#fuses NOWDT
#fuses PUT
#fuses BROWNOUT
#fuses NOMCLR
#fuses PROTECT
#bit carga_Pin1 =0x05.5 <span class="rem" style="color: green;">//pin_A5 pino para carga do capacitor com resistor de 1k</span>
#bit carga_Pin1_tris =0x85.5
#bit carga_Pin10 =0x05.4 <span class="rem" style="color: green;">//pin_A4 pino para carga do capacitor com resistor de 10k</span>
#bit carga_Pin10_tris =0x85.4
#bit carga_Pin100 =0x07.0 <span class="rem" style="color: green;">//pin_C0 pino para carga do capacitor com resistor de 100k</span>
#bit carga_Pin100_tris =0x87.0
#bit carga_Pin1000 =0x07.1 <span class="rem" style="color: green;">//pin_C1 pino para carga do capacitor com resistor de 1M</span>
#bit carga_Pin1000_tris =0x87.1
#bit descarga_Pin =0x07.2 <span class="rem" style="color: green;">//pin_C2 pino para descarregar capacitor atraves de resistor de 1k</span>
#bit descarga_Pin_tris =0x87.2
<span class="preproc" style="color: #cc6633;">#define</span> Valor_resistor1 1000.0F <span class="rem" style="color: green;">// valor do resistor de 1k</span>
<span class="preproc" style="color: #cc6633;">#define</span> Valor_resistor10 10000.0F <span class="rem" style="color: green;">// valor do resistor de 10k</span>
<span class="preproc" style="color: #cc6633;">#define</span> Valor_resistor100 100000.0F <span class="rem" style="color: green;">// valor do resistor de 100k</span>
<span class="preproc" style="color: #cc6633;">#define</span> Valor_resistor1000 1000000.0F <span class="rem" style="color: green;">// valor do resistor de 1M</span>
<span class="preproc" style="color: #cc6633;">#define</span> auto_Capacitance 0.000228F
<span class="rem" style="color: green;">// Variáveis globais</span>
unsigned int32 inicio_tempo;
unsigned int32 Tempo_total;
<span class="kwrd" style="color: blue;">float</span> microFarads;
<span class="kwrd" style="color: blue;">float</span> nanoFarads;
<span class="kwrd" style="color: blue;">float</span> picoFarads;
unsigned <span class="kwrd" style="color: blue;">char</span> carga_Pin = 0;
<span class="kwrd" style="color: blue;">float</span> Valor_resistor;
<span class="kwrd" style="color: blue;">void</span> descarregaCap();
#include <span class="str" style="color: #a31515;">"lcd-4.c"</span>
<span class="rem" style="color: green;">//Rotina de interrupção</span>
#int_rtcc
<span class="kwrd" style="color: blue;">void</span> rotina_t0()
{
set_timer0(255) + get_timer0();
inicio_tempo++;
}
<span class="kwrd" style="color: blue;">void</span> main()
{
LCD_init(); <span class="rem" style="color: green;">//inicializa o LCD</span>
<span class="rem" style="color: green;">//configura a interrupção do timer0</span>
enable_interrupts(global);
setup_timer_0(rtcc_internal | rtcc_ext_l_to_h);
setup_timer_0(rtcc_8_bit | rtcc_div_1);
Enable_interrupts(int_timer0);
set_timer0(255);
<span class="rem" style="color: green;">//configura o ADC do pic canal 0</span>
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(sAN0);
<span class="rem" style="color: green;">// Configura pinos como entrada</span>
carga_Pin10_tris = 1;
carga_Pin100_tris = 1;
carga_Pin1000_tris = 1;
carga_Pin1_tris = 1;
<span class="rem" style="color: green;">// imprime texto estático na tela</span>
lcd_gotoxy(1,1);
printf (lcd_putc,<span class="str" style="color: #a31515;">"Lobosoft Ltda. "</span>);
lcd_gotoxy(1,2);
printf (lcd_putc,<span class="str" style="color: #a31515;">"Cap = "</span>);
while(<span class="kwrd" style="color: blue;">true</span>)
{
<span class="rem" style="color: green;">// Seleciona melhor resistor para capacitor a ser medido</span>
carga_Pin = 0;
<span class="kwrd" style="color: blue;">do</span>
{
descarregaCap();
<span class="kwrd" style="color: blue;">switch</span> (carga_Pin)
{
<span class="kwrd" style="color: blue;">case</span> 0:
carga_Pin10_tris = 1;
carga_Pin100_tris = 1;
carga_Pin1000_tris = 1;
carga_Pin1_tris = 0;
carga_Pin1 = 1;
Valor_resistor = Valor_resistor1;
<span class="kwrd" style="color: blue;">break</span>;
<span class="kwrd" style="color: blue;">case</span> 1:
carga_Pin1_tris = 1;
carga_Pin100_tris = 1;
carga_Pin1000_tris = 1;
carga_Pin10_tris = 0;
carga_Pin10 = 1;
Valor_resistor = Valor_resistor10;
<span class="kwrd" style="color: blue;">break</span>;
<span class="kwrd" style="color: blue;">case</span> 2:
carga_Pin1_tris = 1;
carga_Pin10_tris = 1;
carga_Pin1000_tris = 1;
carga_Pin100_tris = 0;
carga_Pin100 = 1;
Valor_resistor = Valor_resistor100;
<span class="kwrd" style="color: blue;">break</span>;
<span class="kwrd" style="color: blue;">case</span> 3:
carga_Pin1_tris = 1;
carga_Pin10_tris = 1;
carga_Pin100_tris = 1;
carga_Pin1000_tris = 0;
carga_Pin1000 = 1;
Valor_resistor = Valor_resistor1000;
<span class="kwrd" style="color: blue;">break</span>;
}
<span class="rem" style="color: green;">//seleciona canal zero do ADC para leitura</span>
set_adc_channel(0);
delay_us(10);
inicio_tempo = 0;
<span class="rem" style="color: green;">//aguarda carga de 63.2% do capacitor para calculo</span>
while (read_adc() < 648); <span class="rem" style="color: green;">// 647 é 63.2% de 1023 (valor máximo da entrada analógica)</span>
<span class="rem" style="color: green;">//calcula tempo de carga com 39.82% de correção</span>
Tempo_total = (inicio_tempo*1.3982)*39.82;
carga_Pin++;
} while (Tempo_total < 1000 && carga_Pin != 4);
<span class="rem" style="color: green;">// Converte valor de capacitor medido para unidade de engenharia e imprime no display LCD</span>
microFarads = ((<span class="kwrd" style="color: blue;">float</span>)Tempo_total / Valor_resistor) - auto_Capacitance;
<span class="kwrd" style="color: blue;">if</span>(microFarads >0)
{
lcd_gotoxy(7,2);
printf (lcd_putc,<span class="str" style="color: #a31515;">" "</span>);
lcd_gotoxy(7,2);
<span class="kwrd" style="color: blue;">if</span> (microFarads > 1)
{
printf (lcd_putc,<span class="str" style="color: #a31515;">"%fuf"</span>,microFarads);
}
<span class="kwrd" style="color: blue;">else</span>
{
nanoFarads = microFarads * 1000.0;
<span class="kwrd" style="color: blue;">if</span> (nanoFarads > 1)
{
printf (lcd_putc,<span class="str" style="color: #a31515;">"%fnf "</span>,nanoFarads);
}
<span class="kwrd" style="color: blue;">else</span>
{
picoFarads = nanoFarads * 1000.0;
printf (lcd_putc,<span class="str" style="color: #a31515;">"%fpf"</span>,picoFarads);
}
}
descarregaCap();
delay_ms(500);
}
<span class="kwrd" style="color: blue;">else</span>
{
<span class="rem" style="color: green;">//Se o capacitor não estiver conectado diz que esta ausente</span>
lcd_gotoxy(7,2);
printf (lcd_putc,<span class="str" style="color: #a31515;">"Ausente "</span>);
}
}
}
<span class="rem" style="color: green;">// Função para descarregar capacitor</span>
<span class="kwrd" style="color: blue;">void</span> descarregaCap() {
carga_Pin10_tris = 1;
carga_Pin100_tris = 1;
carga_Pin1000_tris = 1;
carga_Pin1_tris = 1;
descarga_Pin_tris = 0;
descarga_Pin = 0;
<span class="rem" style="color: green;">//Aguarda a descarga total do capacitor</span>
while (read_adc() > 0);
descarga_Pin_tris = 1;
}
Biblioteca para LCD alfanumérico
<span class="rem" style="color: green;">////////////////////////////////////////////////////////////////////////////////</span>
<span class="rem" style="color: green;">// BIBLIOTECA DO LCD //</span>
<span class="rem" style="color: green;">// data:27/07/2017 //</span>
<span class="rem" style="color: green;">// //</span>
<span class="rem" style="color: green;">// //</span>
<span class="rem" style="color: green;">////////////////////////////////////////////////////////////////////////////////</span>
<span class="rem" style="color: green;">// Modifique os pinos o quanto Quiser.</span>
<span class="preproc" style="color: #cc6633;">#define</span> LCD_DB4 PIN_b4
<span class="preproc" style="color: #cc6633;">#define</span> LCD_DB5 PIN_b5
<span class="preproc" style="color: #cc6633;">#define</span> LCD_DB6 PIN_b6
<span class="preproc" style="color: #cc6633;">#define</span> LCD_DB7 PIN_b7
<span class="preproc" style="color: #cc6633;">#define</span> LCD_RS PIN_b0
<span class="preproc" style="color: #cc6633;">#define</span> LCD_E PIN_b1
<span class="rem" style="color: green;">// Se voce quiser uma interface de 6 pinos para seu LCD, então</span>
<span class="rem" style="color: green;">// conecte o pino R/W do LCD ao terra, e comente a seguinte linha</span>
<span class="rem" style="color: green;">//#define USE_LCD_RW 1 </span>
<span class="rem" style="color: green;">//========================================</span>
<span class="preproc" style="color: #cc6633;">#define</span> lcd_type 2 <span class="rem" style="color: green;">// 0=5x7, 1=5x10, 2=2 lines</span>
<span class="rem" style="color: green;">//#define lcd_line_two 0x40 //LCD RAM address for the 2nd line</span>
<span class="preproc" style="color: #cc6633;">#define</span> lcd_line_1 0x00 <span class="rem" style="color: green;">//LCD RAM address for the 1 line</span>
<span class="preproc" style="color: #cc6633;">#define</span> lcd_line_2 0x40 <span class="rem" style="color: green;">//LCD RAM address for the 2 line</span>
<span class="preproc" style="color: #cc6633;">#define</span> lcd_line_3 0x10 <span class="rem" style="color: green;">//LCD RAM address for the 3 line</span>
<span class="preproc" style="color: #cc6633;">#define</span> lcd_line_4 0x50 <span class="rem" style="color: green;">//LCD RAM address for the 4 line</span>
int8 <span class="kwrd" style="color: blue;">const</span> LCD_INIT_STRING[4] =
{
0x20 | (lcd_type << 2), <span class="rem" style="color: green;">// Func set: 4-bit, 2 lines, 5x8 dots</span>
0xc, <span class="rem" style="color: green;">// Display on</span>
1, <span class="rem" style="color: green;">// Clear display</span>
6 <span class="rem" style="color: green;">// Increment cursor</span>
};
<span class="rem" style="color: green;">//-------------------------------------</span>
<span class="kwrd" style="color: blue;">void</span> lcd_send_nibble(int8 nibble)
{
<span class="rem" style="color: green;">// Note: !! converts an integer expression</span>
<span class="rem" style="color: green;">// to a boolean (1 or 0).</span>
output_bit(LCD_DB4, !!(nibble & 1));
output_bit(LCD_DB5, !!(nibble & 2));
output_bit(LCD_DB6, !!(nibble & 4));
output_bit(LCD_DB7, !!(nibble & 8));
delay_cycles(1);
output_high(LCD_E);
delay_us(2);
output_low(LCD_E);
}
<span class="rem" style="color: green;">//-----------------------------------</span>
<span class="rem" style="color: green;">// This sub-routine is only called by lcd_read_byte().</span>
<span class="rem" style="color: green;">// It's not a stand-alone routine. For example, the</span>
<span class="rem" style="color: green;">// R/W signal is set high by lcd_read_byte() before</span>
<span class="rem" style="color: green;">// this routine is called. </span>
#ifdef USE_LCD_RW
int8 lcd_read_nibble(<span class="kwrd" style="color: blue;">void</span>)
{
int8 retval;
<span class="rem" style="color: green;">// Create bit variables so that we can easily set</span>
<span class="rem" style="color: green;">// individual bits in the retval variable.</span>
#bit retval_0 = retval.0
#bit retval_1 = retval.1
#bit retval_2 = retval.2
#bit retval_3 = retval.3
retval = 0;
output_high(LCD_E);
delay_cycles(1);
retval_0 = input(LCD_DB4);
retval_1 = input(LCD_DB5);
retval_2 = input(LCD_DB6);
retval_3 = input(LCD_DB7);
output_low(LCD_E);
<span class="kwrd" style="color: blue;">return</span>(retval);
}
<span class="preproc" style="color: #cc6633;">#endif</span>
<span class="rem" style="color: green;">//---------------------------------------</span>
<span class="rem" style="color: green;">// Read a byte from the LCD and return it.</span>
#ifdef USE_LCD_RW
int8 lcd_read_byte(<span class="kwrd" style="color: blue;">void</span>)
{
int8 low;
int8 high;
output_high(LCD_RW);
delay_cycles(1);
high = lcd_read_nibble();
low = lcd_read_nibble();
<span class="kwrd" style="color: blue;">return</span>( (high<<4) | low);
}
<span class="preproc" style="color: #cc6633;">#endif</span>
<span class="rem" style="color: green;">//----------------------------------------</span>
<span class="rem" style="color: green;">// Send a byte to the LCD.</span>
<span class="kwrd" style="color: blue;">void</span> lcd_send_byte(int8 address, int8 n)
{
output_low(LCD_RS);
#ifdef USE_LCD_RW
while(bit_test(lcd_read_byte(),7)) ;
<span class="preproc" style="color: #cc6633;">#else</span>
delay_us(60);
<span class="preproc" style="color: #cc6633;">#endif</span>
<span class="kwrd" style="color: blue;">if</span>(address)
output_high(LCD_RS);
<span class="kwrd" style="color: blue;">else</span>
output_low(LCD_RS);
delay_cycles(1);
#ifdef USE_LCD_RW
output_low(LCD_RW);
delay_cycles(1);
<span class="preproc" style="color: #cc6633;">#endif</span>
output_low(LCD_E);
lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}
<span class="rem" style="color: green;">//----------------------------</span>
<span class="kwrd" style="color: blue;">void</span> lcd_init(<span class="kwrd" style="color: blue;">void</span>)
{
int8 i;
output_low(LCD_RS);
#ifdef USE_LCD_RW
output_low(LCD_RW);
<span class="preproc" style="color: #cc6633;">#endif</span>
output_low(LCD_E);
delay_ms(15);
<span class="kwrd" style="color: blue;">for</span>(i=0 ;i < 3; i++)
{
lcd_send_nibble(0x03);
delay_ms(5);
}
lcd_send_nibble(0x02);
<span class="kwrd" style="color: blue;">for</span>(i=0; i < <span class="kwrd" style="color: blue;">sizeof</span>(LCD_INIT_STRING); i++)
{
lcd_send_byte(0, LCD_INIT_STRING[i]);
<span class="rem" style="color: green;">// If the R/W signal is not used, then</span>
<span class="rem" style="color: green;">// the busy bit can't be polled. One of</span>
<span class="rem" style="color: green;">// the init commands takes longer than</span>
<span class="rem" style="color: green;">// the hard-coded delay of 60 us, so in</span>
<span class="rem" style="color: green;">// that case, lets just do a 5 ms delay</span>
<span class="rem" style="color: green;">// after all four of them.</span>
#ifndef USE_LCD_RW
delay_ms(60);
<span class="preproc" style="color: #cc6633;">#endif</span>
}
}
<span class="rem" style="color: green;">/*------------duas linhas----------------</span>
<span class="rem" style="color: green;"></span>
<span class="rem" style="color: green;">void lcd_gotoxy(int8 x, int8 y)</span>
<span class="rem" style="color: green;">{</span>
<span class="rem" style="color: green;">int8 address;</span>
<span class="rem" style="color: green;"></span>
<span class="rem" style="color: green;">if(y != 1)</span>
<span class="rem" style="color: green;"> address = lcd_line_two;</span>
<span class="rem" style="color: green;">else</span>
<span class="rem" style="color: green;"> address=0;</span>
<span class="rem" style="color: green;"></span>
<span class="rem" style="color: green;">address += x-1;</span>
<span class="rem" style="color: green;">lcd_send_byte(0, 0x80 | address);</span>
<span class="rem" style="color: green;">}</span>
<span class="rem" style="color: green;">*/</span>
<span class="rem" style="color: green;">//------------quatro linhas----------------</span>
<span class="kwrd" style="color: blue;">void</span> lcd_gotoxy(int8 x, int8 y)
{
int8 address;
<span class="kwrd" style="color: blue;">switch</span>(y)
{
<span class="kwrd" style="color: blue;">case</span> 1:
address = lcd_line_1;
address += x-1;
<span class="kwrd" style="color: blue;">break</span>;
<span class="kwrd" style="color: blue;">case</span> 2:
address = lcd_line_2;
address += x-1;
<span class="kwrd" style="color: blue;">break</span>;
<span class="kwrd" style="color: blue;">case</span> 3:
address = lcd_line_3;
address += x-1;
<span class="kwrd" style="color: blue;">break</span>;
<span class="kwrd" style="color: blue;">case</span> 4:
address = lcd_line_4;
address += x-1;
<span class="kwrd" style="color: blue;">break</span>;
<span class="kwrd" style="color: blue;">default</span>:
address = lcd_line_1;
address += x-1;
<span class="kwrd" style="color: blue;">break</span>;
}
lcd_send_byte(0, 0x80 | address);
}
<span class="rem" style="color: green;">//-----------------------------</span>
<span class="kwrd" style="color: blue;">void</span> lcd_putc(<span class="kwrd" style="color: blue;">char</span> c)
{
<span class="kwrd" style="color: blue;">switch</span>(c)
{
<span class="kwrd" style="color: blue;">case</span> <span class="str" style="color: #a31515;">'\f'</span>:
lcd_send_byte(0,1);
delay_ms(2);
<span class="kwrd" style="color: blue;">break</span>;
<span class="kwrd" style="color: blue;">case</span> <span class="str" style="color: #a31515;">'\n'</span>:
lcd_gotoxy(1,2);
<span class="kwrd" style="color: blue;">break</span>;
<span class="kwrd" style="color: blue;">case</span> <span class="str" style="color: #a31515;">'\b'</span>:
lcd_send_byte(0,0x10);
<span class="kwrd" style="color: blue;">break</span>;
<span class="kwrd" style="color: blue;">default</span>:
lcd_send_byte(1,c);
<span class="kwrd" style="color: blue;">break</span>;
}
}
<span class="rem" style="color: green;">//------------------------------</span>
#ifdef USE_LCD_RW
<span class="kwrd" style="color: blue;">char</span> lcd_getc(int8 x, int8 y)
{
<span class="kwrd" style="color: blue;">char</span> value;
lcd_gotoxy(x,y);
<span class="rem" style="color: green;">// Wait until busy flag is low.</span>
while(bit_test(lcd_read_byte(),7));
output_high(LCD_RS);
value = lcd_read_byte();
output_low(lcd_RS);
<span class="kwrd" style="color: blue;">return</span>(value);
}
<span class="preproc" style="color: #cc6633;">#endif</span>
<span class="rem" style="color: green;">//implementado por Renato Lôbo Rodrigues</span>
#separate
<span class="kwrd" style="color: blue;">void</span> lcd_cursor_on()
{
lcd_send_byte(0,0x0E);
}
#separate
<span class="kwrd" style="color: blue;">void</span> lcd_cursor_blink()
{
lcd_send_byte(0,0x0F);
}
#separate
<span class="kwrd" style="color: blue;">void</span> lcd_cursor_off()
{
lcd_send_byte(0,0x0C);
}
#separate
<span class="kwrd" style="color: blue;">void</span> lcd_shift_left()
{
lcd_send_byte(0,0x18);
}
#separate
<span class="kwrd" style="color: blue;">void</span> lcd_shift_right()
{
lcd_send_byte(0,0x1C);
}</span></span></pre>
Unknownnoreply@blogger.com0