Ir ao conteúdo
  • Cadastre-se

Marcador de pontos com LED


LeonardoBoniDel

Posts recomendados

Galera, estou tentando fazer um marcador de truco, porém não entendo o que não da certo.

Vamos lá...

A ideia, marcador de truco utilizando:

12 Leds azuis e 12 Leds vermelhos (0 a 11);

1 pic 18F2220.

1 botão para cada equipe para marcar os pontos

 

Eu montei o circuito no PROTEUS e lá funciona corretamente, porém quando passo para a protoboard funciona parciamente.

 

Esquema Elétrico PROTEUS:

1218188220_EsquemaEltricoTruco.thumb.PNG.a081bab00a8209d708d180ed6b5afb52.PNG

 

Defeito 1: Quando ligo o circuito e começo a marcar o placa, quando chega no 3 ou 4 ele apaga e volta para o 0. Depois a programa segue "normal".

Defeito 1: As vezes aperto o botão e ele pula do 2 para o 4, por exemplo.

Defeito 2: os leds correspondentes aos pontos 9, 10 e 11 não ascendem. (já troquei o transistor e a porta do pic e não funcionou).

Defeito 3: Quando chega no LED correspondente ao 3 ponto, eu tenho que apertar o botão algumas vezes até que o proximo ponto seja computado (só acontece nesse LED).

 

Programa feito pelo MPLAB X, compilado pelo XC8, e usei o MultiprogPlus - Pickit 2 pra passar o programa para o PIC.

 

 

Programa em C

 

#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <pic18.h>
#include "18f2220t.h"

void main (void)
{
    OSCCON = 0x70;
    ADCON1 = 0x0F;
    TRISB=0b00001111;
    TRISA=0b00000000;
    TRISC=0b00000000;
    PORTA=0b00000000;
    PORTB=0b00000000;
    PORTAbits.RA3=1;
    PORTAbits.RA0=1;
    PORTBbits.RB6=1;
    
    int A,B,C,D;
    A=1;
    B=1;
    
    while(1)
    {
        if(PORTBbits.RB2 == 1)
            {
            __delay_ms(150);
            B++;
            do {}while (PORTBbits.RB2 == 1);
        }
        
       if(PORTBbits.RB0 == 1)
        {
           __delay_ms(150);
            do {}while (PORTBbits.RB0 == 1);
            A++;
            
        }

        switch(A)
                {
                case (1):
                    PORTAbits.RA3=1;
                    PORTAbits.RA0=1;
                    break;
        
                case (2):
                    
                    PORTAbits.RA0=0;
                    PORTAbits.RA1=1;
                    break;

                case (3):
                    
                    PORTAbits.RA1=0;
                    PORTAbits.RA2=1;
                    break;
                
                case (4):
                    PORTAbits.RA2=0;
                    PORTAbits.RA3=0;
                    PORTBbits.RB4=1;
                    PORTAbits.RA0=1;
                    break;
        
                case (5):
                    
                    PORTAbits.RA0=0;
                    PORTAbits.RA1=1;
                    break;

                case (6):
                    
                    PORTAbits.RA1=0;
                    PORTAbits.RA2=1;
                    break;
                    
                case (7):
                    PORTAbits.RA2=0;
                    PORTBbits.RB4=0;
                    PORTAbits.RA5=1;
                    PORTAbits.RA0=1;
                    break;
        
                case (8):
                    
                    PORTAbits.RA0=0;
                    PORTAbits.RA1=1;
                    break;

                case (9):
                    
                    PORTAbits.RA1=0;
                    PORTAbits.RA2=1;
                    break;
                
                case (10):
                    PORTAbits.RA2=0;
                    PORTAbits.RA5=0;
                    PORTAbits.RA4=1;
                    PORTAbits.RA0=1;
                    break;
        
                case (11):
                    
                    PORTAbits.RA0=0;
                    PORTAbits.RA1=1;
                    
                    break;

                case (12):
                    
                    PORTAbits.RA1=0;
                    PORTAbits.RA2=1;
                    __delay_ms(200);
                    PORTAbits.RA2=0;
                    __delay_ms(200);   

                    break;
                
                case (13):
                    PORTAbits.RA2=0;
                    PORTBbits.RB5=0;
                    A=1;
                    break;
                }
                switch(B)
                {
                case (1):
                    PORTCbits.RC1=1;
                    PORTBbits.RB6=1;
                    break;
        
                case (2):
                    
                    PORTBbits.RB6=0;
                    PORTBbits.RB7=1;
                    break;

                case (3):
                    
                    PORTBbits.RB7=0;
                    PORTCbits.RC0=1;
                    break;
                
                case (4):
                    PORTCbits.RC0=0;
                    PORTCbits.RC1=0;
                    PORTCbits.RC2=1;
                    PORTBbits.RB6=1;
                    break;
        
                case (5):
                    
                    PORTBbits.RB6=0;
                    PORTBbits.RB7=1;
                    break;

                case (6):
                    
                    PORTBbits.RB7=0;
                    PORTCbits.RC0=1;
                    break;
                    
                case (7):
                    PORTCbits.RC0=0;
                    PORTCbits.RC2=0;
                    PORTCbits.RC3=1;
                    PORTBbits.RB6=1;
                    break;
        
                case (8):
                    
                    PORTBbits.RB6=0;
                    PORTBbits.RB7=1;
                    break;

                case (9):
                    
                    PORTBbits.RB7=0;
                    PORTCbits.RC0=1;
                    break;
                
                case (10):
                    PORTCbits.RC0=0;
                    PORTCbits.RC3=0;
                    PORTCbits.RC4=1;
                    PORTBbits.RB6=1;
                    break;
        
                case (11):
                    
                    PORTBbits.RB6=0;
                    PORTBbits.RB7=1;
                    
                    break;

                case (12):
                    
                    PORTBbits.RB7=0;
                    PORTCbits.RC0=1;
                    __delay_ms(200);
                    PORTCbits.RC0=0;
                    __delay_ms(200);
                    break;
                
                case (13):
                    PORTCbits.RC4=0;
                    PORTCbits.RC0=0;
                    B=1;
                    break;    
                }
            }   
}
 

Obs: Estou usando o oscilador interno do PIC. O vídeo mostrando o que está acontecendo está abaixo:

 

 

Se alguém puder me dar uma luz agradeço galera!!!!!

 

 

  • Curtir 1
  • Triste 1
Link para o comentário
Compartilhar em outros sites

De programação eu não entendo muito, mas sobre a parte eletrônica tem alguns erros. 

Faltou aí um capacitor de 100nF em paralelo com a alimentação do pic, ele elimina ruídos externos que atrapalham o bom funcionamento do circuito. 

Outra coisa são esses resistores aí ligado nos botões, R1 e R3 de 470R são desprezíveis pode ligar o botão direto no pic. 

O mesmo para a parte do reset, só que nesse faltou o resistor de pull UP. Perceba que do jeito que está da curto circuito ao apertar o botão pra zerar. 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

(tambem de programação eu sou leigo). Esses PICs da vida apesar de serem baratos são frageis (julgo vagab*ndos), qualquer coisa ele já endoida, queima ou não funciona direito. Bom toda placa decente q tem ele no meio tem o clock externo (porque o interno deve ser ruim demais), mas, faltou acho q um capacitor de 100nF em paralelo com cada chave, pois cada vez q fecha a chave acontece tipo um mal contato por um breve periodo, dai acho melhor colocar o capacitor só pra garantir (e não ir nenhum ruido para o PIC). Ou tambem pode fazer um snubber pra colocar em paralelo na chave.

Link para o comentário
Compartilhar em outros sites

1 hora atrás, K.e.V. T.a.G disse:

faltou acho q um capacitor de 100nF em paralelo com cada chave,

Eu costumo colocar o capacitor em paralelo com o resistor de pull down. Para 5V o capacitor é de 4,7uF e o resistor é de 1k, mas uso mais em circuitos com lógica do tipo CMOS. 

Nos pics uso só o resistor mesmo, pois faço eles trabalham de forma mais lenta dependendo do tipo de programação e acabam ignorando o efeito debounce. 

Link para o comentário
Compartilhar em outros sites

Transistores de Q5 a Q8 estão invertidos.

Quanto ao projeto elétrico, faltou malícia.

- Muito mais fácil ter cada banco de contagem numa única porta, consegue fazer a instrução com um único comando.

- Ao invés de 3 linhas fazendo 5V e 4 fazendo 0V, 4 fazendo os 5V e 3 fazendo o 0V. Economiza 1 transistor por banco.

- Ao ter cada banco numa porta, basta uma única palavra para fazer as mudanças necessárias.

- Montando o banco de leds A de forma idêntica ao banco de led B a palavra de comando será idêntica para a mesma pontuação. Assim sendo, monta-se a tabela da verdade que será a mesma para os 2 bancos.

- Transformamos essa tabela em variáveis:

zero = 00001001

um =  00001010

dois = 00001100

...

onze = 01000100

 

Dessa forma, se o time B alcançou 5 pontos, PORTB = cinco.

 

Sobre o fato da contagem por vezes contar 2. O botão é um dispositivo mecânico e seu contato móvel possui flexibilidade. Em termos práticos, isso significa que ao fechar provoca um repique que pode ser capturado pelo processador. Se capturar 1 repique, vai contar 2 eventos. Se fosse um espressif que corre a 200MHz, correria o risco de contar 3 ou 4 eventos a cada toque de botão. Para neutralizar esse repique pode usar capacitores em paralelo com o botão ou implantar rotinas de filtro para eliminar esse ruído. Para saber mais sobre isso, pesquise por bounce. As técnicas para eliminar esse efeito são conhecidas por debounce.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Não faço parte da galera e entendo ainda menos de programação mas se eu fosse você minimizaria o projeto

-ligue os leds direto nos pinos... com resistor CLARO.

-acenda com zero colocando o anodo no vcc. Isso porque tem saídas que são open colector ou open drain. Algumas são só entrada ou precisam de configuração pra se tornar IO. Veja seu d.s.

-a quantidade de pinos dá pra isso. Se não der você não precisa do doze né? 2 a-. Talvez nem do onze...

-o programa conceito parcial minimalista ao quasiextremo pra 8 leds:... to com preguiça de digitar todo
 

for(;;)
{
if (bt1) tento1++;
if (bt2) tento1--;
if (bt3) tento2++;
if (bt4) tento2--;
delay(200);
if (tento1>7) tento1=0; // até 7 pra você testar num port se quiser
if (tento2>7) tento2=0;
PORTB=~(1<<tento1)
PORTC=~(1<<tento2)
}

Se achar que ctrl-c ctrl=v vai funcionar, receba um cóqui...

Link para o comentário
Compartilhar em outros sites

Olá todos!

Primeiro gostaria de agradecer a todos pelos comentários e pela ajuda.

 

Galera eu não trabalho com eletrônica, sou engenheiro de automação formado há 10 anos e minha bagagem é somente o que vi na faculdade e o que ainda lembro, portanto, peço desculpa pela "falta de malícia" e pelo "amadorismo" do circuito. Estou aprendendo/reaprendendo a lidar com eletrônica novamente.

 

Fiz alguma alterações conforme orientações de vocês e ficou muito melhor.

1) O MCLR realmente estava em curto, alterei e agora funciona corretamente.

2) Estava utilizando o debounce somente na programação, e não sei porque não estava adiantando, então fiz os dois, debounce da programação e no circuito (adicionei 1 capacitor em paralelo com cada botão).

3) Ainda não encontrei a explicação correta para compartilhar com vcs, porém o fato de o ultimo conjunto de leds não acenderem era devido a variável que eu estava utilizando (INT), agora que troquei para LONG, comecou a funcionar perfeitamente. Obs: Não encontrei nd dizendo que INT é só de 0 a 9.

4) Os transistores do lado B, estavam realmente ao contrário, já arrumei.

5) Incrementei na programação os botões de ++ e -- pontos de ambos (A e B e estão funcionando corretamente.

 

O amigo Sérgio Lembo, fez um comentário: "Ao invés de 3 linhas fazendo 5V e 4 fazendo 0V, 4 fazendo os 5V e 3 fazendo o 0V. Economiza 1 transistor por banco." que eu não entendi como fazer.

 

O único erro que ainda persiste é logo que ligo o circuito e começo a marcar os pontos ele volta para 0 sozinho 1 ou 2 vezes, depois passa a funcionar sem problemas. Fazendo uma analogia tosca, é como se precisasse "esquentar" o pic pra ele começar a funcionar corretamente.

 

Abaixo envio o esquema elétrico e o video do erro.

 

 

 

 

 

Capturar.PNG

Link para o comentário
Compartilhar em outros sites

Só me dei ao trabalho de desenhar o primeiro banco. Utilizar os conceitos para o segundo.

Note que todos os terminais que atuam no primeiro banco estão no mesmo conjunto de portas, no caso o PORTA. A vantagem disso: se quiser acender o led 4, PORTA = 00100001. Com um só comando altera todos os bits necessários.

Sem título.png

adicionado 40 minutos depois

E com o uso de mais 2 transistores dá para fazer os 2 marcadores utilizando apenas o PORTA, ficando o PORTB para os botões.

Vantagem: possibilita a utilização de um MCU com menos portas.

Desvantagem: Os leds acenderão com metade do brilho.

O truque: o bit7 de PORTA define qual o banco que estará aceso. Com o uso do timer interno fazer com que as marcações se alternem pelo menos 50x por segundo. Não haverá o efeito flicker, cinema opera com 24 quadros por segundo e ninguém percebe.

Nesse caso, 4 pontos no banco A  PORTA = 00100001 e os mesmos 4 pontos no banco B PORTA = 10100001.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Se o problema de voltar acontece sempre e repetitivamente e com a mesmíssima característica, você deve reavaliar seu sw. Também pode ser bug no compilador. Tente alterar suas otimizações.

 

Um desabafo off 1/2 on ...

Eu ia te dizer que seu programa pode ser resumido à uma meia dúzia de linhas mas acho que isso seria uma subtração em vários aspectos, mas o principal seria o de tirar seu prazer de descobrir por si em algum momento no futuro. Mas posso de dar um vislumbre?

Imagine 24 leds formados por uma matriz 3x8. 3 pinos do PORTA e 8 do PORTB. Numa interrupt de 50Hz (ao invés de 24 do Serjão) em cada passada aciona um conjunto de 8 leds. ... bem este é o princípio da varredura. De fato é a lesma lerda que mencionou o amigo Serjão e provavelmente o que estás a fazer  mas o detalhe vantajoso é que você consegue mapear por 3 bytes apenas os 24 leds=24bits.

unsigned char led[3];

 

Numa passada, você coloca o led[0], noutra led[1] e na derradeira led[2].

Com duas (02) variáveis int você resolve seu problema se montá-las nas variáveis led[x], dentro da interrupt.

unsigned int tento1,tento2
led[0]=tento1;
led[1]=((tento1&0b000011111111)>>4) | (tento2<<4);
led[2]=tento2>>8;

Pronto. A partir de agora você tem duas variáveis 16 bits com o conteúdo dos seus 24 leds, 12 leds cada. basta manipulá-la no loop do seu main(); Algo como:

for(;;)
{
tento1=0b0000000000000001;
tento2=0b0000100000000000;
for(i=0;i<12;i++)
	{
	tento1<<=1;
	tento2>>=1;
	"delay(1segundo);"
	}
}

consegue visualizar os leds se deslocando um de cada lado a cada segundo? Se não , tudo bem. Eu também não consigo ouvir a música só olhando a partitura.

 

obs: De fato criei de digitei isso agora portanto passível de correção e melhorias.

E de novo... não precisa dos transistores.

 

 

Link para o comentário
Compartilhar em outros sites

15 minutos atrás, Isadora Ferraz disse:

E de novo... não precisa dos transistores.

Isadora, minha insistência nos transistores se deve a tensão reversa máxima dos leds. Em alguns manuais que li reportam 5V de máxima reversa. O sistema opera em 5V. Trabalhar no limite do Absolute maximum ratings me parece temerário.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Ok amigo mas permita-me considerar que na prática estás ovalmente enganado. Já que tens o bom hábito de ler d.s., perceba nos de alguns leds a informação reverse current em 5v geralmente 100uA. Isso é um bom indício teórico que não deve haver dano algum para o led em 5V. E de fato na prática não há.

Tenho cá ao meu alcance imediato um projeto que usa simplesmente um led, um 100K 1W ligado em 220Vac. você pode acreditar que já se produziram dezenas de milhares de produtos com este circuito com uma boa economia de um diodo reverso. Portanto, neste projeto do garoto você pode (e ele) ficar tranquilo neste aspecto.

Dica prática pra quem tem tempo: ligue alguns leds com 12V ou+ reversos mantendo o resistor calculado pra 12V e meça a corrente pra gente ver. Depois, confirme se queimou... espero que não...😨

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!