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

se fosse em basic ate daria uma ajuda,mais c nao mexo.mais basta fazer a rotina do lcd,um contador q soma 1 a cada registro de usuario, ate dar 100,pro beep ,a cada vez q o botao e apertado ,chame a rotina do beep, o login você grava uma senha na memoria e compara ela com a senha de entrada,e por ai.

Postado

Jfeliciano,

Bom, meu amigo, exatamente do jeito que voce quer, não é possível, pois se voce tiver mesmo de usar o pino AN7, terá de usar, no mínimo, 6 entradas analógicas.

O correto seria voce usar AN0, pois existe uma configuração onde apenas esse pino será entrada analógica, e todos os outros pinos respectivos aos AN1 ...AN7 serão entradas digitais. Segue um trecho do próprio tutorial, já modificado para seu uso com AN0 :

Define CONF_WORD = 0x3f71
Define CLOCK_FREQUENCY = 4
AllDigital 'prepara o uso do PIC como DIGITAL apenas
TRISD = 11111100b 'Pinos RD0 e RD1 como saída, e RD2 como entrada
TRISB = 00000000b 'todos os pinos como saída pois é a porta do display
ADCON1 = 0x0E 'usar apenas pino RA0 como entrada analógica

Agora é só fazer a leitura , por exemplo, assim :

Adcin 0, contagem 'lê a entrada analógica e guarda leitura na variável tipo WORD contagem

Paulo

Postado

Oiluj,

Desculpe pela demora, estou bem ocupado com uns projetinhos com AVR, e acabo deixando este tópico meio de lado, senão funde a cuca.... 2 tipos de processadores bem diferentes, e dois tipos de BASIC bem diferentes também... tem horas que confundo tudo !

Do jeito que voce gostaria, não é possível de fazer com o PSI ( mas com o BASCOM pode, pena que é para AVR... ).

Sugiro voce criar uma subrotina que detecta primeiro se tem algum botão apertado, e se tiver, descubra qual é , ligue um flag, e teste esse flag no seu programa para saber como proceder.

Claro que voce também pode trabalhar por interrupção do PORTB .

Existe a possibilidade de voce usar até 4 bits ( RB4...RB7 ) do PORTB na configuração INTERRUPT ON CHANGE, ou seja, qualquer alteração de estado em um ou mais destes pinos gera uma interrupção, e voce verificará dentro dessa rotina de interrupção qual ( ou quais ) bits mudaram de estado, ou no seu exemplo, quais botões mudaram entre SOLTO / APERTADO , assim voce pode tratar da maneira que lhe for conveniente.

O que voce quer fazer, com o botão MODE, é um exemplo clássico das famosas máquinas de estado, e a mudança de estado é feita via o botão MODE.

Não sei se ainda ensinam isto hoje em dia, mas pesquise como STATE MACHINE ou VARIABLE STATE MACHINE que voce deve encontrar toda a técnica, ok ?

Boa sorte, Júlio !

Paulo

Eu gosto muito de sinalizar via flags para o programa principal quais os botões que estão apertados, assim posso fazer algo tipo máquina de estados.

Postado
  aphawk disse:
Jfeliciano,

Bom, meu amigo, exatamente do jeito que voce quer, não é possível, pois se voce tiver mesmo de usar o pino AN7, terá de usar, no mínimo, 6 entradas analógicas.

O correto seria voce usar AN0, pois existe uma configuração onde apenas esse pino será entrada analógica, e todos os outros pinos respectivos aos AN1 ...AN7 serão entradas digitais. Segue um trecho do próprio tutorial, já modificado para seu uso com AN0 :

Define CONF_WORD = 0x3f71
Define CLOCK_FREQUENCY = 4
AllDigital 'prepara o uso do PIC como DIGITAL apenas
TRISD = 11111100b 'Pinos RD0 e RD1 como saída, e RD2 como entrada
TRISB = 00000000b 'todos os pinos como saída pois é a porta do display
ADCON1 = 0x0E 'usar apenas pino RA0 como entrada analógica

Agora é só fazer a leitura , por exemplo, assim :

Adcin 0, contagem 'lê a entrada analógica e guarda leitura na variável tipo WORD contagem

Paulo

Paulo,

Bom dia, obrigado pela reposta.

ja tinha entendido esta parte ai, mas pensei que poderia usar qualquer entada analogica independente, mas parece que nao tem jeito, vou modifcar aqui .

Aproveitando a oportunidade, voce ensinou no tutorial como ler e converter a leitura do adc para unidades e dezenas, e como seria a formula para centenas? você poderia dar uma explicaçao?

so mais uma coisa, aquele projetinho do sequencial que falei antes ta caminhado, seria correto usar uma leitura do adc pra modificar a velocidade do efeito?

Ate breve

jfeliciano

Postado

Jfeliciano,

Sugiro que voce baixe o datasheet do PIC que voce está usando, acredito que seja o 16f877A, veja na parte sobre ADC, existe uma tabela com todas as configurações possíveis das portas analógicas com as portas digitais. voce vai ver que existe limite no hardware ! Verifique a função do registrador ADCON1 !

Para a conversão da leitura em centenas, me explique exatamente o que voce quer, se é para converter e mostrar em um display, ou se é para fazer algum tipo de conta....

A leitura do ADC sempre retorna um valor entre 0 e 1023, e voce pode fazer a conversão para uma escala qualquer que voce quer, seja entre 0 e 99, ou entre 0 e 499 por exemplo.

Me explique o que voce quer fazer, aliás, explique se voce usa displays LCD ou 7 segmentos também, e eu te explico ok ?

Para aquele seu projetinho, nada te impede de voce usar o ADC, por exemplo, usando um potenciometro ligado entre o +5 e o terra, voce pode variar linearmente a velocidade do seu shift. Basta apenas fazer uma conversão, por exemplo, dos valores entre 0 e 1023 para a escala entre 1 e 10 shifts por segundo, entendeu o conceito ?

É a tal de regra de três que eu expliquei no tutorial, é bem simples.

Paulo

Postado
  aphawk disse:
Jfeliciano,

Sugiro que voce baixe o datasheet do PIC que voce está usando, acredito que seja o 16f877A, veja na parte sobre ADC, existe uma tabela com todas as configurações possíveis das portas analógicas com as portas digitais. voce vai ver que existe limite no hardware ! Verifique a função do registrador ADCON1 !

Para a conversão da leitura em centenas, me explique exatamente o que voce quer, se é para converter e mostrar em um display, ou se é para fazer algum tipo de conta....

A leitura do ADC sempre retorna um valor entre 0 e 1023, e voce pode fazer a conversão para uma escala qualquer que voce quer, seja entre 0 e 99, ou entre 0 e 499 por exemplo.

Me explique o que voce quer fazer, aliás, explique se voce usa displays LCD ou 7 segmentos também, e eu te explico ok ?

Para aquele seu projetinho, nada te impede de voce usar o ADC, por exemplo, usando um potenciometro ligado entre o +5 e o terra, voce pode variar linearmente a velocidade do seu shift. Basta apenas fazer uma conversão, por exemplo, dos valores entre 0 e 1023 para a escala entre 1 e 10 shifts por segundo, entendeu o conceito ?

É a tal de regra de três que eu expliquei no tutorial, é bem simples.

Paulo

Paulo,

Bom dia

Obrigado mais uma vez pela força.

Eu ja baixei aqui o datasheet do pic, mas é que meus conhecimentos tecnico e de inglês e limitado e ai complica um pouco, mas vou caminhado devagar e sempre.

Mas neste intervalo tive a oportunidade de ver uma mini video aula do Curso de Programação BASIC para PIC do pessoal da "Microgenios" falado exatamente do uso e configuraçoes do adc, deu pra entender direitinho.

Tai uma boa ideia, quem sabe você mesmo no futuro nao faz algo parecido , um "video tutorial".

Mas a respeito da conversão da leitura do adc ,é pra fazer ensaios com um voltimetro DC de 5volts com LCD, mas pode ser tambem com display de 7 seg., 3 ou 4 digitos.

Se você puder explicar os dois ficarei muito grato.

E o projetinho do sequencial, quando ficar pronto vou postar aqui pra você avaliar, ok

jfelicano

Postado

Jfeliciano,

Modifiquei o programa do Exemplo 4 do tutorial, para o caso de usar 3 displays de 7 segmentos e com leitura até 5 volts. Como os resultados a mostrar vão até 500 ( 5.00 ) , teremos de usar as centenas, que é o que voce pediu. O que complicou foi a simplificação da escala.... porisso que agora só uso o BASCOM e os AVR's , enche o saco ficar inventando truques para a limitação matemática do PSI !!!

Para fazer funcionar na prática, acrescente mais um display com seu transistor no pino PORTD.3, e elimine o divisor resistivo ligado ao pino de entrada do ADC, pois agora voce irá aplicar apenas 5 volts, que é o limite.

O correto seria recalcular a frequência do TIMER0 , pois agora tem de fazer refresh em 3 displays ( antes eram apenas 2 ), portanto, caso na prática os displays fiquem piscando ( o mais provável... ), basta seguir o tutorial e calcular o novo valor ( ... estou com preguiça ! ) .

Não testei o programa, deixei para voce testar no PSI e ver se funciona, ok ?

Um abraço !


Define CONF_WORD = 0x3f71
Define CLOCK_FREQUENCY = 4
AllDigital 'prepara o uso do PIC como DIGITAL
TRISD = 11110100b 'Pinos RD0, RD1 e RD3 como saída, e RD2 como entrada
TRISB = 00000000b 'todos os pinos como saída pois é a porta do display
ADCON1 = 0x00 'usar pino RA0 como entrada analógica
Dim contagem As Word
Dim temp As Byte
Dim digito As Byte 'os números que vamos mostrar, de 0 a 9 para lookup
Dim centena As Word 'centena corrente
Dim dezena As Word 'dezena corrente
Dim unidade As Word 'unidade corrente
Dim mask As Byte 'mascara corrente que veio de lookup
Dim centmask As Byte 'mascara da centena
Dim dezmask As Byte 'mascara da dezena
Dim unimask As Byte 'mascara da unidade
Dim chave As Bit
Dim phase As Byte 'controla seqüência mostrada na interrupção
Symbol enablecentena = PORTD.3
Symbol enabledezena = PORTD.1
Symbol enableunidade = PORTD.0
enablecentena = False
enabledezena = False
enableunidade = False
unimask = 0
dezmask = 0
centmask = 0
phase = 1

OPTION_REG.T0CS = 0 'usar clock interno
OPTION_REG.PSA = 0 'prescaler ligado no TIMER0
OPTION_REG.PS2 = 1 'valor prescaler = 64
OPTION_REG.PS1 = 0
OPTION_REG.PS0 = 1
TMR0 = 0x3d 'contagem inicial do TIMER0
INTCON.T0IE = 1 'Habilita as interrupções do TIMER0
INTCON.GIE = 1 'Habilita todas as interrupções não mascaradas
Enable 'agora sim as interrupções já estão acontecendo
digito = 10 'vamos acender padrão de espera no display
Gosub getmask 'pega a equivalência da tabela
unimask = mask 'prepara mostrar na unidade
dezmask = mask 'e prepara para mostrar na dezena
centmask = mask
'automaticamente a rotina de interrupção vai mostrando os dígitos
espera: 'e agora só esperamos apertar a chave sw1
chave = PORTD.2
If chave = 1 Then Goto espera 'espera chave apertada
loop: 'finalmente a chave foi apertada
Adcin 0, contagem 'lê a entrada analógica e guarda leitura em contagem

'agora, temos de acertar a conversão, pois leitura vai de 0 a 1023
'e no nosso circuito 1023 tem de corresponder a 5,00 volts na entrada
'do circuito, ou 5 volts na entrada RA0.
'para facilitar, faremos contagem variar de 0 até 500 para a tensão
'de 0 até 5,00 volts

contagem = (contagem * 61)/125

'na verdade a conta exata era ( contagem * 500 ) / 1023
'mas o resultado de contagem * 500 pode ultrapassar 65535, que é
'o limite da variável tipo WORD . Portanto temos de tentar sempre
'usar a matemática para fazer as contas serem sempre menores.
' primeiro, se dividirmos 500 por 1023 resulta 0,4888.... daí vem
' contagem = contagem * 0,4888, mas como só podemos usar inteiros
'faremos contagem = 488,8 * contagem / 1000 ( mesma coisa certo ? )
'simplificando fica contagem = 61,1 * contagem / 125
' que pode ser mais simplificado assim :
' contagem = contagem * ( 61 + 0,1) / 125
'finamente dividimos a conta em duas somas :
'contagem = contagem * 61 /125 + contagem *0,1/125
'e para só termos inteiros de novo fica :
'contagem=contagem*61/125 + contagem*1/1250
'analisando, vemos que o segundo termo sempre será zero portanto
'podemos deixar assim : contagem = (contagem * 61)/125
'assim teremos para uma leitura do ADC de 1023, resultará 499
' o que dá um erro de 1 milivolt, que é bem menor do que a resolução
'do ADC que é de mais de 4 milivots !
'nossa conversão de escala está pronta !

centena = contagem / 100 ' temos a centena
dezena = contagem - ( 100 *centena )
dezena = dezena / 10 ' temos a dezena
unidade = contagem - (100*centena)
unidade = unidade - (10 * dezena ) ' temos a unidade

'agora, para não termos problemas com o programa, vamos
'converter a variável que é WORD para uma que é Byte
'através da função .LB pois o valor é menor do que 255 !

digito = centena.LB
gosub getmask
centmask = mask
digito = dezena.LB 'agora pegamos o equivalente da dezena para mostrar
Gosub getmask 'consultamos a tabela que retorna sempre em mask
dezmask = mask 'dezena já está prontinha para ser mostrada
digito = unidade.LB 'pegamos agora o equivalente da unidade
Gosub getmask 'fazemos a mesma coisa para a unidade
unimask = mask 'unidade também já está prontinha
WaitMs 50 'agora esperamos 0,2 segundos ( 200 mseg )
Goto loop
End

On Interrupt 'Rotina de interrupção
Save System 'SEMPRE SALVAR ESTADO DO SISTEMA
If phase = 1 Then Gosub mostracentena
If phase = 2 Then Gosub mostradezena
If phase = 3 Then Gosub mostraunidade
phase = phase + 1 'preparar o próximo estado
If phase = 4 Then phase = 1
TMR0 = 0x3d 'contagem inicial do TIMER0 novamente
INTCON.T0IF = 0 'habilita novamente as interrupções do TIMER0
Resume

getmask: 'pega a equivalência para acender os dígitos
mask = LookUp(0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x49),
digito
Return


mostracentena: 'mostra a centena e mantém ela acesa
enabledezena = False
enableunidade = False
enablecentena = False
PORTB = centmask
High PORTB.7 'acende o ponto decimal
enablecentena = True
Return

mostradezena: 'mostra a dezena e mantém ela acesa
enabledezena = False
enableunidade = False
enablecentena = False
PORTB = dezmask
enabledezena = True
Return

mostraunidade: 'mostra a unidade e mantém ela acesa
enabledezena = False
enableunidade = False
enablecentena = False
PORTB = unimask
enableunidade = True
Return

Paulo

Postado
  aphawk disse:
Jfeliciano,

Modifiquei o programa do Exemplo 4 do tutorial, para o caso de usar 3 displays de 7 segmentos e com leitura até 5 volts. Como os resultados a mostrar vão até 500 ( 5.00 ) , teremos de usar as centenas, que é o que voce pediu. O que complicou foi a simplificação da escala.... porisso que agora só uso o BASCOM e os AVR's , enche o saco ficar inventando truques para a limitação matemática do PSI !!!

Para fazer funcionar na prática, acrescente mais um display com seu transistor no pino PORTD.3, e elimine o divisor resistivo ligado ao pino de entrada do ADC, pois agora voce irá aplicar apenas 5 volts, que é o limite.

O correto seria recalcular a frequência do TIMER0 , pois agora tem de fazer refresh em 3 displays ( antes eram apenas 2 ), portanto, caso na prática os displays fiquem piscando ( o mais provável... ), basta seguir o tutorial e calcular o novo valor ( ... estou com preguiça ! ) .

Não testei o programa, deixei para voce testar no PSI e ver se funciona, ok ?

Um abraço !


Define CONF_WORD = 0x3f71
Define CLOCK_FREQUENCY = 4
AllDigital 'prepara o uso do PIC como DIGITAL
TRISD = 11110100b 'Pinos RD0, RD1 e RD3 como saída, e RD2 como entrada
TRISB = 00000000b 'todos os pinos como saída pois é a porta do display
ADCON1 = 0x00 'usar pino RA0 como entrada analógica
Dim contagem As Word
Dim temp As Byte
Dim digito As Byte 'os números que vamos mostrar, de 0 a 9 para lookup
Dim centena As Word 'centena corrente
Dim dezena As Word 'dezena corrente
Dim unidade As Word 'unidade corrente
Dim mask As Byte 'mascara corrente que veio de lookup
Dim centmask As Byte 'mascara da centena
Dim dezmask As Byte 'mascara da dezena
Dim unimask As Byte 'mascara da unidade
Dim chave As Bit
Dim phase As Byte 'controla seqüência mostrada na interrupção
Symbol enablecentena = PORTD.3
Symbol enabledezena = PORTD.1
Symbol enableunidade = PORTD.0
enablecentena = False
enabledezena = False
enableunidade = False
unimask = 0
dezmask = 0
centmask = 0
phase = 1

OPTION_REG.T0CS = 0 'usar clock interno
OPTION_REG.PSA = 0 'prescaler ligado no TIMER0
OPTION_REG.PS2 = 1 'valor prescaler = 64
OPTION_REG.PS1 = 0
OPTION_REG.PS0 = 1
TMR0 = 0x3d 'contagem inicial do TIMER0
INTCON.T0IE = 1 'Habilita as interrupções do TIMER0
INTCON.GIE = 1 'Habilita todas as interrupções não mascaradas
Enable 'agora sim as interrupções já estão acontecendo
digito = 10 'vamos acender padrão de espera no display
Gosub getmask 'pega a equivalência da tabela
unimask = mask 'prepara mostrar na unidade
dezmask = mask 'e prepara para mostrar na dezena
centmask = mask
'automaticamente a rotina de interrupção vai mostrando os dígitos
espera: 'e agora só esperamos apertar a chave sw1
chave = PORTD.2
If chave = 1 Then Goto espera 'espera chave apertada
loop: 'finalmente a chave foi apertada
Adcin 0, contagem 'lê a entrada analógica e guarda leitura em contagem

'agora, temos de acertar a conversão, pois leitura vai de 0 a 1023
'e no nosso circuito 1023 tem de corresponder a 5,00 volts na entrada
'do circuito, ou 5 volts na entrada RA0.
'para facilitar, faremos contagem variar de 0 até 500 para a tensão
'de 0 até 5,00 volts

contagem = (contagem * 61)/125

'na verdade a conta exata era ( contagem * 500 ) / 1023
'mas o resultado de contagem * 500 pode ultrapassar 65535, que é
'o limite da variável tipo WORD . Portanto temos de tentar sempre
'usar a matemática para fazer as contas serem sempre menores.
' primeiro, se dividirmos 500 por 1023 resulta 0,4888.... daí vem
' contagem = contagem * 0,4888, mas como só podemos usar inteiros
'faremos contagem = 488,8 * contagem / 1000 ( mesma coisa certo ? )
'simplificando fica contagem = 61,1 * contagem / 125
' que pode ser mais simplificado assim :
' contagem = contagem * ( 61 + 0,1) / 125
'finamente dividimos a conta em duas somas :
'contagem = contagem * 61 /125 + contagem *0,1/125
'e para só termos inteiros de novo fica :
'contagem=contagem*61/125 + contagem*1/1250
'analisando, vemos que o segundo termo sempre será zero portanto
'podemos deixar assim : contagem = (contagem * 61)/125
'assim teremos para uma leitura do ADC de 1023, resultará 499
' o que dá um erro de 1 milivolt, que é bem menor do que a resolução
'do ADC que é de mais de 4 milivots !
'nossa conversão de escala está pronta !

centena = contagem / 100 ' temos a centena
dezena = contagem - ( 100 *centena )
dezena = dezena / 10 ' temos a dezena
unidade = contagem - (100*centena)
unidade = unidade - (10 * dezena ) ' temos a unidade

'agora, para não termos problemas com o programa, vamos
'converter a variável que é WORD para uma que é Byte
'através da função .LB pois o valor é menor do que 255 !

digito = centena.LB
gosub getmask
centmask = mask
digito = dezena.LB 'agora pegamos o equivalente da dezena para mostrar
Gosub getmask 'consultamos a tabela que retorna sempre em mask
dezmask = mask 'dezena já está prontinha para ser mostrada
digito = unidade.LB 'pegamos agora o equivalente da unidade
Gosub getmask 'fazemos a mesma coisa para a unidade
unimask = mask 'unidade também já está prontinha
WaitMs 50 'agora esperamos 0,2 segundos ( 200 mseg )
Goto loop
End

On Interrupt 'Rotina de interrupção
Save System 'SEMPRE SALVAR ESTADO DO SISTEMA
If phase = 1 Then Gosub mostracentena
If phase = 2 Then Gosub mostradezena
If phase = 3 Then Gosub mostraunidade
phase = phase + 1 'preparar o próximo estado
If phase = 4 Then phase = 1
TMR0 = 0x3d 'contagem inicial do TIMER0 novamente
INTCON.T0IF = 0 'habilita novamente as interrupções do TIMER0
Resume

getmask: 'pega a equivalência para acender os dígitos
mask = LookUp(0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x49),
digito
Return


mostracentena: 'mostra a centena e mantém ela acesa
enabledezena = False
enableunidade = False
enablecentena = False
PORTB = centmask
High PORTB.7 'acende o ponto decimal
enablecentena = True
Return

mostradezena: 'mostra a dezena e mantém ela acesa
enabledezena = False
enableunidade = False
enablecentena = False
PORTB = dezmask
enabledezena = True
Return

mostraunidade: 'mostra a unidade e mantém ela acesa
enabledezena = False
enableunidade = False
enablecentena = False
PORTB = unimask
enableunidade = True
Return

Paulo

Paulo,

Boa noite

Nao testei com display de 7 seg., mas fiz o teste com lcd ,tanto no psi como na placa de desenvolvimento funcionou certinho, o erro foi realmente 1 milivolt.

Só nao entedi bem foi esta parte da matematica "leitura = (leitura * 61) / 125".

como você chegou aos numeros 61 e 125?

Mas o resto foi tranquilo, agora vou estudar o TIMER0 pra fazer com 7 seg.

Veja ai com eu fiz o codigo aqui e me diz se e isto mesmo.

Define CONF_WORD = 0x3f72

Define CLOCK_FREQUENCY = 12

AllDigital

ADCON1 = 0x0e

Define LCD_BITS = 8

Define LCD_DREG = PORTD

Define LCD_DBIT = 0

Define LCD_RSREG = PORTE

Define LCD_RSBIT = 0

Define LCD_RWREG = PORTE

Define LCD_RWBIT = 1

Define LCD_EREG = PORTE

Define LCD_EBIT = 2

Define LCD_READ_BUSY_FLAG = 1

Lcdinit

Dim leitura As Word

Dim dez As Word

Dim uni As Word

Dim cent As Word

loop:

Adcin 0, leitura

leitura = (leitura * 61) / 125

cent = leitura / 100

dez = leitura - (100 * cent)

dez = dez / 10

uni = leitura - (100 * cent)

uni = uni - (10 * dez)

Lcdcmdout LcdClear

Lcdout " VOLT-METER LCD"

Lcdcmdout LcdLine2Home

Lcdout " VOLTS >>> " #cent, "." #dez, #uni

WaitMs 250

Goto loop

Muito obrigado

jfelicano

Postado

Jfeliciano,

Acho que seu programa está certinho. Agora, modifique para trabalhar com 3 displays de 7 segmentos.

Para calcular o novo valor do TIMER0, lembre-se de que para que voce não perceba a cintilação, cada um dos displays tem de acender no mínimo 30 vezes a cada segundo. Eu recomendo sempre 40 vezes por segundo, portanto a cada interrupção voce vai fazer um deles acender, depois o outro, e assim sucessivamente.

Portanto, a frequência que voce tem de gerar será de 3 * 40 = 120 Hertz, ou em termos de tempo de timer, uma interrupção a cada 8,3 milisegundos aproximadamente. Veja no tutorial como voce vai calcular o valor inicial do TIMER0 a partir deste tempo. O truque é saber quantos ciclos de clock ocorrem em 8,3 milisegundos, isso depende da frequência do Cristal que voce estiver usando.

Agora, o x da questão, de onde que sairam os numeros mágicos 61 e 125 ????

Veja que queremos mostrar no display o número 500 quando tivermos uma tensão de 5 volts no ADC, o qual vai resultar numa leitura do adc no valor de 1023.

Portanto, é a tal regra de tres ( vulga conversão de escala ) :

1023 -> 500

x adc -> y contagem

Multiplicando em X conforme aprendemos na escola :

y contagem = 500 * x adc / 1023

Lembro que x adc = Leitura do ADC

Ou, conforme meu exemplo no post anterior :

CONTAGEM = 500 * LEITURA ADC / 1023

Posso reescrever assim :

CONTAGEM = (500/1023) * LEITURA ADC

Como no PSI não podemos trabalhar com nada diferente de números inteiros, e compreendidos entre 0 e 65535, temos de improvisar alguns truques.

Primeiro, pegue uma calculadora e vamos fazer a conta : 500 / 1023 = 0,4888.... certo ?

Posso reescrever 0,4888 como, por exemplo, 4888 / 10000 , pois o resultado será o mesmo, certo ?

Daí teremos a fórmula :

CONTAGEM = ( 4888 / 10000 ) * LEITURA DO ADC

Lembra da simplificação que aprendemos na escola ? Vamos começar a simplificar, pois ambos os números são multiplos de 2 . Dividindo ambos por 2 não muda o resultado, mas diminuí o valor dos números envolvidos !

4888 / 10000 = 488,8 / 1000 = 244,4 / 500 = 122,2 / 250 = 61,1 / 125

Agora, não consigo simplificar mais, mas observe uma coisa : o valor máximo da leitura do ADC é de 1023, e se eu usar a fórmula agora, multiplicando 61,1 * 1023 = 62505,3 , que é menor do que 65535, portanto nosso problema de fazer conta que não ultrapasse o limite do PSI está resolvido !

A fórmula correta agora seria esta aqui :

CONTAGEM = ( 61,6 / 125) * LEITURA DO ADC

Mas ainda temos um último problema : não temos como fazer conta com números fracionários no PSI, temos de dar um jeitinho de transformar essa conta em alguma conta que só envolva números inteiros !

Agora, vem mais um truque : 61,1 = 61 + 1/10 , certo ?

Reescrevendo a equação usando o truque acima :

CONTAGEM = (61/125) * LEITURA DO ADC + (1/1250) * LEITURA DO ADC !

Repare o segundo termo da equação : (1/1250) * LEITURA DO ADC .

Qual o maior valor possível para LEITURA DO ADC ? 1023, certo ?

Oras, 1023 * (1/1250) sempre será menor do que 1, e portanto o PSI vai sempre resultar em zero !

Porisso que eu ignorei esse termo... ele sempre é ZERO no PSI !

Assim, chegamos aos valores que voce questionou !

Espero que tenha entendido esses truques, a obrigação de um bom programador é ter sempre uma cartola cheia de pombos, coelhos, etc !

Boa montagem de display !

Paulo

Postado
  aphawk disse:
Jfeliciano,

Acho que seu programa está certinho. Agora, modifique para trabalhar com 3 displays de 7 segmentos.

Para calcular o novo valor do TIMER0, lembre-se de que para que voce não perceba a cintilação, cada um dos displays tem de acender no mínimo 30 vezes a cada segundo. Eu recomendo sempre 40 vezes por segundo, portanto a cada interrupção voce vai fazer um deles acender, depois o outro, e assim sucessivamente.

Portanto, a frequência que voce tem de gerar será de 3 * 40 = 120 Hertz, ou em termos de tempo de timer, uma interrupção a cada 8,3 milisegundos aproximadamente. Veja no tutorial como voce vai calcular o valor inicial do TIMER0 a partir deste tempo. O truque é saber quantos ciclos de clock ocorrem em 8,3 milisegundos, isso depende da frequência do Cristal que voce estiver usando.

Agora, o x da questão, de onde que sairam os numeros mágicos 61 e 125 ????

Veja que queremos mostrar no display o número 500 quando tivermos uma tensão de 5 volts no ADC, o qual vai resultar numa leitura do adc no valor de 1023.

Portanto, é a tal regra de tres ( vulga conversão de escala ) :

1023 -> 500

x adc -> y contagem

Multiplicando em X conforme aprendemos na escola :

y contagem = 500 * x adc / 1023

Lembro que x adc = Leitura do ADC

Ou, conforme meu exemplo no post anterior :

CONTAGEM = 500 * LEITURA ADC / 1023

Posso reescrever assim :

CONTAGEM = (500/1023) * LEITURA ADC

Como no PSI não podemos trabalhar com nada diferente de números inteiros, e compreendidos entre 0 e 65535, temos de improvisar alguns truques.

Primeiro, pegue uma calculadora e vamos fazer a conta : 500 / 1023 = 0,4888.... certo ?

Posso reescrever 0,4888 como, por exemplo, 4888 / 10000 , pois o resultado será o mesmo, certo ?

Daí teremos a fórmula :

CONTAGEM = ( 4888 / 10000 ) * LEITURA DO ADC

Lembra da simplificação que aprendemos na escola ? Vamos começar a simplificar, pois ambos os números são multiplos de 2 . Dividindo ambos por 2 não muda o resultado, mas diminuí o valor dos números envolvidos !

4888 / 10000 = 488,8 / 1000 = 244,4 / 500 = 122,2 / 250 = 61,6 / 125

Agora, não consigo simplificar mais, mas observe uma coisa : o valor máximo da leitura do ADC é de 1023, e se eu usar a fórmula agora, multiplicando 61,1 * 1023 = 62505,3 , que é menor do que 65535, portanto nosso problema de fazer conta que não ultrapasse o limite do PSI está resolvido !

A fórmula correta agora seria esta aqui :

CONTAGEM = ( 61,6 / 125) * LEITURA DO ADC

Mas ainda temos um último problema : não temos como fazer conta com números fracionários no PSI, temos de dar um jeitinho de transformar essa conta em alguma conta que só envolva números inteiros !

Agora, vem mais um truque : 61,1 = 61 + 1/10 , certo ?

Reescrevendo a equação usando o truque acima :

CONTAGEM = (61/125) * LEITURA DO ADC + (1/1250) * LEITURA DO ADC !

Repare o segundo termo da equação : (1/1250) * LEITURA DO ADC .

Qual o maior valor possível para LEITURA DO ADC ? 1023, certo ?

Oras, 1023 * (1/1250) sempre será menor do que 1, e portanto o PSI vai sempre resultar em zero !

Porisso que eu ignorei esse termo... ele sempre é ZERO no PSI !

Assim, chegamos aos valores que voce questionou !

Espero que tenha entendido esses truques, a obrigação de um bom programador é ter sempre uma cartola cheia de pombos, coelhos, etc !

Boa montagem de display !

Paulo

Paulo,

Muitíssimo obrigado por esta aula particular de matematica.

vai ajudar muita gente aqui.

Eu nunca foi muito amigo da matematica, e ja faz um bom tempo que fugi da escola, estou bem enferrujado, mas com calma, paciencia e a ajuda de DEUS e dos colegas as coisas vão tomando forma

vou ate fazer uma cartilha desta aula pra estudar,e praticar nas horas de folga !!!!

Mas a cartola na managa vai ter que esperar um pouco mais, mas vou comesar com um elefante,e mas faciel de encontrar,coelhos e pombos e muito esperto. kakakakakakakaka

Abraço

jfeliciano

Postado

Opa, disponha, não é uma aula de matemática, e sim uma demonstração de como contornar um problema que muitos acham quase impossível, mas na verdade é bem simples, basta querer enfrentar ele de frente !

Esta é a função deste Fórum : ensinar a todos que querem mesmo aprender, e muitos de nós estão comprometidos com isto !

Vai com calma com a cartola .... mas voce está no caminho certo, estou apostando que voce vai conseguir calcular o novo valor do TIMER0, e com isso já estará apto a fazer muitas coisas novas por sua própria conta !

É mais uma mostra de que eu estava certo em apostar que o PSI é a melhor maneira para iniciantes terem experiência com programaçào de PICs !

Vai mandando bala !

Paulo

Postado

Fala turma to com um problema aqui meio urgente! Preciso disso pro meu avô no prasso mais ou menos de uns 15 dias!

To usando o programa lá do Tutorial do Paulo que usa o RTC pela serial e mostra num Display LCD, aí ao invés de mostrar a data e a hora iria mostrar a Temperatura e a Hora.

incrementei ele com o LM35 ai tenho as seguintes duvidas:

Primeiro: Qual o nome do amplificador de sinal que tenho que usar junto ao LM35 para que o PIC leia o valor?

Segundo: Como faço uma para controlar a temperaturo dentro de uma caixa, ligando/desligando uma Lampada Incandecente(127V), da seguinte forma, pela manhã entre 8:00 e 12:00 preciso manter a uma temperatura X, entre 12:00 e 18:00 preciso manter a uma temperatura Y, e entre 18:00 e 8:00 mater a uma temperatura Z! Como faço isso!

Terceiro: Eu poderia usar mais de um LM35 nesse mesmo PIC, é pra poder ler a Temperatura Ambiente!

E ai tem comome ajudar nisso aí?

Valeu brigado abraços!

Postado
  aphawk disse:
Opa, disponha, não é uma aula de matemática, e sim uma demonstração de como contornar um problema que muitos acham quase impossível, mas na verdade é bem simples, basta querer enfrentar ele de frente !

Esta é a função deste Fórum : ensinar a todos que querem mesmo aprender, e muitos de nós estão comprometidos com isto !

Vai com calma com a cartola .... mas voce está no caminho certo, estou apostando que voce vai conseguir calcular o novo valor do TIMER0, e com isso já estará apto a fazer muitas coisas novas por sua própria conta !

É mais uma mostra de que eu estava certo em apostar que o PSI é a melhor maneira para iniciantes terem experiência com programaçào de PICs !

Vai mandando bala !

Paulo

Ola,Paulo

Tudo na paz por ai?

Aqui ta caminhado,fiz os teste com o voltimetro usando os 3 displays de 7 seg. e funcionou certinho, nem presisei mexer no TIMER0, porque estou usando um cristal de 12Mhz.

Foi so ajustar os PORTS pra trabalhar na minha placa e tambem retirei a rotina da chave que da inicio da leitura.

Ai foi so partir pro abraço.

Pelas minhas contas ficou com o 240 veze por segundo e interrupçao de 4,16 milisegundo, se estiver errado me corrija por favor.

Mas re-lendo aqui a parte de tutorial que mostra como configurar o timer0 fiquei com algumas duvidas.

Por exemplo nesta parte aqui:

"Mas, temos um problema : quantos ciclos de clock ocorrem a cada 12,5 mseg ???

Oras, se temos uma freqüência na entrada de 1Mhz, temos 1 milhão de ciclos em um

segundo, basta multiplicar por 0,025 para sabermos quantos ciclos ocorrem. A resposta

é esta : 12.500 ciclos."

Nao entendi como multiplicar 1 milhão de ciclos em um segundo por 0,025 pra achar 12.500 ciclos.

E nesta parte aqui :

"Apenas para fazer uma conta rápida, a única maneira de dividir os 12.500 ciclos de

clock para caber em 256 é ( 12.500 / 256 ) = 42,82 ou seja, temos de selecionar

OBRIGATÓRIAMENTE o PRESCALER de 64, POIS É O VALOR

IMEDIATAMENTE ACIMA DE 42"

Fiz as contas aqui de (12.500/256)=48,82, tem algum segredo ai ou ficou errado?

Postado

Oiluj, calma meu amigo !!!!! é fácil, dá tempo tranquilo !

Primeiro lugar, o LM35. voce deve amplificar a saída com um amplificador operacional do tipo RAIL-TO-RAIL. É a maneira mais correta de se fazer.

Eu já indiquei até o circuito disto em algum post do ano passado... procure aqui no Fórum.

Mas é só fazer um amplificador não inversor com ganho de , por exemplo, 4, pois o LM35 tem tensão de zero volt a zero graus Celsius, e varia 10 mV por grau.

Se não encontrar esses operacionais RAIL-TO-RAIL, nada te impede de usar o LM35 diretamente sem nenhum amplificador, desde que o comprimento dos fios não seja grande, e os fios sejam bem blindados e relativamente grossos. Existem alguns exemplos de conexão na Internet, usando esse princípio.

Por exemplo, voce quer ligar 2 unidades do LM35, basta configurar o módulo do conversor A/d para a configuração onde os pinos AN3 e AN2 sejam as referências de tensão, e voce possa usar como entrada analógica os pinos AN1 e AN0, cada um destes ligados diretamente ao LM35.

No datasheet do PIC16F877A, está na página 128. Veja o registro ADCON1 na configuração dos bits PCFG <3:0> = 1101 .

Agora, faça um divisor resistivo, usando um trim-pot de 4k7 ligado ao +5V e ao terra, e no pino do meio coloque um pequeno capacitor eletrolítico, do tipo 4.7 uF/ 16 Volts, ligado ao terra. Ajuste o trim-pot para ler exatos 1,023 volts nesse ponto. Esta junção será ligada ao pino AN3, e será a tensão de referência positiva ( 1 volt ).

O pino AN2 será ligado diretamente ao terra, e será a tensão de referência negativa ( 0 volts ).

Desta maneira, o conversor A/D irá retornar o valor de 0 quando o LM35 estiver a zero graus, e irá retornar o valor de 1000 quando a temperatura estiver em 100 graus ! Assim, fica fácil fazer a escala da leitura. E sem usar nenhum amplificador.

Lembro que esta maneira de se fazer a tensão de referência de 1 volt não dá precisão, mas para uso caseiro serve bem. Se voce quiser, pode usar um desses pequenos CI's de referência de tensão, e ajustar a saida dele para obter os 1.023 volts. Assim, teremos uma boa imunidade à variação tanto da tensão como da temperatura ambiente do circuito.

Claro que se tiver uma fiação longa, tem de usar um amplificador operacional não inversor, com ganho 1, ligado o mais próximo possível do pino de saída do LM35, e enviar este sinal até os pinos do conversor A/D do PIC, através de um bom cabo blindado.

Quanto ao software do programa de temperatura, é só comparar os horários do RTC com os do seu preset, determinado pelo usuário, certo ?

Para evitar muito trabalho, que tal fazer assim : converta as horas e minutos em uma nova quantidade ! Por exemplo, calcule sempre quantos minutos são no momento, relativos á zero hora !

Assim, 06:30 da manhã serão 390 minutos; 20:03 da noite serão 1203 minutos, assim basta voce toda hora ler o RTC, converter para minutos, e verificar o que que voce tem de fazer numa tabela de horários, definida pelo usuário !

Esta tabela seria algo assim : entre os minutos 123 e 1507, manter a temperatura X ; entre os minutos 1910 e 2450, manter a temperatura Y, e assim vai. Fácil, não é ?

Agora, para aumentar a temperatura, voce vai usar uma saída do PIC e acionar , por exemplo, um relé, o qual controla o elemento aquecedor, que pode ser inclusive uma lâmpada !

Determine uma faixa de histerese, e tente sempre manter a temperatura entre os limites inferiores e superiores dessa histerese.

Por exemplo, sua temperatura alvo é de 35 graus. Use uma histerese de 2 graus , assim voce ligará o aquecedor, espere atingir a temperatura de 35 graus, e desligue. Quando abaixar de 33 graus, voce liga novamente, espera atingir 35 e desliga de novo, e assim vai.

Use um teclado de 16 teclas , assim pode entrar com os dados diretamente. Veja no site do PSI, existe um exemplo de como montar e como ler as teclas.

Agora, o resto é com você, ok ?

Manda bala !

Paulo

Postado

Jfeliciano, vamos lá !

  Citação
Pelas minhas contas ficou com o 240 veze por segundo e interrupçao de 4,16 milisegundo, se estiver errado me corrija por favor.

Mas re-lendo aqui a parte de tutorial que mostra como configurar o timer0 fiquei com algumas duvidas.

Por exemplo nesta parte aqui:

"Mas, temos um problema : quantos ciclos de clock ocorrem a cada 12,5 mseg ???

Oras, se temos uma freqüência na entrada de 1Mhz, temos 1 milhão de ciclos em um

segundo, basta multiplicar por 0,025 para sabermos quantos ciclos ocorrem. A resposta

é esta : 12.500 ciclos."

Nao entendi como multiplicar 1 milhão de ciclos em um segundo por 0,025 pra achar 12.500 ciclos.

E nesta parte aqui :

"Apenas para fazer uma conta rápida, a única maneira de dividir os 12.500 ciclos de

clock para caber em 256 é ( 12.500 / 256 ) = 42,82 ou seja, temos de selecionar

OBRIGATÓRIAMENTE o PRESCALER de 64, POIS É O VALOR

IMEDIATAMENTE ACIMA DE 42"

Fiz as contas aqui de (12.500/256)=48,82, tem algum segredo ai ou ficou errado?

Bom, primeiro quero te agradecer, voce pegou dois erros que passaram pela minha revisão ! :cool:

Ótimo, pois significa que voce está interessado e está acompanhando o raciocínio, portanto está aprendendo mesmo !

Primeiro erro :

12, 5 milisegundos são exatos 0,0125 , não 0,025 !!!!!

Portanto, onde se lê : 0,025 , deve-se alterar para 0,0125 !

Segundo erro : onde eu escreví 42,82, o correto é 48,82 !!!

Tá vendo o porque eu nunca quis escrever um livro ???????????

Vou corrigir o tutorial e fazer um novo upload este fim de semana !

Agora, a sua pergunta. Eu estava usando um cristal de 4 Mhz nesse exemplo, portanto se voce não mexeu nada no software, os tempos mudaram, vamos ver como ficaram :

Se o PRESCALER é de 64, temos um clock no TIMER0 de 12Mhz / 4 / 64 = 46.875 Hz. Se estamos iniciando a contagem ( preload ) a partir de 61, teremos uma interrupção a cada 195 contagens ( 256 - 61 ), relativas à frequência de 46.875 Hz, que dá em milisegundos 195 * 1/46875 = 4,16 milisegundos.

E a taxa de refresh ficou de 1/0,00416 = 240,38 Hz , e como são 3 displays, cada um deles acende 240,38 / 3 = 80 vezes por segundo !

Assim, voce não vai perceber que eles estão piscando, mas devem ter ficado um pouco mais fracos, ok ?

Portanto, seus resultados estão certinhos !!!!!! Meus parabéns, gostei de ver !

Esse é um dos momentos em que me sinto recompensado, vendo que todo o tempo emprendido no tutorial está tendo um ótimo retorno em aprendizado !

Continue assim, meu amigo ! E obrigado por isto tudo que voce me mostrou hoje !

Paulo

Postado

Paulo então cara, eu tava pensando em usar a serial mesmo, porque meu avô já faz tudo lá por serial e estufinha vai ficar a no máximo 2 metros do pc dele, ai tava pensando em usar o Amplificador mesmo com ganho 4 por exemplo.

Aí tipo tive pensando em com sua permisão usar como base para o tempo e comunicação serial aquele seu programa do tutorial, e acrescentar nele a leitura da temperatura e o controle da mesma! Seria acho que mais fácil e rápido de ser feito! Posso?

Com relação ao controle da teperatura eu teria que criar tipo rotinas diferentes, uma pra cada intervalo de tempo certo?

E você acha que seria muito complicado eu colocar isso tudo pra ser definido pelo usuário via Serial, tipo o usuário vai decidir os intervalos de tempo e a temperatura que deseja manter nesse mesmo intervalo de horários. E aí ficaria muito difícil?

Abraços e muito obrigado!

EDIT:

Galera agora uma duvida matématica aqui! Queria mostrar a temperatura com uma casa decimal, aí coloquei a formula:

valor= leitura*1500/1023

Fiz varias simplificações de todas as formas possiveis nessa expressão e não consegui nada, o valor nunca dá certo na leitura!

Exite a possibilidade de eu conseguir essa leitura decimal, ou essa possibilidade é inexssistente!

Desde já agradeço e muito obrigado!

Abraço a todos

Postado

Puxa vida, que material bom aphawk! Parabéns!

Me deu vontade de estudar os PICs. Mas me falta tanto estudar dos 8051, que ainda estou com medo de ter que jogar tudo fora por aqui! hehehe

Quero estudar PICs quando eu já estiver entendendo como se programa uma USB, essas coisas mais modernas.

Ei! Eu tbém comecei com o Basic, mas especificamente o GWBasic! Bons tempos!

Parabéns mais uma vez!

Abraços,

Graccs

Postado

Graccula,

Obrigado ! Espero que lhe seja útil também, como foi para muitas pessoas.

Se voce começou com o GWBASIC, com certeza tem boas lembranças !

Eu usei o GWBASIC, com um AT-286 super potente, de 20 Mhz ( !!!! ), e tinha também quase 5 K de rotinas em Assembly, tipo TSR, cuidando de um hardware de comunicação dedicado a 1200 bauds, que comunicava com os flightfones dos aviões !

Bons tempos esses !

Sobre o 8051, como já lhe disse em outro tópico, é muito usado ainda hoje em dia, mas voce pode aprender também sobre os PIC's , são bem mais divertidos de se usar , e com o PSI voce vai ter uma experiência muito proveitosa !

Depois, voce pode passar para algo mais potente, como os AVR's e usando o BASCOM ( Basic também, claro ! ) e olha só : existe também o BASCOM para o core do 8051 !!!!

Procure na Internet sobre o BASCOM, veja o site do fabricante, baixe a versão demo, e divirta-se !

Qualquer coisa, é só postar, ok ?

Paulo

Postado

Oiluj,

Caramba, eu queria ter um avô assim !!!!!!!!!!!!!!!!!!!!!!!

Pode usar os programas como voce quiser, não tem nenhum problema, não existe nenhum copyright !

As rotinas de controle de temperatura são idênticas, o que muda são os parâmetros de atuação. O que muda são os horários onde começam e terminam o funcionamento, e a temperatura-alvo de cada situação, ok ?

Pode bolar tudo como serial, fica bem fácil, em vez de usar teclado.

Pára de ficar perguntando e começe a fazer ! voce já sabe o suficiente para concluir esse projeto. Se tiver problemas, é só chamar que a turma toda vai te ajudar.

Agora, o seu problema com 1500 / 1023 :

olha só : 1500/1023 = 1,466 ( arredondando ) = 1466/1000 = 146,6/100 =

73,3/50 = (70 +3,3)/ 50

Então reescreva :

valor= leitura*(70+3,3)/50 = (7*leitura)/5 + (33*leitura)/500

Basta implementar estas duas somas, pois nenhuma delas ultrapassa o limite de 65535 .

Como exemplo, vamos fazer leitura = 50 e ver o erro :

Com calculadora : valor = 73,3 que arredonda em 73.

No PSI : valor = 7*50/5 + 33*50/500 = 70 + 3 = 73

Ou seja, o erro nem existiu neste caso !

Como segundo exemplo, vamos ver o valor para leitura = 76

Calculadora : 111,43 que arredonda em 111

PSI : 106 + 5 = 111

Também não existiu erro !

Bom, acho que a aproximação está boa, certo ?

Manda bala !

Paulo

Postado
  aphawk disse:
Jfeliciano, vamos lá !

Bom, primeiro quero te agradecer, voce pegou dois erros que passaram pela minha revisão ! :cool:

Ótimo, pois significa que voce está interessado e está acompanhando o raciocínio, portanto está aprendendo mesmo !

Primeiro erro :

12, 5 milisegundos são exatos 0,0125 , não 0,025 !!!!!

Portanto, onde se lê : 0,025 , deve-se alterar para 0,0125 !

Segundo erro : onde eu escreví 42,82, o correto é 48,82 !!!

Tá vendo o porque eu nunca quis escrever um livro ???????????

Vou corrigir o tutorial e fazer um novo upload este fim de semana !

Agora, a sua pergunta. Eu estava usando um cristal de 4 Mhz nesse exemplo, portanto se voce não mexeu nada no software, os tempos mudaram, vamos ver como ficaram :

Se o PRESCALER é de 64, temos um clock no TIMER0 de 12Mhz / 4 / 64 = 46.875 Hz. Se estamos iniciando a contagem ( preload ) a partir de 61, teremos uma interrupção a cada 195 contagens ( 256 - 61 ), relativas à frequência de 46.875 Hz, que dá em milisegundos 195 * 1/46875 = 4,16 milisegundos.

E a taxa de refresh ficou de 1/0,00416 = 240,38 Hz , e como são 3 displays, cada um deles acende 240,38 / 3 = 80 vezes por segundo !

Assim, voce não vai perceber que eles estão piscando, mas devem ter ficado um pouco mais fracos, ok ?

Portanto, seus resultados estão certinhos !!!!!! Meus parabéns, gostei de ver !

Esse é um dos momentos em que me sinto recompensado, vendo que todo o tempo emprendido no tutorial está tendo um ótimo retorno em aprendizado !

Continue assim, meu amigo ! E obrigado por isto tudo que voce me mostrou hoje !

Paulo

Paulo,

Tudo na paz ai?

Que bom que voce ficou contente com os resultados, eu fiquei mais ainda.

Nao tenhas duvidas de que seu tutorial é e será muito util ainda pra muita gente.

E que venham mais e mais tutoriais como estes !!!!!!!!

E pra nao perder o costume, sempre vi uma tecnica usada por varios fabricantes de equip.eletronicos que me deixava muito curioso, mas agora ja sei o que é que .

Onde se usa varias teclas pra mudança de funçoes, controles de volumes etc..

usando apenas uma entrada do "Micro", que agora sei que é o "ADC" com um divisor de tensão resistivo associado a varias teclas.

Mas como saber o valor certo pra cada tecla, ja que na teoria os calculos é um e na pratica tem as tolerancias dos componentes as variaçoes de temperaturas e umidades etc.. e podem ter valores ligeiramente diferentes dos calculados.

Por exemplo um divisor de 5volts de 1 pra 1 teria teoricamente no centro 2,5volts , mas e se este valor for um pouco diferente ?

Como fazer pra que esta pequena diferença seja reconhecida como uma leitura valida para a variavel associada a esta tecla e nao gere uma funçao errada?

Isto ai é que ja estou me preparando pra "tutorial 3"

Se voce puder dar uma ajudinha ai e tambem com os "potenciometros sem fim (ROTARY ENCODERS)", ja procurei alguma coisa mas em basic PSI nao encontrei nada, pode ser uma pequena rotina so pra matar a curiosidade.

Obs. os PGAS 2310,2311 e 4311 estão guardadinhos so esperando o tutorial 3 sair pra começar as brincadeiras com os controles de volumes etc.

uma abraço

Jfeliciano

Postado

Então Paulo...

Meu avô é o cara mesmo, ele já me pediu pra fazer tanta tralha quue tu nem imagina, e tem muitas que ele usa até hoje, mas nem me lembro muito mais, desde, sensores bobos de alarme, até coisas mais complexas como essa "estufinha"....

mas voltando aos calculos, uma pequena dúvida, eu joguei lá a medida máxima e deu um pequeno erro, ao invés de 1500 deu 1499... você acha que isso pode influenciar muito no funcionamento???

E quanto a fazer eu já estou com o programa praticamente montado só estou acabando de fazê-lo simulá-lo assmi que estiver tudo ok, mando vim os componentes, e aí é mão na massa!

Hehehe...

Até queria ver com você, 2 coisas, se o próprio PSI grava no pic ou se preciso de outro software! e outra, pra controlar por serial, eu poderia usar um adaptador USB/Serial??

T+

Abraços..

Postado

Jfeliciano,

Pois é, eu também estou esperando aparecer os pots digitais duplos I2C de 100K ...... mas também estou gastando mais tempo do que pensei no tutorial de AVR's. Estou quase terminando o meu circuitinho para as lanternas da minha moto com LED's RGB de alta potência e PWM, depois disso vou dar um tempo no outro tutorial e volto para tentar fazer o circuito com os PGA's aqui no PSI. Tem vezes que a cabeça quase entra em curto-circuito....

Quanto à sua pergunta sobre os divisores resistivos, é bem simples de se fazer. Basta usar resistores de pelo menos 5% de tolerância, o ideal seria mesmo 1%, mas se não forem dezenas de botões, 5% está muito bom.

voce pode implementar isto usando uma variação do circuito R / 2R, muito usado em conversores D/A, e , pensando bem, seria exatamente isto que voce iria fazer, converter um valor digital em analógico !

Mas a conta é complicada de se fazer.

voce pode fazer um divisor mais simples, por exemplo, dobrando o valor de cada resistor ligado a um determinado botão. O primeiro botão teria um de 1K, o segundo 2K, o terceiro 4K, e assim sucessivamente.

Ligando todos os botões ao + VCC, e fazendo todos os resistores que vem dos botões se juntarem na entrada A/D do PIC, e por último ligando um resistor ao terra de , por exemplo, 10K, fica fácil calcular a tensão na entrada do conversor, para cada possível combinação de botões apertados.

Por exemplo, 4 botões juntos totalizam 16 possíveis valores de tensão, todos diferentes uns dos outros.

Assim, voce monta uma tabela dos valores, guarda ela no seu programa, e quando ler a entrada digital, vá procurando em sequência uma de cada vez, até ultrapassar o valor da tabela, e pronto, achou a combinação !

Existem muitas maneiras de se fazer isto, cada um que escrever com certeza vai bolar uma diferente.

Quando voce calcular os valores da tabela, verifique qual é a menor variação possível entre dois valores da tabela, e assuma como tolerância a metade desse valor.

Quando voce for pesquisar na tabela, começe sempre do menor para o maior, e sempre leve essa tolerância em conta na pesquisa, assim voce estará mais do que seguro quando localizar a combinação correta.

Quanto aos Rotary Encoders, eu mesmo nunca usei um deles, mas devem existir exemplos na Net para voce pesquisar, ok ?

Vou dar uma pesquisada e se achar eu posto aqui.

Como curiosidade, o BASCOM possui uma função no BASIC prontinha para se usar com esses rotarys encoders .... porisso que estou usando os AVR's hoje nos meus projetos, tem coisas que fazem muita falta no PSI, quando voce começa a fazer projetos mais sofisticados !

Guarda os PGA'S mais um pouquinho .....

Um abraço !

Paulo

Oiluj,

1499 em vez de 1500 é um erro menor do que 0.1 % !!!!!!!!!!!!!!!!

Deixa de se preocupar com isto e monte logo ! :)

Não se preocupe com isto.... as tolerâncias da tensão de alimentação e sua variação com a temperatura é bem maior do que isto, e são elas que vão determinar a sua precisão.

Como norma de uso, se voce conseguir uns 5% de precisão já está bom para uso caseiro.

E nada te impede de usar um adaptador USB/SERIAL, vai funcionar da mesma maneira. Só cuidado ao selecionar a porta de comunicação no hyperterminal do Windows !

Agora, voce vai precisar de um gravador de PIC's, sugiro algo compatível com o PICKIT2, existem algumas boas ofertas no Mercado Livre, compre uma que possua soquete ZIF de 40 pinos ok ?

Assim, voce compila o programa no PSI, e vai gerar o arquivo .HEX, e o PICKIT2 vai gravar esse arquivo no seu PIC.

Mas nada te impede de fazer a gravação direto na placa do seu protótipo, se voce implementar um conector ICSP do padrão da Microchip, pois quase todos os gravadores tipo PICKIT2 possuem esse conector. É uma boa ajuda poder gravar direto na placa, sem ter de remover o PIC dela.

Manda bala !

Paulo

Postado

ola pessoal, esse topico ta demais, material de primeira. parabens a todos, em especial ao paulo pelos otimos tutoriais.

seguinte: preciso acessar um sd card em fat16, usando um pic 18F4620 e ler arquivos de 8KB, 16KB, 32KB e 64KB, mostrar o nome e tamanho, em KB, do arquivo num lcd em sequencia comandado por botões para subir ou descer a lista e selecionando um nome nessa lista com outro botao, manda-lo para uma memoria sram paralela de 64KB ou maior, usando 74hc573 ou 74hc574.

complicado?

espero algumas ideias, dicas sugestoes da galera mais experientes.

T+

mauro

Postado

Queria saber uma coisinha aqui com relação ao acendimento da lampadá....

Qual relé eu posso usar que suporte uma grande corrente no contato que vai ligar a lampada(corrente na faixa de 788mA).

E ao mesmo tempo tenha uma corrente baixa de funcionamento, e funcione com 5 volts. que é a parte que vai ser ligada no pic?

Ou então pergunto se Há algum outro componente, que eu possa usar como interruptor para a lampada, acionado pelo pic, ou seja, quando o port do pic estiver em 1 o interruptor fecha e a lampada acende, quando estiver em 0 o interruptor abre e a lampada apaga!

Desde já muito grato

Abraços!

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

Mostrar 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

Mostrar mais  
×
×
  • Criar novo...