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

Mestre Paulo....

Gostaria se possivel que o amigo me tirasse algumas dúvidas sobre o PIC16F877A, se possível.

Interrupções:

1 - Como fazer para habilitar repetidas interrupções externas apenas do pino RBO "1"---> "0"? existem na rotina varias instruções WaitMS e WaitUS e a rotina implementada responde a todas.

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

Quanto as interrupções:

no inicio do programa:

INTCON.INTF = 0

INTCON.INTE = 1

ONTCON.GIE=1

no final do programa:

On Interrupt

Save System

If sw4 = 0 Then

Low rele12

Lcdcmdout LcdClear

Lcdcmdout LcdLine1Home

Lcdout "Emergencia"

WaitMs 5000

INTCON.INTF = 0

Goto inicio

Endif

Resume

é acionada em porém gera uma mensagem 'HARDWARE STACK OVERFLOW' em pontos ou instruções de WAIT diferente ou LCDCMDout

Antecipadamente agradeço....

IAS

Postado

IAS, tenta isto aqui :


[COLOR=DarkGreen]OPTION_REG.INTEDG = 0 ´ interrompe apenas na descida do RB0
INTCON.INTE = 1 ´ habilita interrupção do RBO
INTCON.GIE=1 ´ liga as interrupts globais
ENABLE[/COLOR]

E na rotina de interrupção termina ela assim :


[COLOR=DarkGreen]INTCON.INTF = 0
RESUME
[/COLOR]

Quanto aos erros, experimenta o código abaixo, mas tome muito cuidado com o local do label INICIO, ok ? Ele deveria estar bem na primeira instrução do programa !

A causa do erro é que as instruções do LCD demoram uma eternidade , e qualquer coisa que ocorra nessa eternidade vai ficando na pilha ( STACK ) , e vai acabando com ela, enquanto não terminar de tratar a interrupção !


[COLOR=DarkGreen]On Interrupt
If sw4 = 1 Then Goto paulo1
INTCON.INTE = 0
INTCON.INTF = 0
DISABLE
Low rele12
Lcdcmdout LcdClear
Lcdcmdout LcdLine1Home
Lcdout "Emergencia"
WaitMs 5000
Goto inicio ´ o labeL inicio tem de estar ANTES de configurar
´ as interrupções senão dá pau !

paulo1:[/COLOR] [COLOR=DarkGreen]
INTCON.INTF = 0
Resume[/COLOR]

Experimenta e fala se resolveu...

Paulo

Postado

Alguem me socorre pelo amor de Deus...

Eu fiz tudo aqui, montei o circuito, todinho, gravei o PIC, e tudo mais...

Liguei tudo lá, e alimentei o circuito, mas nada acontece....

O que tá acontecendo de errado????

P.S.: A única coisa que não coloquei ainda foi a comunicação serial!

Abraços e por favor respondam rápido!

Postado

Hahahahah po calma, Oiluj !!!!

Primeiro, o oscilador.... solde o capacitor de filtragem de 0.1 uF diretamente nos pinos de alimentação +5v e GND do PIC.

Segundo, verifique qual a CONFIG_WORD que voce tem de informar ao PSI , se está certinha e se o RESET está devidamente configurado.

Terceiro, verifique se voce implementou o famoso circuito de RESET , ( capacitor e resistor ) , se tem os valores adequados.

Se tudo estiver OK, poste o programa e o circuito para a gente dar uma olhada, ok ?

Calma, amigo !!!

Paulo

Postado

Dei uma olhada em tudo que você falou e não encontrei erro!

Ai to mandando aqui as imagens e o código!

Por favor, é porque preciso disso pra quinta-feira!

Define CONF_WORD = 0x3f72
Define CLOCK_FREQUENCY = 4
AllDigital
ADCON1 = 0x00
TRISC = 0000011000b
OPTION_REG = 0x07
'DEFINIÇÃO DO DISPLAY LCD
Define LCD_BITS = 4
Define LCD_DREG = PORTD
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
'DEFINIÇÃO DA CONEXÃO I2C
Symbol sda = PORTC.4
Symbol scl = PORTC.3
'DEFINIÇÃO DAS VARIÁVEIS DO PROGRAMA
Dim hora As Byte
Dim minuto As Byte
Dim segundo As Byte
Dim dia As Byte
Dim mes As Byte
Dim ano As Byte
Dim txrtc(8) As Byte
Dim rxrtc(8) As Byte
Dim rxbuff(13) As Byte
Dim temp As Byte
Dim temp1 As Byte
Dim x As Byte
Dim dado As Byte
Dim addr As Byte
Dim addrw As Word
Dim invalido As Bit
Dim erro As Bit
Dim leitura As Word
Dim valor As Word
Dim tempe As Byte
Dim decimal As Byte
Dim tempemanha As Byte
Dim tempetarde As Byte
Dim tempenoite As Byte
Dim ulttemp As Byte
Dim ultdec As Byte
Dim tempemanham As Byte
Dim tempetardem As Byte
Dim tempenoitem As Byte
'INICIO DO PROGRAMA
Lcdinit 3
Lcdcmdout LcdDisplayOn
Lcdcmdout LcdClear
Lcdcmdout LcdLine1Pos(6)
Lcdout "Estufa"
Lcdcmdout LcdLine2Pos(2)
Lcdout "Julio e Maicon"
WaitMs 1000
Hseropen 4800
Hserout "Para acertar a data e a hora ou programar a qualquer momento prescione uma tecla e aguarde.", CrLf
WaitMs 50
ultdec = 0
ulttemp = 0
Lcdcmdout LcdClear
Lcdout "Hora - : : "
Lcdcmdout LcdLine2Home
Lcdout "Temp.- "
ciclo:
Hserget dado
If dado > 0 Then Goto prog
Gosub lertc
Gosub convertetempo
Adcin 0, leitura
valor = (250 * leitura) / 51
tempe = valor / 10
decimal = valor - (tempe * 10)
Gosub comparacao
Gosub mostratempolcd
Gosub mostratemposerial
Goto ciclo
prog:
Hserout " ", CrLf
Hserout "Para acertar as horas tecle 1(um).", CrLf
Hserout "Para programar as temperaturas tecle 2(dois).", CrLf
Hserout "Caso nao queria realizar nenhuma das operações tecle 3(três).", CrLf
subprog:
Hserget dado
If dado = 49 Then Goto pedehora
If dado = 50 Then Goto tempmanha
If dado = 51 Then Goto ciclo
Goto subprog
pedehora:
Hserout " ", CrLf
Hserout "Digite no formato mostrado abaixo", CrLf
Hserout "DDMMAAHHMMSS", CrLf
For x = 0 To 11
m21:
Hserget dado
If dado = 0 Then Goto m21
rxbuff(x) = dado
Next x
erro = 0
Gosub asciidec
If erro = 1 Then Goto pedehora
dia = rxbuff(0) * 10 + rxbuff(1)
mes = rxbuff(2) * 10 + rxbuff(3)
ano = rxbuff(4) * 10 + rxbuff(5)
hora = rxbuff(6) * 10 + rxbuff(7)
minuto = rxbuff(8) * 10 + rxbuff(9)
segundo = rxbuff(10) * 10 + rxbuff(11)
If dia > 31 Then Goto pedehora
If mes > 12 Then Goto pedehora
If hora > 23 Then Goto pedehora
If minuto > 59 Then Goto pedehora
If segundo > 59 Then Goto pedehora
If dia = 0 Then Goto pedehora
If mes = 0 Then Goto pedehora
Gosub preparartc
Gosub gravartc
Goto prog
tempmanha:
Hserout " ", CrLf
Hserout "Agora programe a que Tempretaruta a Estufa deve estar pela manhã.", CrLf
Hserout " ", CrLf
Hserout "Digite a temperatura no seguinte formato:", CrLf
Hserout " ", CrLf
Hserout "TTT", CrLf
For x = 0 To 2
m22:
Hserget dado
If dado = 0 Then Goto m22
rxbuff(x) = dado
Next x
erro = 0
Gosub asciidec1
If erro = 1 Then Goto tempmanha
tempemanha = rxbuff(0) * 100 + rxbuff(1) * 10 + rxbuff(2)
If tempemanha > 150 Then Goto tempmanha
temptarde:
Hserout " ", CrLf
Hserout "Agora programe a que Tempretaruta a Estufa deve estar à tarde.", CrLf
Hserout " ", CrLf
Hserout "Digite a temperatura no seguinte formato:", CrLf
Hserout " ", CrLf
Hserout "TTT", CrLf
For x = 0 To 2
m23:
Hserget dado
If dado = 0 Then Goto m23
rxbuff(x) = dado
Next x
erro = 0
Gosub asciidec1
If erro = 1 Then Goto temptarde
tempetarde = rxbuff(0) * 100 + rxbuff(1) * 10 + rxbuff(2)
If tempetarde > 150 Then Goto temptarde
tempnoite:
Hserout " ", CrLf
Hserout "Agora programe a que Tempretaruta a Estufa deve estar à noite.", CrLf
Hserout " ", CrLf
Hserout "Digite a temperatura no seguinte formato:", CrLf
Hserout " ", CrLf
Hserout "TTT", CrLf
For x = 0 To 2
m24:
Hserget dado
If dado = 0 Then Goto m24
rxbuff(x) = dado
Next x
erro = 0
Gosub asciidec1
If erro = 1 Then Goto tempnoite
tempenoite = rxbuff(0) * 100 + rxbuff(1) * 10 + rxbuff(2)
If tempenoite > 150 Then Goto tempnoite
Goto ciclo
End
lertc:
addrw = 0
For addr = 0 To 6
dado = 0
addrw.LB = addr
I2CRead sda, scl, 0xd0, addr, dado
WaitMs 6
rxrtc(addr) = dado
Next addr
Return
gravartc:
addrw = 0
For addr = 0 To 6
dado = txrtc(addr)
addrw.LB = addr
I2CWrite sda, scl, 0xd0, addr, dado
WaitMs 6
Next addr
Return
convertetempo:
invalido = 0
temp = rxrtc(0)
temp = temp And 00001111b
segundo = temp
temp = rxrtc(0)
temp = temp And 01110000b
temp = temp / 16
temp = temp * 10
segundo = segundo + temp
temp = rxrtc(1)
temp = temp And 00001111b
minuto = temp
temp = rxrtc(1)
temp = temp And 01110000b
temp = temp / 16
temp = temp * 10
minuto = minuto + temp
temp = rxrtc(2)
temp = temp And 00001111b
hora = temp
temp = rxrtc(2)
temp = temp And 00110000b
temp = temp / 16
temp = temp * 10
hora = hora + temp
temp = rxrtc(4)
temp = temp And 00001111b
dia = temp
temp = rxrtc(4)
temp = temp And 00110000b
temp = temp / 16
temp = temp * 10
dia = dia + temp
temp = rxrtc(5)
temp = temp And 00001111b
mes = temp
temp = rxrtc(5)
temp = temp And 00010000b
temp = temp / 16
temp = temp * 10
mes = mes + temp
temp = rxrtc(6)
temp = temp And 00001111b
ano = temp
temp = rxrtc(6)
temp = temp And 11110000b
temp = temp / 16
temp = temp * 10
ano = ano + temp
If ano > 00 Then Goto tb
If mes > 01 Then Goto tb
If dia > 01 Then Goto tb
If hora > 00 Then Goto tb
If minuto > 00 Then Goto tb
If segundo > 00 Then Goto tb
tb:
Return
mostratempolcd:
If ano > 99 Then ano = 0
If mes > 12 Then mes = 1
If dia > 31 Then dia = 1
If hora > 23 Then hora = 00
If minuto > 59 Then minuto = 00
If segundo > 59 Then segundo = 00
Lcdcmdout LcdLine1Pos(8)
If hora < 10 Then
Lcdout "0", #hora, ":"
Else
Lcdout #hora, ":"
Endif
Lcdcmdout LcdLine1Pos(11)
If minuto < 10 Then
Lcdout "0", #minuto, ":"
Else
Lcdout #minuto, ":"
Endif
Lcdcmdout LcdLine1Pos(14)
If segundo < 10 Then
Lcdout "0", #segundo
Else
Lcdout #segundo
Endif
Lcdcmdout LcdLine2Pos(8)
Lcdout #tempe, ".", #decimal, 223, "C"
Return
mostratemposerial:
If ulttemp = tempe And ultdec = decimal Then Goto m1
If dia > 9 Then
Hserout "DATA - ", #dia, "/"
Else
Hserout "DATA - 0", #dia, "/"
Endif
If mes > 9 Then
Hserout #mes, "/"
Else
Hserout "0", #mes, "/"
Endif
If ano > 9 Then
Hserout #ano, CrLf
Else
Hserout "0", #ano, CrLf
Endif
If hora > 9 Then
Hserout "HORA - ", #hora, ":"
Else
Hserout "HORA - 0", #hora, ":"
Endif
If minuto > 9 Then
Hserout #minuto, ":"
Else
Hserout "0", #minuto, ":"
Endif
If segundo > 9 Then
Hserout #segundo, CrLf
Else
Hserout "0", #segundo, CrLf
Endif
Hserout "Temperatura - ", #tempe, ".", #decimal, "ºC", CrLf
ulttemp = tempe
ultdec = decimal
m1:
Return
asciidec:
For x = 0 To 11
temp = rxbuff(x)
If temp < 48 Then Goto m3
If temp > 57 Then Goto m3
rxbuff(x) = temp - 48
Next x
Goto m4
m3:
erro = 1
m4:
Return
asciidec1:
For x = 0 To 2
temp = rxbuff(x)
If temp < 48 Then Goto m5
If temp > 57 Then Goto m5
rxbuff(x) = temp - 48
Next x
Goto m6
m5:
erro = 1
m6:
Return
preparartc:
temp = segundo
Gosub separa
txrtc(0) = temp + temp1 * 16
temp = minuto
Gosub separa
txrtc(1) = temp + temp1 * 16
temp = hora
Gosub separa
txrtc(2) = temp + temp1 * 16
txrtc(2) = txrtc(2) And 00111111b
txrtc(3) = 0
temp = dia
Gosub separa
txrtc(4) = temp + temp1 * 16
txrtc(4) = txrtc(4) And 00111111b
temp = mes
Gosub separa
txrtc(5) = temp + temp1 * 16
txrtc(5) = txrtc(5) And 00011111b
temp = ano
Gosub separa
txrtc(6) = temp + temp1 * 16
Return
separa:
'NA SAIDA TEMP = UNIDADE E TEMP1 = DEZENA
temp1 = temp / 10
temp = temp - temp1 * 10
Return
comparacao:
If hora > 6 And hora < 12 Then Goto compmanha
If hora > 12 And hora < 18 Then Goto comptarde
If hora > 18 And hora < 23 Then Goto compnoite
If hora > 0 And hora < 6 Then Goto compnoite
Goto m7
compmanha:
If tempemanha = 0 Then Goto m8
tempemanham = tempemanha - 1
If tempe = tempemanha Or tempe > tempemanha Then
PORTC.2 = 0
Endif
If tempe < tempemanham Then
PORTC.2 = 1
Endif
Goto m7
comptarde:
If tempetarde = 0 Then Goto m8
tempetardem = tempetarde - 1
If tempe = tempetarde Or tempe > tempetarde Then
PORTC.2 = 0
Endif
If tempe < tempetardem Then
PORTC.2 = 1
Endif
Goto m7
compnoite:
If tempenoite = 0 Then Goto m8
tempenoitem = tempenoite - 1
If tempe = tempenoite Or tempe > tempenoite Then
PORTC.2 = 0
Endif
If tempe < tempenoitem Then
PORTC.2 = 1
Endif
Goto m7
m8:
PORTC.2 = 0
m7:
Return

OgAAANJ0CwBffBXdTmNY2wx1K-FPus3PDufhuWIMsvlpo6Y1SdlVvK9OT3LMokYRXBobsS0XgQRqMDJTNUM-ZDnEUiQAm1T1UOWcf7sAmqMITSk-FlXSiCcw-2Zi.jpg

OgAAAPh4gwIeU6qbT9wgfQsfrxytrJ9kBVMNVCkfQ-Imw7jyc75NZ-H46sr6a9yOITWcyokI0EVDlSrcal8EYGrsLwAAm1T1UJf4JjLkmdC7loUQJlHdo9axhcIW.jpg

OgAAABS0hV5gsg2uI5Mjq3wKCa1RYJ3ZN727-VLoHRTbr-vcTT2If4j2G_T-5k4H2OSiXjCcudU7U6v-5qEqcOGzjRUAm1T1UBkJXlRATMqqrm96ETr8QuThy8TZ.jpg

EDIT:

P.S.:

A bateria do RTC nas fotos está fora do lugar pra não ficar alimentando ele enquanto o circuito não funciona!

aquele fio branco que vai até um diiodo, ali vai ser ligado o relé que acende e apaga a lampada que vai esquenar a estufa...

e aquele outro fio branco que sai do Pino 2 do Pic, vai ser a entrada de dados do LM35.

Valeu Paulo e Turma abraços!

E muito obrigado, desculpa o desespero, mas ajudem aí o mais rápido possivel!!

Postado

Oiluj, acho que achei o problema....

Poe um trimpot no display LCD pino VEE, conforme mostrado no Tutorial, senão nunca vai aparecer nada nele !!!!!!!!!!!!!!!!!! O pino VEE tem de ser ligado ao central do trimpot, e os outros terminais ligue no +5V e no terra.

Assim que ligar o circuito, ajuste o trimpot até aparecer pelo menos os quadrados dos caracteres um pouco escuros, assim voce vai ver se está funcionando.

Ví também que voce está usando um micro-rele, ligado direto ao pino de saida do PIC, via diodo. Tenha certeza de que a corrente do relé seja inferior ou no máximo igual a 20 mA, e que o relé consiga atuar com 4.3 volts, pois esta é a tensão que vai sobrar quando passar pelo diodo.

Eu usaria um pequeno transistor tipo BC qualquer coisa, igual ao que uso no tutorial para acender os displays de LED, tome o cuidado de ligar o diodo em paralelo com a bobina do relé para evitar a queima por FCEM. Tem muito exemplo de circuito na Internet mesmo, se quiser pesquise para não errar.

Outra coisa importante que eu ví na foto do protoboard ...

voce criou 4 barras horizontais levando a alimentação. Coloque EM CADA UMA DELAS, perto do final da barra, um capacitor eletrolítico pequeno, tipo uns 47 uF / 16 volts, e também um pequeno capacitor cerâmico de uns 100 nF , assim a filtragem da alimentação será bem melhor.

E por último .... sabe o terra do LM35 ? Ligue ele diretamente ao pino terra analógico do PIC, assim terá uma leitura bem mais estável do que ligar numa das barras de terra. Ah, ligue um pequeno capacitor eletrolítico na saída do LM35, tipo de 1 uF / 16 volts, entre esse sinal e o terra dele, ajuda muito a estabilizar a leitura.

Veja se resolveu !

Paulo

Postado

Cara agora vou ter que ver isso tudo amanha....

Porque com esse jogo do brasil tá tudo fechado na minha cidade...

Agora me disseram pra tirar o LCD e vê porque teve um professor meu da facul que falou..

Que ele já quase queimou um pic por causa da ligação errada do lcd...

e outra... O codigo, foi feito pra um 16F877 e eu to usando 16F877A tem perigo???

Mais uma olha só o que está acontecendo, tô achando que meu pic queimou...

Tipo leio ele, tá tudo 3FFF, aí gravo nele, o processo ocorre certinho...

ai mando ler ele de novo lê ele como 0000...

Abraços

E muito obrigado pelas ajudas!

EDIT:

Cara fiz a parada lá do LCD beleza, só que tipo no Vss num aconteceu nada não..

Ai peguei e tentei no Pino Vee que tem nele... Ai nesse aconteceu...

Só que estranho que apareceu sóa linha de baixo a de cima num apareceu não..

o Display que to usando tem numeração JHD162A..

Postado

Oiluj,

Eu quis dizer VEE mesmo .... não sei o porque eu escreví VSS !!!!

Liga o trimpot no VEE que vai funcionar. Esse seu display tem a documentação fácil na internet, é só baixar o datasheet.

Mas acho que seu PIC tá bichado.... a princípio, nada muda entre o 16f877 e o 16f877a em termos de programação, mas na hora de gravar, tem de dizer o modelo correto, tome cuidado com o programa de gravação, ok ?

Outra coisa, verifique se as CONFIG_WORD não tem de serem mudadas.

Paulo

Postado

Paulo Beleza..

Então eu mudei lá a CONFG_WORD, e tentei deu a mesma pala..

Tô achando que meu PIC tá bichado mesmo viu..

Tipo o que te falei é estranho, se eu gravei tudo certinho, quando lesse era pra ler o código gravado, e não tudo 0000, ele deve tá com pau na memória...

Sou azarado demais cara, isso é raro acontecer....

To vendo se arrumo outro PIC...

Aqui agora outra coisa...

Sobre o LCD, tendo mexendo la no Vee e só a segunda linha tendo mudado...

Isso quer dizer que ele tá com defeito???

Se tiver eu sou azarado²²²²

Quanto ao Relé...

O Datasheet tá aqui:

http://www.metaltex.com.br/downloads/ML.pdf

é o

c-5V

Valeu Paulo qualquer coisa te falo direito e antes de testar vou postar outra foto da Proto, com as alterações que você falou ali no se post...

Abraços e muito obrigado!!

Postado

Oiluj,

Pois é ... troca o PIC, esse seu tá bichado mesmo.....

Sobre o relé, ele consome 40 mA, portanto não vai dar certo ligar direto no pino do PIC ( máximo de 25 mA ), tem de usar um transistor mesmo.

Usa o circuito do tutorial, um BC npn qualquer, um resistor entre a base e o pino do PIC, e no coletor liga o relé, a outra perna do relé liga no +5 Volts.

Não esquece do famoso diodo em paralelo com o relé, mas com o CATODO dele ligado ao +5V, e o ANODO ligado no coletor, ok ?

Sobre o LCD.... nem sei o que te falar, eu peguei o meu aqui, que está no meu protoboard, e quando mexo no trimpot, as duas linhas ficam todinhas escuras, mas o meu AVR já inicializou o display antes, quem sabe que se não for inicializado, como o seu, acende só uma das linhas .... estou torcendo para ser esse o caso.

Mas troque o PIC primeiro, e depois testa o display.

Verifique também se voce ligou todos os 4 pinos de alimentação do PIC, ou seja, os dois digitais e os dois analógicos, se faltar um só deles o PIC não funciona mesmo, ok ? É que no seu esquema não aparecem nenhum dos pinos de alimentação nem de terra !

Boa sorte !

Paulo

Postado

Desculpa abusar tanto de você Paulo...

Hehehhehehe

Da alimentação tá certinho cara....

o Proteus é que eu num sei como fazer aparecer os pinos de Alimentação!

Mas mesmo assim, hoje como estou no serviço, vou ver se confiro a ligação de todas e continuidade dos pinos certinhos.....

E a respeito do relé eu vou arrumar isso amanhnã sem falta....

Eu sou uma anta mesmo, nem pensei em dividir a potência pela tensão pra axar a corrente...

Abraços, e amanha vou ver se mando noticias aqui antes do almoço...

O difícil vai ser conseguir o PIC, minha cidade é um buraco!!!

Fala paulo então arrumei outro pic gravei e tal....

Mas aqui o LCD não rodou mesmo não num aconeceu nada cara....

E outra ali onde pede para apertar 1 para hora, 2 pra temperatura e 3 pra sair, quando aperto 3 ele não sai....

E também nas rotinas de mandar a temperatura, as duas primeiras vão beleza com 3 digitos, mas a ultima eu tenho que digitar 4 para ele poder voltar...

Sabe quais são os erros de programação ai, se existem????

E aqui o LCD é realmente ligado ospinos mais altos???

RB7, RB6, RB5 e RB4, foi nesses que eu liguei....

Num tem que sernos primeros não???

Rb3, RB2, RB1 e RB0??

Valeu brigadão.... abraços....

Postado

Olha só o que eu achei :

own disse... Realmente ! Trabalhando em modo 4 bits, o LCD JHD162a só funcionou quando eu liguei o pino 5 ao GND. O resto dos pinos não utilizados, tive que deixar flutuando !! (sem ligações)-- Abrçs galera.

9 de fevereiro de 2010 15:48

Ou seja, experimente desligar o pino 5 do LCD do PIC, e ligue esse pino 5 diretamente ao terra.... parece que esse display tem alguns problemas meio malucos, tem muita gente reclamando que ele não funciona como deveria !

Quanto aos erros que voce falou, troque este código :

ciclo:
Hserget dado

por este código aqui :

ciclo:

waitms 20

dado=0

Hserget dado

Troque também este trecho :

subprog:
Hserget dado

por este trecho aqui :

subprog:
waitms 20
dado=0
Hserget dado

Experimente e torça !

Paulo

Postado

Cara isso aí tudo já foi resolvido hooje a tarde alias a tarde não neah, a noite...

Lutei pakas pra isso aí cara.., consegui resolver o do display, tinha trocado uma pinagme lá no pic.... e o do código eu acabei de resolver agora via programação, apenas colocando uma frase depois que o ultimo dado for recolido!

Agora apareceu mais um problema depois disso tudo, eu liguei o LM35 errrado, aí ele foi-se, eu tinha outro em casa, porém num acho o desgraado..... Ou to muito azarado cara tenho que ir num benzedor só pode....

Ahsudiahsidhasid

Abraços, Boa noite!

Postado

KKKKKKKKkkkkkkkkkk

Pelo seu horário, estou vendo que tá te deixando doido mesmo !!!!!

Ainda bem que resolveu os maiores problemas, só falta o LM35.....

Cara, vai se benzer..... tá tudo queimando aí, deve ser mandinga !!!

Qualquer coisa estamos aqui para ajudar !

Paulo

Postado

Cara agora acho que tá tudo certinho....

Coloquei um Trimpot na entrada analogica do PIc pra simular o LM e ele leu certinho as temperaturas....

Agora vou fazer um pedido na worldpic e vou pedir os LM35 e vai ser só alegria se deus quiser....

Quando tiver funcionando eu vou postar um video aqui...

Hehehe

Abração Paulo, e muito obrigado por todas as dicas...

E lógico desculpa todos os incomodos,...

ahsudiahsidu

Postado

Oba !!!!! Legal, fico contente que tenha conseguido !!!

Não foi incômodo nenhum, amigo, fico contente em ajudar quem realmente quer aprender, e voce, desde o início, mostrou que está mesmo querendo isso !

Só lhe peço uma coisa : quando estiver funcionando, faça um pequeno vídeo, e poste o programa também, assim ajudará outras pessoas que como voce já fêz um dia, querem aprender de verdade, e vejam o potencial que todos podem tem, apenas aprendendo um pouco de Basic, e , claro, um pouco de eletrônica também , ok ?

Manda bala, meu amigo, agora que voce já conseguiu chegar aonde queria, vou anexar o esquema de uma das montagens do tutorial em Basic para AVR's, para que voce veja como pode dar uma aperfeiçoada na parte do LM35, bem como o trecho de código em Basic, que trata da conversão da medida. Espero que isto lhe traga novos horizontes !


'agora, vamos medir a temperatura, usando uma técnica
'para cancelar estatísticamente o ruído
'faremos 8 leituras, uma em cada semiciclo da senóide de 60 hz
'e tiraremos a média

Somav = Getadc(0)
Waitus 8300
Somav1 = Getadc(0)
Somav = Somav + Somav1
Waitus 8300
Somav1 = Getadc(0)
Somav = Somav + Somav1
Waitus 8300
Somav1 = Getadc(0)
Somav = Somav + Somav1
Waitus 8300
Somav1 = Getadc(0)
Somav = Somav + Somav1
Waitus 8300
Somav1 = Getadc(0)
Somav = Somav + Somav1
Waitus 8300
Somav1 = Getadc(0)
Somav = Somav + Somav1
Waitus 8300
Somav1 = Getadc(0)
Somav = Somav + Somav1

Somav = Somav / 8
'pronto, tiramos o ruído e temos a média

' agora, vamos converter o valor de tensão para a temperatura
'lembrando que temos 1 volt para 20 graus, e 4 volts para 40 graus
' ou seja, t = 20 + (V-1)*20/3
' agora, basta lermos a tensão via ADC usando a fórmula :
' V = Somav * 5 / 1023

Temperatura = Somav * 5
Temperatura = Temperatura / 1023
Temperatura = Temperatura - 1
Temperatura = Temperatura * 20
Temperatura = Temperatura / 3
Temperatura = Temperatura + 20
'aora vamos converter para uma variável tipo byte, assim
'já teremos o arredondamento para inteiro
Temp = Temperatura
' pronto, temperatura lida, agora é só fazer o controle
' ou seja, se temos de ligar ou desligar a resistência.

Claro que fica fácil pois no Bascom Basic posso trabalhar com números reais grandes ou fracionários, sem nenhum problema.

Mas nada te impede de adaptar as contas para o PSI usando inteiros !

Repare na técnica para diminuir os ruídos na leitura do LM35, pode ser feita também no seu protótipo !

Segue o esquema em anexo.

Um abraço, Oiluj, e meus parabéns !

Paulo

post-464954-13884956146188_thumb.jpg

Postado

Aqui Paulo, vê se essa é uma boa tradução, do Bacom pro PSI, do código postado acima:

Adcin 0, leitura
WaitUs 8300
Adcin 0, leitura1
leitura = leitura + leitura1
WaitUs 8300
Adcin 0, leitura1
leitura = leitura + leitura1
WaitUs 8300
Adcin 0, leitura1
leitura = leitura + leitura1
WaitUs 8300
Adcin 0, leitura1
leitura = leitura + leitura1
WaitUs 8300
Adcin 0, leitura1
leitura = leitura + leitura1
WaitUs 8300
Adcin 0, leitura1
leitura = leitura + leitura1
WaitUs 8300
Adcin 0, leitura1
leitura = leitura + leitura1
WaitUs 8300
Adcin 0, leitura1
leitura = leitura + leitura1
WaitUs 8300
Adcin 0, leitura1
leitura = leitura + leitura1
leitura = leitura / 10
valor = (250 * leitura) / 51
tempe = valor / 10
decimal = valor - (tempe * 10)

e como eu mesmo disse, assim que tiver perfeito aqui vou te mostra funcionando na protoboard....

Eu ainda peguei uma caixa de MDF pra simular a estufa cara, e vou colocar uma lampada dentro dela pra esquentar... vai ficar massa...

Ai depois vou ver se faço uma PCI...

Cara esse dias eu ví uma "Máquina pra imprimir placa" feita com sucata de impressora a Laser, meu prof. da facul que me mostrou, é muito prático cara, tu faz a placa no Eagle, imprime em Gloss, depois fixa esse Gloss no fenolite, e depois é só passar ele umas 3 a 6 vezes pela máquina e corroer... Muito filé.... Coisa que no metodo ferro de passar demora horas, você faz com alguns minutos... To tentando achar uma sucata pra poder montar uma pra mim....

O Videozinho, devo postar até o fim dessa semana agora...

O que quero fazer agora cara, e aprender a fazer "menus"...

Aquele lá do acerto do relógio, pra eu fazer um relógio com termometro sem ter que usar a SERIAL pra acertar o Relógio....

E mais posteriormente, ao invés de usar um LCD vou ver se consgo usar matrizes de LED, e montar, tipo um mini painel publicitário...

ai vou poder mandar mensagens pra ele também, tipo frase passando, alá Rodóviarias do Brasil....

O displau nessa parte de mensagem seria parecido com que o TcheCara está fazendo.,..

Ai vai ser meio que pra uso meu, ficar ali no criado do lado da cama... minha cria..

Mas até lá acho que vai demorar um pouco, ai tenho bastante a aprender..

mas esse é um dos objetivos finais...

Abraços!!!

Postado

Paulo deixa eu te perguntar uma coisa aqui....

Uma tensão de 5,1 já queimaria um PIC???

porque eu tava medindo aqui minha fonte, e ela está dando isso na saida!

Uso uma ATX de PC e fui conferir as saidas dela hoje e estão dando o seguinte:

GND - GND

+5 - +5,1

+12 - +11,99

-12 - -11,39

+3,3 - +3,32

Abraços!

Júlio César

Postado

Oiluj,

Na verdade, não queimaria não, mas o problema é que usar fontes de PC, sem carga nenhuma, faz ela ficar meia sem regulação no start, e pode mesmo ter tensões maiores do que 5,5 volts por alguns milisegundos.

Pelo menos nas fontes antigas, nas de hoje eu nem testei para ver.

O certo mesmo é voce usar um 7805 e ligar ele nos +12V da fonte, e alimentar o PIC e demais circuitos por ele.

Eu sempre faço assim : coloco uma carga de uns 100 mA nos +12 Volts, e uma de 100 mA nos +5 Volts, aí sim eu fico mais tranquilo, ok ?

Quanto ao teu código, está certo, experimenta e ve se fica mais estável a tua leitura, ok ?

Paulo

Postado

Vou ver isso mesmo, mais agora vou ter que esperar outro PIC...

Heuhhasiudhaiudhasu....

Então cara, vou ver isso da fonte...

Tô até com um outro tópico aqui no forum, pra pegar uma luz pra ver essa parte da fonte..

E transformar ela numa fonte de bancada mais estavel...

Agora quanto ao programa só esperar o novo PIC chegar...

E aqui, te perguntar uma coisa...

Você leu ali no fim no meu post, a parte do sistema de menus pro relógio??

Então tinha dado uma parada com ele, mas agora nas férias to querendo pegar de novo!!

Aí to nessa cara, tipo é fácil criar esse sistema pra acessar o relógio??

porque me disseram que em C é "simples", tava até com planos de pegar C nessas férias...

O que você acha meu caro??

Abraços..

Júilo César

Postado

Bom, eu nem respondí, pois é um trabalho de programação igual a todos os outros ... claro que se voce projetar tudo pensando no tal do Menu, fica bem mais fácil escrever todo o programa.

Dá uma olhada no Tutorial em Basic para AVR's, lá eu postei um relógio simples, usando uma mesma parte de código, uma hora via interrupção normal de 1 segundo, outra hora sob controle do sistema de acerto lento ou rápido. Veja o software, é um péssimo exemplo de programa pois fui escrevendo o programa sem nenhum planejamento, mas a ideia de chamar a rotina que trata a passagem de um segundo ( numa interrupção ) como uma subrotina do programa ( fora da interrupção ! ) ficou muito boa !

Quanto à linguagem, tanto faz, é simples, seja em C seja em Basic, acho que o mais complicado é "bolar" um menú legal.

Po... mais um PIC ????????????? Heheheh faz o que te falei, usa um 7805 assim nunca mais pifa por causa da fonte !

Um abraço.

Paulo

Postado

É já to usando já....

Eu to pesado demais cara...

Ahduiashdiuahsidhasidhasdh

Agora quanto ao menu você lembra como eu queria acertar o relógo???

Então seria daquele jeito, do mesmo jeitinho que os relógios digitais de pulso mesmo entende...

Quero ver se nas férias eu mexo com isso, to com um projeto aqui cara, que se der certo vai ficar muito bom...

Abraços!

Júlio César

Postado

Po, nem me lembro do que comí hoje no almoço.... voce quer que eu me lembre disso ( meses atrás ) ?????????????

Posta novamente o esquema completo, e explica o tal de menú dos botoões de novo... nem me lembro se era LCD ou LED 7 segmentos !!!!

Vou adaptar o programa que fiz para os AVR´s para este projeto seu.

Um abraço !

Paulo

Postado

Tu é igual eu cara...

Eu também sou lerdasso, nunca lembro das coisas direito, e todo mundo insiste pra tu lembrar coisas de trezentos anos atras...

Ahsduiahsduiah

Primeiramente eu vou usar LCD cara, porque depois tenho uns outros planos, mas vou ir perguntando aos poucos!

Mas aqui o "menu" era o seguinte, o sistema seria com quatro botões: MODE, SET, UP e DOWN

(pelos nomes já dá pra saber mais ou menos as funções!)

MODE:

Ia ser tipo eu escolher o que ia ser acertado, ficar passando saca...

Alarme, Hora, Data

SET:

Selecionar o que eu quero acertar, tipo depois que eu encontrei o que eu quero acertar, tipo, queria arrumar as horas, eu apert SET, ai os segundos começam a piscar, se eu apertar SET de novo, vai pros minutos, que começama a piscar, se for horas, aperto de novo e, as horas começam a piscar, isso vale, pra ALARME(Hora e minuto do Alarme), HORA(Hora, minuto e segundo do Relógio) e DATA(Dia, mês e ano).

UP e DOWN:

Acrescentar e Decrescentar(nem sei se exste isso) no que foi selecionado pra ser acertado!

Deu pra entender tudinho??w

abraços,

Júlio César!

  • 2 semanas depois...
Postado

bom dia amigos do forum:

estou meio que sumido, mas ja estou de volta, estarei postando o link do meu robo que ja esta quase que pronto, no etanto estou precisando da ajuda de todos do forum,

meu proteus travou e tive que exclui-lo agora que é o problema me esqueci como fazer,

para baixa-lo peço aos colega desse forum que me ajude por favor.

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