collapse

* Posts Recentes

tecnologias web para servidor num MCU por jm_araujo
[09 de Outubro de 2019, 14:47]


Limitador de corrente simples por jm_araujo
[08 de Outubro de 2019, 10:29]


Assemblagem de PCBs - JLCPCB por jm_araujo
[06 de Outubro de 2019, 13:46]


"Arduino vs PIC" por jm_araujo
[06 de Outubro de 2019, 13:42]


UTC555D vs NE555N ? por jm_araujo
[03 de Outubro de 2019, 17:57]


Caixa de música por Alhiados
[02 de Outubro de 2019, 00:30]


Trituradora/Destruidora de cartão em tiras por m90mine
[01 de Outubro de 2019, 21:30]


Perfil 30x30 400mm? por brunus
[30 de Setembro de 2019, 23:35]


Carregador Solar para Baterias - EBay por almamater
[20 de Setembro de 2019, 21:57]


Ajuda na identificação de componente de portatil por m90mine
[20 de Setembro de 2019, 17:19]

Autor Tópico: [Ajuda] Picaxe 40x2 + ds18b20 +ds1307 + lcd03(i2c)  (Lida 40154 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline fre_deri_co

  • Mini Robot
  • *
  • Mensagens: 510
Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
« Responder #135 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"
que sempre se partilhe o conhecimento para que sempre se evolua!!!
Frederico Pereira

Offline andre_f_carvalho

  • Mini Robot
  • *
  • Mensagens: 1.469
    • Pro - andrefcarvalho
Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
« Responder #136 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?

Offline fre_deri_co

  • Mini Robot
  • *
  • Mensagens: 510
Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
« Responder #137 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


que sempre se partilhe o conhecimento para que sempre se evolua!!!
Frederico Pereira

Offline andre_f_carvalho

  • Mini Robot
  • *
  • Mensagens: 1.469
    • Pro - andrefcarvalho
Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
« Responder #138 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

Offline fre_deri_co

  • Mini Robot
  • *
  • Mensagens: 510
Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
« Responder #139 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?!
que sempre se partilhe o conhecimento para que sempre se evolua!!!
Frederico Pereira

Offline andre_f_carvalho

  • Mini Robot
  • *
  • Mensagens: 1.469
    • Pro - andrefcarvalho
Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
« Responder #140 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?

Offline fre_deri_co

  • Mini Robot
  • *
  • Mensagens: 510
Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
« Responder #141 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...
que sempre se partilhe o conhecimento para que sempre se evolua!!!
Frederico Pereira

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.616
  • Helpdesk do sitio
Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
« Responder #142 em: 07 de Outubro de 2010, 22:51 »
Eu gostava e te ajudar, mas não apanho mesmo nada de basic.
Avr fanboy

Offline andre_f_carvalho

  • Mini Robot
  • *
  • Mensagens: 1.469
    • Pro - andrefcarvalho
Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
« Responder #143 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 ;)

Offline fre_deri_co

  • Mini Robot
  • *
  • Mensagens: 510
Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
« Responder #144 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...
que sempre se partilhe o conhecimento para que sempre se evolua!!!
Frederico Pereira

Offline andre_f_carvalho

  • Mini Robot
  • *
  • Mensagens: 1.469
    • Pro - andrefcarvalho
Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
« Responder #145 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 :)

Offline fre_deri_co

  • Mini Robot
  • *
  • Mensagens: 510
Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
« Responder #146 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  ;))
« Última modificação: 07 de Outubro de 2010, 23:26 por fre_deri_co »
que sempre se partilhe o conhecimento para que sempre se evolua!!!
Frederico Pereira

Offline andre_f_carvalho

  • Mini Robot
  • *
  • Mensagens: 1.469
    • Pro - andrefcarvalho
Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
« Responder #147 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

Offline fre_deri_co

  • Mini Robot
  • *
  • Mensagens: 510
Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
« Responder #148 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
que sempre se partilhe o conhecimento para que sempre se evolua!!!
Frederico Pereira

Offline andre_f_carvalho

  • Mini Robot
  • *
  • Mensagens: 1.469
    • Pro - andrefcarvalho
Re: [Ajuda]lcd serial 4x20 (ligação i2c)+ picaxe 40x1
« Responder #149 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
« Última modificação: 09 de Outubro de 2010, 19:20 por andre_f_carvalho »