collapse

* Posts Recentes

Circuito Microfone que funcione por almamater
[Hoje às 17:14]


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]

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

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

Offline Dave

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

Offline Dave

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

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

Offline Sérgio_Sena

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.649
    • Electronic Gear for Musicians
Re: Display 7 segmentos
« Responder #47 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! ;)

Offline Dave

  • Mini Robot
  • *
  • Mensagens: 368
    • "O Engenhocas"
Re: Display 7 segmentos
« Responder #48 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!
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 #49 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.
Avr fanboy

Offline Dave

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

Offline Sérgio_Sena

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.649
    • Electronic Gear for Musicians
Re: Display 7 segmentos
« Responder #51 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

Offline senso

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

Offline Dave

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




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

Offline Dave

  • Mini Robot
  • *
  • Mensagens: 368
    • "O Engenhocas"
Re: Display 7 segmentos
« Responder #54 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
« Última modificação: 02 de Novembro de 2010, 02:31 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 #55 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?
Avr fanboy

Offline Sérgio_Sena

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.649
    • Electronic Gear for Musicians
Re: Display 7 segmentos
« Responder #56 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.




 ;) ;)



- 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.



Offline Dave

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



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 #58 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.
Avr fanboy

Offline Dave

  • Mini Robot
  • *
  • Mensagens: 368
    • "O Engenhocas"
Re: Display 7 segmentos
« Responder #59 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 ;).
« Última modificação: 02 de Novembro de 2010, 12:35 por Dave »
David Martins
Eng. Electrotécnica e de Computadores, UBI