Ir ao conteúdo
  • Cadastre-se

Vu meter para pic


Ir à solução Resolvido por aphawk,

Posts recomendados

Olá pessoal, estou pesquisando sobre projetos com VU METER e até encontrei um tópico aqui no fórum:

Porém neste tópico foi feito um VU muito simples com apenas um LED acendendo, estou procurando um VU igual deste site ->http://s-o.webnode.cz/vu-metr/

Este é um link de um site com projeto do VU que eu gostaria de fazer, no site o cara me deu o programa em .HEX, porém não quero copiar o projeto dele por que eu estou procurando um VU METER para 40led's. Eu queria saber se alguém entende a lógica por traz deste projeto, pois através deste projeto pretendo fazer o meu. Eu tentei montar no ISIS como ele pode ter feito a sequencia de led para acender porém ainda não consigo entender. Vou tentar utilizar um PIC como o 18f4550 ou 16f877a. EU SEI QUE TENHO QUE UTILIZAR O CONVERSOR ADC DO PIC ADC_READ(), quero entender a lógica para poder acender 40 leds e ainda usando menos pinos do Microcontrolador.

ISIS.png

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Pra facilitar minha análise, vou considerar 32 led´s em 4 ports
se o ad 10bits vai até 1023, pra 32 led´s você deve ter um step de 32 unidades de ad

unsigned ind res;
res=adcread()/32;//de 0 a 31


vamos criar uma variável 32 bits pra compor os leds?

unsigned long int res32;


vamos deslocar 1´s baseando no resultado?

res32=1<<res;


vamos decompor a res32 nos 4 ports?
 

PORTA=res32>>0;//!?!
PORTB=res32>>8;
PORTC=res32>>16;
PORTD=res32>>24;

Com isso, teoricamente, ao variar a entrada ad de 0 a 5V, você deve ver os leds se deslocarem 1 a 1 pelos ports

 

Entenda isso primeiro (e me explique kk pois digitei online), simule pra ver se funciona e tal. Depois parta pra fazer com matriz pra economizar pino. Mas aí é outra batalha. Tens que ter bem assimilados alguns conceitos como p.ex. interrupts e etc

Ah sim, você não está queimando a etapa do pisca led não, né??!!

 

Na prática a teoria é outra

Link para o comentário
Compartilhar em outros sites

Isadora... Eu fiz um robô autônomo com 4 sensores infravermelhos e 3 ultasonicos HC-RS04 em cima de só um PIC 16f877a, utilizando as 4 interrupções dele, funcionou lindo! Mas antes tive muitos problemas quanto na pratica quanto na teoria, se era isso que você queria saber quando você digitou "você está queimando a etapa do pisca led não, né??!!" TENHO MUITO QUE APRENDER AINDA! Preciso de ajuda.

Mas, entretanto, voltando ao assunto do projeto do VU METER que para mim isso está muito complexo, eu não quero deslocar led por led, eu quero tentar fazer igual o cara fez no site postado, e ainda, percebe-se que ele colocou um trimpot em uma das portas que pode ser utilizada como comparador criando uma sensibilidade do VU, mas eu acredito que é impossível utilizar o comparador junto com o ADC do PIC. Vamos discutir sobre isso?

 

O seu código: Não quero utilizar o PORTA para deslocar LEd, pois afinal vou usa-lo como entrada analógica, pelo menos o primeiro bit. Ta... você fez de 0 a 31 para deslocar 32 bits. Ele deslocou certinho do PORTA até o PORTB led a led, porém quando ele chegou em 2,5V no PORTC ele deslocou 1 byte e o mesmo no PORTD ao mesmo tempo. (não entendo o motivo).

 

Matriz de led: Já pensei em fazer por matriz de led porém acredito que vou ter que usar multiplexação...  Ja vi na internet dois modelos de VU's e eles não usam matriz de led.

 

Obrigado.

Link para o comentário
Compartilhar em outros sites

@Poporms ,

 

A lógica eu entendí :

 

1 - O conversor A/D sampleia os dois canais numa velocidade suficiente, tipo 40 K samples por segundo , tudo bem que o PIC não aguenta esse sample rate com 10 bits, mas você pode aproveitar apenas 8 bits e nesse caso seve direitinho. Mas também pode pensar em uma taxa bem mais baixa, que acompanhe a frequência utilizada na visualização ( multiplex ... pois é ! ) , como por exemplo fazer apenas 180 leituras dos dois canais em um segundo, que é a mesma frequência utilizada no multiplex dos 6 conjuntos de Leds ( explico abaixo ).

 

2 - Para converter em Logaritmo, use uma tabela simples, se você usar 40 Leds serão 20 Leds para cada canal, então tua tabela de conversão deve ter 20 valores para a conversão.

 

3 - No hardware voce irá usar uma porta de 8 bits em comum, e mais 6 pinos de I/O para chavear 3 conjuntos diferentes de Leds para cada canal. Se quiser pode usar até 48 Leds no total. Para isso, você vai utilizar um Timer que de tempos em tempos vai chavear a porta de 8 bits e um dos 6 pinos de I/O para poder acender um determinado conjunto de Leds. É a mesma coisa que a multiplexação clássica, são 6 conjuntos diferentes para serem acesos, então precisará no Timer uma frequência mínima de 6 x 30 = 180 Hertz. Cada um dos conjuntos irá acender e apagar 30 vezes por segundo.

 

4 - Um segundo Timer será o responsável por manter o Led de pico, e também por fazer o "decaimento" dele depois de um certo tempo passado.

 

5 - Pode usar o terceiro Timer também para fazer a lógica principal, que é samplear os dois canais , converter em Log, e atualizar as variáveis que indicam a todo instante quais os Leds que tem de estar acesos. 

 

6 - Por ultimo, sobre o potenciômetro... ele deve estar programando o conversor A/D para ter como referência de tensão a tensão ajustada pelo potenciômetro, repare que está ligado numa entrada que serve como +Vref no conversor A/D , então é uma maneira de se fazer um ajuste de sensibilidade. Isso você pode manter também no seu programa.

 

Não posso te ajudar no programa pois não entendo nadinha de C, mas tem muita gente boa aqui que entende dessa joça kkkk  vou acompanhando ok ?

 

Boa diversão !

 

Paulo

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

  • Membro VIP

Claro amigo. todos temos muito que aprender

 

o quê?!! você testou aquele código? e quase funcionou? que legal mano! Por partes

-O trimpot provavelmente era pra ajuste de referência do ad. Basta ligar numa entrada de referencia do ad (não do comparador). Tá discutido?

-Realmente tem razão em usar uma entrada analógica matando um led ou +

-a partir do 2.5V deu pau: provavelmente faltou configurar os ports corretamente. Alguns nascem analogicos ou comparadores ou outra função qualquer

-Matriz de led: catodos num port e anodos em outro você consegue mais leds 8x8 = 64 leds. No seu caso 5x8 = 13 pinos só. Conceitos de interrupt e varredura pelo jeito você já tem afinal já fizeste o tal robô

-não queres deslocar led por led e sim ir acendendo. Algo como:

PORTA|=res32>>0;

PORTB|=res32>>8;

Operação OR. Deve acender e não apagar +.É só pra você entender o conceito. Te vira pra apagar

 

obs: estava escrevendo quando Paulão respondeu... Boa Paulão!

 

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

  • Solução

Hoje de tarde tava sem fazer nada, e me veio a ideia de fazer um VU como esse que você quer, com 20 Leds para cada canal, e com Peak Hold, o efeito é igual ao que voce postou. Utilizei também uma escala logarítmica.

 

Usei um Atmega328, mas pode usar um Arduíno Uno da mesma maneira....

 

Não montei o circuito, mas pelo que vi na simulação do Proteus deve funcionar direitinho. Simulei por mais de duas horas ... é um saco simular quando se tem displays multiplexados....

 

Segue o circuito, claro que você pode adaptar ao Arduíno se quiser  e o fonte em Bascom. Fiz todo o processo dentro de uma única interrupção do Timer. Ah, segue o programa também ....

 

$regfile = "m328pdef.dat"
$crystal = 16000000
$hwstack = 40
$swstack = 40
$framesize = 40

Dim Canal_e As Word
Dim Canal_d As Word
Dim Vmax_e As Byte
Dim Vmax_d As Byte
Dim Old_vmax_e As Byte
Dim Old_vmax_d As Byte
Dim Saida1 As Byte
Dim Saida2 As Byte
Dim Saida3 As Byte
Dim Saida4 As Byte
Dim Saida5 As Byte
Dim Saida6 As Byte
Dim Mask1 As Byte
Dim Mask2 As Byte
Dim Mask3 As Byte
Dim Mask4 As Byte
Dim Mask5 As Byte
Dim Mask6 As Byte
Dim New_mask1 As Byte
Dim New_mask2 As Byte
Dim New_mask3 As Byte
Dim New_mask4 As Byte
Dim New_mask5 As Byte
Dim New_mask6 As Byte
Dim Contador_d As Byte
Dim Contador_e As Byte
Dim Contador1_e As Byte
Dim Contador1_d As Byte
Dim Disp_index As Byte
Dim Temp1 As Byte

Config Portd = Output
Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.2 = Output
Config Portb.3 = Output
Config Portb.4 = Output
Config Portb.5 = Output

Config Timer0 = Timer , Prescale = 1024
Timer1 = 170
' vamos gerar uma interrupção a cada 5,6 milissegundo
' que corresponde a uma frequencia de Multiplex de 181,68 Hertz
' ou seja, cada display vai acender 30 vezes por segundo !
On Timer0 Timer0_sub
Enable Timer0
' aqui definimos a subrotina que irá ser chamada a cada
' interrupção, e já deixamos o timer0 correr
Config Adc = Single , Prescaler = 64 , Reference = Aref
Start Adc
' aqui configuramos o conversor a/d para fazer uma leitura
' apenas quando pedirmos.
Enable Interrupts

Sempre:
nop
Goto Sempre

 '------------- ROTINA DE INTERRUPÇÃO ------------------------------------
Timer0_sub:
' Rotina chamada pelo Timer1 a cada 5,6 milisegundos
Timer0 = 170
' recarrega o timer novamente
If Disp_index > 5 Then Disp_index = 0
' vamos ver se já fizemos o ultimo digito, pois então teremos de
' começar pelo primeiro novamente
'Temp1 = Lookup(disp_index , Tabela_pinos)

If Disp_index = 0 Then
  Canal_e = Getadc(0)
  Canal_e = Getadc(0)
  Canal_d = Getadc(1)
  Canal_d = Getadc(1)
  Mask1 = 0
  Mask2 = 0
  Mask3 = 0
  Mask4 = 0
  Mask5 = 0
  Mask6 = 0

  If Canal_e = 1023 Then
    Vmax_e = 20
    Mask3 = 8
    Saida1 = &B11111111
    Saida2 = &B11111111
    Saida3 = &B00001111
    Goto Sai_if
  Elseif Canal_e > 971 Then
    Vmax_e = 19
    Mask3 = 4
    Saida1 = &B11111111
    Saida2 = &B11111111
    Saida3 = &B00000111
    Goto Sai_if
  Elseif Canal_e > 920 Then
    Vmax_e = 18
    Mask3 = 2
    Saida1 = &B11111111
    Saida2 = &B11111111
    Saida3 = &B00000011
    Goto Sai_if
  Elseif Canal_e > 869 Then
    Vmax_e = 17
    Mask3 = 1
    Saida1 = &B11111111
    Saida2 = &B11111111
    Saida3 = &B00000001
    Goto Sai_if
  Elseif Canal_e > 817 Then
    Vmax_e = 16
    Mask2 = 128
    Saida1 = &B11111111
    Saida2 = &B11111111
    Saida3 = &B00000000
    Goto Sai_if
  Elseif Canal_e > 766 Then
    Vmax_e = 15
    Mask2 = 64
    Saida1 = &B11111111
    Saida2 = &B01111111
    Saida3 = &B00000000
    Goto Sai_if
  Elseif Canal_e > 715 Then
    Vmax_e = 14
    Mask2 = 32
    Saida1 = &B11111111
    Saida2 = &B00111111
    Saida3 = &B00000000
    Goto Sai_if
  Elseif Canal_e > 664 Then
    Vmax_e = 13
    Mask2 = 16
    Saida1 = &B11111111
    Saida2 = &B00011111
    Saida3 = &B00000000
    Goto Sai_if
  Elseif Canal_e > 613 Then
    Vmax_e = 12
    Mask2 = 8
    Saida1 = &B11111111
    Saida2 = &B00001111
    Saida3 = &B00000000
    Goto Sai_if
  Elseif Canal_e > 562 Then
    Vmax_e = 11
    Mask2 = 4
    Saida1 = &B11111111
    Saida2 = &B00000111
    Saida3 = &B00000000
    Goto Sai_if
  Elseif Canal_e > 511 Then
    Vmax_e = 10
    Mask2 = 2
    Saida1 = &B11111111
    Saida2 = &B00000011
    Saida3 = &B00000000
    Goto Sai_if
  Elseif Canal_e > 459 Then
    Vmax_e = 9
    Mask2 = 1
    Saida1 = &B11111111
    Saida2 = &B00000001
    Saida3 = &B00000000
    Goto Sai_if
  Elseif Canal_e > 408 Then
    Vmax_e = 8
    Mask1 = 128
    Saida1 = &B11111111
    Saida2 = &B00000000
    Saida3 = &B00000000
    Goto Sai_if
  Elseif Canal_e > 357 Then
    Vmax_e = 7
    Mask1 = 64
    Saida1 = &B01111111
    Saida2 = &B00000000
    Saida3 = &B00000000
    Goto Sai_if
  Elseif Canal_e > 255 Then
    Vmax_e = 6
    Mask1 = 32
    Saida1 = &B00111111
    Saida2 = &B00000000
    Saida3 = &B00000000
    Goto Sai_if
  Elseif Canal_e > 204 Then
    Vmax_e = 5
    Mask1 = 16
    Saida1 = &B00011111
    Saida2 = &B00000000
    Saida3 = &B00000000
    Goto Sai_if
  Elseif Canal_e > 152 Then
    Vmax_e = 4
    Mask1 = 8
    Saida1 = &B00001111
    Saida2 = &B00000000
    Saida3 = &B00000000
    Goto Sai_if
  Elseif Canal_e > 101 Then
    Vmax_e = 3
    Mask1 = 4
    Saida1 = &B00000111
    Saida2 = &B00000000
    Saida3 = &B00000000
    Goto Sai_if
  Elseif Canal_e > 51 Then
    Vmax_e = 2
    Mask1 = 2
    Saida1 = &B00000011
    Saida2 = &B00000000
    Saida3 = &B00000000
    Goto Sai_if
  Else
    Vmax_e = 1
    Mask1 = 1
    Saida1 = &B00000001
    Saida2 = &B00000000
    Saida3 = &B00000000
  End If
Sai_if:

  If Canal_d = 1023 Then
    Vmax_d = 20
    Mask6 = 8
    Saida4 = &B11111111
    Saida5 = &B11111111
    Saida6 = &B00001111
    Goto Sai_if1
  Elseif Canal_d > 971 Then
    Vmax_d = 19
    Mask6 = 4
    Saida4 = &B11111111
    Saida5 = &B11111111
    Saida6 = &B00000111
    Goto Sai_if1
  Elseif Canal_d > 920 Then
    Vmax_d = 18
    Mask6 = 2
    Saida4 = &B11111111
    Saida5 = &B11111111
    Saida6 = &B00000011
    Goto Sai_if1
  Elseif Canal_d > 869 Then
    Vmax_d = 17
    Mask6 = 1
    Saida4 = &B11111111
    Saida5 = &B11111111
    Saida6 = &B00000001
    Goto Sai_if1
  Elseif Canal_d > 817 Then
    Vmax_d = 16
    Mask5 = 128
    Saida4 = &B11111111
    Saida5 = &B11111111
    Saida6 = &B00000000
    Goto Sai_if1
  Elseif Canal_d > 766 Then
    Vmax_d = 15
    Mask5 = 64
    Saida4 = &B11111111
    Saida5 = &B01111111
    Saida6 = &B00000000
    Goto Sai_if1
  Elseif Canal_d > 715 Then
    Vmax_d = 14
    Mask5 = 32
    Saida4 = &B11111111
    Saida5 = &B00111111
    Saida6 = &B00000000
    Goto Sai_if1
  Elseif Canal_d > 664 Then
    Vmax_d = 13
    Mask5 = 16
    Saida4 = &B11111111
    Saida5 = &B00011111
    Saida6 = &B00000000
    Goto Sai_if1
  Elseif Canal_d > 613 Then
    Vmax_d = 12
    Mask5 = 8
    Saida4 = &B11111111
    Saida5 = &B00001111
    Saida6 = &B00000000
    Goto Sai_if1
  Elseif Canal_d > 562 Then
    Vmax_d = 11
    Mask5 = 4
    Saida4 = &B11111111
    Saida5 = &B00000111
    Saida6 = &B00000000
    Goto Sai_if1
  Elseif Canal_d > 511 Then
    Vmax_d = 10
    Mask5 = 2
    Saida4 = &B11111111
    Saida5 = &B00000011
    Saida6 = &B00000000
    Goto Sai_if1
  Elseif Canal_d > 459 Then
    Vmax_d = 9
    Mask5 = 1
    Saida4 = &B11111111
    Saida5 = &B00000001
    Saida6 = &B00000000
    Goto Sai_if1
  Elseif Canal_d > 408 Then
    Vmax_d = 8
    Mask4 = 128
    Saida4 = &B11111111
    Saida5 = &B00000000
    Saida6 = &B00000000
    Goto Sai_if1
  Elseif Canal_d > 357 Then
    Vmax_d = 7
    Mask4 = 64
    Saida4 = &B01111111
    Saida5 = &B00000000
    Saida6 = &B00000000
    Goto Sai_if1
  Elseif Canal_d > 255 Then
    Vmax_d = 6
    Mask4 = 32
    Saida4 = &B00111111
    Saida5 = &B00000000
    Saida6 = &B00000000
    Goto Sai_if1
  Elseif Canal_d > 204 Then
    Vmax_d = 5
    Mask4 = 16
    Saida4 = &B00011111
    Saida5 = &B00000000
    Saida6 = &B00000000
    Goto Sai_if1
  Elseif Canal_d > 152 Then
    Vmax_d = 4
    Mask4 = 8
    Saida4 = &B00001111
    Saida5 = &B00000000
    Saida6 = &B00000000
    Goto Sai_if1
  Elseif Canal_d > 101 Then
    Vmax_d = 3
    Mask4 = 4
    Saida4 = &B00000111
    Saida5 = &B00000000
    Saida6 = &B00000000
    Goto Sai_if1
  Elseif Canal_d > 51 Then
    Vmax_d = 2
    Mask4 = 2
    Saida4 = &B00000011
    Saida5 = &B00000000
    Saida6 = &B00000000
    Goto Sai_if1
  Else
    Vmax_d = 1
    Mask4 = 1
    Saida4 = &B00000001
    Saida5 = &B00000000
    Saida6 = &B00000000
  End If
Sai_if1:
End If


'agora, vamos comparar se teve novo máximo
  If Vmax_e >= Old_vmax_e Then
    Contador_e = 0
    Old_vmax_e = Vmax_e
    Contador1_e = 0
    New_mask1 = Mask1
    New_mask2 = Mask2
    New_mask3 = Mask3

  Else
    Incr Contador_e
    If Contador_e > 96 Then
  ' precisamos fazer o decaimento
      If Contador1_e = 6 Then
        Contador1_e = 0
  'agora, mudar para o led logo abaixo
        If New_mask3 > 1 Then
          Shift New_mask3 , Right , 1
          New_mask2 = 0
          New_mask1 = 0
        Elseif New_mask3 = 1 Then
          New_mask3 = 0
          New_mask2 = 128
          New_mask1 = 0
        Elseif New_mask2 > 1 Then
          Shift New_mask2 , Right , 1
          New_mask3 = 0
          New_mask1 = 0
        Elseif New_mask2 = 1 Then
          New_mask2 = 0
          New_mask1 = 128
          New_mask3 = 0
        Elseif New_mask1 > 1 Then
          Shift New_mask1 , Right , 1
          New_mask3 = 0
          New_mask2 = 0
        Else
          New_mask1 = 1
          New_mask2 = 0
          New_mask3 = 0
        End If
        Decr Old_vmax_e
        If Old_vmax_e = 0 Then Old_vmax_e = 1
        Incr Contador1_e
      Else
        Incr Contador1_e
      End If
    End If
  End If


'agora, vamos comparar se teve novo máximo
  If Vmax_d >= Old_vmax_d Then
    Contador_d = 0
    Old_vmax_d = Vmax_d
    Contador1_d = 0
    New_mask4 = Mask4
    New_mask5 = Mask5
    New_mask6 = Mask6

  Else
    Incr Contador_d
    If Contador_d > 96 Then
  ' precisamos fazer o decaimento
      If Contador1_d = 6 Then
        Contador1_d = 0
  'agora, mudar para o led logo abaixo
        If New_mask6 > 1 Then
          Shift New_mask6 , Right , 1
          New_mask5 = 0
          New_mask4 = 0
        Elseif New_mask6 = 1 Then
          New_mask6 = 0
          New_mask5 = 128
          New_mask4 = 0
        Elseif New_mask5 > 1 Then
          Shift New_mask5 , Right , 1
          New_mask6 = 0
          New_mask4 = 0
        Elseif New_mask5 = 1 Then
          New_mask5 = 0
          New_mask4 = 128
          New_mask6 = 0
        Elseif New_mask4 > 1 Then
          Shift New_mask4 , Right , 1
          New_mask5 = 0
          New_mask6 = 0
        Else
          New_mask4 = 1
          New_mask5 = 0
          New_mask6 = 0
        End If
        Decr Old_vmax_d
        If Old_vmax_d = 0 Then Old_vmax_d = 1
        Incr Contador1_d
      Else
        Incr Contador1_d
      End If
    End If
  End If




  Portb = 0
'Apaga todos os leds
Temp1 = Lookup(disp_index , Tabela_pinos)

If Disp_index = 0 Then
  Portd = Saida1 Or New_mask1
Elseif Disp_index = 1 Then
  Portd = Saida2 Or New_mask2
Elseif Disp_index = 2 Then
  Portd = Saida3 Or New_mask3
Elseif Disp_index = 3 Then
  Portd = Saida4 Or New_mask4
Elseif Disp_index = 4 Then
  Portd = Saida5 Or New_mask5
Elseif Disp_index = 5 Then
  Portd = Saida6 Or New_mask6
Else
  nop
End If

Incr Disp_index

If Contador_d = 255 Then
  Decr Contador_d
End If
If Contador_e = 255 Then
  Decr Contador_e
End If

Portb = Temp1

Return

End

Tabela_pinos:
Data 1 , 2 , 4 , 8 , 16 , 32

 

O programa ocupa 4.1 K , e utiliza cerca de 200 bytes de Ram no total, dá para usar um monte de Cis.....

 

Repare que no Proteus os Bargraph de Leds são de 10 Leds, mas eu só uso 8 Leds. Na prática, tem de comprar barras de 8 Leds para quatro dos displays, e barras de 4 Leds para dois displays. Ou utilizar tudo Leds Avulsos...

RN1 é um resistor array de 10K, e RN2 é de 150 ohms. Se quiser pode trocar por resistores individuais.

O Trimpot RV1 de 4,7K ajusta a sensibilidade do conversor A/D.

Utilizei dois diodos de sinal Schottky, mas pode utilizar um 1n914.

 

Agora, a passagem para um Pic é com você, meu amigo !

 

Paulo

 

vu_final.png

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

  • 3 anos depois...
  • Membro VIP

Não me mencionou, então a dica principal vai pro Paulão... Use [s p o i l er] "texto longo" [/ s p o i l e r] sem espaços



Mas é curioso viu! 😁

 

Pra você uma resposta proporcional...

Sim, pode colocar quantos leds quiser e sim com o 595. Se achar que deve, fale mais sobre seu desafio com desenhos, fotos, figuras e fontes...

abç

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

@joelTGA ,

 

Pode sim, com ele pode usar mais duas colunas de Led se preferir .

O valor dos resistors array estão errados .... o correto seria usar no valor de 330 ohms em vez dos 10K que coloquei no simulador do Proteus.

Em tempo ... a corrente que o 595 vai aceitar é menor do que a dos 2N7000 ... vai ter menos brilho nos leds.

E algumas alterações no programa ...

 

Paulo

 

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

@Isadora Ferraz @aphawk  entao... se n for pedindo muito mais ja pedindo rsrs eu queria q você me explicasse do 0 como fazer isso. e Isadora eu coonsigo fazer um led piscar ta kkkk consigo exibir uma variavel ou uma frase no display LCD, mais e so isso também ta kkk pois to focado nos videos do Wr Kits para aprender mesmo e to ate pensando em fazer um curso no Microgenios sobre linguagem c para pic, so n comecei ainda porque estou quitando umas contas aqui antes rsrs. bom eu tenho aqui um codigo de uma matris de led de 15 colunas por 7 linhas que baixei da net, fiz umas adaptações no codigo e uma delas foi acrescentar o Ci 595 e por incrivel q pareca funcionou kkk vou postar o codigo aqui e vcs da uma olhada e me diz se ele pode ser melhorado se posso a partir dele fazer um Vu de led com a quantidade de led q eu quiser usar. Ha sim tentei colocar mais matrizes de led funcionou so q quanto mais coluna mais lento as letras correm, mesmo eu tirando o delay porque sera q isso acontece?

#define shcp ra0_bit
#define ds ra1_bit
#define stcp ra2_bit

#define b1 button(&portb,4,1,1)
#define b2 button(&portb,5,1,1)
#define b3 button(&portb,6,1,1)
#define b4 button(&portb,7,1,1)

#define texto  50 //140max
#define espaco 50 //max 105

int longo; // contador do longo do texto
int velocidade; //velocidade da rolagem
int multiplexacao;// contador de multiplexacao de coluna
char longe=2, E=5; // veocidade iniciada em 5
bit bb1, bb2, bb3, bb4;

int const filas[texto+espaco]={

                                0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

                                 2,1,65,126,64,
                                 0,62,65,65,65,62,
                                 0,127,73,73,73,65,
                                 0,127,1,1,1,1,
                                 0,50,73,73,73,38,
                                 0,62,65,65,65,62,
                                 0,127,16,8,4,127,




                                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};

 int  coluna [17]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
 
void InitTimer0(){
  OPTION_REG         = 0x81;
  TMR0               = 6;
  INTCON             = 0xA0;
}

void Interrupt(){
  if (TMR0IF_bit){
    TMR0IF_bit         = 0;
    TMR0                 = 6;
    
    if((b1) && bb1==1)
    {
    bb1=0;
     E++;
    }
    if((!b1) && bb1==0)
    {
    bb1=1;

    }
    
    if((b2) && bb2==1)
    {
    bb2=0;
     E--;
    }
    if((!b2) && bb2==0)
    {
    bb2=1;

    }
    
    if((b3) && bb3==1)
    {
    bb3=0;
     longe++;
    }
    if((!b3) && bb3==0)
    {
    bb3=1;

    }
    
    if((b4) && bb4==1)
    {
    bb4=0;
     longe--;
    }
    if((!b4) && bb4==0)
    {
    bb4=1;

    }
    


  }
}


 void main()

 {

 ansel=0;
  anselh=0;

  C1ON_bit = 0;                      // Disable comparators
  C2ON_bit = 0;

  //trise=0x00;
  //porte=0x00;

  trisa=0x00;
  porta=0b00000000;

  trisb=0b11110001;
  portb=0b00000000;

  trisc=0x00;
  portc=0b00000000;

  trisd=0x00;
  portd=0x00;
InitTimer0();
while(1)
{
 for(longo=0;longo<texto+20;longo++)
   {




                         for(velocidade=0;velocidade<E;velocidade++)
                         {

                                 for(multiplexacao=0;multiplexacao<15;multiplexacao++)
                                   {


                                       switch(coluna[multiplexacao])
                                        {
                                          case 1:ds=0;shcp=0; shcp=1;stcp=1;   stcp=0; break;
                                          case 2:ds=1;shcp=0; shcp=1;stcp=1;   stcp=0; break;
                                          case 3:ds=1;shcp=0; shcp=1;stcp=1;   stcp=0; break;
                                          case 4:ds=1;shcp=0; shcp=1;stcp=1;   stcp=0; break;
                                          case 5:ds=1;shcp=0; shcp=1;stcp=1;   stcp=0; break;
                                          case 6:ds=1;shcp=0; shcp=1;stcp=1;   stcp=0; break;
                                          case 7:ds=1;shcp=0; shcp=1;stcp=1;   stcp=0; break;
                                          case 8:ds=1;shcp=0; shcp=1;stcp=1;   stcp=0; break;
                                          case 9:ds=1;shcp=0; shcp=1;stcp=1;   stcp=0; break;
                                          case 10:ds=1;shcp=0; shcp=1;stcp=1;  stcp=0; break;
                                          case 11:ds=1;shcp=0; shcp=1;stcp=1;  stcp=0; break;
                                          case 12:ds=1;shcp=0; shcp=1;stcp=1;  stcp=0; break;
                                          case 13:ds=1;shcp=0; shcp=1;stcp=1;  stcp=0; break;
                                          case 14:ds=1;shcp=0; shcp=1;stcp=1;  stcp=0; break;
                                          case 15:ds=1;shcp=0; shcp=1;stcp=1;  stcp=0; break;



                                        }
                                        portd=(filas[longo+multiplexacao]);

                                         delay_ms(1);


                                  }
                          }

    }
}    
 }
       

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Vu de leds com mais de 16 leds já começa a ficar fora do conforto pros mc de 8 bits e de seu conversor ad - a maioria 10 bis. Foque em 16 aprendendo a escrever em 2x595. Bem fácil com 1/2 dúzia de linhas c. De fato com matriz 8x8 você coloca até 64 leds (se minha matemática não falha). mas por partes, .. escreva nos 16 1º. Não analisei seu fonte...

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

@joelTGA ,

 

Bom, tem muita maneira de fazer isso com mais de 16 Leds... mas lembre que a escala é logarítmica então usar mais que 16 Leds nao tem sentido frente a resolução de um conversor A/D de 10 bits.

Não concordo com a afirmação da @Isadora Ferraz sobre o microcontrolador ser de 8 bits, pois o problema é apenas o conversor A/D interno.

Nada te impede de comprar um desses módulos de conversor A/D de 12 ou 14 bits que tem no Mercado Livre e usar em um microcontrolador de 8 bits, afinal a nave Apollo foi para a Lua usando um microcontrolador de 4 bits e 16K de memória Flash.

De tudo o que pode ser feito com microcontrolador, eu aposto que mais de 99% pode ser feito em 8 bits.

 

Mas não posso te ajudar na sua linguagem ... só entendo Basic e Asm ...

 

Paulo

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

  • Membro VIP

Amigo não é "informação". É algo como insight, intuição "entrar no mundinho, na cabecinha do mc" e coisas do gênero😜. Um mc de 8 pode até trabalhar com 32 mas p.ex. fazer um pic10f trabalhar com float (o 1%), ele não sentiria muito bem. Por isso o termo fofo "conforto". Falando em fofura dos 8 bits, matriz e afins, me lembro que já publiquei isso aqui...

com fonte e tudo... Te vira pra achar kk...

 

 

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!