Voltímetro com display de leds

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Voltímetro com display de leds

Mensagempor Adauto sampaio » 02 Abr 2007 16:50

Boa tarde pessoal. Estou fazendo um voltimetro com o 16F873A, mas estou com dificuldades. Tenho o livro Conectando o PIC, do David de Souza, e lá tem um exemplo de multiplex com display de leds (contador de segundos), e outro exemplo de conversão AD com resultado no display LCD. Pois bem, estou tentando mesclar os dois circuitos, mas não estou encontrando uma forma lógica de mostrar o resultado no display.
Depois da conversão AD, faço uma conversão normal para decimal, onde tenho os três dígitos: unidade, dezena e centena (o mostrador é de 2 e meio digitos). Mas não consigo multiplexar nos displays!!! Sei que é um programa relativamente simples, já procurei na net e não encontrei nada em ASM.
Agradeceria muito se alguém puder me auxiliar nessa tarefa. Obrigado.
É tudo uma questão de sorte; pergunte a qualquer perdedor
Adauto sampaio
Byte
 
Mensagens: 123
Registrado em: 07 Jan 2007 16:02

Mensagempor fabim » 03 Abr 2007 08:45

quer um conselho simples e funcional..
Eu nunca perdi tempo com multiplexar displays. Dependendo da aplicação é quase impossivel vc conseguir fazer isto, ainda mais se o circuito for de controle, as vz´s 8mS para fazer a varredura é vital para o circuito..

Meu conselho é vc usar um CI 4X7 .. 4511.. pode ser 74XX4511 ou CD4511.. SMD claro, que cabera perfeiramente debaixo do display comum. isso evita muita dor de cabeça e poupa muitas horas de raiva..
Sei lá mais axo que algum fabricante de display de 7S deveria prever isto em um modelo usando aquele tal de OEM..

Fabim.
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Adauto sampaio » 03 Abr 2007 10:35

É, sem duvida alguma pouparia muita dor de cabeça. Mas até a multiplex desse circuito com o 4511, eu teria o mesmo problema. É que o ckt vai usar obrigatoriamente um 873A (devido a alarmes e proteções), então queria aproveitar e usar todos os pinos do MCU.
Eu sei o princípio de funcionamento, mas tenho dificuldades em implementar na prática. Agradeço a resposta ,obrigado.


:lol:
É tudo uma questão de sorte; pergunte a qualquer perdedor
Adauto sampaio
Byte
 
Mensagens: 123
Registrado em: 07 Jan 2007 16:02

Mensagempor fabim » 03 Abr 2007 11:12

me adiciona no msn que eu te dou um 220V. rsrs
fabioriksilva@hotmail.com
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor eletroinf » 03 Abr 2007 16:14

Puxa vida... multiplexar displays não é tão cabuloso assim não...
Faz uma interrupção a cada 2 ms, e nela tu faz a tarefa tranquilamente.
No meu site tem um termômetro que é multiplexado:
www.eletroinf.cjb.net
com um 16f676. São poucos os casos em que a multiplexação fica impraticável.
Avatar do usuário
eletroinf
Word
 
Mensagens: 948
Registrado em: 12 Out 2006 14:59
Localização: Santa Maria - RS

Mensagempor Adauto sampaio » 04 Abr 2007 09:02

Grande Ricardo, tudo em cima? E olha que eu já tinha visitado seu site no mês passado, visto o projeto com o termometro, mas nem me lembrava dele.
Mas blz, vou tentar de duas maneiras: como está no seu site, usando as interrupções; e outra, sem o uso das interrupções, que o nosso amigo Fabim muito gentilmente me mostrou, tratando tudo na rotina principal do sistema.
Vou fazer e depois posto os resultados aki, e assim que sobrar tempo, vou fezer uma pagina no yahoo e colocar os projetinhos lá.
Obrigado a todos que, direta ou indiretamente, ajudaram no andamento do projeto. Valeu galera!!! Obrigado.


eletroinf escreveu:Puxa vida... multiplexar displays não é tão cabuloso assim não...
Faz uma interrupção a cada 2 ms, e nela tu faz a tarefa tranquilamente.
No meu site tem um termômetro que é multiplexado:
www.eletroinf.cjb.net
com um 16f676. São poucos os casos em que a multiplexação fica impraticável.
É tudo uma questão de sorte; pergunte a qualquer perdedor
Adauto sampaio
Byte
 
Mensagens: 123
Registrado em: 07 Jan 2007 16:02

Mensagempor hemasc » 04 Abr 2007 14:07

Por acaso você não tem este projeto em C? É que estou aprendendo a programar um micro 16f877A em C e gostaria de fazer um termômetro com 3 displays multiplexados. Até achei um programa de um voltímetro em 16F873, entendi alguns pontos dele mas não consigo pôr em prática, ou seja, compilo, gravo, mas nada de funcionar em minha placa. olha o end onde achei o programa.

http://miarroba.com/foros/ver.php?foroi ... ltiplexado

obrigado!



[quote="eletroinf"]Puxa vida... multiplexar displays não é tão cabuloso assim não...
Faz uma interrupção a cada 2 ms, e nela tu faz a tarefa tranquilamente.
No meu site tem um termômetro que é multiplexado:
www.eletroinf.cjb.net
com um 16f676. São poucos os casos em que a multiplexação fica impraticável.[/quote]
hemasc
Nibble
 
Mensagens: 80
Registrado em: 26 Fev 2007 08:59
Localização: Campinas - SP

Mensagempor Adauto sampaio » 04 Abr 2007 16:26

Boa tarde Hemasc. Kra, infelizmente não programo em C, só asm (to martelando com pascal tbem, com a ajuda do fabim). Tem um link postado pelo pessaol aki do forum, lá tem um exemplo em C. Dá uma conferida.

http://www.asm51.eng.br/phpbb/viewtopic.php?t=135

Abraços
É tudo uma questão de sorte; pergunte a qualquer perdedor
Adauto sampaio
Byte
 
Mensagens: 123
Registrado em: 07 Jan 2007 16:02

Mensagempor eletroinf » 04 Abr 2007 17:17

Aqui vai um pedaço de um programa que fiz para mostrar a temperatura medida com um sensor tmp122. A biblioteca do tmp122 não está incluída, apenas a parte que lida com os displays. A multiplexação utiliza a interrupção do timer 0. Fiz esse código quando estava aprendendo C, já faz um bom tempo, portanto... sem detalhes! heheheh bom proveito!
A sim, o código é para o (arghhh!) CCS, com muitas das suas "mãnhas".


/*Termômetro com sensor TMP122 (TI).
Processador: PIC 16F628.
Comunicação serial com o sensor (SPI 16bit).
*/


#include <16f628.h> //Includes do pic usado.
#include <tmp122pic.c>

#fuses NOWDT,NOBROWNOUT,NOMCLR,NOPROTECT,INTRC_IO, PUT, NOLVP

#use delay(clock = 4000000)
#use fast_io(A)
#use fast_io(B)

#bit t0if = 0x0b.2
#byte status = 0x03

#byte porta = 0x05
#byte portb = 0x06
#byte cmcon = 0x1F
#byte intcon = 0x0B
#byte option_reg = 0x81
#byte tmr0 = 0x01

#define d_und pin_a0 //Acionamento dos dígitos dos displays.
#define d_dez pin_a7
#define d_cent pin_a6
#define d_mil pin_b7


int flags = 0;
int mux_disp = 0;
int displays[4] = {0,0,0,0}; //Armazena os dígitos: xxx.x.
int disp_tmp[5];
int temp = 0;
float temperatura;


#bit tmp_lido = flags.0
#bit bit_sig = celsius.12 //Bit de sinal da temperatura.
#bit sinal = flags.1


byte const tab_display[]={
0b10111111, // 0
0b10000110, // 1
0b11011011, // 2
0b11001111, // 3
0b11100110, // 4
0b11101101, // 5
0b11111101, // 6
0b10000111, // 7
0b11111111, // 8
0b11101111, // 9
0b10000000, //
0b11000000, // -
0b11110111, // A
0b11111100, // b
0b10111001, // C
0b11011110, // D
0b11111001, // E
0b11110001, // F
0b10111000, // L
0b11110110}; // H



#int_timer0

void trata_int()
{

int temp;
if (tmp_lido)
{
if (disp_tmp[3] == '.')
{
displays[3] = (disp_tmp[4]) - 0x30;
displays[2] = (disp_tmp[2]) - 0x30;
displays[1] = (disp_tmp[1]) - 0x30;
displays[0] = (disp_tmp[0]) - 0x30;
}
if (disp_tmp[2] == '.')
{
displays[3] = (disp_tmp[3]) - 0x30;
displays[2] = (disp_tmp[1]) - 0x30;
displays[1] = (disp_tmp[0]) - 0x30;
if (sinal)
{
displays[0] = 11; //Sinal negativo "-".
}else
{
displays[0] = 10; //Dígito apagado.
}
}
if (disp_tmp[1] == '.')
{
displays[3] = (disp_tmp[2]) - 0x30;
displays[2] = (disp_tmp[0]) - 0x30;
if (sinal)
{
displays[1] = 11;
}else
{
displays[1] = 10;
}
displays[0] = 10;
}
if (disp_tmp[0] == '.')
{
displays[3] = (disp_tmp[1]) - 0x30;
displays[2] = 0;
if (sinal)
{
displays[1] = 11;
}else
{
displays[1] = 10;
}
displays[0] = 10;
}

tmp_lido = 0;
}


switch (mux_disp)
{
case 0: output_high(d_mil); //Desliga o display "milhar".
temp = displays[3];
portb = tab_display[temp];
delay_cycles(1);
output_low(d_und); //Liga o dígito das unidades.
mux_disp++;
break;

case 1: output_high(d_und); //Desliga o dígito das unidades.
temp = displays[2];
portb = tab_display[temp];
delay_cycles(1);
output_low(d_dez); //Liga o dígito das dezenas.
mux_disp++;
break;
case 2:
output_high(d_dez); //Desliga dígito das dezenas.
temp = displays[1];
portb = tab_display[temp];
delay_cycles(1);
output_low(d_cent); //Liga dígito das centenas.
mux_disp++;
break;
case 3: output_high(d_cent);
temp = displays[0];
portb = tab_display[temp];
delay_cycles(1);
output_low(d_mil);
mux_disp = 0;
break;

default: mux_disp = 0;
break;

}

tmr0 = 0;


}



void inicia_pinos(void)
{
set_tris_a(0b00110010); //Inicialmente RA0 é entrada. RA3 é somente entrada.
set_tris_b(0b00000000); //Todo portb é saída.
delay_cycles(1);
output_high(cs);
delay_cycles(1);
output_high(sck);
delay_cycles(1);
output_high(d_und); //Desliga os displays.
delay_cycles(1);
output_high(d_dez);
delay_cycles(1);
output_high(d_cent);
delay_cycles(1);
output_high(d_mil);

}



void main ()

{

option_reg = 0b10000001; // setup_timer_0 (RTCC_INTERNAL | RTCC_DIV_4);
intcon = 0b11100000;

cmcon= 0b111;
inicia_pinos();
valor_config = config12bit;
config_tmp122();

delay_ms (2000); //Tempo na inicialização (2 segundos).

while(true)
{
if (tmp_lido == 0)
{
ler_tmp122();
output_high(cs);

if (bit_sig) //Se a temperatura for negativa...
{
celsius = ~celsius; //Complementa os bits.
celsius ++; //Incremento unitário.
celsius &= 0xFFF; //Zera os 4 MSB.
sinal = 1; //Indica temperatura negativa.
}else
{
sinal = 0;
}

temperatura = (float) celsius/16; // celsius * 0.0625.
sprintf(disp_tmp, "%03.1f", temperatura);
celsius = 0;

tmp_lido = 1;


}

}

}
Avatar do usuário
eletroinf
Word
 
Mensagens: 948
Registrado em: 12 Out 2006 14:59
Localização: Santa Maria - RS

Mensagempor hemasc » 05 Abr 2007 07:21

Muito obrigado pessoal. Vou estudar os dois programas para melhorar meus conhecimentos.
hemasc
Nibble
 
Mensagens: 80
Registrado em: 26 Fev 2007 08:59
Localização: Campinas - SP

FABIM 220V

Mensagempor tecman » 04 Mai 2007 09:36

fABIM MANDA PARA MIM ESTE 220 !!!
tecman
Byte
 
Mensagens: 342
Registrado em: 01 Nov 2006 09:02

Mensagempor fabim » 04 Mai 2007 10:00

tecman. eu não entendi.

OS 220V. é no sentido de dar uma força.

Mais seguinte.

Vou dar uma dica que poucos pensaram.

deem uma olhada no datasheet do 4094.CD,74HC etc.

Observem que ele trabalha cascateado e vc pode trabalhar em SPI do proprio pic.

Por exemplo eu estava usando ele em um, display LCD serial que eu bolei um protocolo.

Fiquei observando esse 4094 e liguei ele em cascata. usei 10 em série.
.......................

só uma dica.

abraços
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x