Ir ao conteúdo

Tutorial : Introdução ao uso de PIC´s em BASIC com o PIC Simulator IDE - Parte 1/2


aphawk

Posts recomendados

Postado

Leonardo,

É exatamente isto!

Se variar o valor de um dos componente R ou C vai varia a frequencia em MHZ.

Quero saber como calcular o valor em MHZ , se varia o valor de R para max. e min.

abç

jfeliciano

Postado

Ma2008,

Desculpe... faltou colar o final do programa ...:(

Acrescente este trecho ao final :

Goto inicio
End
saida:
led1 = vled1
led2 = vled2
Return

Pronto, compila e veja !

Leonardo e Jfeliciano,

O datasheet não informa a fórmula, ele apenas informa que a frequência do oscilador varia com atensão de alimentação, com a temperatura, e com o valor de R e de C .

Ainda informa que pode variar bastante entre um CI e outro, portanto não é para ser usado desta maneira.

Lembre-se que isto é para aplicações tipo de baixíssimo custo, onde a frequência não tem importância no funcionamento .

Seguem os limites para R e para C :

R maior do que 5K e menor do que 100K

C maior do que 20 pf e menor que 300 pf ( os 300 é chute meu, veio do exemplo do datasheet ... )

Se quiserem saber mais, como exemplos de valores e frequências, procurem no datasheet específicamente o Capítulo 13, tem gráficos de monte lá ....

Paulo

Postado

Paulo, entendi perfeitamente, obrigado!

Jfeliciano, a economia cristalxRC gira em torno de R$2,50, daí um de nós monta um projeto, e se algo der errado a economia pode gerar dúvida, é aí que os 2,50 podem valer ouro.

Por outro lado, sua dúvida contribuiu com o meu conhecimento.

Segue tópico que aborda o uso de osciladores RC:

http://forum.clubedohardware.com.br/oscilador-pic/659114

Gostei dos comentários sobre "ruídos".

Abraços.

Postado

Paulo, leonardo,

Obrigado

Eu ja tinha a ideia da tolerancia do osc. RC, mas e que ja vi sequenciais com pic que usa oscilador RC e um poteciometro pra controlar a velocidade dos movimento das luzes.

Ai estava curioso pra saber como calcular o osc. RC, e tambem como cofigurar O PSI pra usar ocilador RC.

Mas pesquisei, e achei este site: http://www.sprut.de/electronic/pic/osc/#rc

Esta em alemao mas acho que deu pra entender a formula.

Falta saber com configurar o PSI??

Ate breve

jfeliciano

Postado

Quanto ao ruido, a ideia é simples : Estamos falando de ruido induzido !

Quando usamos um oscilador RC, trabalhamos com altas impedâncias na entrada do oscilador do PIC, portanto qualquer ruido EXTERNO consegue "se induzir" no circuito, podendo fazer que a frequência mude muito em alguns períodos de clock, ou até mesmo fazendo cessar a oscilação.

Já quando usamos um oscilador a cristal, a impedância vista pelo circuito oscilador do PIC é bem mais baixa, e diminui muito a amplitude de qualquer possível ruido EXTERNO.

Para evitarmos problemas no oscilador RC, a regra é esta : usar resistores de baixo valor, tipo de 5K a 22K, e claro que nesse caso a frequência do clock é alta, mas a imunidade a ruídos também é alta.

Uma boa sugestão seria R= 10K e C=47pF , deve ser uma opção mais estável.

Quanto aos ruidos via fonte de alimentação, sigam sempre a regra de ouro : dois capacitores, colocados o mais próximo possível dos pinos de alimentação e de terra do PIC, um deles eletrolítico de 47 uF / 16 volts, e um outro cerâmico de preferência, de 100nf ou de 47nf. vocês nem imaginam quanta gente já se complicou por não fazer isso e no projeto real acontece de tudo : alguns nem chegam a funcionar pois o oscilador não consegue trabalhar direito, outros circuitos travam de repente quando aciona algo com consumo um pouco maior, ou alguém atende um celular ( RF ) , etc ....

Quanto ao PSI, ele não oferece uma opção de clock variável.... o que voce pode fazer é informar a frequência do oscilador , por exemplo, 100 Khz, compilar, rodar a simulação, parar, mude a frequencia para 50 Khz, compile e rode novamente, e ir observando os resultados.

Claro que na prática é só mudar um potenciômetro.... mas é uma maneira de usar um PIC que os autores dos simuladores nunca imaginaram !

Creio que nem o Proteus consegue simular, pois até ele precisa que informemos o clock do circuito....

Se quiserem uma opção mais barata que um cristal, podem usar um filtro cerâmico, tipo de 455 Khz , pelo menos é mais estável, só a precisão que deixa um pouco a desejar, principalmente se voce for utilizar comunicação serial. Mas para usos simples, tipo controle de I/O's / Leds, botões, não muda nada.

Mas se for um projeto real, usem um cristal para garantir.... é a tal regra : " A Economia sempre resulta na Porcaria " !

Agora, gostei do site alemão .... realmente é algo que nunca encontrei nos datasheets !

Um abraço e boas simulações.

Paulo

Postado

Caros,

Citei os "ruídos", porque já passei por isso. :(

Valeu Paulo, excelente explanação: "regra de ouro"

Estou aguardando os componentes chegarem para iniciar as montagens.

Abraço a todos.

Postado

MESTRE APHAWK ESTE TRECHO JA SE ENCONTRA NO FINAL, ME DESCULPE A MINHA

INSISTÊNCIA, por favor ESTOU AGUARDANDO O SEU RETORNO DESDE DE JA OBRIGADO.

Goto inicio

End

saida:

led1 = vled1

led2 = vled2

Return

APHAWK, desculpe o erro era meu, pois depois de um montão de tentativas, verifiquei

que eu estava errado, agora vou tentar escrever outros codicos com essa dica que você me deu, tudo bem. mais um aprendizado ate mais

Postado

Ma2008,

É que ao mesmo tempo que eu postei o que faltou, eu também editei e corrigí o post do código, desculpe eu não ter deixado isto claro.

Mas ótimo que funcionou, agora continue na apostila que voce vai logo logo escrever seus próprios programas !

Paulo

Postado

Mestre aphwk obrigado, sÓ tire uma duvida por favor no pic 12f675 eu posso

usar os 6pinos como ios certo? Ok. Eu fiz o seguinte tomando base como partida o codico que você escreveu pra mim. EntÃo fiz o seguinte: BotÃo quando acionado acende 5 leds quando solto o botÃo os leds se apagÃo, sÓ tem um detalhe:

Eu coloquei

gp0 associado a um botÃo

gp1 led

gp2 led

gp3 led

gp4 led

gp5 led

funcionou bem, sÓ que o gp4/an3/t1g/osc2/clkout nÃo acendeu permaneceu apagado, gostaria de te pedir a sua ajuda pois com a ajuda desse forum

tenho aprendido muito, desde ja obrigado, aguardo seu retorno.

mestre aphawk:

descilpe não é o gp4 que não funcionou.

0 que não funcionou foi o MCLR/Vpp/GP3 deveria acender tambem junto com os outros 5 leds.

Postado

ma2008,

Esse pino GP3 só pode ser duas coisas : RESET ou DIGITAL INPUT, veja no datasheet .

Ele não funciona como saída, apenas como ENTRADA !!!!!

Sugestão : ligue o botão no GP3 , ( troque a função do pino com a do GP0 ) , ligue o LED no GP0, e também coloque um resistor ligado no GP3 de uns 4k7 até o positivo só para garantir ( isso na prática ! ) , altere isso no programa, e no PSI deve funcionar agora ok ?

Paulo

Postado

mestre: aphawk

estou postando esse códico aqui no forum porque esta dando um erro ao copia lo,

o codico e para funcionar um servo motor ele fica continuo pra direita e esquerda

segue o codico:

Define CONF_WORD = 0x31c4

AllDigital

C var Byte' o erro e esse: error in line 3: syntax error

TRISIO = 0

GP0 = 0

inicio:

For C = 50 To 250 Step 1

pulsout GP0.0, C

pause 10

Next

For C = 250 To 50 Step -1

pulsout GP1.0, C

pause 10

Next

Goto inicio

end

amigos por favor, obrigado aguardo retorno

Postado

ma2008,

Toda vez que voce precisa usar uma variável, temos de declarar o tipo da variável, essa é a função do DIM, leia os programas do tutorial para voce ver como deve ser feito isso nos vários casos.

O comando correto naquela linha é este aqui :

DIM C as BYTE

Veja se resolveu.

Paulo

Postado

Mestre, as peças chegaram, montei o primeiro projeto, deu trabalho, mas funcionou perfeitamente. Foi emocionante!!!

Aproveitei e confeccionei uma placa para os três projetos ( PIC 16F84 ).

Finalizando, sair do virtual (PSI) e passar para o "real" é maravilhoso, além de aumentar "e muito" o conhecimento através da prática.

Mais uma vez muito obrigado!

Postado

Leonardo,

Parabéns pelo seu sucesso,e tenha muitos mais!!!

Paulo,

Estou aqui tentado realizar um sonho antigo que até já comentei aqui em outras mensagens.

Que é terminar um projeto parado que tenho aqui de um controle de volume com seletor de entradas

Acho que ainda nao estou preparado pra lidar com os programas, mas e praticando que se aprende !!!

Vou tentar explicar como e o projeto pra vocês me ajudarem no que for possivel.

Vou tentar fazer o programa passo a passo, pra ir pegando o jeito.

Estou usando pic16f877a, ldc 16x2, 4 teclas e 4 LEDS e tambem um 74hc595.

sendo que as teclas estão ligada no (ADC) do pic com um divisor de tensão, e cada tecla apertada me da uma leitura, que ate ai deu tudo certo.

E os leds estão ligado no 74hc595, que depois de muita pesquisas consegui fazer funcionar, pra cada tecla apertada o display vai mostrar qual fonte de sinal foi selecionada e o led referente aquela fonte vai iluminar a tecla apertada.

Mas nao estou conseguindo fazer o controle do 74hc595 pra trabalhar desta forma.

segue o inicio de um "rascunho" do programa que estou tentando fazer.

Gostaria muito da sua ajuda e sugestão e tambem criticas.

Segue em anexo o esquema inicial, que vai ser ampliado na medida do desenvolvimento

'Controle de volume 5.1 e Seletor de Entradas'

Define CONF_WORD = 0x3f31

Define CLOCK_FREQUENCY = 4

AllDigital

ADCON1 = 0x0e

TRISB = 0x00

TRISD = 0x00

TRISC = 0x00

Symbol data = PORTC.0 'PIN 14 74HC595

Symbol clock = PORTC.2 'PIN 11 74HC595

Symbol latch = PORTC.1 'PIN 12 74HC595

PORTC = 0

PORTB = 0

PORTD = 0

Define LCD_BITS = 8

Define LCD_DREG = PORTD

Define LCD_DBIT = 4

Define LCD_RSREG = PORTB

Define LCD_RSBIT = 0

Define LCD_RWREG = PORTB

Define LCD_RWBIT = 1

Define LCD_EREG = PORTB

Define LCD_EBIT = 2

Define LCD_READ_BUSY_FLAG = 1

Lcdinit 0

Dim clk As Byte

Dim an0 As Word

Goto dvd5

loop:

Adcin 0, an0

'-------------LEDS

For clk = 0 To 7

clock = 1

data = 0 'Q7=SEM USO

clock = 0

WaitMs 1

clock = 1

data = 0 'Q6=SEM USO

clock = 0

WaitMs 1

clock = 1

data = 0 'Q5=SEM USO

clock = 0

WaitMs 1

clock = 1

data = 0 'Q4=SEM USO

clock = 0

WaitMs 1

clock = 1

data = 0 'Q3=SAIDA P/LED>"SAT"

clock = 0

WaitMs 1

clock = 0

data = 1 'Q1=SAIDA P/LED>"DVD5.1"

clock = 0

WaitMs 1

clock = 1

data = 0 'Q2=SAIDA P/LED>"CD"

clock = 0

WaitMs 1

clock = 1

data = 0 'Q0=SAIDA P/LED DVD2.0

WaitMs 1

clock = 0

latch = 1

latch = 0

Next clk

'- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -

fonte:

If an0 = 295 Then Goto sat

If an0 = 112 Then Goto dvd2

If an0 = 174 Then Goto dvd5

If an0 = 239 Then Goto cd

If an0 = 1023 Then Goto loop

dvd2:

Lcdout " Pre-Amplifier"

Lcdcmdout LcdLine2Home

Lcdout "Source: ", "DVD2.0 "

WaitMs 50

Goto loop

cd:

Lcdout " Pre-Amplifier"

Lcdcmdout LcdLine2Home

Lcdout "Source: ", "CD "

WaitMs 50

Goto loop

sat:

Lcdout " Pre-Amplifier"

Lcdcmdout LcdLine2Home

Lcdout "Source: ", "SAT "

WaitMs 50

Goto loop

dvd5:

Lcdout " Pre-Amplifier"

Lcdcmdout LcdLine2Home

Lcdout "Source: ", "DVD5.1 "

'WaitMs 50

Goto loop

Ate breve

jfeliciano

Postado

Leonardo,

Parabéns !!!!! Agora é ir fazendo mais projetinhos e o conhecimento vai ficar cada vez mais "enraizado" !!!! Sugiro que repita a montagem do tutorial, que utiliza os displays de 7 segmentos multiplexados, experimente brincar com a temporização dos displays, e veja a teoria na prática, os displays piscando, ou até acendendo apenas um de cada vez, tudo isso é interessante e fixa bem os conhecimentos.

Jfeliciano,

A ideia é bem simples, não segui o fluxo de seu programa, mas posso sugerir algumas mudanças.

Mude este trecho :

fonte:
If an0 = 295 Then Goto sat
If an0 = 112 Then Goto dvd2
If an0 = 174 Then Goto dvd5
If an0 = 239 Then Goto cd
If an0 = 1023 Then Goto loop

Para este aqui :


if an0 < 60 then goto loop
if an0 < 143 then goto dvd2
if an0 < 206 then goto dvd5
if an0 < 659 then goto cd
if ano > 1000 then goto loop

Motivo : voce sempre vai ter uma variação na leitura, em funcão da tolerãncia de valores dos resistores, temperatura, ruídos, etc.


Agora, com o código para usar o 74HC595 :

Mude o seu circuito, em vez de controlar o pino DS, controle o pino /MR.

Ligue o DS no terra (0) .

Lembre-se de que o estado normal das entradas de clock são sempre nivel 0, e um pulso significa levar a entrada para 1 por um tempo maior do que uns 50 nseg, e voltar para 0. Use 1 milisegundo para evitar problemas de timing.

Já o pino /MR deve ficar normalmente em nivel 1, e só deve ser levado ao nivel 0 para um RESET.

Usando o /MR vai ficar muito mais fácil voce sempre fazer o RESET ( baixar para 0 por 1 milisegundo e depois voltar para 1 ) quando tiver de mudar o LED, sempre saberemos que estamos no ZERO no início, e basta fazermos os clocks num numero bem determindado.

Primeiro lugar, crie uma subrotina que faça o RESET do CI, em seguida gere tantos clocks na entrada SH_CP quantos forem necessários para atingir o LED correspondente, em seguida faça um simples pulso em ST_CP, e pronto, o LED desejado vai acender. Use uma variável onde voce defina quantos pulsos são necessários para acender o LED correspondente.

Por exemplo, para acender o LED D2, são necessários 2 pulsos, ok ?

Veja se já adianta.

Um abraço.

Paulo

Postado
Leonardo,

Parabéns !!!!! Agora é ir fazendo mais projetinhos e o conhecimento vai ficar cada vez mais "enraizado" !!!! Sugiro que repita a montagem do tutorial, que utiliza os displays de 7 segmentos multiplexados, experimente brincar com a temporização dos displays, e veja a teoria na prática, os displays piscando, ou até acendendo apenas um de cada vez, tudo isso é interessante e fixa bem os conhecimentos.

Jfeliciano,

A ideia é bem simples, não segui o fluxo de seu programa, mas posso sugerir algumas mudanças.

Mude este trecho :

fonte:
If an0 = 295 Then Goto sat
If an0 = 112 Then Goto dvd2
If an0 = 174 Then Goto dvd5
If an0 = 239 Then Goto cd
If an0 = 1023 Then Goto loop

Para este aqui :


if an0 < 60 then goto loop
if an0 < 143 then goto dvd2
if an0 < 206 then goto dvd5
if an0 < 659 then goto cd
if ano > 1000 then goto loop

Motivo : voce sempre vai ter uma variação na leitura, em funcão da tolerãncia de valores dos resistores, temperatura, ruídos, etc.


Agora, com o código para usar o 74HC595 :

Mude o seu circuito, em vez de controlar o pino DS, controle o pino /MR.

Ligue o DS no terra (0) .

Lembre-se de que o estado normal das entradas de clock são sempre nivel 0, e um pulso significa levar a entrada para 1 por um tempo maior do que uns 50 nseg, e voltar para 0. Use 1 milisegundo para evitar problemas de timing.

Já o pino /MR deve ficar normalmente em nivel 1, e só deve ser levado ao nivel 0 para um RESET.

Usando o /MR vai ficar muito mais fácil voce sempre fazer o RESET ( baixar para 0 por 1 milisegundo e depois voltar para 1 ) quando tiver de mudar o LED, sempre saberemos que estamos no ZERO no início, e basta fazermos os clocks num numero bem determindado.

Primeiro lugar, crie uma subrotina que faça o RESET do CI, em seguida gere tantos clocks na entrada SH_CP quantos forem necessários para atingir o LED correspondente, em seguida faça um simples pulso em ST_CP, e pronto, o LED desejado vai acender. Use uma variável onde voce defina quantos pulsos são necessários para acender o LED correspondente.

Por exemplo, para acender o LED D2, são necessários 2 pulsos, ok ?

Veja se já adianta.

Um abraço.

Paulo

Paulo,

Obrigado pelas dicas, a parte do 74hc595 eu li varias vezes mas infelizmente eu nao consegui entender.

Se nao for pedir muito seria possivel voce fazer um pequeno exemplo prático, pra ver se entra nesta minha "cabecinha oca"?

Abraço

Jfeliciano

Postado

Primeiro, temos de definir nossas variáveis e sinais de controle, e os Leds, por exemplo,

CD acende o LED1, DVD2 acende o LED2, DVD5 acende o LED3.

Também teremos de conectar o sinal DS ao PIC, sugiro o portc.3 que está vago no seu esquema

E o hardware estará conectado assim :

portc.0 = /MR

portc.1 = ST_CP

portc.2 = SH_CP

portc.3 = DS

No início do programa , temos de definir e dimensionar algumas variáveis e simbolos :

SYMBOL MR = PORTC.0
SYMBOL STCP= PORTC.1
SYMBOL SHCP=PORTC.2
SYMBOL DS=PORTC.3
DIM ACLED AS BYTE
DIM VTEMP AS BYTE
.....

´ AQUI COMEÇA O PROGRAMA

SHCP=0
STCP=0
MR=0
WAITMS 1
MR=1

....



if an0 < 60 then goto loop
if an0 < 143 then goto dvd2
if an0 < 206 then goto dvd5
if an0 < 659 then goto cd
if ano > 1000 then goto loop

.....
´ AQUI FICA O CÓDIGO QUE DEFINE QUAL O LED A ACENDER
cd:
acled=1
gosub 74hc595
goto loop

.....

END
´ APÓS O END, COMEÇAM AS SUBROTINAS
.....

´ SEGUE A SUBROTINA QUE ACENDE O LED EXATO

74hc595:
´ PRIMEIRO, FAZER O RESET
MR=0
WAITMS 1
MR=1
DS=1 ´ ENTRADA EM NIVEL 1 APENAS UMA VEZ
´ AGORA, MUDAR O SHIFT ATÉ O LED DESEJADO
for VTEMP=1 to acled
SHCP=1
WAITMS 1
SHCP=0
IF DS = 1 THEN DS=0 ´ COMO DITO ACIMA, APENAS 1 VEZ
NEXT TEMP
´ AGORA, BASTA FAZER O LATCH E O LED VAI ACENDER
STCP=1
WAITMS 1
STCP=0
´ PRONTO, ACABOU !
RETURN

Veja se dá certo, ok ?

Paulo

Postado
Leonardo,

Parabéns pelo seu sucesso,e tenha muitos mais!!!

jfeliciano, valeu a força, com certeza vão vir muito mais!

Leonardo,

Parabéns !!!!! Agora é ir fazendo mais projetinhos e o conhecimento vai ficar cada vez mais "enraizado" !!!! Sugiro que repita a montagem do tutorial, que utiliza os displays de 7 segmentos multiplexados, experimente brincar com a temporização dos displays, e veja a teoria na prática, os displays piscando, ou até acendendo apenas um de cada vez, tudo isso é interessante e fixa bem os conhecimentos.

Paulo, já estou fazendo isso, inclusive a placa que desenvolvi engloba os 3 primeiros projetos da apostila:D

Tenho feito várias simulações no PSI desde fevereiro/2010, alterei os tempos, acrescentei algumas rotinas, há 5 meses venho simulando os exemplos da:

http://www.ucontrol.com.ar/wiki/index.php?title=PIC_BASIC_%28PSI%29

http://www.oshonsoft.com/picbasiccompilerexamples.html

Segue foto do resultado do "nosso" trabalho:

foto2cipic16f84projeto1.jpg

Muito obrigado pelas dicas, com certeza estão sendo muito bem aproveitadas!

Postado

Leonardo,

Muito legal a montagem !!!!!

voce está fazendo o mesmo que eu fiz quando resolvi entender os microprocessadores PIC , cerca de dois anos atrás !!!!

Os tutoriais saíram exatamente dessas "mexidas" e experimentos, e torço para que em breve VOCÊ mesmo faça um tutorial para ajudar ainda mais a todos !!!

Parabéns, e continue contando com a nossa turma de amigos !

Paulo

Postado
Primeiro, temos de definir nossas variáveis e sinais de controle, e os Leds, por exemplo,

CD acende o LED1, DVD2 acende o LED2, DVD5 acende o LED3.

Também teremos de conectar o sinal DS ao PIC, sugiro o portc.3 que está vago no seu esquema

E o hardware estará conectado assim :

portc.0 = /MR

portc.1 = ST_CP

portc.2 = SH_CP

portc.3 = DS

No início do programa , temos de definir e dimensionar algumas variáveis e simbolos :

SYMBOL MR = PORTC.0
SYMBOL STCP= PORTC.1
SYMBOL SHCP=PORTC.2
SYMBOL DS=PORTC.3
DIM ACLED AS BYTE
DIM VTEMP AS BYTE
.....

´ AQUI COMEÇA O PROGRAMA

SHCP=0
STCP=0
MR=0
WAITMS 1
MR=1

....



if an0 < 60 then goto loop
if an0 < 143 then goto dvd2
if an0 < 206 then goto dvd5
if an0 < 659 then goto cd
if ano > 1000 then goto loop

.....
´ AQUI FICA O CÓDIGO QUE DEFINE QUAL O LED A ACENDER
cd:
acled=1
gosub 74hc595
goto loop

.....

END
´ APÓS O END, COMEÇAM AS SUBROTINAS
.....

´ SEGUE A SUBROTINA QUE ACENDE O LED EXATO

74hc595:
´ PRIMEIRO, FAZER O RESET
MR=0
WAITMS 1
MR=1
DS=1 ´ ENTRADA EM NIVEL 1 APENAS UMA VEZ
´ AGORA, MUDAR O SHIFT ATÉ O LED DESEJADO
for VTEMP=1 to acled
SHCP=1
WAITMS 1
SHCP=0
IF DS = 1 THEN DS=0 ´ COMO DITO ACIMA, APENAS 1 VEZ
NEXT TEMP
´ AGORA, BASTA FAZER O LATCH E O LED VAI ACENDER
STCP=1
WAITMS 1
STCP=0
´ PRONTO, ACABOU !
RETURN

Veja se dá certo, ok ?

Paulo

Paulo,

Obrigado por mais esta força, vou fazer os testes aqui depois posto os resultados.

Ficou uma pequena duvida, no post anterior voce sugeriu aterrar o pino " DS ".

"Mude o seu circuito, em vez de controlar o pino DS, controle o pino /MR.

Ligue o DS no terra (0) ."

E neste exemplo voce esta manipulando o mesmo, e tambem acrecetou mais um pino .

Queria saber se as duas opções estão corretas, e qual a diferença entre elas?

Abraço

Jfelicano

Postado

Só vai funcionar se usar o DS também .....

É que depois que resolví ler mesmo o datasheet ( antes tinha te falado de memória ... ) percebí que precisava colocar a entrada em nivel alto , para fazer essa entrada ir se propagando pelos shifts register, até chegar na saída desejada.

E também só devo colocar em nivel alto no primeiro shift, senão vai propagar o nivel alto para todos os leds em sequência, e todos ficariam acesos .... o que queremos é acender apenas um, certo ?

E tive de acrescentar o sinal de RESET, fica bem mais fácil do que ficar controlando na memória do PIC qual é o led aceso no momento, e calcular quantos shifts terei de fazer para fazer acender um outro led .... como ví que voce tem trocentos pinos sobrando (:D) aproveitei !!!!

Mas se voce quiser, pode fazer sem o RESET, mas terá de ficar sempre calculando quantos shifts terá de dar para acender o LED que voce quiser, por exemplo, se o LED que estiver aceso for o da saída Q5 do CI, e eu quiser agora acender o da saída Q3, tenho de dar mais 2 shifts com a entrada DS em nivel 0 para chegar ao estágio inicial ( o próximo shift mandaria 0 para a saida Q7 , e coloca o sinal de entrada DS na saída Q0 ) , e depois dar mais 2 shifts, sendo que tenho de colocar primeiro DS=1, fazer um shift, colocar DS=0 e fazer os outros 3 shifts, entendeu ?

Heheheh, se complicou, faz como eu fiz.... use o RESET !!!!

Paulo

Postado
Só vai funcionar se usar o DS também .....

É que depois que resolví ler mesmo o datasheet ( antes tinha te falado de memória ... ) percebí que precisava colocar a entrada em nivel alto , para fazer essa entrada ir se propagando pelos shifts register, até chegar na saída desejada.

E também só devo colocar em nivel alto no primeiro shift, senão vai propagar o nivel alto para todos os leds em sequência, e todos ficariam acesos .... o que queremos é acender apenas um, certo ?

E tive de acrescentar o sinal de RESET, fica bem mais fácil do que ficar controlando na memória do PIC qual é o led aceso no momento, e calcular quantos shifts terei de fazer para fazer acender um outro led .... como ví que voce tem trocentos pinos sobrando (:D) aproveitei !!!!

Mas se voce quiser, pode fazer sem o RESET, mas terá de ficar sempre calculando quantos shifts terá de dar para acender o LED que voce quiser, por exemplo, se o LED que estiver aceso for o da saída Q5 do CI, e eu quiser agora acender o da saída Q3, tenho de dar mais 2 shifts com a entrada DS em nivel 0 para chegar ao estágio inicial ( o próximo shift mandaria 0 para a saida Q7 , e coloca o sinal de entrada DS na saída Q0 ) , e depois dar mais 2 shifts, sendo que tenho de colocar primeiro DS=1, fazer um shift, colocar DS=0 e fazer os outros 3 shifts, entendeu ?

Heheheh, se complicou, faz como eu fiz.... use o RESET !!!!

Paulo

OK,

Paulo

Na verdade nao tenho pinos sobrando no pic,e que eu nao fiz todo o desenho.

Porque se colocar tudo vou acabar desistindo no meio do caminho,tem leras de coisa pra acrecentar, montes de reles ,pgas23xx , encoder, sensor de cont. remoto etc.

E que eu coloquei a carroça na frente dos burros , construi primeiro todo o hardware,pra depois aprender a "programar" kakakakaka!!!!!.

E que um amigo ia fazer o codigo, mas ai ele foi embora e eu fiquei a ver navios, digo " placas e mais placas na gaveta "

então vou tentar seguir a ideia inicial que e este projeto deste link:http://www.mhennessy.f9.co.uk/preamp/schematics.htm.

pra nao peder todo o serviço , vou tentar fazer pequenas adaptaçoes, como reduzir o numero de reles,chaves etc.. e usar outro ldc.

Veja bem no que e que foi me meter. hummmmm!!!!!!!!!

Ate breve

Jfeliciano

Postado

Caramba .... tem dezenas de pinos nesse PIC e todos estão usados ??????????????????????????????????????????????????????????????

Hehehehe, bom, paciência, então vamos usar o método mais complicado que te expliquei acima.

Crie uma variável adicional que mantém qual o LED aceso, por exemplo, suponha que o LED D1 está ligado na saída Q0, e assim por diante.

Agora, suponha que neste momento o LED aceso é o da saída Q5.

Quantos pulsos teremos de dar para esse nível alto na saida Q5 chegar até o Q7 ?

Esse é o algoritmo !!!!

A conta a fazer é sempre 7 - o numero do led QUE ESTÁ ACESO !

Neste mesmo exemplo, se dermos dois pulsos , com a entrada DS no nível 0, já estaremos prontos para fazer o ciclo de pulsos para ir até a posição desejada, da mesma maneira que se usássemos o pio de RESET !

Olha só :

Led aceso = Q5

Fazemos DS=0

Damos 2 pulsos de clock em SHCP ( 7-5 = 2, certo ? )

Agora, supondo que queremos acender o LED Q3.

Fazemos DS=1

Fazemos SHCP = 1

ESPERAMOS 1 MILISEGUNDO

Fazemos SHCP = 0

Fazemos DS=0

Agora, damos os pulsos de clock restantes ( 3 pulsos com SHCP indo até 1 e voltando a 0 )

Colocamos STCP em 1

ESPERAMOS 1 MILISEGUNDO

Voltamos STCP a 0

Pronto !!!!

Entendeu ?

Mãos à obra !!!!!

Paulo

Postado

Paulo,

Já esta funcionando a caisa por aqui,foi so compilar e partir pro abraço.

Foi só alegria, so nao soltei fogos por que nao tinha!!!!!! kakakakakakakaka

Parecia pintinho no lixo!!!

Depois da "onça morta" da até coragem pra tirar o coro!!!!!!!!!

Agora é passar para o proximo passo, e melhorar o visual das apresentaçoes das "Telas" e acresentar os reles e mais alguma "coisinha".

Tem uma tecla que e pra colocar o pic pra "Dormir" (STANDBY), mas não tenho a menor ideia de como isto e feito.

Há! e como e que se faz a conta pra compensar a tolerancia dos componentes na leitura do ADC?

Se tiver mais sugestoes pode mandar.

Veja ai como ficou o codigo.

Muitissimo Obrigado!!!!!!!!

Ate breve

jfeliciano

'Controle de volume 5.1 e Seletor de Entradas'

Define CONF_WORD = 0x3f31

Define CLOCK_FREQUENCY = 4

AllDigital

ADCON1 = 0x0e

TRISB = 0x00

TRISD = 0x00

TRISC = 0x00

PORTB = 0

PORTD = 0

Symbol mr = PORTC.0 'RESET PIN 10 (MR) 74HC595

Symbol stcp = PORTC.1 'CLOCK PIN 12 (ST_CP) 74HC595

Symbol shcp = PORTC.2 'LATCH PIN 11 (SH_CP)74HC595

Symbol ds = PORTC.3 'DATA PIN 14 (DS) 74HC595

Dim acled As Byte

Dim vtemp As Byte

Dim an0 As Word

Define LCD_BITS = 8

Define LCD_DREG = PORTD

Define LCD_DBIT = 4

Define LCD_RSREG = PORTB

Define LCD_RSBIT = 0

Define LCD_RWREG = PORTB

Define LCD_RWBIT = 1

Define LCD_EREG = PORTB

Define LCD_EBIT = 2

Define LCD_READ_BUSY_FLAG = 1

Lcdinit 0

shcp = 0

stcp = 0

mr = 0

WaitMs 1

mr = 1

Goto dvd2

loop:

Adcin 0, an0

If an0 < 60 Then Goto loop

If an0 < 143 Then Goto dvd2

If an0 < 206 Then Goto dvd5

If an0 < 250 Then Goto cd

If an0 < 350 Then Goto sat

If an0 > 1000 Then Goto loop

dvd2:

acled = 1

Gosub sn74hc595

Lcdout " Pre-Amplifier"

Lcdcmdout LcdLine2Home

Lcdout "Source: ", "DVD2.0 "

WaitMs 50

Goto loop

cd:

acled = 3

Gosub sn74hc595

Lcdout " Pre-Amplifier"

Lcdcmdout LcdLine2Home

Lcdout "Source: ", "CD "

WaitMs 50

Goto loop

sat:

acled = 4

Gosub sn74hc595

Lcdout " Pre-Amplifier"

Lcdcmdout LcdLine2Home

Lcdout "Source: ", "SAT "

WaitMs 50

Goto loop

dvd5:

acled = 2

Gosub sn74hc595

Lcdout " Pre-Amplifier"

Lcdcmdout LcdLine2Home

Lcdout "Source: ", "DVD5.1 "

Goto loop

End

sn74hc595:

mr = 0

WaitMs 1

mr = 1

ds = 1

For vtemp = 1 To acled

shcp = 1

WaitMs 1

shcp = 0

If ds = 1 Then ds = 0

Next vtemp

stcp = 1

WaitMs 1

stcp = 0

Return

Postado

Opa, Legal !!!! Parabéns hehehehe !!!!!

Tá vendo que o leão é manso né ?????

Agora, que tal mais umas idéias :

1 - Pelo que entendí, voce vai controlar o volume usando um daqueles PGA qualquer coisa. Então, que tal aproveitar e fazer o controle de graves e agudos, também da maneira digital ????

Digo, sem utilizar esses CI's comuns que tem distorção e ruído meio alto.

Faz um controle de tom tipo Baxandall, com um transistor, sendo que no lugar dos potenciômetros de 100K voce usa dois digital pot !!! A distorção e o ruído serão bem mais baixos.

Eu comprei estes aqui na Farnell : X9C104P , é tipo DIP 8 pinos, valor de 100K, e dá para controlar bem fácil. Dá até para usar dois deles no lugar do PGA, claro que a gama de variação será de apenas 100 valores possíveis de volume, e o ruido é bem maior se comparado a um PGA ( os PGA's tem -140dB uauuu !!! ), mas a distorção é semelhante , o ruído dele é abaixo de - 104db ( inaudível, e tá ótimo já que um power Hi-Fi top de linha, construido com os melhores componentes, não chega a -100 db ... ) , mas o preço e a facilidade de encontrar compensam.

2 - Mais para frente, voce pode trocar tudo, tanto os PGAs mais o circuito de tom mais o seletor deentradas ( que eu acredito que voce está fazendo com relé ! ) , por este CI aqui :

TDA7439 - Não consegui achar ele ainda, mas seria muito bom !!!!

3 - Fazer o PIC dormir seria apenas para diminuir os possíveis ruídos gerados, não é difícil, mas ainda não sei como o PSI encara isso ... deixe para o final do projeto, por enquanto faça toda a parte digital em uma placa separada da parte analógica, com alimentação muito bem filtrada, e cuidado com os loops de terra, que fazem aparecer os famosos roncos e zumbidos de 60 ou 120 hz ....

4 - A conta para os níveis do ADC foi uma ideia que tive : Eu apenas calculei o valor médio entre os pontos exatos que voce queria a comutação, só isso !!!! assim temos uma margem muito alta de tolerância, muito maior do que 10 % , pode usar resistores comuns tipo 5% que vai funcionar direitinho.

Por exemplo, voce faz a conta de um divisor resistivo, e usando uma regrinha de três voce calculou o valor da leitura do PIC caso os resistores forem exatos, certos ?

Eu apenas calculei o valor médio entre um ponto e outro, só isso.

5 - Já que o seu código funcionou , experimente alterar para não usar o /MR, do jeito que eu falei no post anterior, assim sobra esse pino do Pic.

No resto, só posso te desejar boa sorte, agora chega que eu vou pescar lá perto de São Roque, é um belo passeio de moto em um dia que tá amanhecendo bem legal, e promessa de calor !!!!

Um abraço !

Paulo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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