Página 1 de 1

mudar display de 7 seg. para barra de leds

MensagemEnviado: 18 Jun 2009 12:58
por Hermann Rocha
Olá, estou a algum tempo querendo modificar esse codigo para acionar uma barra leds pois atualmente uso 2 lm3914 para 20leds, pelo que percebi terei que modificar a const char SegCode[11] =, comprei um livro sobre C, Auto Renato A. Silva mais o mesmo usa o pic16f628 como exemplo sendo que nao tem A/D, enfim e isso.
Obrigado


#include <16F676.h>
#device adc=10
#fuses INTRC_IO,NOWDT,PUT,NOPROTECT,BROWNOUT,NOMCLR
#use delay (clock=4000000) // 4MHz clock

#rom 0x3ff={0x3444}

#byte PORTA = 0x05
#byte PORTC = 0x07
#byte TRISA = 0x85
#byte TRISC = 0x87

#define SPORTA PORTA
#define SPORTC PORTC

#define TICKS_BETWEEN_INTERRUPTS 5000 //5000
#define INTERRUPT_OVERHEAD 35
#define TMR1RESET (0xFFFF-(TICKS_BETWEEN_INTERRUPTS-INTERRUPT_OVERHEAD))

const char SegCode[11] = {0x40,0x57,0x22,0x06,0x15,0x0C,0x08,0x56,0x00,0x04,0xFF};
// 0 1 2 3 4 5 6 7 8 9
const char Column[3] = {0x02,0x01,0x04};
static char Segment[3] = {0x7f,0x7f,0x7f};
static unsigned char ColCount=0x00;

MensagemEnviado: 24 Jun 2009 09:36
por Francesco
Hermann, como é o esquema elétrico do seu circuito? Os dois LM3914 estão ligados a duas barras de 10 leds cada?

MensagemEnviado: 24 Jun 2009 10:22
por Djalma Toledo Rodrigues
Se não pretende usar os LM 3914
Uma opção é no circuito uma matriz de LEDs
Digamos 3 x 7 Três colunas sete linhas
No Painel os LEDs em linha.
.

MensagemEnviado: 24 Jun 2009 12:41
por Hermann Rocha
Ola Francesco, os lm3914 estão em uma placa junto com os leds ok.
Ola Djalma, assim esse e meu interesse não tenho conhecimento em C como tenho esse programa que peguei na internet e que usa um pic que custa o mesmo valor de um lm3914 pensei em pedir uma ajudinha aqui no fórum, há algum tempo já pedi uma ajuda mais não tive sucesso, como hoje tenho um codigo pronto usando display de 7seg pensei em fazer algumas modificações no mesmo, tenho o projeto completo caso aja interesse envio por email ok. agradeço a atenção

MensagemEnviado: 24 Jun 2009 15:24
por Francesco
Se entendi bem, sua idéia é substituir o LM3914 pelo PIC16F628.

Eu fiz um programinha para esse PIC a algum tempo, você vai precisar de um AD e tenho o código pronto. Dá uma olhada no projeto "Gerador" no www.epopeiaeletronica.com

MensagemEnviado: 24 Jun 2009 17:02
por ze
veja um ex simples. se quiser o fonte... só não tá junto pois pode não ser interessante.
não sei se pode acessar sem logar. tentaê...

http://forum.eletronica.etc.br/viewtopic.php?f=13&t=255

abç

MensagemEnviado: 24 Jun 2009 23:00
por Hermann Rocha
Ola, Francesco sim tenho intenção de substituir o lm3914, bacana seu projeto em minhas buscas eu ja avia visto o monitor de tensão, Ola lellis vi e ja baixei o arquivo zipado que tem um esquema e o HEX. Pessoal agradeço a ajuda, para quem nao tem esse é o site onde peguei o projeto do voltimetro, http://www.coolcircuit.com/project/meter/index.html

MensagemEnviado: 25 Jun 2009 08:10
por fabim
tiozinho..

Se você comprar um pic com ADC de 10 bit´s.. na santa ifigenia tem o 16f72/73 por 4,50.. o 16f628 é o dobro..

É muito simples pra você pegar o peso binario do ADC e jogar em led´s..
cada led na significancia que você quiser..

Você estava pensando em quantos led´s ?

Só para ter uma idéia, esqueça conversão de peso binario para numeros etc.

Se você sabe que o inicio de escala = 0V para 0 em binario
Se você sabe que o fundo de escala =5V para 256 em binario 8 bits.

E tu vai ter por exemplo 10 led´s.
255 / 10 = 25. certo ?

deixa o 5 de ofset lá pro fundão e nao no inicio.

leio ADC.
dado = leio%25;
dado = (leio - dado)/25;

Pronto tu pegou range de 25 e tirou os quebrados.

if(dado)
seta_led0;
else
limpa_led0;

dado --;

if(dado)
seta_led1;
else
limpa_led1;

Sucessivo até o décimo byte.

Observe também que..

Se esta trabalhando em 8 bits, fundo de escala 5V
cada 1 no binario equivale a 0.0196V.
Se cada led tem o range de 25, para cada um acender do primeiro ao décio, o range de tensão de cada led = 25 * 0.0196 = 0,49V..

quarquer coisa da um grito aí.

MensagemEnviado: 26 Jun 2009 13:50
por Hermann Rocha
Ola Fabim tudo bem, pretendo usar 10 ou 20 leds depende do meu cliente, não sei pra que ele usa mais sempre tenho que mudar os valores de leitura dos leds e como o micro controlador da mais flexibilidade pra desenvolver outras aplicações estou querendo migrar. E isso, não entendi oque você quis dizer com isso, esqueça conversão de peso binário para números etc. AT+

MensagemEnviado: 26 Jun 2009 14:19
por fabim
hehe...
Imagine que vai trabalhar com 10 bits no ADC, e V ref de 5V

Certo ?

0V = 0
5V = 1024

Se vai ter um range de 20 led´s...

1024 / 20 = 51,2 ou 51.

Se sua Vref = 5V e a escalonação é de 1024.

Cada 1 do ADC = 5V/1024 = 4,88mV.

se cada led fica dentro de 51, então a tensão para que o primeiro led acenda é de 0 a 51 * 0.00488V = 248mV

Quando a tensão passar de 248mV para 253mV vai ficar aceso o primeiro e o segundo led até 248 + 248mV, quando a tensão for de 248mV+248mV+4,88mV, vao ficar acesos o primeiro o segundo e o terceiro.... sucessivo até 20 led´s.

Se por exemplo você usar Vref de 2.5,V, basta repetir os calculos com 2.5 ao invés de 5..

Isso um 16f870 que custa 4,80R$ faz com as mãos nas costas e chupando cana e assiviando...

tendeu ?

MensagemEnviado: 26 Jun 2009 16:19
por ze
rocha, veja um ex. bobo (não poderia ser diferente) de como colocar 16 leds em 2 ports do pic16f87x com ad 10 bits
Código: Selecionar todos
unsigned int ad;
...
...
for (;;)
{
ad=adc_read(0)/64; //16 estágios
PORTB=1<<ad; //LSB
PORTC=1<<(15-ad); //MSB
}

simulação=ok

abç & bfds

MensagemEnviado: 29 Jun 2009 19:09
por Hermann Rocha
Ola Fabim, obrigado pelas dicas que ja estão arquivadas, pelo que percebi nao é tão simples modificar meu codigo. Ola lellis não tive tempo de ver direito aquele arquivo assim que der dou uma olha. obrigado mais uma vez, ate +

MensagemEnviado: 03 Jul 2009 10:35
por Hermann Rocha
Ola pessoal, achei algo que pode me ajudar, lembrando que vou usar o 16f676 com ocilador interno e somente 10 leds, se alguem puder dar me ajudar nas alterações agradeço.

#include <p18f452.h>
#pragma config OSC=HSPLL, WDT=OFF, BOR=OFF, PWRT=ON

//This function delays for 14 us (micro-seconds)
//Assumes a 10 MHz crystal in HSPLL mode
//Overall, Fosc = 40 MHz
void delay(void)
{
int x = 3;
while (x--);
}

void main(void)
{
//long int = 4 bytes = 32 bits
unsigned long int i, d0, d1;
signed long int average;
unsigned long int values;
unsigned long int scaleFactor = 130944;
//130944 = 1023 (max ADC value) * 128 (number of samples)

//initialize the ADC registers:
ADCON0 = 0b10000001;
ADCON1 = 0b11000000;

//initialize PORTC and PORTD:
PORTC = 0;
TRISC = 0;

PORTD = 0;
TRISD = 0;

while(1)
{
values = 0;
average = 0;

for (i = 0; i < 128; i++)
{
delay(); //wait 14 us for acquisition
ADCON0bits.GO = 1; //start AD conversion
while (ADCON0bits.GO); //wait for AD to finish
values += ADRES;
}

//calculate bargraph values:
average = (values * 20) / (scaleFactor);
average -= 10;

if (average < 0)
{
PORTDbits.RD0 = 0; // turn off positive
PORTDbits.RD1 = 1; // turn on negative
}
else if (average > 0)
{

PORTDbits.RD0 = 1; // turn on positive
PORTDbits.RD1 = 0; // turn off negative
}
else
{
PORTDbits.RD0 = 0; // turn off positive
PORTDbits.RD1 = 0; // turn off negative
}

PORTDbits.RD2 = 0;
PORTDbits.RD3 = 0;
switch (average)
{
case -10:
case +10:
PORTC = 0b00000000;
break;
case -9:
case +9:
PORTC = 0b10000000;
break;
case -8:
case +8:
PORTC = 0b11000000;
break;
case -7:
case +7:
PORTC = 0b11100000;
break;
case -6:
case +6:
PORTC = 0b11110000;
break;
case -5:
case +5:
PORTC = 0b11111000;
break;
case -4:
case +4:
PORTC = 0b11111100;
break;
case -3:
case +3:
PORTC = 0b11111110;
break;
case -2:
case +2:
PORTC = 0b11111111;
//RD2 = RD3 = 0;
break;
case -1:
case +1:
PORTC = 0b11111111;
PORTDbits.RD2 = 1;
//PORTDbits.RD3 = 0;
break;
case 0:
default:
PORTC = 0b11111111;
PORTDbits.RD2 = 1;
PORTDbits.RD3 = 1;
break;
}
}
}