LusoRobótica - Robótica em Português

Sistemas específicos => PIC => Tópico iniciado por: Dave em 25 de Outubro de 2010, 10:55

Título: Display 7 segmentos
Enviado por: Dave em 25 de Outubro de 2010, 10:55
Olá amigos!

Pode parecer uma pergunta um pouco "estúpida" para vocês, mas para mim não faz sentido....

Reparem no seguinte link: http://www.eletrica.info/termometro-digital-com-pic16f818-e-lm35/ (http://www.eletrica.info/termometro-digital-com-pic16f818-e-lm35/)

Eis a pergunta: se eu tenho um PIC só com 14 pinos livres, como faço para colocar em funcionamento 3 displays de 7 segmentos?  :o
No link para resultar tudo muito bem... que tipo de ligações terá feito? Haverá algum código especial?


Estava interessado em fazer algo assim, mas feito na totalidade por mim.... tenho um PIC16f88 e 3 displays de 7 segmentos.



O meu obrigado pelo esclarecimento ;)


Cumprimentos
Título: Re: Display 7 segmentos
Enviado por: LordNelthon em 25 de Outubro de 2010, 12:14
Existe um circuito integrado que permite aumentar as saidas digitais do arduino (o 74HC595 (http://www.arduino.cc/playground/Portugues/LearningShiftOut)), mas não sei se é compativel com o PIC.
Espera por respostas de outros users.

EDIT: Parece que sim. :) vê se ajuda http://www.electronics-lab.com/projects/mcu/015/index.html (http://www.electronics-lab.com/projects/mcu/015/index.html).
Título: Re: Display 7 segmentos
Enviado por: senso em 25 de Outubro de 2010, 17:26
Um 595 é um shift register, funciona com qualquer micro-controlador, até ligado a uma porta paralela de um computador funciona.
Podes tambem pesquisar por multiplexing, que é usares o anodo ou o cátodo comum como um enable para cada display e colocas um transistor, regra geral um 2n2222 serve perfeitamente e usas os 7 de cada segmento para todos os displays e depois usas mais um pino ligado através do 2n2222 ao anodo comum de cada um dos displays em separado, se procurares por 7 segment multiplexing deves encontrar muita coisa, mas com 3 74hc595 podes ligar os 3 displays e só vais precisar de usar 3 pinos do pic.
Título: Re: Display 7 segmentos
Enviado por: Sérgio_Sena em 25 de Outubro de 2010, 19:30
Reparem no seguinte link: http://www.eletrica.info/termometro-digital-com-pic16f818-e-lm35/ (http://www.eletrica.info/termometro-digital-com-pic16f818-e-lm35/)
Eis a pergunta: se eu tenho um PIC só com 14 pinos livres, como faço para colocar em funcionamento 3 displays de 7 segmentos?  :o
No link para resultar tudo muito bem... que tipo de ligações terá feito? Haverá algum código especial?
Estava interessado em fazer algo assim, mas feito na totalidade por mim.... tenho um PIC16f88 e 3 displays de 7 segmentos.

Vê lá se este LINK te ajuda ::

mostrador de 4 dígitos de 7-segmentos, com recepção de dados por porta RS232/USB (http://www.antoniosergiosena.com/files/015___7segSerial___senaeng.com.zip)


Qualquer dúvida, apita!
Título: Re: Display 7 segmentos
Enviado por: Dave em 25 de Outubro de 2010, 19:40
Obrigado pelas rápidas respostas ;).

Eu vou estudar todas as hipóteses e tentar entender como tudo funciona... qualquer dúvida eu coloco por cá ;).


Uma vez mais o meu obrigado  ;D
Título: Re: Display 7 segmentos
Enviado por: fre_deri_co em 25 de Outubro de 2010, 20:57
não sei se ja esta esclarecido mas em todo caso deixo a minha opinião caso interesse....

CI 4026 - onde este só necessita de se ligar dois pins ao pic (incrementar e reset) permitindo ligar vários 7segment (mas cada um terá de levar um CI destes, cada um ronda os 0,6€), ao incrementar (sempre o das unidades) cada vez que recebe o décimo impulso este envia um para as dezenas, e este por sua vez ao receber o décimo impulso envia um para as centenas .... para enviar o valor basta enviar o valor pretendido em nº de impulsos de 10 micro segundos...
tenho um exemplo que eu usei dois com um picaxe 8m (pic com 8 pins) http://lusorobotica.com/index.php?topic=2653.0 (http://lusorobotica.com/index.php?topic=2653.0)


CI 4511 também é uma solução que conheço mas pessoalmente nunca utilizei, onde necessita de quatro pins convertendo o valor enviado em binário para estes para o 7 segmentos...

Título: Re: Display 7 segmentos
Enviado por: Dave em 29 de Outubro de 2010, 18:32
Amigos, estou a fazer um pequeno teste com um display de 7 segmentos, mas o programa não está a ser devidamente executado...

Citar
#include <16f88.h>
#use delay (clock=4000000)
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOMCLR, INTRC_IO
#use standard_io(A)


byte const tabela[]={
         0b10111111,
         0b10000110,
         0b11011011,
         0b11001111,
         0b11100110,
         0b11101101,
         0b11111101,
         0b10000111,
         0b11111111,
         0b11100111};

main()
{

int valor;

valor=0;

while (true)
{
   valor = valor+1;
   if (valor>9) valor = 0;
   output_b (tabela[valor]);

   delay_ms(1000);
}
}

De que poderá ser?

O display apenas apresenta o número 1 e não segue com o loop....




Agradeço.

Cumps
Título: Re: Display 7 segmentos
Enviado por: senso em 29 de Outubro de 2010, 18:53
Tens tudo bem ligado, se fizeres um simples programa para piscar um led ele pisca?
Experimenta escrever int8 ou char em vez de int, mas não me parece que venha dai algum erro.
Título: Re: Display 7 segmentos
Enviado por: Sérgio_Sena em 29 de Outubro de 2010, 19:21
verifica se a função de DELAY, aceita uma variavel de entrada de 16 bits.  Algumas bibliotecas só aceitam 8-bits.
Título: Re: Display 7 segmentos
Enviado por: Dave em 29 de Outubro de 2010, 20:22
Amigos, já fiz a dita alteração, mas o problema mantém-se....

Continuo sem ter nada no display a não ser o número 1.
Título: Re: Display 7 segmentos
Enviado por: Dave em 29 de Outubro de 2010, 20:42
Amigos, em anexo envio o ficheiro de simulação do proteus, assim como o ficheiro *.hex.

Por que razão o segmento e (RB4) nunca liga?



PS: código actual
Citar
#include <16f88.h>
#use delay (clock=4000000)
#fuses XT, NOWDT, BROWNOUT, PUT, NOMCLR, INTRC_IO

byte const tabela[]={
         0b10111111,
         0b10000110,
         0b11011011,
         0b11001111,
         0b11100110,
         0b11101101,
         0b11111101,
         0b10000111,
         0b11111111,
         0b11100111};

main()
{

int8 valor;

set_tris_a (0b11111100);

valor=0;

while (true)
{
   valor = valor+1;
   if (valor>9) valor = 0;
   output_b (tabela[valor]);
   delay_ms(1000);
}
}

cumps
Título: Re: Display 7 segmentos
Enviado por: Dave em 29 de Outubro de 2010, 22:20
Amigos, o problema está na função de soma....

Executei o com o seguinte código:

Citar
while (true)
{
valor = 5;
   
   output_b (tabela[valor]);

   delay_ms(1000);
   
   valor = 6;
   
   output_b (tabela[valor]);

   delay_ms(1000);
   
   valor = 7;
   
   output_b (tabela[valor]);

   delay_ms(1000);
}

O display liga correctamente.

Isto deixa-me ainda mais confuso, porque parece estar tudo bem ....


cumps
Título: Re: Display 7 segmentos
Enviado por: senso em 29 de Outubro de 2010, 22:43
O problema é estares a usar um simulador que nem sequer é feito pela microchip, manda lá o proteus dar uma volta que isso regra geral só trás mais mal que bem.
Experimenta já agora isto, em vez de fazeres:
Código: [Seleccione]
valor=valor+1;
faz antes:
valor++;
troca o delay_ms(1000); por :
delay_ms(250);
delay_ms(250);
delay_ms(250);
delay_ms(250);
Título: Re: Display 7 segmentos
Enviado por: Cynary em 29 de Outubro de 2010, 22:45
Com o código mais recente que apresentaste, o display faz: 5,6,7,5,6,7,..., ou faz: 5,6,7, e fica no 7?
Na parte da soma, em vez de fazeres:
valor = valor+1;
tenta cada um destes:
valor++;
++valor;
valor += 1;

E dou-te o mesmo conselho que o senso: larga o simulador.
Título: Re: Display 7 segmentos
Enviado por: Dave em 29 de Outubro de 2010, 22:51
OK amigos... eu apenas iniciei o simulador para não "estragar" demais o PIC.

Vou fazer mais testes.... modificando o delay.

Quanto ao incremento, eu estava a utilizar assim (valor++), mas fui procurando alternativas....


Citar
Com o código mais recente que apresentaste, o display faz: 5,6,7,5,6,7,..., ou faz: 5,6,7, e fica no 7?

Ele faz o ciclo.... 5,6,7,5,6,7,5,6,7,5,6,7,.......





cumps  ;)



Título: Re: Display 7 segmentos
Enviado por: senso em 29 de Outubro de 2010, 22:56
Como é que estragas o PIC a testar código?
Título: Re: Display 7 segmentos
Enviado por: Dave em 29 de Outubro de 2010, 22:57
Ele está a fazer o somatório dos números... mas demora muito mais que 250ms...... ronda o minuto de espera.

O display não apresenta o último segmento, ou seja o D, ligado a RB3.

Está complicado fazer algo simples  ;D.


cumps ;)
Título: Re: Display 7 segmentos
Enviado por: senso em 29 de Outubro de 2010, 23:07
Não tens que definir a frequência do oscilador nas propriedados do PIC no proteus?
Qual é a outra função do RB3 para além de pino digital?
Título: Re: Display 7 segmentos
Enviado por: Dave em 29 de Outubro de 2010, 23:12
Não tens que definir a frequência do oscilador nas propriedados do PIC no proteus?

Amigo, eu só usei o proteus à pouco para tirar as "teimas" e ver se era mesmo do código ou do PIC....

Agora, como dantes, estou a programar no PIC e a testar na placa.

Qual é a outra função do RB3 para além de pino digital?

RB3 - PGM - CCP1 é o indicado no datasheet.


Obrigado pelas respostas ;)
Título: Re: Display 7 segmentos
Enviado por: senso em 29 de Outubro de 2010, 23:19
PGM, tem alguma coisa a ver com pino involvido no processo de programar o PIC?
O proteus pode pensar que o pino está noutro modo que não um pino digital.
Título: Re: Display 7 segmentos
Enviado por: Dave em 29 de Outubro de 2010, 23:45
PGM, tem alguma coisa a ver com pino involvido no processo de programar o PIC?
O proteus pode pensar que o pino está noutro modo que não um pino digital.

Amigo... eu não estou a utilizar o proteus!
Eu estou a usar o CCS para compilar e estou a testar nas placa e não no proteus.

cumps
Título: Re: Display 7 segmentos
Enviado por: senso em 29 de Outubro de 2010, 23:47
Mas não estavas a simular no proteus?
Título: Re: Display 7 segmentos
Enviado por: Dave em 29 de Outubro de 2010, 23:57
Mas não estavas a simular no proteus?


Eu apenas simulei uma única vez (como já disse num post anterior) para:
* Colocar aqui no fórum o circuito e a ligação;
* "para tirar as "teimas" e ver se era mesmo do código ou do PIC....";

Assim, vou reformular e fazer o ponta da situação.

Neste momento o PIC16F88 foi programado com o seguinte código:
Citar
#include <16f88.h>
#use delay (clock=4000000)
#fuses NOWDT, BROWNOUT, PUT, NOMCLR, INTRC_IO

byte const tabela[]={0b10111111,
                     0b10000110,
                     0b11011011,
                     0b11001111,
                     0b11100110,
                     0b11101101,
                     0b11111101,
                     0b10000111,
                     0b11111111,
                     0b11100111};

void main()
{
int8 valor;
set_tris_a(0b11111100);
valor=0;

while (true)
{
   valor++;
   if (valor>=10) valor=0; 
   output_b(tabela[valor]);
   delay_ms(250);
}
}

Problemas:
1) O delay "real" não é de 250ms. Demora cerca de 1 min até aparecer outro número no display.
2) Todos os números que necessitem do segmento "d" do display, estão a sair sem que o mesmo seja activo.

Notas:
1) Dos pinos A configurei tudo como saída, excepto os dois pinos onde está colocado o cristal... não sei se é esta a forma correcta de fazer...

2) Já testei usando apenas números ao invés da função if e do incremento de "valor" e  todos os segmentos ligaram correctamente. Com os código em cima, não está a resultar.



Uma vez mais obrigado pelo vosso tempo!
Título: Re: Display 7 segmentos
Enviado por: senso em 30 de Outubro de 2010, 00:03
Como é que ligas 7 segmentos a 6 pinos?
Depois, tens a certeza que o teu PIC está mesmo a funcionar a 4Mhz?
Se dizes que fazes um delay de 250ms e demora 1 minuto parece que o teu pic está na verdade a trabalhar a 1Mhz.
Já experimentas-te usar outro porto sem ser o porto A?
Título: Re: Display 7 segmentos
Enviado por: Dave em 30 de Outubro de 2010, 00:14
Como é que ligas 7 segmentos a 6 pinos?

Não entendi amigo...
Eu tenho 7 segmentos, ligados a 7 pinos.
Liguei aos pinos RB0 a RB6.

Depois, tens a certeza que o teu PIC está mesmo a funcionar a 4Mhz?
Se dizes que fazes um delay de 250ms e demora 1 minuto parece que o teu pic está na verdade a trabalhar a 1Mhz.
Já experimentas-te usar outro porto sem ser o porto A?

O cristal é de 4MHz... no código apresento " #use delay (clock=4000000) ", por isso penso que sim... de certo ele demora muito tempo talvez antes de chegar ao delay....


Cumps
Título: Re: Display 7 segmentos
Enviado por: senso em 30 de Outubro de 2010, 00:18
Mas não estavas a simular no proteus?


Eu apenas simulei uma única vez (como já disse num post anterior) para:
* Colocar aqui no fórum o circuito e a ligação;
* "para tirar as "teimas" e ver se era mesmo do código ou do PIC....";

Assim, vou reformular e fazer o ponta da situação.

Neste momento o PIC16F88 foi programado com o seguinte código:
Citar
#include <16f88.h>
#use delay (clock=4000000)
#fuses NOWDT, BROWNOUT, PUT, NOMCLR, INTRC_IO

byte const tabela[]={0b10111111,
                     0b10000110,
                     0b11011011,
                     0b11001111,
                     0b11100110,
                     0b11101101,
                     0b11111101,
                     0b10000111,
                     0b11111111,
                     0b11100111};

void main()
{
int8 valor;
set_tris_a(0b11111100);    //Configuras o teu porto A
valor=0;

while (true)
{
   valor++;
   if (valor>=10) valor=0; 
   output_b(tabela[valor]);   //usas o porto B como saida?
   delay_ms(250);
}
}

Problemas:
1) O delay "real" não é de 250ms. Demora cerca de 1 min até aparecer outro número no display.
2) Todos os números que necessitem do segmento "d" do display, estão a sair sem que o mesmo seja activo.

Notas:
1) Dos pinos A configurei tudo como saída, excepto os dois pinos onde está colocado o cristal... não sei se é esta a forma correcta de fazer...

2) Já testei usando apenas números ao invés da função if e do incremento de "valor" e  todos os segmentos ligaram correctamente. Com os código em cima, não está a resultar.



Uma vez mais obrigado pelo vosso tempo!
Tens que decidir se queres usar o porto A ou o porto B, muda lá o set_trisa para b, mete tudo como deve ser, deixa lá o porto A descansado e configura bem o B.
Depois mete um led a piscar, por exemplo 1 segundo ligado e 1 segundo desligado para teres a certeza que tens o cristal a funcionar á frequência esperada, não sei se esse pic tem oscilador interno, mas se tiver podes estar a correr do oscilador interno e não do cristal como pensas.
Título: Re: Display 7 segmentos
Enviado por: Dave em 30 de Outubro de 2010, 00:25
Já coloquei o led a piscar de 1s em 1s e está operacional.

De momento estou a testar o PIC com o código abaixo e continuo a verificar o mesmo problema...

Citar
#include <16f88.h>
#use delay (clock=4000000)
#fuses NOWDT, BROWNOUT, PUT, NOMCLR, INTRC_IO



byte const tabela[]={0b10111111,
                     0b10000110,
                     0b11011011,
                     0b11001111,
                     0b11100110,
                     0b11101101,
                     0b11111101,
                     0b10000111,
                     0b11111111,
                     0b11100111};

void main()
{

int8 valor;

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

set_tris_b(0b11111111);

valor=0;

while (true)
{
   valor++;

   if (valor>=10) valor=0;

   output_b(tabela[valor]);

   delay_ms(250);
}
}
Título: Re: Display 7 segmentos
Enviado por: senso em 30 de Outubro de 2010, 00:30
Talvez sejam manias do compilador e porque nem sequer tens acesso directo ao porto, tenta assim:

Código: [Seleccione]
#include <16f88.h>
#use delay (clock=4000000)
#fuses NOWDT, BROWNOUT, PUT, NOMCLR, INTRC_IO



byte const tabela[]={0b10111111,
                     0b10000110,
                     0b11011011,
                     0b11001111,
                     0b11100110,
                     0b11101101,
                     0b11111101,
                     0b10000111,
                     0b11111111,
                     0b11100111};

void main()
{

int8 valor = 0;
int8 tab = 0;

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

set_tris_b(0b11111111);


while (true)
{

   if (valor>9){
      valor=0; }
   tab = tabela[valor];
   output_b(tab);
   valor++;
   delay_ms(250);
}
}

Atenção que um array de tamanho 10 só podes ler de 0 a 9 e não de 1 a 10, lês sempre a começar do 0 e acaba sempre uma posição a menos que o tamanho com que o declaras, porque a declarar contas de 1 até onde queres e a ler, lês a partir de 0 e não do 1.
Título: Re: Display 7 segmentos
Enviado por: Dave em 30 de Outubro de 2010, 00:42
Amigo, infelizmente o problema mantém-se.....

Encontrei um código na net que faz exactamente o mesmo. Vou testa-lo e já dou por cá feedback.

Se continuar na mesma já não pode ser erro meu....


cumps
Título: Re: Display 7 segmentos
Enviado por: Dave em 30 de Outubro de 2010, 00:55
Nada... tudo na mesma....

 :'( :'(
Título: Re: Display 7 segmentos
Enviado por: senso em 30 de Outubro de 2010, 00:58
Isso é muito estranho..
Pisca um led no porto A para ver o loop está a ser executado a cada 250ms.
Título: Re: Display 7 segmentos
Enviado por: Dave em 30 de Outubro de 2010, 01:01
Tenho aqui um código para fazer piscar dois leds e dar um efeito de strobe.

Quando programo o PIC com isto, funciona bem....


Citar
#include <16F88.h>
#use standard_io (A)
#use standard_io (B)
#use delay (clock = 4000000)
#fuses XT, NOWDT, PUT, NOLVP, NOMCLR, BROWNOUT, NOWDT


void main()
{
int conta1, conta2;

   while (true)
   {
   for (conta1 = 0; conta1 <= 30; conta1 = conta1 +1)
      {
      output_high (pin_B0) ;
      delay_ms (50)        ;
      output_low (pin_B0)  ;
      delay_ms (50)        ;

     (....................)

      output_high (pin_B1) ;
      delay_ms (50)        ;
      output_low (pin_B1)  ;
      delay_ms (100)       ;
      }
    for (conta2=1000; conta2>=50; conta2=conta2-10)
      {
      output_high (pin_A0) ;
      delay_ms (conta2)    ;

(..........................)

      output_low (pin_A1)  ;
      delay_ms (conta2)    ;
      }
   }

}
Título: Re: Display 7 segmentos
Enviado por: senso em 30 de Outubro de 2010, 01:03
Então o problema deve se o acesso ao array, tira o const e volta a experimentar.
Título: Re: Display 7 segmentos
Enviado por: Dave em 30 de Outubro de 2010, 01:09
Acabei de testar e fica tudo na mesma....


Vou refazer toda a montagem.

O curioso é que se eu "mandar" o PIC sair com valor = 8, todos os segmentos acendem e até o temporizador funciona bem...
Título: Re: Display 7 segmentos
Enviado por: senso em 30 de Outubro de 2010, 01:13
O que queres dizer com sair?
Título: Re: Display 7 segmentos
Enviado por: Dave em 30 de Outubro de 2010, 01:14
Dentro do while, se fizer a troca por:

Citar
valor=0;
   output_b(tabela[valor]);
   delay_ms(250);

   valor=1;
   output_b(tabela[valor]);
   delay_ms(250);

   valor=2;
   output_b(tabela[valor]);
   delay_ms(250);

   valor=3;
   output_b(tabela[valor]);
   delay_ms(250);

   valor=4;
   output_b(tabela[valor]);
   delay_ms(250);

   valor=5;
   output_b(tabela[valor]);
   delay_ms(250);

   valor=6;
   output_b(tabela[valor]);
   delay_ms(250);
   valor=7;
   output_b(tabela[valor]);
   delay_ms(250);

   valor=8;
   output_b(tabela[valor]);
   delay_ms(250);

   valor=9;
   output_b(tabela[valor]);
   delay_ms(250);

O tempo fica nos 250ms na realidade e todos os segmentos ligam....

Curioso....
Título: Re: Display 7 segmentos
Enviado por: senso em 30 de Outubro de 2010, 01:16
Tens optimizações ligadas, o compilador não te dá nenhum erro nem aviso, é que isso é bastante estranho e não estou assim a ver nenhum erro que salte á vista.
Título: Re: Display 7 segmentos
Enviado por: Dave em 30 de Outubro de 2010, 18:22
Amigos, fiz uma modificação das saídas, excluindo o pin RB3, porque como visto anteriormente ele não "funciona" com o código usado.

Assim, usando o seguinte código, tudo está a funcionar bem agora  ;).


Citar
#include <16f88.h>
#use delay (clock=4000000)
#fuses NOWDT, BROWNOUT, PUT, NOMCLR, INTRC_IO


byte tabela[]={      0b01111111,
                     0b00001110,
                     0b10111011,
                     0b10011111,
                     0b11001110,
                     0b11011101,
                     0b11111101,
                     0b00001111,
                     0b11111111,
                     0b11001111};



void main()
{

int8 valor;


set_tris_b(0b11111111);
set_tris_a(0b11111111);

   setup_oscillator(OSC_4MHZ);
   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);


while (true)
{
   valor=0;
   output_b(tabela[valor]);
   delay_ms(1000);

   valor=1;
   output_b(tabela[valor]);
   delay_ms(1000);

   valor=2;
   output_b(tabela[valor]);
   delay_ms(1000);

   valor=3;
   output_b(tabela[valor]);
   delay_ms(1000);

   valor=4;
   output_b(tabela[valor]);
   delay_ms(1000);

   valor=5;
   output_b(tabela[valor]);
   delay_ms(1000);

   valor=6;
   output_b(tabela[valor]);
   delay_ms(1000);

   valor=7;
   output_b(tabela[valor]);
   delay_ms(1000);

   valor=8;
   output_b(tabela[valor]);
   delay_ms(1000);

   valor=9;
   output_b(tabela[valor]);
   delay_ms(1000);
}
}
Título: Re: Display 7 segmentos
Enviado por: Dave em 31 de Outubro de 2010, 01:53
Amigos, peço uma vez mais a vossa ajuda!

Coloquei no PIC o código em baixo:
Citar
#include <16f88.h>
#device adc=10
#use delay (clock=4000000)
#fuses NOWDT, BROWNOUT, PUT, NOMCLR, INTRC_IO


byte tabela[]={      0b01111111,//0
                     0b00001110,//1
                     0b10111011,//2
                     0b10011111,//3
                     0b11001110,//4
                     0b11011101,//5
                     0b11111101,//6
                     0b00001111,//7
                     0b11111111,//8
                     0b11001111};//9

main()
{

long int sensor;
float temp;
int8 d2, d1, d0;
int8 x1, x2, x0;

set_tris_a(0b10000100);
set_tris_b(0b00000000);

   setup_oscillator(OSC_4MHZ);
   setup_adc_ports(sAN2|VSS_VDD);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   
sensor=0;
temp=0;
d2=0;
d1=0;
d0=0;
x1=0;
x2=0;
X0=0;

while (true)
{
set_adc_channel(2);

 sensor = READ_ADC(7);  // ler temperatura, associar a "sensor"
 
 delay_ms(100); //tempo para aquisição

 temp = (sensor*0.48828125);/// converter sensor (0 a 1024) em decimal
delay_ms(10);

 d2 = temp/10;// valor no 1º display
 delay_ms(10);
 
 d1 = temp-(10*d2);//valor no 2º display
 delay_ms(10);
 
 d0 = (temp-(10*d2)-d1)*10;//valor no display decimal
delay_ms(10);

// mostrar valores nos display's
 x2=tabela[d2];
 delay_ms(10);
 x1=tabela[d1];
 delay_ms(10);
 x0=tabela[d0];
 delay_ms(10);

   //mostrar d2
output_high(PIN_A4);
delay_ms(200);
      output_b(x2);
      delay_ms(1000);
output_low(PIN_A4);
delay_ms(100);
     
   //mostrar d1
output_high(PIN_A3);
delay_ms(200);
      output_b(x1);
      delay_ms(1000);
output_low(PIN_A3);
delay_ms(100);
     
   //mostrar d0
output_high(PIN_A1);
delay_ms(200);
      output_b(x0);
      delay_ms(1000);
output_low(PIN_A1);
delay_ms(200);
}
}

Utilizo um só display, mas faço com que liguem 3 leds por sua vez.... o das dezenas, o das unidades e o decimal.

O que está a acontecer é que o valor mostrado nunca é o mesmo... fica e variar e numa dada altura o programa para um por pouco deixando 1 ou 2 leds ligados....

O que será e como poderei resolver.

Muito obrigado pela vossa paciência e pelo vosso tempo!



Cumprimentos!
Título: Re: Display 7 segmentos
Enviado por: senso em 31 de Outubro de 2010, 01:36
Com tanto delay no programa é normal que ele ande meio aos soluços, para começar, para que fazes isto:
Código: [Seleccione]
delay_ms(100); //tempo para aquisiçãoÉ que está depois de leres o valor do adc, logo esse delay só está a comer tempo.
Código: [Seleccione]
#include <16f88.h>
#device adc=10
#use delay (clock=4000000)
#fuses NOWDT, BROWNOUT, PUT, NOMCLR, INTRC_IO


byte tabela[]={      0b01111111,//0 
                     0b00001110,//1
                     0b10111011,//2
                     0b10011111,//3
                     0b11001110,//4
                     0b11011101,//5
                     0b11111101,//6
                     0b00001111,//7
                     0b11111111,//8
                     0b11001111};//9

main()
{

long int sensor;
float temp;
int8 d2, d1, d0;
int8 x1, x2, x0;

set_tris_a(0b10000100);
set_tris_b(0b00000000);

   setup_oscillator(OSC_4MHZ);
   setup_adc_ports(sAN2|VSS_VDD);    // o 's' minisculo é suposto ser minusculo?
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   
sensor=0; //se um long int do teu compilador for igual a um long int dos avr's isto é uma variavel de 32, não sei para que precisas dela
temp=0.0; //floats devem ser inicializados como floats e não como inteiros, logo mete sempre 0.0 ou 0,0 depende do compilador
d2=0;
d1=0;
d0=0;
x1=0;
x2=0;
X0=0;

while (true)
{
set_adc_channel(2);  //isto deveria estar fora do loop, porque se lês sempre o mesmo canal não vejo porque estás sempre a defini-lo

 sensor = READ_ADC(7);  // ler temperatura, associar a "sensor" //pressuponho que o (7) sejam os bits que o ADC vai ler, logo usar a resolução máxima do adc parece-me o mais apropriado e depois, meter 7 bits numa variavel de 32 bits é muito estranho
 
 delay_ms(100); //tempo para aquisição //o tal tempo que acho completamente inutil

 temp = (sensor*0.48828125);/// converter sensor (0 a 1024) em decimal  //qual é a conta que fazes para obter o 0.48828125, se os displays não têm valores com virgula(decimais) acho que podes descartar de todo o uso de floats no programa
delay_ms(10);   //mais um delay caido do céu sem efeitos praticos, digo eu :s

 d2 = temp/10;// valor no 1º display
 delay_ms(10);  //e outro
 
 d1 = temp-(10*d2);//valor no 2º display
 delay_ms(10); //e mais outro
 
 d0 = (temp-(10*d2)-d1)*10;//valor no display decimal
delay_ms(10); // e ainda outro

// mostrar valores nos display's
 x2=tabela[d2];
 delay_ms(10); //para que é que tens um delay entre cada operação, o PIC não se engasga..
 x1=tabela[d1];
 delay_ms(10); //idem aspas
 x0=tabela[d0];
 delay_ms(10);  //e mais outro, passa mais tempo a fazer delays que mais nada, coitado do bicho

   //mostrar d2
output_high(PIN_A4);
delay_ms(200);  //e mais outro
      output_b(x2);
      delay_ms(1000);
output_low(PIN_A4);
delay_ms(100); //e outro
     
   //mostrar d1
output_high(PIN_A3);
delay_ms(200);
      output_b(x1);
      delay_ms(1000);
output_low(PIN_A3);
delay_ms(100);
     
   //mostrar d0
output_high(PIN_A1);
delay_ms(200);
      output_b(x0);
      delay_ms(1000);
output_low(PIN_A1);
delay_ms(200);
}
}

Tanto delay para que rapaz?
Se não me enganei a somar nada, tens nada mais nada menos que 4070ms de delays numa unica interação do loop infinito, ou seja mais de 4 segundos para correr essas linhas de código uma unica vez.
Título: Re: Display 7 segmentos
Enviado por: Dave em 31 de Outubro de 2010, 13:22
Amigo, já retirei todos os delay's dispensáveis...

Citar
setup_adc_ports(sAN2|VSS_VDD);    // o 's' minisculo é suposto ser minusculo?

Exacto, tem a ver com a biblioteca do CCS... o "s" é mesmo minúsculo.

Inicialmente testei como o amigo sugere, mas como dava alguns problemas, fui visitando paginas na net e fazndo algumas modificações.
No exemplo do "set_adc_channel()" vi isso numa página web, de facto não tem muita lógica, daí eu ter antes do while... mas depois como não funcionava, eu foi "inventando"....

Vou testar novamente.... LOL durante a noite tive umas ideias "luminosas" e vou tentar também.

Já coloco por cá o feedback.


Obrigado  ;) :)
Título: Re: Display 7 segmentos
Enviado por: Dave em 31 de Outubro de 2010, 21:39
Amigos, estou farto de dar voltas, pensar em tudo novamente, mas o resultado é quase sempre o mesmo...

Afinal onde poderá estar o erro?

Queria apenas que lê-se a temperatura a partir do sensor, depois por cada digito acendesse um led e mostrasse o digito no display.

Infelizmente não consigo resultados positivos e já estou cansado de tentar procurar um erro que, aos meus olhos, está bastante bem camuflado...


Agradeço toda e qualquer ajuda ;).


O meu muito obrigado.
Título: Re: Display 7 segmentos
Enviado por: senso em 31 de Outubro de 2010, 21:40
Tal como fizeste com as variaveis, mete a tabela dentro do main.
Que compilador estás a usar, quais as opções de optimização tens ligadas, o compilador não dá nem um aviso nesse código?
Título: Re: Display 7 segmentos
Enviado por: Dave em 31 de Outubro de 2010, 21:49
Tal como fizeste com as variaveis, mete a tabela dentro do main.
Que compilador estás a usar, quais as opções de optimização tens ligadas, o compilador não dá nem um aviso nesse código?

Estou a compilar com o CCS e, aquando da compilação, não há nenhum erro mostrado pelo compilador.

Quanto ao colocar a tabela no main, suponho que irá ficar igual... o irreal disto é que ele associa o valor e converte para o display (se meter com ciclo com uma soma, tal como já aqui postei, os números saem correctos), mas quando mando ler a temperatura e escrever os valores, tudo começa a "descambar"...

Era meu objectivo, além de aprender um pouco mais sobre pic's, fazer um termómetro para funcionar dentro de casa e na mesma estrutura... 1 display com 3 leds (indicando a posição do digito mostrado pelo display).

Olhei para a biblioteca do CCS relativa a este PIC, revi tudo à procura de eventuais erros mas a procura não teve frutos...  :'( :'(


Título: Re: Display 7 segmentos
Enviado por: senso em 31 de Outubro de 2010, 22:13
Regista-te no forum da microchip e pergunta lá, e depois diz aqui qual foi a solução para outros com o mesmo problema, e aproveita e manda uma pm ao asena que é o mestre dos Pics aqui do fórum.
Título: Re: Display 7 segmentos
Enviado por: Dave em 31 de Outubro de 2010, 22:50
Regista-te no forum da microchip e pergunta lá, e depois diz aqui qual foi a solução para outros com o mesmo problema, e aproveita e manda uma pm ao asena que é o mestre dos Pics aqui do fórum.

OK.


Assim vou fazer.
Título: Re: Display 7 segmentos
Enviado por: Dave em 31 de Outubro de 2010, 22:58
Para sintetizar, cá fica o último código utilizado:
Citar
#include <16f88.h>
#device adc=10
#use delay (clock=4000000)
#fuses NOWDT, BROWNOUT, PUT, NOMCLR, XT


byte tabela[]={      0b01111111,//0
                     0b00001110,//1
                     0b10111011,//2
                     0b10011111,//3
                     0b11001110,//4
                     0b11011101,//5
                     0b11111101,//6
                     0b00001111,//7
                     0b11111111,//8
                     0b11001111};//9


main()
{

long int sensor;
float temp;
int8 d2, d1, d0;
int8 m1, m2, m0;

#use fast_io(A)
set_tris_A(0B10000100);
#use fast_io(B)
set_tris_B(0B00000000);
 
   setup_oscillator(OSC_4MHZ);
   setup_adc_ports(sAN2|VSS_VDD);
   setup_adc(ADC_CLOCK_INTERNAL);
   set_adc_channel(2);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);


while(true)
{

 READ_ADC(1);
 delay_ms(100);
 sensor = READ_ADC(6);  // ler temperatura, associar a "sensor"

 temp = (sensor*20)/40.96;/// converter sensor (0 a 1024) em decimal

 d2 = (temp/10);// valor no 1º display
 m2=tabela[d2];

 d1 = (temp-(10*d2));//valor no 2º display
 m1=tabela[d1];
 
 d0 = ((temp-(10*d2)-d1)*10);//valor no display decimal
 m0=tabela[d0];
 
// mostrar valores nos display's

   //mostrar d2

   output_high(PIN_A4);
   output_b(m2);
   delay_ms(1000);
   output_low(PIN_A4);

   //mostrar d1

   output_high(PIN_A3);
   output_b(m1);
   delay_ms(1000);
   output_low(PIN_A3);
   
   //mostrar d0

   output_high(PIN_A1);
   output_b(m0);
   delay_ms(1000);
   output_low(PIN_A1);

}
}
Título: Re: Display 7 segmentos
Enviado por: Sérgio_Sena em 01 de Novembro de 2010, 14:18
Respondo aqui, em vez de por PM, pois assim pode tirar a dúvida a outros.

Acompanho este tópico desde o início, mas nunca quis comentar pois é recorrente o tipo de dúvidas.
E vêem todas pela falta crónica de bases sobre a arquitectura e funcionamento interno.
Tendo nunca aprendido a trabalhar com microcontroladores, querer aprender PIC logo em C, dá sarilhos. E eles estão aqui bem patentes.
Aprender de raiz, com alguém que possa ajudar, ou com bons manuais, seguindo exemplos e estudando o q os exemplos significam, Em Assembler, vai ajudar a passar para o C sem grandes preocupações.
É o que se passa, é que não se consegue saber se o problema vem do compilador ou do PIC.

DAVE, não é para te desmoralizar. Avança em frente. Quem dera que houvesse mais jovens com vontade de aprender alguma coisa.



# o esquema eléctrico?

# tens a certeza que a função interna de "delay_ms(1000);" aceita um número Inteiro16? é que dos compiladores que eu conheço, só costuma aceitar Inteiro8.

# para ter a certeza q o PIC está a fazer o que realmente tu queres que ele faça, deixa de usar as funções do compilador, tipo :: fast_io(A), set_tris_A(0B10000100); e as outras todas de SETUP,    output_high(PIN_A4);   output_b(m2);.... etc.... etc...

Para quê usar "output_high(PIN_A4)", quando se pode usar RA4=1 ?
Para quê usar "output_b(m2)", quando se pode usar PORTB=m2 ?
Eu sei o que vai lá dentro destas funções?
Podem nem ser funções, podem ser macros do compilador, e aí não tens mesmo acessoa a elas.

Não estou a dizer que não funcionem. Só quero frisar que TU não sabes o que elas estão a fazer.
A não ser que as tenhas feito tu. O que não acontece.


# Há uma maneira melhor de converter Binário em BCD, sem usar FLOAT (não está optimizada, mas funciona bem-zinho).
Tens que criar um array onde vão ser colocados os 5 digitos do teu INT16 ::

Código: [Seleccione]
/********************************************************************
*     Function Name:    BinTOBCD *
*     Parameters:       numero a converter, array destino *
*     Description:      converte numero INTeiro para n*BCD *
********************************************************************/
void BinTOBCD (int a, char *b)
{
for (b[0]=0x30; a >= 10000 ; (a-=10000))
b[0]++;
for (b[1]=0x30; a >= 1000 ; (a-=1000))
b[1]++;
for (b[2]=0x30; a >= 100 ; (a-=100))
b[2]++;
for (b[3]=0x30; a >= 10 ; (a-=10))
b[3]++;
for (b[4]=0x30; a >= 1 ; (a-=1))
b[4]++;
}// BinTOBCD (minutos, X2B); //converte binario "minutos" para BCD




# Já confirmaste em simulação no MPLAB, se os valores que estás a ter no TEMP, a cada passo aritmético, e nos mX, são os correctos? confirma isso. Abre uma janela WATCH, põe lá os registos q queres ver e faz passo a passo a simulação.

# " d0 = ((temp-(10*d2)-d1)*10);//valor no display decimal" ----   há compiladores que não gostam de uma equação tão grande. Tens q reduzir por passos.

# " READ_ADC(1);" ----- isto serve para quê?

#  "temp = (sensor*20)/40.96;/// converter sensor (0 a 1024) em decimal" ----- precisas mesmo de dividir por um decimal? podes dividir por 4096? é que a nível interno, tens várias vezes menos assmbler a ser gerado. Podes mais à frente dividir por 100, ou simplesmente ignorar os dois digitos menos significativos quando converteres de BINARIO para BCD.



Tinhas menos trabalho com 3x7-seg do que com um apenas e vários LEDs.  ;D

bom trabalho! ;)
Título: Re: Display 7 segmentos
Enviado por: Dave em 01 de Novembro de 2010, 16:07
Amigo asena, antes de mais, obrigado pela reposta!
Vou continuar a analisar o seu tópico com especial atenção, mas aproveito para colocar cá algo que observei ontem há noite e pode dar uma enorme ajuda.

Ontem troquei o sensor por um potenciómetro e fui variando para ver o que dava.... conclusão: o valor da tensão tem uma correspondência com o valor mostrado pelo display. Se nesse pino tiver 2V, o display irá mostrar (das três piscadelas...) "2 - 0 - 0", se colocar o pino no GND vou ter "0 - 0 - 0", por último, se colocar no +5, vou ter no display "4 - 9 - 9".

Com o código apresentado (depois de concluir isto, modifiquei os cálculos), no display aparece "2 - 0 - 9"..."2 - 1 - 9".... ou seja o valor não é constante nem corresponde tão pouco há temperatura... que rondava os 17.5ºC.




Vou continuar a análise do post ;).


Cumprimentos!
Título: Re: Display 7 segmentos
Enviado por: senso em 01 de Novembro de 2010, 22:06
Lembrei-me de um outro tópico, não terás  a ter problemas por teres pinos não configurados nem como saidas nem como entradas e por isso estão a apanhar ruido e por isso estão a flutuar e ao que parece os Pics têm problemas de estabilidade quanto a isso, configura todos os pinos não usados como saidas  e coloca todos a 0 ou 1 para terem um valor fixo.
Mas se estás a usar o adc com 7 bits o máximo deveria ser 127, com 8 bits o máximo devia ser 255, com 9 bits seria 511 e com 10 bits 1023.
Título: Re: Display 7 segmentos
Enviado por: Dave em 01 de Novembro de 2010, 22:35
Agora fiquei confundido....

Citar
#use fast_io(A)
set_tris_A(0B10000100);
#use fast_io(B)
set_tris_B(0B00000000);

Se "0" é saída e "1" é entrada, o que está em cima não está correcto?
Não é assim que se faz a configuração dos pinos?


cumps
Título: Re: Display 7 segmentos
Enviado por: Sérgio_Sena em 02 de Novembro de 2010, 00:22
Se estás a usar o 16F88, então só tens as portas A e B.
Então, a tua configuração está correcta.


Já agora, para que serve a entrada extra?

É que como ainda não apresentaste esquema eléctrico, andamos todos a adivinhar !  ;D
Título: Re: Display 7 segmentos
Enviado por: senso em 02 de Novembro de 2010, 00:45
Eu acho estranho isso não funcionar, é que um pedacinho de código tão pequeno e não funciona :s
Título: Re: Display 7 segmentos
Enviado por: Dave em 02 de Novembro de 2010, 02:23
Cá fica o circuito.

O pino RB3, pino 9 do PIC, tem de ser ligado ao GROUND... caso contrário, o display não funciona  ???.

No Proteus, há um erro qualquer e alguns segmentos não acendem.... mas na realidade, estão todos a trabalhar bem, segundo a conversão feita.

(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi473.photobucket.com%2Falbums%2Frr100%2Fdaviddmmartins%2Fcircuitodisplay.jpg&hash=077a36c3d29d80811f126e06710be7021df40cb8)


 ;) ;)
Título: Re: Display 7 segmentos
Enviado por: Dave em 02 de Novembro de 2010, 02:26
Já agora, para que serve a entrada extra?

Pode ser brutidade minha, mas segundo o datasheet o pino RA7 é a entrada do cristal... talvez não seja necessário isso....


PS: testei no PROTEUS e está tudo a funcionar como deveria....

Se este é o melhor simulador e está tudo igual ao real, porque num funciona e no outro não.... "o material tem sempre razão" e de certo a culpa é minha :(:(.


Cumprimentos
Título: Re: Display 7 segmentos
Enviado por: senso em 02 de Novembro de 2010, 10:15
Com um cristal nos pinos não tens qualquer controlo sobre a função de pino digital de entrada/saida onde o cristal está ligado pois esse circuito é desligado do pino fisico e fica ligado o oscilador.
O reset não devia ter uma resistência ou assim?
Título: Re: Display 7 segmentos
Enviado por: Sérgio_Sena em 02 de Novembro de 2010, 10:25
Cá fica o circuito.

O pino RB3, pino 9 do PIC, tem de ser ligado ao GROUND... caso contrário, o display não funciona  ???.

No Proteus, há um erro qualquer e alguns segmentos não acendem.... mas na realidade, estão todos a trabalhar bem, segundo a conversão feita.

(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi473.photobucket.com%2Falbums%2Frr100%2Fdaviddmmartins%2Fcircuitodisplay.jpg&hash=077a36c3d29d80811f126e06710be7021df40cb8)


 ;) ;)



- Acrescenta o FUSIVEL de LowVoltageProgramming DESLIGADO.

- liga o RA5 com uma resistência aos+5V

- ao escolheres cristal externo, deixas de ter controlo sobre os pinos RA6 e RA7


- usa o oscilador interno. Poupas componentes e dinheiro e chatice.


Título: Re: Display 7 segmentos
Enviado por: Dave em 02 de Novembro de 2010, 12:26
Quando ligo o cristal, deixo de ter controlo sobre esses pinos, então no "set_tris_a", admito tudo saída excepto onde tenho onde tenho o sensor é isso?

Quanto ao circuito apresentado, peço desculpa, pois contêm um erro. o MCLR não está ligado ao GROUND mas sim ao VDD... no entanto não tem a resistência sugerida...

Aqui com todas as modificações ;).

(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi473.photobucket.com%2Falbums%2Frr100%2Fdaviddmmartins%2Fcircuitodisplay-1.jpg&hash=74ac0a07c2660bf3680e3c787cda46718f764625)

Título: Re: Display 7 segmentos
Enviado por: senso em 02 de Novembro de 2010, 12:32
Então, o teu sensor é uma entrada, e não uma saida, e se estás a usar o ADC não deve interferir, mas convem configurar o pino onde tens o LM35 ligado como uma entrada.
Mas por esse erro do reset podes ver como o simulador é tão fiavel(ironicamente falando é claro, que nas internets não temos tom de voz), supostamente o teu PIC na simulação devia estar num hard-reset mas mesmo assim funcionava, agora se bem ou não, ou quão mal simulado isso está a ser não sabemos.
Título: Re: Display 7 segmentos
Enviado por: Dave em 02 de Novembro de 2010, 12:33

- Acrescenta o FUSIVEL de LowVoltageProgramming DESLIGADO.


Quase de certeza que é disso!

No proteus, funcionava mas com alguns "arranques", depois disso passou a funcionar bem.
Infelizmente agora não tenho como testar, pois o programador (assim como o circuito) está em casa e só lá vou no fim de semana :(.

Vou aproveitar para fazer todas as melhorias aconselhadas no código.

Fico à espera de mais conselhos :):).

O meu muito obrigado e as minhas desculpas pela "chatice" toda, mas aprender algo sozinho é complicado... cá se faz algum esforço, mas ....


Com os melhores cumprimentos ;).
Título: Re: Display 7 segmentos
Enviado por: Dave em 05 de Novembro de 2010, 18:53
Pois é amigos.... o problema mantém-se.

O display nunca apresenta uma série de 3 digitos seguidos e iguais, ou seja, tenho o PIC ligado a um divisor de tensão e o valor mostrado nunca é o mesmo....

Vou dar mais uma vista de olhos em tudo...


Cumps
Título: Re: Display 7 segmentos
Enviado por: senso em 05 de Novembro de 2010, 19:00
Mostra ai uma foto do teu circuito.
Título: Re: Display 7 segmentos
Enviado por: Dave em 05 de Novembro de 2010, 20:20
Mostra ai uma foto do teu circuito.
Foto do circuito:

(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi473.photobucket.com%2Falbums%2Frr100%2Fdaviddmmartins%2FIMG_4159.jpg&hash=175366dfd7029a6980f61d95687f8d0136c5c827)


Vídeo do circuito em funcionamento:
http://s473.photobucket.com/albums/rr100/daviddmmartins/?action=view&current=IMG_4162.mp4 (http://s473.photobucket.com/albums/rr100/daviddmmartins/?action=view&current=IMG_4162.mp4)

PS: Como podem ver no video, os valores nunca são iguais nem reais... neste momento o sensor LM35 lê 19,2ºC.
Título: Re: Display 7 segmentos
Enviado por: senso em 05 de Novembro de 2010, 21:08
E não são reais porque?
Não tens os condensadores no cristal nem no regulador de tensão, que sem eles pode oscilar, tenta "limpar"/organizar melhor a tua montagem que isso está um pouco caótico.
Título: Re: Display 7 segmentos
Enviado por: Sérgio_Sena em 05 de Novembro de 2010, 21:51
Assim de repente ::  organiza a montagem, como o Senso diz está caótico ::

->

# regulador de tensão sem condensador na saída, põe um de 100u e outro de 100n, ajustam-se bem a qq situação

# cristal sem condensadores, 25p ou 33p. Certifica-te que a caixa metálica do cristal não toca em lado algum metálico, ou alguma perna de componente

# LEDs sem resistância. Se usas resistências no 7-seg (que são LEDs), porquê não usar nos LEDs?

# põe um condensador de 100n aos terminais do PIC. Põe-o mesmo por cima dele, de modo a estar o mais perto possivel

# põe um condensador de 4u7 ou 10u depois da resistência do LM35

# ...



Título: Re: Display 7 segmentos
Enviado por: Dave em 05 de Novembro de 2010, 22:15
Por norma as minhas montagens não costumam ser assim... e esta já esteve bem organizada, mas como já tinha dito num post anterior, eu voltei a fazer tudo novamente e evitando o máximo de fio possível para evitar também algumas "perturbações" vindas sei eu lá de onde....

É muito estranho pois parece que tudo está bem e no fundo muito pouco funciona....

Já monto tudo novamente e coloco uma foto..
Título: Re: Display 7 segmentos
Enviado por: Dave em 05 de Novembro de 2010, 23:33
Cá está tudo "remodelado"...


(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fi473.photobucket.com%2Falbums%2Frr100%2Fdaviddmmartins%2FIMG_4163.jpg&hash=63328b0c15d7fd2dd1252471ce57d9fa13db33d5)


E parece estar tudo bem agora.....

Video: http://s473.photobucket.com/albums/rr100/daviddmmartins/?action=view&current=IMG_4164.mp4 (http://s473.photobucket.com/albums/rr100/daviddmmartins/?action=view&current=IMG_4164.mp4)


Teria sido só dos condensadores do cristal??
É que quando retiro o que coloquei no sensor, fica tudo na mesma (aparentemente)...

Cumprimentos
Título: Re: Display 7 segmentos
Enviado por: Sérgio_Sena em 05 de Novembro de 2010, 23:41
É um conjunto de coisas. Pode ser daqui, pode ser dali...  o melhor é tomar as precauções todas e montar tudo o q é necessário.
Título: Re: Display 7 segmentos
Enviado por: senso em 05 de Novembro de 2010, 23:47
Esses condensadores são o valor aconselhado, é que não são ceramicos, mas sim de filme, provavelmente MKP, mas se funciona tudo bem, mas condensadores para os cristais costumam ser ceramicos e bem pequeninos, continuas sem resistencias nos leds, e podes danificar os pinos de saida do PIC e os leds, mas imagino que talvez não tenhas mais resistencias ou algo assim.
Como é que consegues montar o PIC na breadboard com aquele fio lá no meio?
Título: Re: Display 7 segmentos
Enviado por: Dave em 05 de Novembro de 2010, 23:49
É um conjunto de coisas. Pode ser daqui, pode ser dali...  o melhor é tomar as precauções todas e montar tudo o q é necessário.

OK.

Estive aqui a fazer mais uns testes e penso que desta está mesmo a funcionar como deve de ser.

Não posso ser egoísta e dizer que fiz tudo isto sozinho, bla bla bla.... estaria a mentir!
Quero deixar desde já o meu MUITO OBRIGADO a ambos (senso e asena), por todo o tempo perdido a ler e a opinar os meus post's.


Com os melhores dos cumprimentos!
Título: Re: Display 7 segmentos
Enviado por: Dave em 05 de Novembro de 2010, 23:58
Esses condensadores são o valor aconselhado, é que não são ceramicos, mas sim de filme, provavelmente MKP, mas se funciona tudo bem, mas condensadores para os cristais costumam ser ceramicos e bem pequeninos, continuas sem resistencias nos leds, e podes danificar os pinos de saida do PIC e os leds, mas imagino que talvez não tenhas mais resistencias ou algo assim.
Como é que consegues montar o PIC na breadboard com aquele fio lá no meio?

Eheheh, de facto acabou as resistências e agora estão lá de 3.3K (ou algo parecido).

Quanto ao "fio" não é fio não eheh... é um agrafo  ;D ;D. Serve apenas para "me localizar" e saber mais facilmente onde devo encostar o PIC.

Os condensadores são de polyester, mas são os únicos que tenho por cá de 10nF, que é o valor mais próximo do aconselhado em livros (os 15nF) e do aconselhado pelo asena (25/35nF).


Cumprimentos
Título: Re: Display 7 segmentos
Enviado por: senso em 06 de Novembro de 2010, 00:00
No cristal são pF, e não nano, ainda são cerca de 1000 vezes maiores que o que deviam, pode funcionar mas ainda não deve ser muito estavel não.
Título: Re: Display 7 segmentos
Enviado por: Dave em 06 de Novembro de 2010, 00:02
No cristal são pF, e não nano, ainda são cerca de 1000 vezes maiores que o que deviam, pode funcionar mas ainda não deve ser muito estavel não.

Ups... erro meu!

Trocar todos os "n" por "p"... esta minha vista  :-[ :-[.

Título: Re: Display 7 segmentos
Enviado por: Dave em 06 de Novembro de 2010, 10:14
Amigos, mais uma coisa  ;D.

Para ter maior resolução nos valores, queria alterar a tensão de referência...

Para isso será que basta fazer as seguintes modificações??

 set_tris_A(0B00001100);
...
 setup_adc_ports(sAN2|VSS_VREF);
....
 setup_vref(VREF_A3);
....

Depois ligar o pino A3 a um divisor de tensão com 2V (penso que seja esse o valor mínimo...).


Bastará isto?

Cumprimentos.
Título: Re: Display 7 segmentos
Enviado por: senso em 06 de Novembro de 2010, 11:23
O teu sensor dá no máximo 2v?
O PIC deve ter referências internas calibradas, mas isso o datasheet é o teu melhor amigo, se ainda estás a usar o código mais antigo, estavas a usar  7 bits de resolução quando o teu adc tem 10 bits(acho eu, mas pelo menos 8 tem de certeza) e de 7 para 10 bits passas de 128 valores diferentes para 1024.
Título: Re: Display 7 segmentos
Enviado por: Dave em 06 de Novembro de 2010, 12:05
O teu sensor dá no máximo 2v?
O PIC deve ter referências internas calibradas, mas isso o datasheet é o teu melhor amigo, se ainda estás a usar o código mais antigo, estavas a usar  7 bits de resolução quando o teu adc tem 10 bits(acho eu, mas pelo menos 8 tem de certeza) e de 7 para 10 bits passas de 128 valores diferentes para 1024.

O meu sensor dá no máximo 1,5V.
Quanto à ADC é de 10 bit's... penso que usei sempre isso desde o inicio...

Citar
#device adc=10

O que não tem razão de ser é dividir 5V por 1023 "saltos" sabendo que o máximo que vou ter é 1,5V na entrada do PIC (ou na saida do sensor, é igual).
Tinha muito mais lógica "dizer" ao pic para dividir (por exemplo) 2V por 1023 e depois fazer a comparação....
Título: Re: Display 7 segmentos
Enviado por: senso em 06 de Novembro de 2010, 12:12
Ele de deve ter uma referência interna de 2.54v e outra de 1.xxv, os atmega têm, os PICs como te disse vais á datasheet e procuras na secção do ADC se ele tem alguma referência interna.
Título: Re: Display 7 segmentos
Enviado por: Dave em 06 de Novembro de 2010, 12:18
Vou ver o datasheet novamente...
Título: Re: Display 7 segmentos
Enviado por: Dave em 06 de Novembro de 2010, 14:34
Já estive a ver e ao colocar algo deste género, deveria ter Vref de 1,25V.
setup_vref(VREF_HIGH|0);

O que acontece é que ele não faz nada.... fico com os valores todos a zero.

PS: uma vez que alterei o vref, também alterei os cálculos, por isso uma vez mais aparentemente está tudo bem...

Citar
   setup_oscillator(OSC_4MHZ);
   setup_vref(VREF_HIGH|0);
   setup_adc_ports(sAN2|VSS_VREF);
   setup_adc(ADC_CLOCK_INTERNAL);
   set_adc_channel(2);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);

Terei de utilizar alguma função "especial" para além do que está em cima?  :o