collapse

* Posts Recentes

Emulador NES em ESP32 por dropes
[22 de Abril de 2024, 14:14]


Arame de Estendal por almamater
[18 de Abril de 2024, 16:16]


O que é isto ? por SerraCabo
[12 de Abril de 2024, 14:20]


Amplificador - Rockboard HA 1 In-Ear por almamater
[11 de Abril de 2024, 20:46]


Meu novo robô por josecarlos
[29 de Março de 2024, 18:30]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]

Autor Tópico: Display 7 segmentos  (Lida 32896 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Display 7 segmentos
« Responder #30 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.
Avr fanboy

Offline Dave

  • Mini Robot
  • *
  • Mensagens: 368
    • "O Engenhocas"
Re: Display 7 segmentos
« Responder #31 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)    ;
      }
   }

}
David Martins
Eng. Electrotécnica e de Computadores, UBI

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Display 7 segmentos
« Responder #32 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.
Avr fanboy

Offline Dave

  • Mini Robot
  • *
  • Mensagens: 368
    • "O Engenhocas"
Re: Display 7 segmentos
« Responder #33 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...
David Martins
Eng. Electrotécnica e de Computadores, UBI

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Display 7 segmentos
« Responder #34 em: 30 de Outubro de 2010, 01:13 »
O que queres dizer com sair?
Avr fanboy

Offline Dave

  • Mini Robot
  • *
  • Mensagens: 368
    • "O Engenhocas"
Re: Display 7 segmentos
« Responder #35 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....
David Martins
Eng. Electrotécnica e de Computadores, UBI

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Display 7 segmentos
« Responder #36 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.
Avr fanboy

Offline Dave

  • Mini Robot
  • *
  • Mensagens: 368
    • "O Engenhocas"
Re: Display 7 segmentos
« Responder #37 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);
}
}
David Martins
Eng. Electrotécnica e de Computadores, UBI

Offline Dave

  • Mini Robot
  • *
  • Mensagens: 368
    • "O Engenhocas"
Re: Display 7 segmentos
« Responder #38 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!
David Martins
Eng. Electrotécnica e de Computadores, UBI

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Display 7 segmentos
« Responder #39 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.
Avr fanboy

Offline Dave

  • Mini Robot
  • *
  • Mensagens: 368
    • "O Engenhocas"
Re: Display 7 segmentos
« Responder #40 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  ;) :)
David Martins
Eng. Electrotécnica e de Computadores, UBI

Offline Dave

  • Mini Robot
  • *
  • Mensagens: 368
    • "O Engenhocas"
Re: Display 7 segmentos
« Responder #41 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.
David Martins
Eng. Electrotécnica e de Computadores, UBI

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Display 7 segmentos
« Responder #42 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?
Avr fanboy

Offline Dave

  • Mini Robot
  • *
  • Mensagens: 368
    • "O Engenhocas"
Re: Display 7 segmentos
« Responder #43 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...  :'( :'(


« Última modificação: 31 de Outubro de 2010, 22:01 por Dave »
David Martins
Eng. Electrotécnica e de Computadores, UBI

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Display 7 segmentos
« Responder #44 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.
Avr fanboy