LusoRobótica - Robótica em Português

Sistemas específicos => Picaxe => Tópico iniciado por: andre_f_carvalho em 10 de Setembro de 2010, 14:29

Título: [Ajuda] Picaxe 40x2 + ds18b20 +ds1307 + lcd03(i2c)
Enviado por: andre_f_carvalho em 10 de Setembro de 2010, 14:29
boas,

comecei  meu projecto hoje, visto que os meus ds18b20 chegaram ontem, e tenho as seguintes duvidas:

consigo mostrar o valor da temperatura na 1º linha com este código
Código: [Seleccione]
init:
   pause 500
   i2cslave $c6, i2cslow, i2cbyte
   writei2c 0,(254,128,255,19,12,4)

ler_temp:
   readtemp 0,w1
   debug w1
   pause 10
   
escrever_lcd:   
   writei2c 0,(254,128,255,19,12,4)
   pause 10
   bintoascii w1,b0,b1,b2
   hi2cout(" interior=",b1,b2,"")
   pause 10
   pause 1000
   goto ler_temp

e ao tentar juntar as duas temperaturas, aquilo fica tudo seguido com este código:
Código: [Seleccione]
init:
   pause 500
   i2cslave $c6, i2cslow, i2cbyte
   writei2c 0,(254,128,255,19,12,4)

ler_temp:
   readtemp 0,w1
   debug w1
   pause 10
   readtemp 1,w2
   debug w2
   pause 10
   
   
escrever_lcd:   
   writei2c 0,(254,128,255)
   pause 10
   writei2c 0,(".:Temperatura:.")
   bintoascii w1,b0,b1,b2
   bintoascii w2,b3,b4,b5
   writei2c 0,(254,192,255)
   pause 10
   hi2cout("interior=",b1,b2,"","")
   pause 10
   hi2cout("exterior=",b4,b5,"","")
   pause 1000
   goto ler_temp

alguém já trabalhou com este tipo de sistema?
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: durza em 14 de Setembro de 2010, 00:28
eu ja trabalhei  ;D
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: durza em 14 de Setembro de 2010, 00:29
e tens uns erros na programação  :P
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 14 de Setembro de 2010, 10:40
provavelmente no segundo código, no 1º esta bom, pelo menos no lcd está
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: XicoMBD em 14 de Setembro de 2010, 17:09
Boas,

Não sei se tens o datasheet do LCD, mas se não tiveres aqui o tens em anexo.

A tabela de comandos dá bastante jeito.



Na terceira linha podes encontrar o seguinte:

decimal           command                                                                          description
     2          |  Set cursor (1-80) | Cursor to a position specified by the next byte, where 1 is the top left and 80 is the bottom right


Portanto se  escreveres "writei2c (0,2,5)" vais colocar o cursor na posição 5 do LCD, ou seja o 5º rectâgulo da primeira linha, se quisesses na linha seguinte terias de trocar o 5 por 25.


Acho que assim deve funcionar:

Código: [Seleccione]
init:
pause 500
i2cslave $c6, i2cslow, i2cbyte
writei2c 0,(254,128,255,19,12,4)

ler_temp:
readtemp 0,w1
debug w1
pause 10
readtemp 1,w2
debug w2
pause 10


escrever_lcd:
writei2c 0,(254,128,255)
pause 10
writei2c 0,(".:Temperatura:.")
bintoascii w1,b0,b1,b2
bintoascii w2,b3,b4,b5
writei2c 0,(254,192,255)
pause 10


writei2c (0,2,22)

hi2cout("interior=",b1,b2,"","")
pause 10

writei2c (0,2,42)


hi2cout("exterior=",b4,b5,"","")
pause 1000
goto ler_temp
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 14 de Setembro de 2010, 17:51
o datacheet do display já o tinha, em relação a modança de cursor o "writei2c (0,2,5)" este 2 serve para que efeito?
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: XicoMBD em 14 de Setembro de 2010, 17:53
decimal           command                                                                          description
     2          |  Set cursor (1-80) | Cursor to a position specified by the next byte, where 1 is the top left and 80 is the bottom right
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 14 de Setembro de 2010, 18:01
decimal           command                                                                          description
     2          |  Set cursor (1-80) | Cursor to a position specified by the next byte, where 1 is the top left and 80 is the bottom right

peço desculpa não tinha reparado com precisão para a frase


cump
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: XicoMBD em 14 de Setembro de 2010, 18:11
Não há problema.

Já funciona?
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 14 de Setembro de 2010, 18:17
boas,

funciona, alterei um bocado o código, ficando assim
Código: [Seleccione]
init:
pause 500
i2cslave $c6, i2cslow, i2cbyte
writei2c 0,(254,128,255,19,12,4)

ler_temp:
readtemp 0,w1
debug w1
pause 10
readtemp 2,w2
debug w2
pause 10


escrever_lcd:
writei2c 0,(254,128,255,4)
pause 10
writei2c 0,(".:Temperatura:.")
pause 10


writei2c (0,2,22)
bintoascii w1,b0,b1,b2
hi2cout(" interior=",b1,b2,"")
pause 10

writei2c (0,2,42)
bintoascii w2,b3,b4,b5
hi2cout(" exterior=",b4,b5,"")
pause 10
goto ler_temp

mas tenho agora dois problemas, um é a 2º temperatura que esta a 20 mas se a aquecer com os dedos passa a 31(valor normal) e dp passa a 20, a segunda coisas é a escrita de temperatura a mais e alguns caracteres manhosos, vou inserir um vídeo para mostrar com está.

edit:

tive problemas ao filmar, está aqui uma foto onde podes ver o valor a 20 da temp e os caracteres manhosos

(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg715.imageshack.us%2Fimg715%2F7033%2Fcimg0919n.jpg&hash=976e48a241ee7251ea2a483238ad7ff5ac9d677f)
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: XicoMBD em 14 de Setembro de 2010, 18:59
Porque metes sempre "writei2c 0,(254,128,255,4)" antes de temperatura?

Experimenta pôr só:

"writei2c 0,(0,1,12)
writei2c 0,(0,2,3) "
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 14 de Setembro de 2010, 19:23
tb n sei pq, agora está tudo ok, menos o valor da temp que esta a 20, vou tentar resolver o código e vou dando noticias a medida que avanço,

cump
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: XicoMBD em 14 de Setembro de 2010, 19:24
Com a temperatura é que não te devo poder ajudar, nunca utilizei nenhum sensor desse género...
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 14 de Setembro de 2010, 19:27
eu tenho uma ideia do que seja, mas so confirmo quando obter os resultados
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 14 de Setembro de 2010, 20:35
n prebo é porque é que a segunda temperatura está com valores diferentes, ao ver o debug da segunda temperatura esta  b4 esta a 2 e b5 a 0, depois passa a n ter nenhum nº e continua a alternar nesses dois nº, o que é estranho
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: durza em 14 de Setembro de 2010, 21:57
define outras memorias (w)
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 14 de Setembro de 2010, 22:08
trocar a w2 por w3?

edit:. alterei como eu disse e como referi e já está a funcionar, amanha, vou alterar o programa e experimentar o readtemp12 e inserir o programa com os menus.


cump
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 15 de Setembro de 2010, 20:46
boas,

ao usar o comando readtemp12 depois de fazer a divisão por 16, verifico que no lcd são estão a aparcer º inteiros tipo 27º e não 27.xº qual é a dica para aparecer la o x?
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: XicoMBD em 15 de Setembro de 2010, 20:57
Aqui uma foto voltaria a dar jeito.

Porque não
   writei2c (0,2,35)
   writei2c 0,("x")
?
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 15 de Setembro de 2010, 21:01
Aqui uma foto voltaria a dar jeito.

Porque não
   writei2c (0,2,35)
   writei2c 0,("x")
?

eu refiro-me ao x como um nº ou seja se arredondar os 27.8ºc fica 28ºc o meu objectivo é aparecer 27.8º e não 28º
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: XicoMBD em 15 de Setembro de 2010, 21:04
No debug aparece a casa decimal?


Se não experimenta multiplicar por 10 antes de dividires
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 15 de Setembro de 2010, 21:12
experimentei o multiplicar e deu resultado e já aparece as casas decimais, sabes a razão para utilizar o *10?
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: XicoMBD em 15 de Setembro de 2010, 21:37
Como assim?
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 15 de Setembro de 2010, 21:38
disseste para multiplicar por 10, certo?

porque 10?

sei que funciona assim, mas é para aprofundar o conhecimento
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: XicoMBD em 15 de Setembro de 2010, 21:40
Para o número deixar de ser decimal e passar a ser inteiro...

Dá-se isso na primária ;)
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 15 de Setembro de 2010, 21:42
Para o número deixar de ser decimal e passar a ser inteiro...

Dá-se isso na primária ;)

omg...

neste caso é ao contrario deixa de ser inteiro para passar a ser decimal  ;D
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: XicoMBD em 15 de Setembro de 2010, 21:46
?

17.5 - Decimal

17.5 * 10 = 175

175 - Inteiro


Passou de 17.5 (Decimal) para 175 (Inteiro).


Não é assim?
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 15 de Setembro de 2010, 21:58
?

17.5 - Decimal

17.5 * 10 = 175

175 - Inteiro


Passou de 17.5 (Decimal) para 175 (Inteiro).


Não é assim?

sim tens razão, tava a baralhar-me porque ao fazer debug antes de o multiplicar por 10 só dava 27 neste caso e ao multiplicar passou a 278 (27.8ºc)

 as ferias estão-me a atrofiar todo xD
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: XicoMBD em 15 de Setembro de 2010, 22:02
As minhas acabam hoje :(
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 15 de Setembro de 2010, 22:10
As minhas acabam hoje :(
então estás com sorte, eu ainda n sei quando as minhas acabam .. :-\
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 15 de Setembro de 2010, 22:14
boas... não entendi ainda se já conseguis-te readtemp12 ou não, mas para o caso de não (é que também devido ao meu curto tempo actualmente não li tudo.... quanto a programação no teu primeiro post tens vários erros críticos)

(esta pequena parte é exemplo de o codigo que usei para o termometro, isto é muito util para memorizar a temp max e min juntamente com outras linhas)
readtemp12 termometro, temperatura
if temperatura >= 1600 and temperatura <= 2000 then let temperatura = 1599 : endif ;  limite de temperatura máxima = 99.9º (100º a 125º(valor máximo de leitura = 99.9º)
if temperatura > 64655 and temperatura <= 65375 then let temperatura =65377 : endif ;limite de temperatura mínima = -9.9º (-10º a -55º (valor negativo maximo) = -9.9º)
if temperatura > 65376 then let temperatura = 65535 - temperatura + 1 : let negativo = 1 else let negativo = 0 : endif; temperatura negativa limitando ate -9.9º


temperatura = temperatura * 10 / 16 (por exemplo supondo que leu 445 dividindo por 16 (conversão directa) da aproximadamente 27.8º, mas como ja deves saber casa decimais arredonda então a multiplicação anterior por 10)

bintoascci temperatura, auxiliar, auxiliar, aux1, aux2, aux3 (onde auxiliar é para desprezar, aux1 equivale ao 2, aux2 = 7, aux3= 8, dando entao os 27.8º) 



espero ainda ajudar ^^
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 15 de Setembro de 2010, 22:57
ganda confusão xD

já resolvi o problema em relação a temperatura, mas n mexi nas partes negativas (a seu tempo), estou de volta com o meu menu para o lcd onde estou a ter problemas em por uma palavra  por cada linha do lcd

edit:.
sendo este o código
Código: [Seleccione]
menu1:
    writei2c 0,(0,1,4)
    writei2c 0,(".:Menu:.")
    writei2c 0,(0,2,1)
    writei2c 0,("-Temperatura")
    writei2c 0,(0,3,1)
    writei2c 0,("Calendário")
    writei2c 0,(0,4,1)
    writei2c 0,("Estacionamento")
andei a ver nos manuais do picaxe e nenhum faz referencia a esta parte, a minha ideia é colocar cada palavra que ali está, uma por baixo da outra, nas minhas tentativas falhadas aparecia as palavras uma em cima e outra em baixo (1º e 4º linha), ou tudo misturado qual é a solução para este caso?
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: XicoMBD em 15 de Setembro de 2010, 23:38
ganda confusão xD

já resolvi o problema em relação a temperatura, mas n mexi nas partes negativas (a seu tempo), estou de volta com o meu menu para o lcd onde estou a ter problemas em por uma palavra  por cada linha do lcd

edit:.
sendo este o código
Código: [Seleccione]
menu1:
    writei2c 0,(0,1,4)
    writei2c 0,(".:Menu:.")
    writei2c 0,(0,2,1)
    writei2c 0,("-Temperatura")
    writei2c 0,(0,3,1)
    writei2c 0,("Calendário")
    writei2c 0,(0,4,1)
    writei2c 0,("Estacionamento")
andei a ver nos manuais do picaxe e nenhum faz referencia a esta parte, a minha ideia é colocar cada palavra que ali está, uma por baixo da outra, nas minhas tentativas falhadas aparecia as palavras uma em cima e outra em baixo (1º e 4º linha), ou tudo misturado qual é a solução para este caso?

Bem dizes que andas todo atrofiado ;)
Dá uma vista de olhos ao datasheet do lcd.
Quando metes writei2c 0,(0,1,4) estás a posicionar o cursor na posição home e depois a escondê-lo.

Se o que queres é colocá-lo na 4ª posição da 1ª linha então o que devias pôr era:  writei2c 0,(0,3,1,4) ou então  writei2c 0,(0,2,4)

Vê lá se assim não funciona:
Código: [Seleccione]
menu1:
    writei2c 0,(0,2,4)
    writei2c 0,(".:Menu:.")
    writei2c 0,(0,2,21)
    writei2c 0,("-Temperatura")
    writei2c 0,(0,2,41)
    writei2c 0,("Calendário")
    writei2c 0,(0,2,61)
    writei2c 0,("Estacionamento")
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 15 de Setembro de 2010, 23:51
tens razão  ;D
não sei o que seria de mim sem ti xD
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 16 de Setembro de 2010, 20:51
boas,

é possível criar um bitmap para cada quadrado do lcd sendo ele 8x5 e enviar o carácter por i2c?
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 16 de Setembro de 2010, 21:03
se o pretendes fazer so podes num total de 8 caracteres em simultâneo uma vez que a cgram não tem memoria disponível para mais...
para isso necessitas de enviar instrução por exemplo $40 que é o 0 disponível para iniciares o primeiro carácter, de seguida passas a dados enviando 5 bits de cada vaz (de cima para baixo o carácter) conforme o que pretendes desenhar, no fim cada 8 vezes enviada tens um caracter feito... para parar de "desenhar" envia uma instrução qualquer, por exemplo $01 (cursor home) de seguida da mesma forma que envias um carácter envias $00 corespondendo ao primeiro caracter desenhado de $40 a $47 da memoria cgram
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 16 de Setembro de 2010, 21:42
mas usando o cgram é só para o serial ou dá para i2c?
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 16 de Setembro de 2010, 21:45
se dá para um da para o outro, uma vez que i2c "simula" convertendo a comunicação i2c para paralelo, ou seja basta saberes como comunicar através de i2c, para isso necessitaras de saber como o conversor i2c "fala",...
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 16 de Setembro de 2010, 21:51
bahhh

"I do not speak i2c" xD



vou googlar um pouco a ver se descubro
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 16 de Setembro de 2010, 21:53
vê se te ajuda...
http://www.geocities.com/dinceraydin/djlcdsim/djlcdsim.html (http://www.geocities.com/dinceraydin/djlcdsim/djlcdsim.html)
é em paralelo... foi aqui que aprendi como fazer e a intender a linguagem que o display pede por paralelo...
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 16 de Setembro de 2010, 23:44
vê se te ajuda...
http://www.geocities.com/dinceraydin/djlcdsim/djlcdsim.html (http://www.geocities.com/dinceraydin/djlcdsim/djlcdsim.html)
é em paralelo... foi aqui que aprendi como fazer e a intender a linguagem que o display pede por paralelo...

parece-me que n seja igual, estive a ver o datacheet (http://www.robot-electronics.co.uk/htm/Lcd03tech.htm) e na parte
Custom char generator (http://www.robot-electronics.co.uk/htm/Lcd03tech.htm#Custom char generator) mostra com se faz, agora a minha duvida é como escrever aqueles nº e por que ordem os devo escrever, sendo que já sei criar a numeração para o bitmap que quero (caso interesse é usando a tabela de verdade onde 128 corresponde a 00000 e 159 a 11111 e ai por diante entre estes nºs).

edit.: mais uma ajuda possível, quem é que já conseguiu escrever os bits num único carácter?
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 17 de Setembro de 2010, 19:01
eu ja consegui assim como consigo mas fiz- em paralelo...
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 17 de Setembro de 2010, 19:33
no datacheet do lcd estive a ver e esta lá uma seta como explicação, e para fazer a tal seta é nesseçario escrever estes nº por esta ordem:
Código: [Seleccione]
    *  27 (comando para dizer que é a construção do carácter )
    * 128 (location to be filled)
    * 128 (byte 0)
    * 132 (byte1)
    * 142 (byte2)
    * 149 (byte3)
    * 132 (byte 4)
    * 132 (byte 5)
    * 132 (byte 6)
    * 128 (byte 7)

agora, tinha a ideia que pode-se ser assim, mas n funciona   :-\:
Código: [Seleccione]
writei2c 0,(0,27,128,128,132,142,149,132,132,132,128)
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 17 de Setembro de 2010, 19:35
surge algo no lcd com isto?!
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 17 de Setembro de 2010, 19:36
não, porque nem deixa enviar dá erro logo ao inicio
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 17 de Setembro de 2010, 19:39
antes desta linha inicias-te pelo menos o ldc?!
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 17 de Setembro de 2010, 19:42
sim indiquei só não pôs ali por ser óbvio, e era mais para referir aquela parte
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 17 de Setembro de 2010, 19:45
podes-me ceder o tal datasheet?!
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 17 de Setembro de 2010, 19:57
parece-me que n seja igual, estive a ver o datacheet (http://www.robot-electronics.co.uk/htm/Lcd03tech.htm) e na parte
Custom char generator (http://www.robot-electronics.co.uk/htm/Lcd03tech.htm#Custom char generator) mostra com se faz, agora a minha duvida é como escrever aqueles nº e por que ordem os devo escrever, sendo que já sei criar a numeração para o bitmap que quero (caso interesse é usando a tabela de verdade onde 128 corresponde a 00000 e 159 a 11111 e ai por diante entre estes nºs).

está neste post que escrevi os dois links vão dar ao mesmo
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 17 de Setembro de 2010, 20:04
em vez de 128 (location to be filled)  experimenta 64....
ou seja
writei2c 0,(0,27,64,128,132,142,149,132,132,132,128)

.... vendo um pouco melhor
Citar
The first thing that must be done is to send a command of 27 to indicate that you intend to make a custom char.
ou seja  (segundo eles)
writei2c 0,(27,128,128,132,142,149,132,132,132,128)
writei2c 0,("0"<- este 0 não pode existir  ,27,128,128,132,142,149,132,132,132,128)
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 17 de Setembro de 2010, 20:39
em vez de 128 (location to be filled)  experimenta 64....
ou seja
writei2c 0,(0,27,64,128,132,142,149,132,132,132,128)

.... vendo um pouco melhor
Citar
The first thing that must be done is to send a command of 27 to indicate that you intend to make a custom char.
ou seja  (segundo eles)
writei2c 0,(27,128,128,132,142,149,132,132,132,128)
writei2c 0,("0"<- este 0 não pode existir  ,27,128,128,132,142,149,132,132,132,128)

ainda não experimentei o que disseste, mas ao ler aquilo de novo despertou-me a atenção para uma coisa, sendo que o 1º 128 vai ser a localização onde se guarda este carácter, e posso por entre o 128 e o 135, caso o meu mau inglês não me falhe.
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 17 de Setembro de 2010, 20:47
sim, mas de 128 a 135 corresponde ao caracter nº8 ou seja por exemplo do 120 ao 127 é o 7º carácter...
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 17 de Setembro de 2010, 21:29
sim, mas de 128 a 135 corresponde ao caracter nº8 ou seja por exemplo do 120 ao 127 é o 7º carácter...

ai é que penso que te enganas, de acordo com o programa que fiz para experimentar eu defino o 128 como uma seta para cima e o 129 como ºc

podes ver aqui o código rápido que usei:

Código: [Seleccione]
init:
    pause 500
    i2cslave $c6, i2cslow, i2cbyte
    writei2c 0,(254,128,255,19,12,4)

ler_temp:
    pause 10
    writei2c 0,(27,128,128,132,142,149,132,132,132,128)
    writei2c 0,(27,129,140,146,146,140,131,132,132,131)
    pause 10   
    writei2c 0,(0,2,1)
    writei2c 0,("andre",128,"lol",129)
    pause 10
   
lol:
if pin3=1 then ler_temp
goto lol

e aqui uma foto da mensagem no lcd:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg405.imageshack.us%2Fimg405%2F1228%2Fcimg0923p.jpg&hash=6b8e15575ba47b90c4b33f69722bcffe6fc77c08)


os nºs de 128 a 135 podem ser poucos para usar caracteres, mas facilita bem o programa ao ser só necessário um nº por cada carácter
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 17 de Setembro de 2010, 21:37
Citar
Next you have to specify the position in ram of one of the 8 available chars you intend to build, the 8 chars are mapped at  positions 128-135. Then the pattern should be sent as below.

pois... tens razão... eu interpretei que fosse como paralelo, 8 bits para cada carácter, mas pelos vistos o conversor i2c trata de fazer isso tudo...
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 17 de Setembro de 2010, 21:41
ya tens razão acho que começo a gostar bastante do i2c xD

facilita bem as coisas, apesar de fazer dor de cabeça enquanto ainda n sabes trabalhar com ele.


só uma coisa o gram que está no programa para o picaxe serve para criar caracteres para o paralelo, sabes de uma forma em que crie uma mini aplicação para que simplifique a escrita para o i2c?
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 18 de Setembro de 2010, 08:19
não percebi bem a questão...
mas tipo a cgram que falo é uma memoria que o lcd tem, o que a picaxe tem é uma ram onde te permite memorizar dados como eeprom...
quanto a uma aplicação que questionas é algo do género algum circuito que te permita comunicar com o lcd por paralelo para adicionar simplesmente os caracteres personalizados?! 
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 21 de Setembro de 2010, 15:37
não percebi bem a questão...
mas tipo a cgram que falo é uma memoria que o lcd tem, o que a picaxe tem é uma ram onde te permite memorizar dados como eeprom...
quanto a uma aplicação que questionas é algo do género algum circuito que te permita comunicar com o lcd por paralelo para adicionar simplesmente os caracteres personalizados?!

n, é mais do tipo de uma aplicação para desenhar caracteres para i2c, como esta no programa do picaxe
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg339.imageshack.us%2Fimg339%2F1893%2Fcgram.jpg&hash=6907122812e3219fb4e24bf1d043a78584142c14)
agora uma outra duvida minha, ao usar a função readtemp12, qual é o nº em que começa a mostrar valores negativos, de 0º para os -55º?
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 22 de Setembro de 2010, 07:22
64656 corresponde aos -55, quando maior for agora mais próximo do 0 ficaras....

uma forma que eu descobri de calcular que pelo o que testei aparenta ser fiável é:
 
Citar
if temperatura > 64655 then let temperatura = 65535 - temperatura + 1 : let negativo = 1 else let negativo = 0 : endif
temperatura = temperatura * 10 / 16
bintoascii temperatura, aux1, aux1, aux1, aux2, aux3

ora vejamos...
     let temperatura = 65535 - temperatura + 1 ; 65535 é o valor máximo de uma word, uma vez que segundo o datasheet apartir de -0.01º ele desloca-se para o valor 65536 (passando o 0 a ter valor) e inicia a decrementarão conforme o valor baixa.. então se calcular-se 65535 - o valor de leitura adicionando 1 uma vez que o 0 é assumido como 1 no DS18B20, sendo assim saber-se-a a temperatura como se fosse possitivo...

    let negativo = 1 else let negativo = 0 ; caso este if aconteça é porque leu um valor negativo, caso não é porque não, memoriza nesta variável para que depois no debug ou a enviar para o lcd não me de sempre valores positivos....

     temperatura = temperatura * 10 / 16 ; multiplico por 10 para conseguir extrair a casa decimal, e por 16 devido a forma que ele usa os bits

     bintoascii temperatura, aux1, aux1, aux1, aux2, aux3 ; quanto a isto penso eu que nada a a dizer......

seja como for quanto a isto podes sempre confirmar no datasheet do termómetro http://pdfserv.maxim-ic.com/en/ds/DS18B20.pdf (http://pdfserv.maxim-ic.com/en/ds/DS18B20.pdf)

poderá ser confirmado na pág. 4

 
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 23 de Setembro de 2010, 16:57
se não tiveres as memorias em symbol como inseriste aqui é mais fácil de entender,

bem pelo que percebi do que escreveste:

escrevi ente código:

Código: [Seleccione]
init:
    pause 500'inicialização do lcd
    i2cslave $c6, i2cslow, i2cbyte'inicialização do lcd
    writei2c 0,(12,4)
'--------------------------------------definir caracteres-------------------------
writei2c 0,(27,128,140,146,146,140,131,132,132,131)'carácter ºc
writei2c 0,(27,129,128,132,134,159,159,134,132,128)'carácter seta direita
ler_temp:'temperatura

'escrever no lcd   
    writei2c 0,(0,2,3)
    writei2c 0,(".:Temperatura:.")
    writei2c (0,2,21)
    writei2c (" Interior",129)

ler_tempx:
'ler temperatura
    readtemp12 0,w1
    if w1>= 64656 then temp1_neg
   
temp1_pos:
    'temperatura interior positiva
    let w1 = w1*10/16
    debug w1   
    writei2c (0,2,30)
    bintoascii w1,b0,b1,b2
    hi2cout("",b0,b1,".",b2,128)

temp1_neg:   
'temperatura interior positiva
    let w1 = w1*10/16
    debug w1   
    writei2c (0,2,30)
    bintoascii w1,b0,b1,b2
    hi2cout("-",b0,b1,".",b2,128)
    goto ler_tempx

sendo que se o valor da w1 estiver maior ou igual a 64656 passa a escrever em com o traço em negativo, estarei certo? em relação a conversão para negativo?
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 23 de Setembro de 2010, 20:29
não maior... tens um erro....

após leres o valor (readtemp12 ....)
fazes :
Citar
if w1>= 64656 then temp1_neg
(...)
temp1_neg:   
'temperatura interior positiva
    let w1 = w1*10/16

ou seja mal acabas de ler o valor negativo multiplicas logo por 10 e dividindo por 16.... conclusão... por exemplo 65000 * 10 = 650000.... lembra-te que picaxe so vai ate 16 bit, ou seja valor máximo de 65535....
falta-te o comando

Citar
let w1 = 65535 - w1 + 1  * 10 / 16
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 23 de Setembro de 2010, 20:35

let w1 = 65535 - w1 + 1  * 10 / 16

se o +1 é para n aparecer o valor 0ºc, eu deixo-o de parte porque quero que ele apareça,

ah e também não vou por restrições de valores máximo e mínimo, tenho de reduzir o máximo de código no picaxe para n ficar sem memoria, o que falta pouco ...rsss
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 23 de Setembro de 2010, 20:47
não maior... para o valor correcto tens mesmo de adicionar um, não afecta o 0, pois 0 simplesmente será representado por 0

por exemplo, no datasheet do DS18B20 na pág. 4 tem lá
Citar
-55     1111 1100 1001 0000     FC90h 

ou seja = 64656 = -55º

vejamos....
65535 (máximo de uma word) - 64656 = 879

convertendo agora da mesma forma que fazemos para obter a casa decimal no picaxe
879 * 10 = 8790
8790 / 16 =  549.375
ou seja o picaxe assume -54.9ºc    ERRADO, por pouco mas errado

então
65535 - 64656 + 1 = 880
880 * 10 / 16 = 550     ou seja -55ºc



Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 23 de Setembro de 2010, 20:50
um outro pequeno exemplo

Citar
-25.0625     FE6F

$FE6F = 65135
65535 - 65135 + 1 = 401
401 / 16 = 25.0625     ou seja exactamente igual
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 23 de Setembro de 2010, 21:39
então vou lá por o +1, em relação as temperaturas negativas por o termómetro no congelador e consegui verificar temperaturas negativas, erradas mas negativas (por falta então do +1)

vou agora fazer o programa para que seja lida as duas temperaturas e coordenar as coisas + ou -
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 23 de Setembro de 2010, 21:51
a diferença não é muita mas é sempre alguma

seja como for estas com que pic?!
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 23 de Setembro de 2010, 21:58
picaxe 40x1, é o que tem mais memória ram
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 23 de Setembro de 2010, 22:04
nunca usas-te um x2?
tipo 20x2, 28x2, 40x2?!
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 23 de Setembro de 2010, 22:09
não, na altura que andava a estudar, na minha turma fizemos uma compra colectiva entre todos, comprando picaxes 18x1, 28x1 e 40x1, e na altura não havia picaxes x2 (não sei as diferenças entre por exemplo 40x1 e 40x2)

nesta altura em casa tenho um picaxe 8m, um 18x1, um 28x1 e dois 40x1, um 40x1 estar parcialmente queimado nalgumas entradas/ saídas penso, não sei ao certo o que tem e como precisava de um urgentemente comprei outro 40x1

já agora qual a diferença entre um x1 e um x2?
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 23 de Setembro de 2010, 22:14
bastante....
por exemplo 40x1 tem 28 variaveis, o 40x2 tem 56
a memoria também é em dobro...
os pins praticamente todos podem ser entradas como saidas... tens 12 portas analogicas em vez de 7.... velocidade máxima do 40x1 16mhz, so o cristal interno do x2 é de 8, com um cristal externo de 8 ficas com 32mhz... entre outras diferenças 
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 23 de Setembro de 2010, 22:17
então se o picaxe 40x1 tem 4096 bytes internos, o 40x2 tem 8192 bytes?
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: senso em 23 de Setembro de 2010, 22:20
Provavelmente mais até, mas as variaveis não ficam na flash, mas sim na ram.
Isso de teres pouca memória é por teres muito texto para meter no lcd, isso não tem PROGMEM?
Já leste o datasheet do teu picaxe para tirares todo o partido do mesmo?
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 23 de Setembro de 2010, 22:21
não propriamente... diz-se ele ter o dobro da memoria uma vez que o mesmo programa ocupa metade em comparação, no entanto pelo o que vejo a memoria é a mesma penso eu ....
http://www.rev-ed.co.uk/docs/picaxex2.pdf (http://www.rev-ed.co.uk/docs/picaxex2.pdf)
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 23 de Setembro de 2010, 22:22
Citar
PROGMEM
?! não sei o que é isso

seja como for a respeito do manual ja li praticamente todo... há alguns comandos que ainda não usei..
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: senso em 23 de Setembro de 2010, 22:25
Os picaxe correm um interpretador de basic dentro do pic, portanto se o interpretador for mais eficiente ficas com mais espaço para programas, dai teres tão pouca ram, porque o interpretador dos teus programas deve comer uma boa parte.
Tal como o arduino é bom para iniciar, mas quando começas a fazer algo mais a sério começas a ter n problemas devido ás limitações que são criadas para simplificar as coisas.
PROGMEM é guardar texto ou variaveis na flash, ou seja na memória ou se aloja o programa em si e não na ram, porque tens por exemplo só 2Kb de ram, o que com texto se acaba bastante depressa ou então tens 32Kb de flash e ai dá para meter muito, mas muito mais texto sem atrofiar com o programa.
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 23 de Setembro de 2010, 22:26
Provavelmente mais até, mas as variaveis não ficam na flash, mas sim na ram.
Isso de teres pouca memória é por teres muito texto para meter no lcd, isso não tem PROGMEM?
Já leste o datasheet do teu picaxe para tirares todo o partido do mesmo?

PROGMEM? n conheço o comando

por acaso tenho muito texto para o lcd e os 4096 bytes é para a ram, agora é provável que n esteja a utilizar todo o seu potencial
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 23 de Setembro de 2010, 22:28
Os picaxe correm um interpretador de basic dentro do pic, portanto se o interpretador for mais eficiente ficas com mais espaço para programas, dai teres tão pouca ram, porque o interpretador dos teus programas deve comer uma boa parte.
Tal como o arduino é bom para iniciar, mas quando começas a fazer algo mais a sério começas a ter n problemas devido ás limitações que são criadas para simplificar as coisas.
PROGMEM é guardar texto ou variaveis na flash, ou seja na memória ou se aloja o programa em si e não na ram, porque tens por exemplo só 2Kb de ram, o que com texto se acaba bastante depressa ou então tens 32Kb de flash e ai dá para meter muito, mas muito mais texto sem atrofiar com o programa.

sabes se existe a tal memoria  flash no picaxe?
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 23 de Setembro de 2010, 22:29
se estao a referir-se a eeprom que tem interna penso que isso seja baseado na memoria flash, é isso?!
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: senso em 23 de Setembro de 2010, 22:31
PROGMEM é o nome que a atmel/avr-gcc dá, e tu estás a usar pic, logo deve ter outro nome.
Eia tanta ram, isso era dia de festa, isso não dá para ver que estás a usar quando programas o picaxe?
Não, não é a eeprom.
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 23 de Setembro de 2010, 22:31
se estao a referir-se a eeprom que tem interna penso que isso seja baseado na memoria flash, é isso?!

mas a eeprom interna n é usada só para guardar variáveis, words e ect?
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 23 de Setembro de 2010, 22:33
podes usar, sem afectar qualquer variavel, simplesmente se cortares a alimentação no pic quando voltares a dar ele não perde esses valores
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 23 de Setembro de 2010, 22:34
PROGMEM é o nome que a atmel/avr-gcc dá, e tu estás a usar pic, logo deve ter outro nome.
Eia tanta ram, isso era dia de festa, isso não dá para ver que estás a usar quando programas o picaxe?
Não, não é a eeprom.

quando estou a programar o picaxe com o 40x1 aparece lá no syntax um maximo de 4096 bytes, dai eu perguntar se eram 8192 bytes, pq o fre_deri_co disse que tinha o dobro no 40x2
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 23 de Setembro de 2010, 22:35
podes usar, sem afectar qualquer variavel, simplesmente se cortares a alimentação no pic quando voltares a dar ele não perde esses valores

como é que a utilizas?

eu desconhecia essa eeprom
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 23 de Setembro de 2010, 22:39
atraves dos comandos "read" e "write"

exemplo

Citar
read 1, b0

no lugar do um podes variar de 0 a 255
em vez de b0 podes dar directamente o valor
se enviares uma word por exemplo
write 0, w0 (http://write 0, w0)

no lugar 0 da eeprom fica memorizado o b0, no 1 fica b1, fazendo assim a word
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 23 de Setembro de 2010, 22:41
atraves dos comandos "read" e "write"

exemplo

Citar
read 1, b0

no lugar do um podes variar de 0 a 255
em vez de b0 podes dar directamente o valor
se enviares uma word por exemplo
write 0, w0 (http://write%200,%20w0)



no lugar 0 da eeprom fica memorizado o b0, no 1 fica b1, fazendo assim a word

mas esses b0 e b1 interferem com os b's do programa
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 23 de Setembro de 2010, 22:44
não... nada
so usas simplesmente a word para enviar o valor que la se encontra... de resto ele faz tudo sozinho..... quando quiseres por exemplo retirar de la o valor para uma word apos reiniciar o sistema por exemplo

fazes:
Citar
write 0, w1
apos reiniciares para obteres o valor entao:
Citar
read 0, b2
read 1 , b3
assim teras novamente o valor na w1
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 23 de Setembro de 2010, 22:48
não... nada
so usas simplesmente a word para enviar o valor que la se encontra... de resto ele faz tudo sozinho..... quando quiseres por exemplo retirar de la o valor para uma word apos reiniciar o sistema por exemplo

fazes:
Citar
write 0, w1
apos reiniciares para obteres o valor entao:
Citar
read 0, b2
read 1 , b3
assim teras novamente o valor na w1

isso é capaz de dar jeito nalgumas partes do meu programa, agora não ajuda a ter espaço na memoria do picaxe por causa de tanto texto, n conseguir resolver esta parte terei de andar a remover partes do programa para caber o resto
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 23 de Setembro de 2010, 22:51
os comandos "read" e "write" ainda ocupam um bocado, mas por exemplo eu uso para memorizar temperaturas mínimas e máximas  :D
quanto ao programa se quiseres algumas dicas sobre o programa que tens para se compactar um pouco é so dizer
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: senso em 23 de Setembro de 2010, 23:06
Se tivesses ponteiros podias meter o texto na eeprom, ou então fazer algo do género:
for(i=0, i<tamanho_linha_texto,i++){
funcao_i2c_que_escreve_no_lc(read i);
}
algo assim, depois tinhas era de criar uma função igual para meter primeiro o texto na eeprom e já sou capaz de te estar a atrofiar a cabeça toda.
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 23 de Setembro de 2010, 23:07
já é a 3º que escrevo isto  >:( .

bem, a parte do srcoll do menu principal é que ocupa espaço a farta, tenho em anexo o  programa, se houver outra forma de fazer o tal scroll se ocupar muito espaço (n sei outra forma sem ser esta), desta parte como aproveitarias memoria?
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: senso em 23 de Setembro de 2010, 23:16
Quando alteras uma linha no lcd não tens de as reescrever todas, para além de ocupar espaço não é necessário, porque é que defines a seta e depois usas o - para indicar que linha está selecionada?

Código: [Seleccione]
init:
    pause 500'inicialização do lcd
    i2cslave $c6, i2cslow, i2cbyte'inicialização do lcd
    writei2c 0,(12,4)
'--------------------------------------definir caracteres-------------------------
writei2c 0,(27,128,140,146,146,140,131,132,132,131)'carácter ºc
writei2c 0,(27,129,128,132,134,159,159,134,132,128)'carácter seta direita
'--------------------------------------menssagem inicial do lcd-------------------
prin:
    writei2c 0,(12,4)
    writei2c 0,(0,2,3)
    writei2c 0,(".:Ultimate Box:.")
    writei2c 0,(0,2,23)
    writei2c 0,("andre_f_carvalho")
    writei2c 0,(0,2,68)
    writei2c 0,("2010")
    writei2c 0,(0,2,76)
    writei2c 0,("v1.0")
   
    for b8 = 1 to 40'visivel durante 5 segundos ou ok para fazer skip
    if pin4=1 then menu5
    pause 125
    if pin4=1 then menu5
    next b8
'------------------------------------menu pincipal--------------------------------
menu5:
    if pin4=1 then menu5
    if pin2=1 then menu5 
    if pin3=1 then menu5
    writei2c 0,(12,4)
    writei2c 0,(0,2,21)
    writei2c 0,("-Temperatura")
    b6=5
    b7=5
menu5_1:
    if pin2=1 then menu1 
    if pin3=1 then menu6

    goto menu5_1
menu6:
    if pin2=1 then menu6 
    if pin3=1 then menu6
    writei2c 0,(12,4)
    writei2c 0,(0,2,41)
    writei2c 0,("-Calendario")
    b6=6
    b7=6
menu6_1:
    if pin2=1 then menu5 
    if pin3=1 then menu7

    goto menu6_1
menu7:
    if pin2=1 then menu7
    if pin3=1 then menu7
    writei2c 0,(12,4)
    writei2c 0,(0,2,61)
    writei2c 0,("-Estacionamento")
    b6=7
    b7=7
menu7_1:
    if pin2=1 then menu6
    if pin3=1 then menu8

    goto menu7_1
menu8:
    if pin2=1 then menu8 
    if pin3=1 then menu8
    writei2c 0,(12,4)
    writei2c 0,(0,2,61)
    writei2c 0,("-Configuracao")
    b6=8
    b7=8
menu8_1:
    if pin2=1 then menu7 
    if pin3=1 then menu1

    goto menu8_1
menu1:
    if pin2=1 then menu1 
    if pin3=1 then menu1
    writei2c 0,(12,4)
    writei2c 0,(0,2,61)
    writei2c 0,("-Info")
    b6=1
    b7=1
menu1_1:
    if pin2=1 then menu2 
    if pin3=1 then menu5

    goto menu1_1
menu2:
    if pin2=1 then menu2 
    if pin3=1 then menu2
    writei2c 0,(12,4)
    writei2c 0,(0,2,7)
    writei2c 0,(".:Menu:.")
    writei2c 0,(0,2,21)
    writei2c 0,("Estacionamento")
    writei2c 0,(0,2,41)
    writei2c 0,("-Configuracao")
    writei2c 0,(0,2,61)
    writei2c 0,("Info")
    b6=2
    b7=2
menu2_1:
    if pin2=1 then menu3 
    if pin3=1 then menu1

    goto menu2_1
menu3:
    if pin2=1 then menu3
    if pin3=1 then menu3
    writei2c 0,(12,4)
    writei2c 0,(0,2,21)
    writei2c 0,("-Estacionamento")

    b6=3
    b7=3
menu3_1:
    if pin2=1 then menu4 
    if pin3=1 then menu2
    goto menu3_1
menu4:
    if pin2=1 then menu4
    if pin3=1 then menu4
    writei2c 0,(12,4)
    writei2c 0,(0,2,21)
    writei2c 0,("-Calendario")

    b6=4
    b7=4
menu4_1:
    if pin2=1 then menu5 
    if pin3=1 then menu3
    goto menu4_1

Só te fica é a faltar ai uma linha a escrever o menu todo.
Ou então se calhar o que ainda ficava melhor, imagina que isto é o teu lcd:
------------------------------------------
|                      Menu                    |
| Temperatura                             |
| Calendario                                |
| Estacionamento                        |
------------------------------------------
e depois entre no primeiro caracter de cala linha é que fazes o - andar para cima e para baixo, poupavas muito espaço e tempo de execução.
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 23 de Setembro de 2010, 23:26
sei que a seta seta esta definida, mas só a estou a usar em alguns site-os, exemplo no meu temperatura esta
------------------------------------------
|                      temperatura                   |
|interior (seta) (valor da temp)                |
|exterior (seta) (valor da temp)               |
|                                                          |
------------------------------------------

em relação ao "-" de andar de sima para baixo, é o que está a ser feito, a forma que esta essa parte do menu é para dar um efeito de movimento correcto e tornando mais fácil seleccionar as coisas, eu inicialmente tinha menus separadores para o menu, mas ao movimentar entre cada separador nalguns casos fica com mau aspecto, se quiseres posso inserir um vídeo com o menu a fazer scroll, para veres como está, e mesmo assim a partes que se nota uma mínima falha na movimentação do mesmo
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 23 de Setembro de 2010, 23:26
so assim por alto de uma forma muito rapida sem analisar o codigo, em simples condições consegui "compactar" 28 bytes, nao é muito mas fazem falta

nunca ouvis-te falar de "or" ou "and" num if?!
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 23 de Setembro de 2010, 23:32
se posta-ses o vídeo podia-me ser muito útil para me facilitar na analise do codigo
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 23 de Setembro de 2010, 23:33
so assim por alto de uma forma muito rapida sem analisar o codigo, em simples condições consegui "compactar" 28 bytes, nao é muito mas fazem falta

nunca ouvis-te falar de "or" ou "and" num if?!

nepia, nunca vi isso no picaxe, decerto que n conheço todos os comandos,

so conheço o uso dos "or" ou "and"na programação que fazia nos plc's

em relação a esta parte:
Código: [Seleccione]
   
    ;****************************************************************
    do
    inc b8
    pause 50
    loop while b8 < 100 and pin4 = 0 ; ou seja faz este ciclo enquanto b8 é menor que 40 e o pin4 não é acionado

é certo que é equivalente ao for..next mas na parte do pin4=0 n será pin4=1 e assim quando estiver activo muda?
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 23 de Setembro de 2010, 23:40
depende...
"do" indica que inicia a função
(...)
"loop" indica o fim da função e que terá de saltar para o "do", mas se escrever "loop while..." ou "loop until..." ja so salta com base na condição que se encontra a seguir
"loop while pin5=0" salta enquanto o pin 5 estar em baixo, ou seja indo a 1 ele passa logo para baixo
"loop until pin5=0" ele salta enquanto espera que esta condição seja verdadeira...

se quiseres tambem podes por
"do
(...) (acção)
if pin7 = 1 then exit   ; ao esta condição ser verdadeira ela sai logo do loop
loop"

Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 23 de Setembro de 2010, 23:48
quanto a if´s

Citar
if pin3=1 and pin4=1 then goto main    ; so o faz se as duas forem verdadeiras[
if pin3=1 or pin4=1 then goto main ; basta uma das duas que ja faz

if pin3=1 and pin4=1 then      ; if dentro de if
       if pin5 = 1 then rotina1   
       if pin6 = 1 then rotina2
endif

if pin2=1 then high 0 else low 0 endif ; se o botão for pressionado liga um led, se não for pressionado então desliga o led

if pin3=1 then high1 ; se verdadeiro liga o led
elseif pin4=1 then high2 ; so se a afirmação anterior for falsa é que faz este passo, executando-o só se for verdadeira neste segundo if
endif

existe mais formas....
podes já conhecer mas se não espero que seja útil...
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: senso em 24 de Setembro de 2010, 00:08
sei que a seta seta esta definida, mas só a estou a usar em alguns site-os, exemplo no meu temperatura esta
------------------------------------------
|                      temperatura                   |
|interior (seta) (valor da temp)                |
|exterior (seta) (valor da temp)               |
|                                                          |
------------------------------------------

em relação ao "-" de andar de sima para baixo, é o que está a ser feito, a forma que esta essa parte do menu é para dar um efeito de movimento correcto e tornando mais fácil seleccionar as coisas, eu inicialmente tinha menus separadores para o menu, mas ao movimentar entre cada separador nalguns casos fica com mau aspecto, se quiseres posso inserir um vídeo com o menu a fazer scroll, para veres como está, e mesmo assim a partes que se nota uma mínima falha na movimentação do mesmo
Não percebes-te, só mexer o - e não re-escrever todo o ecra só para escrever o traço noutra posição, seria muito mais inteligente e ocuparia muito, muito menos espaço.
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 24 de Setembro de 2010, 11:34
ah, ok

então tenho de programar isso com mais calma, em relação ao vídeo, está aqui:

Picaxe 40x1 + Lcd03 (i2c) - ultimate box fase test (http://www.youtube.com/watch?v=7jGQvPu_Jds#)
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 24 de Setembro de 2010, 11:45
já percebi melhor  o que pretendes... em principio logo chego a casa cedo e começo a analisar o código a ver onde se pode melhorar....
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 24 de Setembro de 2010, 11:49
ok obg,

n sei se reparas-te ao sair da parte da temperatura, demorava um pouco até sair de lá, dai ter de estar a carregar durante algum tempo até que ele sai-se :p
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 24 de Setembro de 2010, 11:52
sim, isso acontece porque usas o comando "readtemp12" que torna o pic bastante lento, eu sempre que carregue no botão "ok" faço uma chamada com o "interrupt", mesmo assim ainda não é totalmente eficaz mas torna-se um pouco mais rápido...
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 24 de Setembro de 2010, 11:59
já me acontecia isso com o "Readtemp", e como é que usas o "interrupt"?
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 24 de Setembro de 2010, 12:07
no caso do x1 so da nos input pins
no inicio do programa ... por exemplo pretendo que seja accionado assim que precionar o input pin 1
Citar
setint %00000010, %00000010
depois tens de criar uma rotina com o nome "interrupt:"
assim que o pin 1 vai a 1 ele salta de imediato para esta rotina (teoricamente  :-\)

isto permite ter algumas combinações, o melhor seria ler o manual 2 da picaxe onde diz "setint"

exemplo de codigo


Citar
setint %00000010, %00000010

menu:
(...)
goto menu

interrupt:
(...)
setint %00000010, %00000010 ;para voltar a validar novamente antes do return (voltando para onde saltou quando pin1 foi a 1) ou entao se preferires faz um reset depois
return
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 24 de Setembro de 2010, 12:12
sendo assim vai quase dar ao mesmo, ou n?
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 24 de Setembro de 2010, 12:15
tens as suas vantagens
so te ocupa um pouco mais de memoria
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 27 de Setembro de 2010, 16:32
uma vez que não obtive resposta limitei-me a fazer assim o codigo... espero que seja util... alguma questão dispõe...
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 27 de Setembro de 2010, 17:00
boas,

este fim de semana n estive no pc por isso é que não respondi as msg, em relação a código, só la para a noite é que poderei dar uma olhadela..


cump
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 27 de Setembro de 2010, 17:03
ok... aguardo feedback  ;)
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 27 de Setembro de 2010, 21:28
boas,

estive a ver o código e é uma forma diferente de programar, mas falta lá mais duas coisas, sendo o info e a configuração, e dai ter de se fazer a escrita mais ou menos da mesma forma que eu fiz no outro programa, para que ao mexer as palavras de a sensação que está tudo seguido (exemplo no filme que mostrei)
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 27 de Setembro de 2010, 21:32
hummm... pois... esta é a questão de programar sem poder experimentar..... quanto aos menus é possível, eu vi por alto e meti o que vi.... quanto a programação encurtou bastante, seja como for conseguis-te perceber a ideia?!
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 27 de Setembro de 2010, 21:38
sim precebi, agora n tenho é muito tempo para andar a programar, mas todo o tempo livre vai ser dedicado ao projecto :)
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 27 de Setembro de 2010, 21:40
já somos dois... mas o meu projecto esta a dar cabo de mim, estou a tentar fazer milagres  ;D
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 27 de Setembro de 2010, 21:46
qual é o tipo de projecto?
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 27 de Setembro de 2010, 21:55
gestão de uma sala com fechadura electrónica
de uma forma mais simplificada um projecto que contem lcd 16x2 por paralelo a 4-bit, i-button como identificador(chave), DS1307 (RTC) para registar todos os acessos, uma eeprom de momento 24LC512 para reter os dados e por fim um keypad que estou a tentar implementar ou então (o mais provável acontecer) um comando só de 3 botões.... para complicar mais estou a ver se existe qualquer hipótese de a qualquer momento copiar todos os dados da eeprom para um cartão de memoria com o objectivo de melhor controlo num pc....
tudo isto inicialmente controlado por um 20x2 (ainda sobram dois pin se não implementar o cartão de memória :P )
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: senso em 27 de Setembro de 2010, 21:56
Precisas de 3 pinos para spi, e quase de certeza que já usas-te os pinos que fazem spi..
Por que não ligação serial a um pc?
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 27 de Setembro de 2010, 22:03
sim, os pins spi são os mesmos que i2c, tendo o 3 pin spi de momento disponível... uma das soluções que metia era um pic so a fazer essa conversão para evitar qualquer falha... quanto a isso meto em causa pois isso da forma que penso implementar requeria uma ligação de vários pic a um servidor ou então de portátil na mão de porta a porta a copiar dados... assim com o cartão conectava-o, passava o identificador "mestre" (administrador) para autorizar uma copia para esse mesmo cartão...   
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: senso em 27 de Setembro de 2010, 22:07
Ligações de grande distancia só serial e com max232 pelo meio que é para teres um sinal forte e estavel que não se degrade com a distancia.
Então e ensinar um pic a falar ethernet e ligar esse pic a um servidor e depois passavas os teus dados por spi do pic que le os cartões para o pic que fala ethernet?
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 27 de Setembro de 2010, 22:12
boas, em relação ao keypad, cheguei a usar um teclado alfanumérico (0+1 a 9, + e #) caso queiras uma forma de usar o teclado com o picaxe é só dizer, tens é de ter 7 inputs para que seja feita a leitura do teclado, ou numa forma mais radical, podes usar o teclado ps2 de um pc para fazer a escrita (existe programas base disso para picaxe, mas num experimentei), ou uma outra forma com o tal teclado é só necessário uma adc e vais vendo os valores para cada tecla,
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 27 de Setembro de 2010, 22:12
agora fiquei com o cérebro em nó....
ora vejamos...

um pic para alem do que eu uso programa-lo para comunicar por RJ45 ligando ao pc por lan e por spi ao pic que se encontra no controlo... é isso?!
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: Cynary em 27 de Setembro de 2010, 22:14
sim, os pins spi são os mesmos que i2c, tendo o 3 pin spi de momento disponível... uma das soluções que metia era um pic so a fazer essa conversão para evitar qualquer falha... quanto a isso meto em causa pois isso da forma que penso implementar requeria uma ligação de vários pic a um servidor ou então de portátil na mão de porta a porta a copiar dados... assim com o cartão conectava-o, passava o identificador "mestre" (administrador) para autorizar uma copia para esse mesmo cartão...

Vou fazer uma sugestão:
pelo que viste no outro tópico, programar de forma a poder escrever/ler de um cartão de memória SD com sistemas de ficheiros, é uma coisa complicada tanto em termos de programação como de RAM.
Se o que queres fazer é comunicar com o PC, não tens a hipótese de criar um pequeno dispositivo (picaxe/arduino/AVR, ...) que comunicasse com essas fechaduras, fazendo uma pequena ligação (provavelmente consegues implementar comunicação I2C ou serial), e guardasse os dados numa EEPROM ou SD sem sistema de ficheiros. Depois, esse pequeno dispositivo comunicaria com o PC por serial (se conseguires, instalas um conversor USB-Serial no próprio dispositivo), de forma a transmitir os dados. Assim resolves o problema de guardar os dados e de ter de levar o portátil a todas as portas (e assim tens mais segurança a guardar os dados, visto necessitares de uma aplicação própria no PC, e podes inventar qualquer sistema de autenticação que queiras, e qualquer formato de dados :P).
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: senso em 27 de Setembro de 2010, 22:15
Sim, teres um pic master a tratar da fechadura e um slave a falar com o pc usando uma conexão lan.
Ou então lê isto tambem:
http://188.65.57.204/showthread.php?s=d2d2edb943bcbc20edc0ea58782900b7&t=14529&highlight=sd+card (http://188.65.57.204/showthread.php?s=d2d2edb943bcbc20edc0ea58782900b7&t=14529&highlight=sd+card)
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 27 de Setembro de 2010, 22:18
boas, em relação ao keypad, cheguei a usar um teclado alfanumérico (0+1 a 9, + e #) caso queiras uma forma de usar o teclado com o picaxe é só dizer, tens é de ter 7 inputs para que seja feita a leitura do teclado, ou numa forma mais radical, podes usar o teclado ps2 de um pc para fazer a escrita (existe programas base disso para picaxe, mas num experimentei), ou uma outra forma com o tal teclado é só necessário uma adc e vais vendo os valores para cada tecla,
eu já experimentei um teclado ps2, mas para a função que pretendo penso que não seja a melhor, pois andar com um teclado atras de mim cada vez que pretendo uma alteração penso que não seja a melhor maneira...
quanto ao keypad eu só utilizo 3 pin ADC onde na qual destingo todos os botões sem qualquer problema, pensei por num so pin mas nao quis complicar tanto por agora.... quanto ao problema do keypad é que estou a tentar utilizado da mesma forma que um teclado de tel (botao 2 = A, B e C conforme o nº de vezes clicado, acabo de o fazer e so mesmo as letras de momento esta a ocupar cerca de 500 bytes) ;D
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 27 de Setembro de 2010, 22:23
boas, em relação ao keypad, cheguei a usar um teclado alfanumérico (0+1 a 9, + e #) caso queiras uma forma de usar o teclado com o picaxe é só dizer, tens é de ter 7 inputs para que seja feita a leitura do teclado, ou numa forma mais radical, podes usar o teclado ps2 de um pc para fazer a escrita (existe programas base disso para picaxe, mas num experimentei), ou uma outra forma com o tal teclado é só necessário uma adc e vais vendo os valores para cada tecla,
eu já experimentei um teclado ps2, mas para a função que pretendo penso que não seja a melhor, pois andar com um teclado atras de mim cada vez que pretendo uma alteração penso que não seja a melhor maneira...
quanto ao keypad eu só utilizo 3 pin ADC onde na qual destingo todos os botões sem qualquer problema, pensei por num so pin mas nao quis complicar tanto por agora.... quanto ao problema do keypad é que estou a tentar utilizado da mesma forma que um teclado de tel (botao 2 = A, B e C conforme o nº de vezes clicado, acabo de o fazer e so mesmo as letras de momento esta a ocupar cerca de 500 bytes) ;D
pois espaço ocupa com fartura xD
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 27 de Setembro de 2010, 22:26
so para memorizar numa variável qual o botão pressionado 100 bytes ainda deve sobrar, mas para o que estou a fazer ja me esta a comer o cérebro  :P
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 27 de Setembro de 2010, 22:27
so para memorizar numa variável qual o botão pressionado 100 bytes ainda deve sobrar, mas para o que estou a fazer ja me esta a comer o cérebro  :P

lol eu sei o que isso é, também estive assim quando criei o alarme com o tal teclado
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 27 de Setembro de 2010, 22:27
sim, os pins spi são os mesmos que i2c, tendo o 3 pin spi de momento disponível... uma das soluções que metia era um pic so a fazer essa conversão para evitar qualquer falha... quanto a isso meto em causa pois isso da forma que penso implementar requeria uma ligação de vários pic a um servidor ou então de portátil na mão de porta a porta a copiar dados... assim com o cartão conectava-o, passava o identificador "mestre" (administrador) para autorizar uma copia para esse mesmo cartão...

Vou fazer uma sugestão:
pelo que viste no outro tópico, programar de forma a poder escrever/ler de um cartão de memória SD com sistemas de ficheiros, é uma coisa complicada tanto em termos de programação como de RAM.
Se o que queres fazer é comunicar com o PC, não tens a hipótese de criar um pequeno dispositivo (picaxe/arduino/AVR, ...) que comunicasse com essas fechaduras, fazendo uma pequena ligação (provavelmente consegues implementar comunicação I2C ou serial), e guardasse os dados numa EEPROM ou SD sem sistema de ficheiros. Depois, esse pequeno dispositivo comunicaria com o PC por serial (se conseguires, instalas um conversor USB-Serial no próprio dispositivo), de forma a transmitir os dados. Assim resolves o problema de guardar os dados e de ter de levar o portátil a todas as portas (e assim tens mais segurança a guardar os dados, visto necessitares de uma aplicação própria no PC, e podes inventar qualquer sistema de autenticação que queiras, e qualquer formato de dados :P).


de uma certa forma vai de acordo com que Senso disse correcto?!
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 27 de Setembro de 2010, 22:30
yah... também já fiz... no fim ate da gosto quando se consegue ^^
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: Cynary em 27 de Setembro de 2010, 23:54
sim, os pins spi são os mesmos que i2c, tendo o 3 pin spi de momento disponível... uma das soluções que metia era um pic so a fazer essa conversão para evitar qualquer falha... quanto a isso meto em causa pois isso da forma que penso implementar requeria uma ligação de vários pic a um servidor ou então de portátil na mão de porta a porta a copiar dados... assim com o cartão conectava-o, passava o identificador "mestre" (administrador) para autorizar uma copia para esse mesmo cartão...

Vou fazer uma sugestão:
pelo que viste no outro tópico, programar de forma a poder escrever/ler de um cartão de memória SD com sistemas de ficheiros, é uma coisa complicada tanto em termos de programação como de RAM.
Se o que queres fazer é comunicar com o PC, não tens a hipótese de criar um pequeno dispositivo (picaxe/arduino/AVR, ...) que comunicasse com essas fechaduras, fazendo uma pequena ligação (provavelmente consegues implementar comunicação I2C ou serial), e guardasse os dados numa EEPROM ou SD sem sistema de ficheiros. Depois, esse pequeno dispositivo comunicaria com o PC por serial (se conseguires, instalas um conversor USB-Serial no próprio dispositivo), de forma a transmitir os dados. Assim resolves o problema de guardar os dados e de ter de levar o portátil a todas as portas (e assim tens mais segurança a guardar os dados, visto necessitares de uma aplicação própria no PC, e podes inventar qualquer sistema de autenticação que queiras, e qualquer formato de dados :P).


de uma certa forma vai de acordo com que Senso disse correcto?!

Em parte vai ...
Pelo que percebi, podes usar mais do que uma porta.
A sugestão do senso é ligar um pic à rede LAN. Para isso tens duas opções: ou uma confusão de cabos todos a ligar para o mesmo PIC (se tiveres pinos suficientes), e esse a ligar à rede LAN, ou um PIC em cada porta a ligar à rede LAN (e novamente o problema da confusão de cabos, mas sem o dos pinos). O ideal é uma combinação destes dois .. não deixa de haver o problema de confusão de cabos xD
O que sugiro é criares um aparelho de armazenamento próprio para este mecanismo. Vai dar ao que querias: ir de porta a porta, ligar o aparelho -- o que sugeriste foi um cartão SD --, clicar num botão e guardar -- até podes fazer com que o aparelho peça para ligar assim que ligas, sem necessidade de botão, e depois ligar ao computador para descarregar os dados -- em vez de copiares um ficheiro, arranjas um programa que comunica com o aparelho e descarrega; esse programa até pode guardar num TXT ou mostrar um gráfico se quiseres. No entanto, tens um pouco mais de despesa, mas é menos complexo.
Outra sugestão: Pelo que percebi queres usar um keypad em cada porta para controlar o aparelho ... uma alternativa seria usar um comando wireless, do tipo dos da TV. Tens dois tutoriais excelentes neste fórum sobre como fazer isso, se tiveres tempo para experimentar:
http://lusorobotica.com/index.php?topic=527.0 (http://lusorobotica.com/index.php?topic=527.0)
http://lusorobotica.com/index.php/topic,1726.0.html (http://lusorobotica.com/index.php/topic,1726.0.html)
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 07 de Outubro de 2010, 21:43
boas,

depois de um tempo sem escrever aqui nada, já consegui reduzir bastante parte do programa com a ajuda do fre_deri_co , mas o meu problema agora é outro, tenho usado as memorias "b" em algumas situações, mas não me têm corrido bem, sendo que por exemplo tenho usado uma memoria num menu para guiar para a secção certa, mas mesmo quando volto atraz para o menu ele vai para a secção errada, como esta no vídeo que eu inseri, onde eu entro a temperatura e ao sair vai para o info, mesmo sem utilizar a memoria ele vai para a secção errada
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 07 de Outubro de 2010, 21:50
não utilizas as variáveis para "memorizar" o menu onde te encontras?! depois num possível retorno o valor das mesmas convém retornar não?! 
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 07 de Outubro de 2010, 22:02
não utilizas as variáveis para "memorizar" o menu onde te encontras?! depois num possível retorno o valor das mesmas convém retornar não?!

não percebi  o que disseste, mas tipo eu defino a b7=5 e ao voltar a trás ele vai para separador com b7=1
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 07 de Outubro de 2010, 22:04
mas ele volta por defeito ou porque defines?!
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 07 de Outubro de 2010, 22:07
tipo criei um separador a dizer voltar e tem tipo if b7=5 then vai para o local isto com vários b7=1...2...3...4..5.. e por ai
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: senso em 07 de Outubro de 2010, 22:09
Podes mostrar o código actual?
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 07 de Outubro de 2010, 22:11
Código: [Seleccione]
init:
    pause 500'inicialização do lcd
    i2cslave $c6, i2cslow, i2cbyte'inicialização do lcd
    writei2c 0,(12,4)
'b's a zero (0)
    b6=0
    b7=0
    b8=0
    b9=0
    b13=0
    b14=0
    b15=0
    b16=0
    b17=0
'--------------------------------------definir caracteres-------------------------
writei2c 0,(27,128,140,146,146,140,131,132,132,131)'carácter ºc
writei2c 0,(27,129,128,132,134,159,159,134,132,128)'carácter seta direita
'--------------------------------------menssagem inicial do lcd-------------------
prin:
    writei2c 0,(12,4)
    writei2c 0,(0,2,3)
    writei2c 0,(".:Ultimate Box:.")
    writei2c 0,(0,2,23)
    writei2c 0,("andre_f_carvalho")
    writei2c 0,(0,2,68)
    writei2c 0,("2010    v1.0")
   
    do
    inc b17
    pause 50
    loop while b17 < 100 and pin4 = 0 ; ou seja faz este ciclo enquanto b8 é menor que 40 e o pin4 não é acionado
'------------------------------------menu pincipal--------------------------------
menu5:
    if pin4=1 or pin2=1 or pin3=1 then menu5   
    writei2c 0,(12,4)
    writei2c 0,(0,2,7)
    writei2c 0,(".:Menu:.")
    writei2c 0,(0,2,21)
    writei2c 0,("-Temperatura")
    writei2c 0,(0,2,41)
    writei2c 0,(" Calendario")
    writei2c 0,(0,2,61)
    writei2c 0,(" Estacionamento")
    b6=5
    b7=5
menu5_1:
    if pin2=1 then menu1 
    if pin3=1 then menu6
    if pin4=1 then ok
    goto menu5_1
menu6:
    if pin2=1 or pin3=1 then menu6 
    writei2c 0,(12,4)
    writei2c 0,(0,2,7)
    writei2c 0,(".:Menu:.")
    writei2c 0,(0,2,21)
    writei2c 0,(" Temperatura")
    writei2c 0,(0,2,41)
    writei2c 0,("-Calendario")
    writei2c 0,(0,2,61)
    writei2c 0,(" Estacionamento")
    b6=6
    b7=6
menu6_1:
    if pin2=1 then menu5 
    if pin3=1 then menu7
    if pin4=1 then ok
    goto menu6_1
menu7:
    if pin2=1 or pin3=1 then menu7
    writei2c 0,(12,4)
    writei2c 0,(0,2,7)
    writei2c 0,(".:Menu:.")
    writei2c 0,(0,2,21)
    writei2c 0,(" Temperatura")
    writei2c 0,(0,2,41)
    writei2c 0,(" Calendario")
    writei2c 0,(0,2,61)
    writei2c 0,("-Estacionamento")
    b6=7
    b7=7
menu7_1:
    if pin2=1 then menu6
    if pin3=1 then menu8
    if pin4=1 then ok
    goto menu7_1
menu8:
    if pin2=1 then menu8 
    if pin3=1 then menu8
    writei2c 0,(12,4)
    writei2c 0,(0,2,7)
    writei2c 0,(".:Menu:.")
    writei2c 0,(0,2,21)
    writei2c 0,(" Calendario")
    writei2c 0,(0,2,41)
    writei2c 0,(" Estacionamento")
    writei2c 0,(0,2,61)
    writei2c 0,("-Configuracao")
    b6=8
    b7=8
menu8_1:
    if pin2=1 then menu7 
    if pin3=1 then menu1
    if pin4=1 then ok
    goto menu8_1
menu1:
    if pin2=1 or pin3=1 then menu1
    writei2c 0,(12,4)
    writei2c 0,(0,2,7)
    writei2c 0,(".:Menu:.")
    writei2c 0,(0,2,21)
    writei2c 0,(" Estacionamento")
    writei2c 0,(0,2,41)
    writei2c 0,(" Configuracao")
    writei2c 0,(0,2,61)
    writei2c 0,("-Info")
    b6=1
    b7=1
menu1_1:
    if pin2=1 then menu2 
    if pin3=1 then menu5
    if pin4=1 then ok
    goto menu1_1
menu2:
    if pin2=1 or pin3=1 then menu2
    writei2c 0,(12,4)
    writei2c 0,(0,2,7)
    writei2c 0,(".:Menu:.")
    writei2c 0,(0,2,21)
    writei2c 0,(" Estacionamento")
    writei2c 0,(0,2,41)
    writei2c 0,("-Configuracao")
    writei2c 0,(0,2,61)
    writei2c 0,(" Info")
    b6=2
    b7=2
menu2_1:
    if pin2=1 then menu3 
    if pin3=1 then menu1
    if pin4=1 then ok
    goto menu2_1
menu3:
    if pin2=1 or pin3=1 then menu3
    writei2c 0,(12,4)
    writei2c 0,(0,2,7)
    writei2c 0,(".:Menu:.")
    writei2c 0,(0,2,21)
    writei2c 0,("-Estacionamento")
    writei2c 0,(0,2,41)
    writei2c 0,(" Configuracao")
    writei2c 0,(0,2,61)
    writei2c 0,(" Info")
    b6=3
    b7=3
menu3_1:
    if pin2=1 then menu4 
    if pin3=1 then menu2
    if pin4=1 then ok
    goto menu3_1
menu4:
    if pin2=1 or pin3=1 then menu4
    writei2c 0,(12,4)
    writei2c 0,(0,2,7)
    writei2c 0,(".:Menu:.")
    writei2c 0,(0,2,21)
    writei2c 0,("-Calendario")
    writei2c 0,(0,2,41)
    writei2c 0,(" Estacionamento")
    writei2c 0,(0,2,61)
    writei2c 0,(" Configuracao")
    b6=4
    b7=4
menu4_1:
    if pin2=1 then menu5 
    if pin3=1 then menu3
    if pin4=1 then ok
    goto menu4_1
'--------------------------------------selecionador do menu prncipal------------   
ok:
    if pin4=1 then ok'bloqueio para não avançar
    writei2c 0,(12,4)'limpar lcd
    if b6=1 then info'info
    if b6=2 then conf'configuração
    if b6=3 then estac'Estacionamento
    if b6=4 then calend'calendário
    if b6=5 then ler_temp'temperatura
    if b6=6 then calend'Calendário
    if b6=7 then estac'Estacionamento
    if b6=8 then conf'configuração
'--------------------------------------voltar ao menu principal pela ordem que saio-------

voltar:
    if pin5=1 then voltar'bloqueio para não avançar
    writei2c 0,(12,4)'limpar lcd
    if b7=1 then menu1
    if b7=2 then menu2
    if b7=3 then menu3
    if b7=4 then menu4
    if b7=5 then menu5
    if b7=6 then menu6
    if b7=7 then menu7
    if b7=8 then menu8
'--------------------------------------Menu temperatura-----------------------------------   
ler_temp:'temperatura

'escrever no lcd   
    writei2c 0,(0,2,3)
    writei2c 0,(".:Temperatura:.")
    writei2c (0,2,21)
    writei2c (" Interior",129)
    writei2c (0,2,41)
    writei2c (" Exterior",129)
       
ler_tempx:
    b7=5
    if pin5=1 then voltar'volta ao menu anterior
'ler temperatura
    readtemp12 0,w1
    readtemp12 1,w3

temp1:
    if pin5=1 then voltar'volta ao menu anterior   
    if w1>= 64656 then'caso o valor seja negativo
   
        let w1 =  65535-w1+1*10/16'calculos para valores negativos
        debug w1   
        writei2c (0,2,32)
        bintoascii w1,b0,b1,b2
        hi2cout("-",b0,b1,".",b2,128)
    else
        let w1 = w1*10/16'calculo para valores positivos
        debug w1   
        writei2c (0,2,32)
        bintoascii w1,b0,b1,b2
        hi2cout("",b0,b1,".",b2,128)
   
    endif   
    pause 10
   
temp2:
    if pin5=1 then voltar'volta ao menu anterior
    if w3>= 64656 then'caso o valor seja negativo
   
        let w1 =  65535-w1+1*10/16'calculos para valores negativos
        debug w1   
        writei2c (0,2,52)
        bintoascii w1,b0,b1,b2
        hi2cout("-",b0,b1,".",b2,128)
    else
        let w3 = w3*10/16'calculo para valores positivos
        debug w3
        writei2c (0,2,52)
        bintoascii w3,b3,b4,b5
        hi2cout("",b3,b4,".",b5,128)
   
    end if
        if pin5=1 then voltar'volta ao menu anterior
    goto ler_tempx
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 07 de Outubro de 2010, 22:22
Citar
ok:
    if pin4=1 then ok'bloqueio para não avançar
    writei2c 0,(12,4)'limpar lcd
    if b6=1 then info'info
    if b6=2 then conf'configuração
    if b6=3 then estac'Estacionamento
    if b6=4 then calend'calendário
    if b6=5 then ler_temp'temperatura
    if b6=6 then calend'Calendário
    if b6=7 then estac'Estacionamento
    if b6=8 then conf'configuração

so uma pequena sugestão, porque não experimentas o comando
- branch "variável", (endereço0, endreço2, endereçoN)
ou
- on "variável" goto/gosub "endereço0, endereço1, endereçoN"

onde variável é um valor que se vai basear de comparação, por exemplo se o valor da variavel for =1 vai para o "endereço1"
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 07 de Outubro de 2010, 22:30
acho que estou a perceber  a tua ideia, mas assim tenho de definir logo no inicio um valor para os tais endereços, certo?
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 07 de Outubro de 2010, 22:33
não...
por exemplo neste caso

Código: [Seleccione]
branch b6, (ok, info, conf, estac, calend, estac, config)
no caso de 0 como tem de existir um caminho qualquer mesmo que não se pretenda mandei para o mesmo


Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 07 de Outubro de 2010, 22:35
não...
por exemplo neste caso

Código: [Seleccione]
branch b6, (ok, info, conf, estac, calend, estac, config)
no caso de 0 como tem de existir um caminho qualquer mesmo que não se pretenda mandei para o mesmo

pera n é a b6 que tenho problema é a b7
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 07 de Outubro de 2010, 22:40
inicialmente estava a dar uma dica de organização

quanto ao problema deriva desta linha de codigo
Código: [Seleccione]
readtemp12 1,w3
w0 = b0 e b1
w1 = b2 e b3
w2 = b4 e b5
w3 = b6 e b7
w4 = b8 e b9
etc...

percebido?!
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 07 de Outubro de 2010, 22:44
então para me facilitar a vida :p tenho de mudar a w3, já agora as "w" vai até a 13 certo?
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 07 de Outubro de 2010, 22:48
no caso do 40x1 sim.... para te facilitar o melhor que recomendo é definitivamente os "symbol", assim não necessitas de alterar em todo o programa, alteras só a variável no inicio, outro costume que tomo é variáveis uso de b0 para cima, word de cima para baixo, assim evita conflitos...
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: senso em 07 de Outubro de 2010, 22:51
Eu gostava e te ajudar, mas não apanho mesmo nada de basic.
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 07 de Outubro de 2010, 22:55
no caso do 40x1 sim.... para te facilitar o melhor que recomendo é definitivamente os "symbol", assim não necessitas de alterar em todo o programa, alteras só a variável no inicio, outro costume que tomo é variáveis uso de b0 para cima, word de cima para baixo, assim evita conflitos...

ao ver o codigo vi um erro na 2º temperatura, mas comecei a usar de cima para baixo as "word", agora só amanha posso experimentar :/

desculpa lá a seca xD

Eu gostava e te ajudar, mas não apanho mesmo nada de basic.

na boa ;)
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 07 de Outubro de 2010, 23:02
na boa... sem qualquer problema.... esta a vontade... em tudo que poder ajudar ca estou eu ^^

ja agora estou a dar uns pequenos toques no teu programa algo simples para depois se quiseres comparar...
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 07 de Outubro de 2010, 23:10
ok, ficarei a espera, eu n mexi muito ainda nessa parte porque não tinha conseguido resolver esse problema :)
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 07 de Outubro de 2010, 23:19
de uma forma muito vaga, sem grandes aprofundações, embora vejo que faltam aqui rotinas  :P

Código: [Seleccione]
init:
    pause 500'inicialização do lcd
    i2cslave $c6, i2cslow, i2cbyte'inicialização do lcd
    writei2c 0,(12,4)
'b's a zero (0)
    b6=0
    b7=0
    b8=0
    b9=0
    b13=0
    b14=0
    b15=0
    b16=0
    b17=0
   

'--------------------------------------definir caracteres-------------------------
writei2c 0,(27,128,140,146,146,140,131,132,132,131)'carácter ºc
writei2c 0,(27,129,128,132,134,159,159,134,132,128)'carácter seta direita
'--------------------------------------menssagem inicial do lcd-------------------
prin:
    writei2c 0,(12,4)
    writei2c 0,(0,2,3)
    writei2c 0,(".:Ultimate Box:.")
    writei2c 0,(0,2,23)
    writei2c 0,("andre_f_carvalho")
    writei2c 0,(0,2,68)
    writei2c 0,("2010    v1.0")
   
    do
    inc b17
    pause 50
    loop while b17 < 100 and pin4 = 0 ; ou seja faz este ciclo enquanto b8 é menor que 40 e o pin4 não é acionado
'------------------------------------menu pincipal--------------------------------

symbol b_menu = b6
let b_menu = 5 ; de forma a iniciar no menu5 como desejado
symbol b_menu_anterior = b7 ; esta variavel vai servir para reter o ciclo no menu quando aguarda por um botão onde possivelmente pelo o que vejo pode-se usar da mesma forma que usas o b7

menu:
    if pin2=1 then dec b_menu : endif
        if  b_menu = 0 then let b_menu = 8 : endif ;uma vez que não existe menu 0 assume logo o ultimo de forma a far a volta
    if pin3=1 then inc b_menu : endif
        if b_menu = 9 then let b_menu = 1 : endif ;uma vez mais limita, mas agora o maximo...
    if pin4=1 then ok
   
    if b_menu_anterior = b_menu then  menu

    let b_menu_anterior = b_menu
   
    ;** Escreve o menu no inicio do lcd, a vantagem de o fazer aqui é de simplesmente evitar a utilização de 25bytes por cada rotina que contenha estas simples 4 linhas
            writei2c 0,(12,4)
            writei2c 0,(0,2,7)
            writei2c 0,(".:Menu:.")
            writei2c 0,(0,2,21)
           
    on b_menu gosub menu, menu1, menu2, menu3, menu4, menu5, menu6, menu7, menu8
   
    do                 ; neste pequeno loop ele ficará retido após enviar a nova informação para o LCD enquanto um dos for pressionado
    loop while pin2 = 1 or pin3 = 1 or pin4 = 1

   
goto menu

menu5:
    writei2c 0,("-Temperatura")
    writei2c 0,(0,2,41)
    writei2c 0,(" Calendario")
    writei2c 0,(0,2,61)
    writei2c 0,(" Estacionamento")
return

menu6:
    writei2c 0,(" Temperatura")
    writei2c 0,(0,2,41)
    writei2c 0,("-Calendario")
    writei2c 0,(0,2,61)
    writei2c 0,(" Estacionamento")
return

menu7:
    writei2c 0,(" Temperatura")
    writei2c 0,(0,2,41)
    writei2c 0,(" Calendario")
    writei2c 0,(0,2,61)
    writei2c 0,("-Estacionamento")
return

menu8:
    writei2c 0,(" Calendario")
    writei2c 0,(0,2,41)
    writei2c 0,(" Estacionamento")
    writei2c 0,(0,2,61)
    writei2c 0,("-Configuracao")
return

menu1:
    writei2c 0,(" Estacionamento")
    writei2c 0,(0,2,41)
    writei2c 0,(" Configuracao")
    writei2c 0,(0,2,61)
    writei2c 0,("-Info")
return

menu2:
    writei2c 0,(" Estacionamento")
    writei2c 0,(0,2,41)
    writei2c 0,("-Configuracao")
    writei2c 0,(0,2,61)
    writei2c 0,(" Info")
return

menu3:
    writei2c 0,("-Estacionamento")
    writei2c 0,(0,2,41)
    writei2c 0,(" Configuracao")
    writei2c 0,(0,2,61)
    writei2c 0,(" Info")
return

menu4:
    writei2c 0,("-Calendario")
    writei2c 0,(0,2,41)
    writei2c 0,(" Estacionamento")
    writei2c 0,(0,2,61)
    writei2c 0,(" Configuracao")
return

'--------------------------------------selecionador do menu prncipal------------   
ok:
    if pin4=1 then ok'bloqueio para não avançar
   
    writei2c 0,(12,4)'limpar lcd
   
;    on b_menu goto ok, info, conf, estac, calend, estac, conf
   

'--------------------------------------voltar ao menu principal pela ordem que saio-------

voltar:
    if pin5=1 then voltar'bloqueio para não avançar
    writei2c 0,(12,4)'limpar lcd
   
    let b_menu = b_menu_anterior
   
    goto menu
   

'--------------------------------------Menu temperatura-----------------------------------   
ler_temp:'temperatura

'escrever no lcd   
    writei2c 0,(0,2,3)
    writei2c 0,(".:Temperatura:.")
    writei2c (0,2,21)
    writei2c (" Interior",129)
    writei2c (0,2,41)
    writei2c (" Exterior",129)
       
ler_tempx:
    b_menu_anterior = 5
    if pin5=1 then voltar'volta ao menu anterior
'ler temperatura
    readtemp12 0,w1
    readtemp12 1,w3

temp1:
    if pin5=1 then voltar'volta ao menu anterior   
    if w1>= 64656 then'caso o valor seja negativo
   
        let w1 =  65535-w1+1*10/16'calculos para valores negativos
        debug w1   
        writei2c (0,2,32)
        bintoascii w1,b0,b1,b2
        hi2cout("-",b0,b1,".",b2,128)
    else
        let w1 = w1*10/16'calculo para valores positivos
        debug w1   
        writei2c (0,2,32)
        bintoascii w1,b0,b1,b2
        hi2cout("",b0,b1,".",b2,128)
   
    endif   
    pause 10
   
temp2:
    if pin5=1 then voltar'volta ao menu anterior
    if w3>= 64656 then'caso o valor seja negativo
   
        let w1 =  65535-w1+1*10/16'calculos para valores negativos
        debug w1   
        writei2c (0,2,52)
        bintoascii w1,b0,b1,b2
        hi2cout("-",b0,b1,".",b2,128)
    else
        let w3 = w3*10/16'calculo para valores positivos
        debug w3
        writei2c (0,2,52)
        bintoascii w3,b3,b4,b5
        hi2cout("",b3,b4,".",b5,128)
   
    end if
        if pin5=1 then voltar'volta ao menu anterior
    goto ler_tempx

os menus ainda se pode melhorar um pouco, mas assim tambem não fica mal de todo  ;D

edit: esta alteração foi de forma a poupar 25 bytes de código que repetia 7 vezes sempre antes de enviar um novo menu (25*7=175bytes que fazem falta  ;))
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 08 de Outubro de 2010, 15:28
de uma forma muito vaga, sem grandes aprofundações, embora vejo que faltam aqui rotinas  :P

Código: [Seleccione]
init:
    pause 500'inicialização do lcd
    i2cslave $c6, i2cslow, i2cbyte'inicialização do lcd
    writei2c 0,(12,4)
'b's a zero (0)
    b6=0
    b7=0
    b8=0
    b9=0
    b13=0
    b14=0
    b15=0
    b16=0
    b17=0
   

'--------------------------------------definir caracteres-------------------------
writei2c 0,(27,128,140,146,146,140,131,132,132,131)'carácter ºc
writei2c 0,(27,129,128,132,134,159,159,134,132,128)'carácter seta direita
'--------------------------------------menssagem inicial do lcd-------------------
prin:
    writei2c 0,(12,4)
    writei2c 0,(0,2,3)
    writei2c 0,(".:Ultimate Box:.")
    writei2c 0,(0,2,23)
    writei2c 0,("andre_f_carvalho")
    writei2c 0,(0,2,68)
    writei2c 0,("2010    v1.0")
   
    do
    inc b17
    pause 50
    loop while b17 < 100 and pin4 = 0 ; ou seja faz este ciclo enquanto b8 é menor que 40 e o pin4 não é acionado
'------------------------------------menu pincipal--------------------------------

symbol b_menu = b6
let b_menu = 5 ; de forma a iniciar no menu5 como desejado
symbol b_menu_anterior = b7 ; esta variavel vai servir para reter o ciclo no menu quando aguarda por um botão onde possivelmente pelo o que vejo pode-se usar da mesma forma que usas o b7

menu:
    if pin2=1 then dec b_menu : endif
        if  b_menu = 0 then let b_menu = 8 : endif ;uma vez que não existe menu 0 assume logo o ultimo de forma a far a volta
    if pin3=1 then inc b_menu : endif
        if b_menu = 9 then let b_menu = 1 : endif ;uma vez mais limita, mas agora o maximo...
    if pin4=1 then ok
   
    if b_menu_anterior = b_menu then  menu

    let b_menu_anterior = b_menu
   
    ;** Escreve o menu no inicio do lcd, a vantagem de o fazer aqui é de simplesmente evitar a utilização de 25bytes por cada rotina que contenha estas simples 4 linhas
            writei2c 0,(12,4)
            writei2c 0,(0,2,7)
            writei2c 0,(".:Menu:.")
            writei2c 0,(0,2,21)
           
    on b_menu gosub menu, menu1, menu2, menu3, menu4, menu5, menu6, menu7, menu8
   
    do                 ; neste pequeno loop ele ficará retido após enviar a nova informação para o LCD enquanto um dos for pressionado
    loop while pin2 = 1 or pin3 = 1 or pin4 = 1

   
goto menu

menu5:
    writei2c 0,("-Temperatura")
    writei2c 0,(0,2,41)
    writei2c 0,(" Calendario")
    writei2c 0,(0,2,61)
    writei2c 0,(" Estacionamento")
return

menu6:
    writei2c 0,(" Temperatura")
    writei2c 0,(0,2,41)
    writei2c 0,("-Calendario")
    writei2c 0,(0,2,61)
    writei2c 0,(" Estacionamento")
return

menu7:
    writei2c 0,(" Temperatura")
    writei2c 0,(0,2,41)
    writei2c 0,(" Calendario")
    writei2c 0,(0,2,61)
    writei2c 0,("-Estacionamento")
return

menu8:
    writei2c 0,(" Calendario")
    writei2c 0,(0,2,41)
    writei2c 0,(" Estacionamento")
    writei2c 0,(0,2,61)
    writei2c 0,("-Configuracao")
return

menu1:
    writei2c 0,(" Estacionamento")
    writei2c 0,(0,2,41)
    writei2c 0,(" Configuracao")
    writei2c 0,(0,2,61)
    writei2c 0,("-Info")
return

menu2:
    writei2c 0,(" Estacionamento")
    writei2c 0,(0,2,41)
    writei2c 0,("-Configuracao")
    writei2c 0,(0,2,61)
    writei2c 0,(" Info")
return

menu3:
    writei2c 0,("-Estacionamento")
    writei2c 0,(0,2,41)
    writei2c 0,(" Configuracao")
    writei2c 0,(0,2,61)
    writei2c 0,(" Info")
return

menu4:
    writei2c 0,("-Calendario")
    writei2c 0,(0,2,41)
    writei2c 0,(" Estacionamento")
    writei2c 0,(0,2,61)
    writei2c 0,(" Configuracao")
return

'--------------------------------------selecionador do menu prncipal------------   
ok:
    if pin4=1 then ok'bloqueio para não avançar
   
    writei2c 0,(12,4)'limpar lcd
   
;    on b_menu goto ok, info, conf, estac, calend, estac, conf
   

'--------------------------------------voltar ao menu principal pela ordem que saio-------

voltar:
    if pin5=1 then voltar'bloqueio para não avançar
    writei2c 0,(12,4)'limpar lcd
   
    let b_menu = b_menu_anterior
   
    goto menu
   

'--------------------------------------Menu temperatura-----------------------------------   
ler_temp:'temperatura

'escrever no lcd   
    writei2c 0,(0,2,3)
    writei2c 0,(".:Temperatura:.")
    writei2c (0,2,21)
    writei2c (" Interior",129)
    writei2c (0,2,41)
    writei2c (" Exterior",129)
       
ler_tempx:
    b_menu_anterior = 5
    if pin5=1 then voltar'volta ao menu anterior
'ler temperatura
    readtemp12 0,w1
    readtemp12 1,w3

temp1:
    if pin5=1 then voltar'volta ao menu anterior   
    if w1>= 64656 then'caso o valor seja negativo
   
        let w1 =  65535-w1+1*10/16'calculos para valores negativos
        debug w1   
        writei2c (0,2,32)
        bintoascii w1,b0,b1,b2
        hi2cout("-",b0,b1,".",b2,128)
    else
        let w1 = w1*10/16'calculo para valores positivos
        debug w1   
        writei2c (0,2,32)
        bintoascii w1,b0,b1,b2
        hi2cout("",b0,b1,".",b2,128)
   
    endif   
    pause 10
   
temp2:
    if pin5=1 then voltar'volta ao menu anterior
    if w3>= 64656 then'caso o valor seja negativo
   
        let w1 =  65535-w1+1*10/16'calculos para valores negativos
        debug w1   
        writei2c (0,2,52)
        bintoascii w1,b0,b1,b2
        hi2cout("-",b0,b1,".",b2,128)
    else
        let w3 = w3*10/16'calculo para valores positivos
        debug w3
        writei2c (0,2,52)
        bintoascii w3,b3,b4,b5
        hi2cout("",b3,b4,".",b5,128)
   
    end if
        if pin5=1 then voltar'volta ao menu anterior
    goto ler_tempx

os menus ainda se pode melhorar um pouco, mas assim tambem não fica mal de todo  ;D

edit: esta alteração foi de forma a poupar 25 bytes de código que repetia 7 vezes sempre antes de enviar um novo menu (25*7=175bytes que fazem falta  ;) )


boas,

é certo que reduz bytes que podem fazer falta, mas no mexer tem uma forma esquisita xD, tipo ao seleccionares o botão para descer, ele percorre o menu todo a descer até que chega ao fim em vez de dar o efeito de descer, ele começa a subir e sempre assim, se clicar no botão subir, faz igual mas de forma inversa, e o seleccionador não vai para o local correcto e deixa o lcd em branco
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 08 de Outubro de 2010, 16:08
ele ficar em branco é por causa desta linha "let b_menu = b_menu_anterior" no menu voltar, isto não pode acontecer, foi uma falha minha... quanto a ele dexer o menu seguido não percebo bem o que acontece, isso só mesmo vendo
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 09 de Outubro de 2010, 19:06
ele ficar em branco é por causa desta linha "let b_menu = b_menu_anterior" no menu voltar, isto não pode acontecer, foi uma falha minha... quanto a ele dexer o menu seguido não percebo bem o que acontece, isso só mesmo vendo

acho que  erro é este
Código: [Seleccione]
'--------------------------------------selecionador do menu prncipal------------   
ok:
    if pin4=1 then ok'bloqueio para não avançar
   
    writei2c 0,(12,4)'limpar lcd
   ;  on b_menu goto ok, info, conf, estac, calend, estac, conf

o ";" não pode estar ali, se n define como uma etiqueta


edit.: mesmo assim não funciona, porque ao seleccionar nunca vai para o local correcto, com alguma paciência, até posso conseguir encontrar o erro, mas em relação ao meu menu, eu já arranjei uma forma de poupar mais espaço
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: fre_deri_co em 10 de Outubro de 2010, 00:33
eu meti essa linha como comentário pois como não tinha as rotinas criadas ele dava erro, para ver se existia mais falhas entao comentei.... seja como for e erro esta onde eu disse pois ele so envia para o ecrã se as variaveis forem diferentes, e quando apaga o lcd para retomar la iguala-as, logo na rotina seguinte falha o que se pretende
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 11 de Outubro de 2010, 22:58
ela estava com comentário, mas mesmo ao seleccionar, não vai para o local correcto
Título: Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
Enviado por: andre_f_carvalho em 22 de Abril de 2012, 19:39
Boas,


depois de tanto tempo sem mexer nisto voltei a pegar no projecto, mas entretanto existem uns problemas,


antigamente ao enviar o programa para configurar as horas no DS1307 ele escrevia e depois lia a data e hora na boa, mas hoje quando tentei enviar o programa para o mesmo este não dá sinal de vida, ja troquei por um outro e nada, eu tenho o led no pino 7 (SQW) do DS1307 penso que se ele estive-se e funcionar bem pisca segundo a segundo, mas agora fica sempre ligado


alguém já teve este problema com o ds1307?
Título: Re: [Ajuda] Picaxe 40x2 + ds18b20 +ds1307 + lcd03(i2c)
Enviado por: fre_deri_co em 23 de Abril de 2012, 11:10
Boas, sinceramente eu tenho andado um pouco ausente disto, mas pelo o que me recordo para o pin 7 piscar a 1Hz tens de lhe dizer isso ao programar, em picaxe da seguinte forma:

writei2c 0, (segundos, minutos, horas, semana, dia, mes, ano, "Piscar")

Sem piscar:
writei2c 0, ($00, $55, $10, $02, $23, $04, $12, $80)
a piscar:
writei2c 0, ($00, $55, $10, $02, $23, $04, $12, $10)

Confirma se deste ordem. seja como for se o DS1307 te devolde so $FF na leitura confirma sa seguinte forma, se ele esta a ser devidamente alimentado, se o cristal esta correcto e conectado (32.768kHz), se estiver bem entao so podera ser do I2C, confirma se nao esta cruzada a linha e se tem as 2 resistencias a fazer pull-up... algo disto estara em falta certamente!!

Se mesmo assim nao der diz que eu ainda hoje monto esse circuito de novo para ver se me esqueço de algo ^^.
Título: Re: [Ajuda] Picaxe 40x2 + ds18b20 +ds1307 + lcd03(i2c)
Enviado por: andre_f_carvalho em 23 de Abril de 2012, 22:26



Confirma se deste ordem. seja como for se o DS1307 te devolde so $FF na leitura confirma sa seguinte forma, se ele esta a ser devidamente alimentado, se o cristal esta correcto e conectado (32.768kHz), se estiver bem entao so podera ser do I2C, confirma se nao esta cruzada a linha e se tem as 2 resistencias a fazer pull-up... algo disto estara em falta certamente!!


Se mesmo assim nao der diz que eu ainda hoje monto esse circuito de novo para ver se me esqueço de algo ^^.









eu uso o template que existe no picaxe para programar a rtc isto:


Código: [Seleccione]
'AXE110 BASIC Program to set time/date on DS1307 RTC
'Automatically generated by Wizard




'Make sure DS1307 chip and cell inserted on datalogger module
'and that the cable is in the 'run' position.
'After downloading, status LED will be Green for pass or Red for fail.
'After success, download empty program to PICAXE to prevent
'time being reset on next power-up of board.




'First program the date
   high 5 ' write protect eeprom




   i2cslave %11010000, i2cslow, i2cbyte
   writei2c 0, ($00, $17, $22, $02, $23, $04, $12, $10)
   pause 50




'Now check has been set OK
   let b8 = $02
   let b9 = $23
   let b10 = $04
   let b11 = $12
   let b12 = $10




   readi2c 0, (b0,b1,b2,b3,b4,b5,b6,b7)




   if b7 <> b12 then fail
   if b6 <> b11 then fail
   if b5 <> b10 then fail
   if b4 <> b9 then fail
   if b3 <> b8 then fail
ok:
   high 3
   goto ok
fail:
   high 2
   goto fail


e ele envia o tal $10


não será do i2c do 40x2 nem das resistências pull up porque tenho um lcd 4x20 ligado ao i2c e funciona bem, agora a rtc e que nada, não sei se ja mencionei, mas troquei por outra rtc e e a mesma coisa
Título: Re: [Ajuda] Picaxe 40x2 + ds18b20 +ds1307 + lcd03(i2c)
Enviado por: fre_deri_co em 23 de Abril de 2012, 23:35
certo, eu sempre que tive problemas trocava o RTC e mantinha-se, era sempre de outra coisa..
no codigo sempre que vais buscar hora ou escrever no display chamas o novo endereço? qual a frequencia que metes-te o 40x2 a correr??
Título: Re: [Ajuda] Picaxe 40x2 + ds18b20 +ds1307 + lcd03(i2c)
Enviado por: andre_f_carvalho em 24 de Abril de 2012, 18:11
a frequencia está a m4 (4mhz).


sim mudo de endereço, como vez

Código: [Seleccione]
'-------------------------------------Menu calendário------------------------------
calend: 'calendário
   let b27=0
   writei2c 0,(0,2,4)
   writei2c 0,(".:Calendario:.")
   pause 20






calend_leit:
'debug
'-----------------ler horas----------
   i2cslave %11010000, i2cslow, i2cbyte 'inicialização da rtc ds 1307
   pause 10
   readi2c 0, (segundos, minutos, horas, semanas, dias, meses, anos)
   pause 10
'-----------------escrita do lcd------------------
   i2cslave $c6, i2cslow_4, i2cbyte 'inicialização do lcd
   pause 10


      writei2c 0,(0,2,27)


         let semanas = bcdtobin semanas
         let dias = bcdtobin dias
         let meses = bcdtobin meses
         let anos = bcdtobin anos
         let horas = bcdtobin horas
         let minutos = bcdtobin minutos
         let segundos = bcdtobin segundos


   bintoascii horas, b19, b19, b20
   bintoascii minutos, b21, b21, b22
   bintoascii segundos, b23, b23, b24
   pause 10
   writei2c 0,(b19, b20,":", b21, b22,":", b23, b24)
   pause 20




      writei2c 0,(0,2,43)


         select semanas
         case 1 writei2c 0,(" Dom")
         case 2 writei2c 0,(" Seg")
         case 3 writei2c 0,(" Ter")
         case 4 writei2c 0,(" Qua")
         case 5 writei2c 0,(" Qui")
         case 6 writei2c 0,(" Sex")
         case 7 writei2c 0,(" Sab")
         endselect


      writei2c 0,(0,2,48)




   bintoascii dias, b21, b21, b22
   bintoascii meses, b23, b23, b24
   bintoascii anos, b25, b25, b26
   writei2c 0,(b21, b22,"/", b23, b24,"/20", b25, b26)
   if pinD.5=1 then voltar 'volta ao menu anterior


   goto calend_leit
Título: Re: [Ajuda] Picaxe 40x2 + ds18b20 +ds1307 + lcd03(i2c)
Enviado por: andre_f_carvalho em 27 de Abril de 2012, 16:34
nenhuma ajuda?
Título: Re: [Ajuda] Picaxe 40x2 + ds18b20 +ds1307 + lcd03(i2c)
Enviado por: fre_deri_co em 27 de Abril de 2012, 18:24
desculpa mas ainda nao me foi possivel testar, pelo o que vejo esta em ordem...

envia as horas para atraves do programador,e depois  envia este codigo, apos enviar este clica "ok" e de seguida F8 (Terminal) se estiver bem definido o RTC iras receber um "debug" da data la inserida!

Código: [Seleccione]
#picaxe 40x2

symbol aux1 = b0
symbol aux2 = b1
symbol aux3 = b2

symbol dias = b3
symbol meses = b4
symbol anos = b5
symbol semanas = b6
symbol horas = b7
symbol minutos = b8
symbol segundos = b9


let segundos = $00
let minutos = $03
let horas = $13
let semanas = $02
let dias = $20
let meses = $02
let anos = $12

i2cslave %11010000, i2cslow, i2cbyte
writei2c 0, (segundos, minutos, horas, semanas, dias, meses, anos)
pause 500

menu:

;Inicializa RTC
i2cslave $D0, i2cslow, i2cbyte

readi2c 0, (segundos, minutos, horas, semanas, dias, meses, anos)


if b15 <> segundos then
let b15 = segundos
goto send
endif

goto menu


send:


semana:
select semanas
case $01 aux1 = "D" aux2 = "o" aux3 = "m"
case $02 aux1 = "S" aux2 = "e" aux3 = "g"
case $03 aux1 = "T" aux2 = "e" aux3 = "r"
case $04 aux1 = "Q" aux2 = "u" aux3 = "a"
case $05 aux1 = "Q" aux2 = "u" aux3 = "i"
case $06 aux1 = "S" aux2 = "e" aux3 = "x"
case $07 aux1 = "S" aux2 = "a" aux3 = "b"
endselect
sertxd (aux1, aux2, aux3, " ")

dia:
aux1 = dias and $F0 / $0F + $30
aux2 = dias and $0F + $30
sertxd (aux1, aux2," ")


mes:
select meses
case $01 aux1 = "J" aux2 = "a" aux3 = "n"
case $02 aux1 = "F" aux2 = "e" aux3 = "b"
case $03 aux1 = "M" aux2 = "a" aux3 = "r"
case $04 aux1 = "A" aux2 = "b" aux3 = "r"
case $05 aux1 = "M" aux2 = "a" aux3 = "i"
case $06 aux1 = "J" aux2 = "u" aux3 = "n"
case $07 aux1 = "J" aux2 = "u" aux3 = "l"
case $08 aux1 = "A" aux2 = "g" aux3 = "o"
case $09 aux1 = "S" aux2 = "e" aux3 = "t"
case $10 aux1 = "O" aux2 = "u" aux3 = "t"
case $11 aux1 = "N" aux2 = "o" aux3 = "v"
case $12 aux1 = "D" aux2 = "e" aux3 = "z"
endselect

sertxd (aux1, aux2, aux3, " ")

ano:
aux1 = anos and $F0 / $0F + $30
aux2 = anos and $0F + $30


sertxd ("20", aux1, aux2,"  ")

hora:

aux1 = horas and $F0 / $0F + $30
aux2 = horas and $0F + $30

if aux1 = "0" then let aux1 = " " : endif
sertxd (aux1, aux2,":")

minuto:

aux1 = minutos and $F0 / $0F + $30
aux2 = minutos and $0F + $30

sertxd (aux1, aux2,":")


segundo:
aux1 = segundos and $F0 / $0F + $30
aux2 = segundos and $0F + $30

sertxd (aux1, aux2)


sertxd (13, 10)
goto menu

Título: Re: [Ajuda] Picaxe 40x2 + ds18b20 +ds1307 + lcd03(i2c)
Enviado por: andre_f_carvalho em 27 de Abril de 2012, 19:14
boas,


vou exerimentar, mas entretanto enviei o prog pelo terminal e consegui ver as horas mas estava  a piscar a imagem mas devia ser de estar a limpar o ecra uma das coisas que me deparei foi o programa so correr no picaxe quando tenho o cabo de programaçao ligado ao pc pelo fidi