mudar display de 7 seg. para barra de leds

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

mudar display de 7 seg. para barra de leds

Mensagempor Hermann Rocha » 18 Jun 2009 12:58

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;
Hermann Rocha
Nibble
 
Mensagens: 59
Registrado em: 09 Fev 2007 20:47

Mensagempor Francesco » 24 Jun 2009 09:36

Hermann, como é o esquema elétrico do seu circuito? Os dois LM3914 estão ligados a duas barras de 10 leds cada?
Avatar do usuário
Francesco
Word
 
Mensagens: 699
Registrado em: 04 Mar 2008 00:22
Localização: São Paulo - SP

Mensagempor Djalma Toledo Rodrigues » 24 Jun 2009 10:22

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.
.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor Hermann Rocha » 24 Jun 2009 12:41

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
Hermann Rocha
Nibble
 
Mensagens: 59
Registrado em: 09 Fev 2007 20:47

Mensagempor Francesco » 24 Jun 2009 15:24

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
Avatar do usuário
Francesco
Word
 
Mensagens: 699
Registrado em: 04 Mar 2008 00:22
Localização: São Paulo - SP

Mensagempor ze » 24 Jun 2009 17:02

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ç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor Hermann Rocha » 24 Jun 2009 23:00

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
Hermann Rocha
Nibble
 
Mensagens: 59
Registrado em: 09 Fev 2007 20:47

Mensagempor fabim » 25 Jun 2009 08:10

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í.
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Hermann Rocha » 26 Jun 2009 13:50

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+
Hermann Rocha
Nibble
 
Mensagens: 59
Registrado em: 09 Fev 2007 20:47

Mensagempor fabim » 26 Jun 2009 14:19

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 ?
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor ze » 26 Jun 2009 16:19

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
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor Hermann Rocha » 29 Jun 2009 19:09

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 +
Hermann Rocha
Nibble
 
Mensagens: 59
Registrado em: 09 Fev 2007 20:47

Mensagempor Hermann Rocha » 03 Jul 2009 10:35

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;
}
}
}
Hermann Rocha
Nibble
 
Mensagens: 59
Registrado em: 09 Fev 2007 20:47


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Google [Bot] e 1 visitante

x