Ir ao conteúdo
  • Cadastre-se

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


Posts recomendados

Galera me apareceu uma dúvida aqui no seguinte, to afim de montar um termometro simples com o LM35 e o PIC16F877 mas na hora de fazer a conversão lá eu num to conseguindo! porque tipo o conversor vai de 0 a 1023 na entrada e a cada 10mv do LM35 representa 1°C! aí tá neah fui eu aqui pensando, se ele liberar 5V a temparatura intão seria de 500,0°C e fui fazer a conta (l$eitura final=leitura do conversor a/d*5000/1023) mas eu num consigo simplificar isso aí pra poder colocar no PSI como é que eu faço, me deêm uma luz nisso aí galera!

valeu brigadão!

Link para o comentário
Compartilhar em outros sites

Vamos la, quanto ao seu termometro:

Primeiro o lm35 não fornece 5V na saida, o maximo que ele mede é 150°C ou seja teras na saida um máximo de 1.5V, se quiser quer funcione diretamento com a faixa de valores de 0 a 5V coloque um amplificador operacional com ganho de aproximadamente 3.3, entre a saida do LM e a porta analógica do PIC (quantas vezes ja fiz isso), assim quanto você tiver 1.5V tera na porta analogica do PIC 5V, assim fica muito mais fácil de fazer a regra de tres.

Agora vamos ao software, vamos supor que você queria medir de 0 a 150 então o calculo matematico seria esse:


seriam as variaves:

ADC ; leitura do no A/D
FESC: Fundo de escala, como o termometro mede 150 então seu valor sera esse.
VALOR; a leitura em graus celsius não formatada (não esta em ASCII).

supondo que seu termometro tenha lido uma temperatura em torno de 75°C

então saida LM = 0.75V que apos passar pelo operacional sera de 0.75 X 3.33 = 2.5V

quanto teremos então no ADC:

2.5 = ADC * (5/1023) = ADC = 2.5/(5/1023) vamos arrumar isso aqui =>

ADC = 2.5 * (1023/5) que vai dar => 511 (exatamente a metade da escala).

agora vamos converter isso para temperatura:

ADC = 511;
FESC = 150;

pela regra de três vale o seguinte raciocinio :

1023 esta para 150° assim como 511 esta para x°

então: 1023 -------------------------- 150
511--------------------------- x ; onde x é a variavel VALOR

logo

1023 X VALOR = 511 * FESC olha podemos chegar ja na formula para achar qualquer temperatura:
então : VALOR = (ADC * FESC )/ 1023

vamos ver se funciona?

VALOR = ADC * FESC (1023) => VALOR = (511 * 150) /1023 = VALOR = 74,9 arredondando VALOR = 75 ai esta temperatura calculada!!

agora so temos que formatar isso para ASCII, e em seguida imprimir no LCD, vejamos:

as variaveis são:

DEZENA
CENTENA
UNIDADE

a rotina chamara ajuste decimal

ajuste_decimal:
centena = 0;
dezena = 0;
unidade = 0;
ajusta
unidade = unidade + 1;
se (unidade > 9 ) então
unidade = 0;
dezena = dezena + 1;
se (dezena > 9 ) então
dezena = 0;
centena = centena + 1;
fim-se
fim-se
VALOR = VALOR - 1;
SE (VALOR > 0)
goto ajusta
fimda subrotina

com isso você recebera os valores separadamente em DEZENA,CENTENA E UNIDADE,

no caso a rotina iria retornar os seguintes valores com VALOR = 75

CENTENA = 0, DEZENA = 7 e UNIDADE = 5;

simpes não?

agora basta somar a essas variaveis o valor 0x30 ou $30 e enviar cada uma para o LCD na sua respectiva posição.

espero que essa explicação ajude!

abs.

Link para o comentário
Compartilhar em outros sites

Galera Fiz esse coigo de termotemtro aí pra usar com o LM35, vê se tá tudo certinho aí, ou se tem algum problema? Se tiver por favor me deêm um toque! E outra, queria uma ajuda aí pra poder fazer ele lendo 1 casa decimal tipo 28,2° uma coisa assim, aproveitando a precisão, do LM35! E também para o simbolo "°" Aparecer porque num consegue fazer não, aítava precisando de uma ajudazinha!


Define CONF_WORD = 0x3f72
Define CLOCK_FREQUENCY = 4
AllDigital
ADCON1 = 0x00
Define LCD_DBIT = 4
Define LCD_RSREG = PORTD
Define LCD_RSBIT = 0
Define LCD_RWREG = PORTD
Define LCD_RWBIT = 1
Define LCD_EREG = PORTD
Define LCD_EBIT = 2
Define LCD_READ_BUSY_FLAG = 1
TRISD = 0x00
Dim leitura As Word
Dim valor As Byte
Dim centena As Byte
Dim dezena As Byte
Dim unidade As Byte
Dim decimal As Byte
Dim temp As Byte
'INICIANDO O PROGRAMA
Lcdinit 3
Lcdcmdout LcdDisplayOn
Lcdcmdout LcdClear
Lcdout "J.C.S.S.J."
inicio:
Adcin 0, leitura
valor = (leitura * 50) / 341
Lcdcmdout LcdClear
Lcdout #valor
Goto inicio
End

Valeu desde já agradeço a todos!

Brigadão!

Link para o comentário
Compartilhar em outros sites

So uma coisa, cade a configuração do Conversor A/D que eu ainda não vi?

Onde esta a rotina de ajuste decimal para separar os caracteres, acho que do modo como você esta mandando ao lcd num vai funcionar não.

também não enetendi a fórmula que você usou para calculo da temperatura.

abs.

Link para o comentário
Compartilhar em outros sites

Cara eu simulei isso aqui no PIC Simulator IDE e robou direitinho! A simulação funcionou legal!

aquela contá ali é pra tipo o leito lá de A/D vai de 0 até 1023 dependendo da tesão que vai entrar, e mede de 0 ate 150, ou seja, 150 está para 1023, assim como a temperatura real está para a leitura do conversor! aí simplificando, não extamente, e simplificando a formula ficou daquele jeito lá!

Agora num sei se tipo o simulador aceitou, mas na realidade não seria aceito entendeu!

Eu até tentei fazer daquele jeito que você mandou lá no outro post mas nao consegui, aí fui nmudando tirando coisas e coisas, do meu projeto que ja tinha feito e tinha dado ero, até chegar nese aí que rodou!

Abraços, e agradeço muito a ajuda!

E se tiver alguma opnião de como consertar esse possiveis erros agradeço!

Link para o comentário
Compartilhar em outros sites

Se funcionou é o que interessa, na verdade você fez a mesma formula mas por outro caminho, no fim é uma regra de 3 simples.

Meus parabens, agora monte o circuito real sem medo de errar porque faz parte, monte em uma protoboard para fazer um teste se o circuito satisfizer você então passe para a montagem da placa ok!?

abs.

Link para o comentário
Compartilhar em outros sites

Ok vou fazer o teste sim, só esperar que esse é um projeto pra mim então vou ver se faço mais complexo, com escritos no LCD e tal!

Agora só mais uma duvida eu não consegui fazer o simbolo "°" que indica graus, aparecer no LCD você saberia me explicar como faço isso?

Desde já muito grato!

Brigaadão e Abraços!

Link para o comentário
Compartilhar em outros sites

Amigos,

Procurando uma maneira de acionar comandos elétricos através da RS232 do PC de modo a que houvesse isolamento elétrico entre o mesmo e o circuito de comando, achei que a maneira mais simples e barata de prover esse isolamento e ao mesmo tempo fazer a conversão de níveis RS232/TTL seria usando acopladores óticos tipo 4N25 ou similares ao invés do famoso MAX232 e procurando na net me supreendi com o pouco ou quase nada existente a respeito. Abaixo disponibilizo o circuito a que cheguei - espero que possa vir a ser de alguma utilidade para alguém que passe por um problema semelhante.

IAS

PS: O pic usado é um 16F628A

post-450483-13884954767017_thumb.png

Link para o comentário
Compartilhar em outros sites

Cara tentei aqui usar o 167, mas apareceu uma coisa nada a vê no LCD, ja procurei em milhares de lugares e não acoh esse simbolo aí de jeito nenhum tá **** isso! Se açguem puder me ajudar agradeço muito!

Abraços..

EDIT:

Arrumei aqui, fui tentando os numeros lá até achar ele, custei mais achei, hehe, demorei também..!

Mas deu tudo certin era o 223!!

Abraço Brigadão!

EDIT 2:

To fazendo um programa de Relógio aqui no PSI mas na parte de acertar o relógio to tentando fazer um modo por botões tá muito difícil nao to conseguindo fazer! Teria como alguém me dar uma ajuda nisso aí não!

Os botões vão funcionar da seguinte maneira:

Vão ser 4, Mode, Edit, Up e Down

Quando eu apertar mode uma vez vou para os segundos se eu apertar edit vou poder acertar os segundos.

Se eu apertar mode 2 vezes vou para os minutos ai aperto o edit e acerto os minutos

Se apertar mode 3 vez vou para as horas ai aperto edit e acerto as horas

E assim também ocorre da data e no alarme! Cada um vai ser acessado, conforme a quantidade de vezes que eu apertar o mode! Deu pra entender?

Valeu galera brigadão!

Abraços!

Link para o comentário
Compartilhar em outros sites

Saudações Paulo!

Eu pergunto se haverá um terceiro tutorial ou já houve e eu perdi?

Aproveitando, nào sei se deveria abrir um novo tópico; eu gostaria de perguntar se tem como programar PICs como potenciometros digitais; correspondentes aos tipos 10K-50K-

100K ou valores até maiores, usando o oscilador interno do próprio PIC.

Obrigado

Agricio

Link para o comentário
Compartilhar em outros sites

Pessoal, desculpem minha ausência, mas como apareceu uma chance legal de fazer uma pequena viagem, resolví aproveitar, e me desliguei por completo de tudo o que é Internet .... mas valeu a pena, estou com carga 100% !

Primeio, agradeço ao Felipe_Eletronic, valeu meu amigo, pelas dicas que voce tem dado ao pessoal !

Vou responder aos vários posts, um de cada vez.

OILUJ,

No tutorial tem um exemplo prontinho de como fazer a leitura e mostrar a tensão com uma casa decimal. O exemplo usa displays de 7 segmentos, mas adaptar para o LCD é muito mais fácil. Veja as dicas comentadas sobre a conversão de valores lidos pelo ADC e a maneira de calcular os valores decimais, pois lembre-se de que o PSI só trabalha com números INTEIROS, e o maior NÚMERO que ele pode trabalhar é 65535. Muitas vezes na simulação as contas funcionam direitinho, mas quando voce usa o código compilado, as coisas dão errado justamente por causa dos tamanhos dos números envolvidos nos cálculos.

E quanto ao seu relógio, lembre-se do que eu falei para voce num post passado. Defina CERTINHO como voce quer que as teclas funcionem, bem detalhado, e a partir daí podemos te ajudar, ok ?

IAS,

Existem MUITOS exemplos de isolação ótica RS-232C na internet. Mas lembre-se de que a maioria não aceita comunicação em alta velocidade, tipo 4800 ou mais. Faça em 1200 Bauds que vai funcionar. Se eu não me engano, eu postei algo a respeito disso no Fórum geral.

Agrício,

Oi meu amigo, eu ainda não terminei a terceira parte simplesmente por falta de alguns potenciômetros digitais.... e como também estou terminando um tutorial semelhante para a linha da ATMEL ( AVR's ) usando o Bascom, ainda vai demorar um pouquinho para terminar, ok ?

Quanto à sua pergunta sobre potenciômetros digitais, não tem nenhum segredo em programar eles, basta voce pegar o datasheet e ver quais são os comandos. A única dificuldade é o tipo de interface, que pode complicar um pouco. Se voce utilizar I2C, basta ver como eu programei o chip RTC no tutorial, em termos gerais é muito parecido.

Ah, em tempo.... o procedimento não muda se voce usar oscilador interno ou externo, ok ? Mas recomendo que no caso de oscilador interno, nunca zere o valor do registro de calibração de fábrica, pois ele é usado para garantir alguma precisão do clock ( mesmo assim, não espere precisão melhor do que 5% ..... ) .

James Freire e Carlosgn,

Bem vindo ao fórum, pessoal, se vocês procurarem em sites do tipo 4SHARED vão encontrar as ferramentas completas ok ?

Recomendo que leiam BASTANTE o tutorial, sem pular nenhuma parte, pois tem muitas dicas que são explicadas conforme os programas são apresentados, um de cada vez.

No mais, um abraço para todos, e vamos em frente !

Paulo

Link para o comentário
Compartilhar em outros sites

Saudações Professor Paulo,

Tenha certeza que deixou saudades, eu aqui to me virando tentando montar uma matriz de leds 7 X 8 usando o PIC 16F628A e um shift register 74LS146. A coisa ta pegando fogo. O seguinte resolvi montar no Proteus somente o 74LS146 e 8 leds para entender seu funcionamento. Aos poucos a coisa vai clareado não é fácil. Meu problema é o seguinte:

Por ex.: Quando envio a palavra 10000001 quando sair o ultimo bit eu teria que ter apenas o ultimo e o primeiro led aceso? Ocorre que acende o primerio depois o segundo mas o primeiro não volta a apagar ao receber 0 e ao final ficam todos acesos.

Já estou de cabeça inchada e não consigo sair dessa tenho a impressão que o erro está no clock, sei lá tem hora que tu confunde tudo e ai fica quenem o cachorro atrás do rabo.

Estou usando gerador de clock e gerador de palavra do próprio PROTEUS.

Um ótimo retorno e um forte Abraço,

Enio.

Link para o comentário
Compartilhar em outros sites

Saudações a todos,

Tambem estou aqui tentando entender estes shift register 74LS146,

mas tem umas dicas legais ai neste local :http://www.ucontrol.com.ar/wiki/index.php/Registro_de_desplazamiento.

talves de uma luz pra você.

estou pensando em fazer o "el relogito", do mesmo site.

Boa sorte, Enio

Abraço A todos e ate breve

jfeliciano

Link para o comentário
Compartilhar em outros sites

Amigo Paulo...

Seja bem vindo no seu retorno. A sua presença tem feito falta por aqui. Quanto ao circuito de acoplamento isolado RS232 disponibilizado um pouco atrás, o protótipo já montado está funcionando redondinho a 2400 Bps, sem erros ou falhas. Tendo procurado na net e não encontrado nada, disponibilizei-o aqui, talvez possa interessar a alguém.

TcheCara e JFeliciano - Gostaria de sugerir se me permitem o uso do Shif Register 74HC595, estou usando o mesmo em um projeto com o PIC, é um circuito atual (o 74LS164 está obsoleto) fácil de encontrar, com baixo custo e tecnologia HC....como estou trabalhando em algo similar e já tenho as placas montadas, talvez possamos nos ajudar mutuamente - o que o meu sistema já faz: envio do PC via RS232 seis palavras de comando, uma para cada shift register 74HC595 e em cada saida dos mesmos aciono um relé ou seja: desejo acionar o relé X do shift register Y - envio uma palavra de comando com o endereço do shift register Y, relé X e após o recebimento da palavra de comando válida, envio de volta para o PC uma string "Comando Processado", se é uma palavra de comando não válida, o PIC retorna uma string "Erro na Comunicação Serial", seguida da palavra de comando errada. Com esse sistema consigo fazer qualquer combinação de acionamento dos relés (&H00 a &HFF).

Espero ter ajudado de alguma forma...

IAS

Link para o comentário
Compartilhar em outros sites

Amigo TcheCara....

A rotina que eu uso pode não ser a mais "elegante", porém funciona: foi testada no PSI e montado em PCI, onde foram realizados os testes práticos; reais.

Crio uma variável "temp" onde ponho a palavra de comando, crio uma variavel latch na qual determino qual shift register deve converter os dados de serial para paralelo e chamo a subrotina Checa_bit; lembando que para o shift register funcionar ou seja converter os dados recebidos serialmente e disponibiliza-los em paralelo são necessários 3 sinais: Dado, Clock e latch

checa_bit:

If temp.0 = 1 Then ;ler o bit 0 de temp

PORTB 0.6 = 1 ;coloca o bit 0 de temp na entrada de dados do shif register

Else

PORTB 0.6 = 0 ;

End If

WaitMs 1 ;aguarda que o dado estabilize

GoSub clock ;chama a sub rotina clock para inserir 1 bit no shift register

If temp.1 = 1 Then ;faz a mesma coisa descrita acima para o bit 1 e assim

PORTB 0.6 = 1 ;sucessivamente até o bit 7

Else

PORTB 0.6 = 0

End If

WaitMs 1

GoSub clock

-----------------------------------------------------------------------

If latch = "0" Then ;transfiro para a saida do shift register indicado pelo

;pelo conteúdo de latch

PORTB 0.5 = 1 ;no caso presente, liguei 6 shift's register onde o

WaitMs 1 ;sinal de dados e de clock entra em todos e em apenas 1

PORTB 0.5 = 0 ;o indicado pelo sinal de latch transfere os dados para a

End If ;saída do shift register

-----------------------------------------------------------------------------

clock:

portB.7=1

waitMS 1

portB.7=0

waitMS 1

return

Espero ter ajudado....

Abraços a todos

IAS

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber 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...

 

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

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!