problema com codigo para GLCD

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

problema com codigo para GLCD

Mensagempor antonio » 02 Abr 2011 19:18

Pessoal tudo bem !!

Estou testando aqui um codigo para escrita num GLCD 128X64, o negocio he o seguinte, estou querendo mostrar na tela do GLCD o horario,temperetura atual e com o keypad 4x4 mostrar o numero que pressionou no momento!

O problema he que não mostra tudo na tela mas sim os codigoa individuias,ou seja não mostra o horario,temperatura e os numeros do keypad tudo de uma vez ,mas se for o codigos individuais jä funciona ,algem pode dar uma ajuda e descobrir undo estou errado??


aqui vai o codigo em C

desde jah agradeço

Código: Selecionar todos
#include <18f452.h>                    //PIC A UTILIZAR
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz)
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //Reset when brownout detected
#FUSES NOPUT                    //No Power Up Timer
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
                              //CRISTAL
#use delay(clock=8000000)               //A 8MHZ

#include <HDM64GS12.c>
#include <graphics.c>

#include <DS1631.c>
#include <DS1307.c>
#include <FLEX_KBD4X4.c>

#use standard_io(a)
#use standard_io(e)
#use standard_io(c)


#define DAL_SCL PIN_C2
#define DAL_SDA PIN_C3

BYTE sec,min,hrs,day,month,yr,dow;

char  v_sec[2]; //
char  v_min[2];  //
char  v_hrs[2];
char  v_day[2];
char  v_month[2];
char  v_yr[2];
char  v_dow[2];
char  kk[2];
char  ponto[2]=":";
char mystring[20];
long adc;
int i,k=0;

main() {

//BYTE sec,min,hrs,day,month,yr,dow;
setup_ccp1(ccp_off);
setup_ccp2(ccp_off);

kbd_init();//inicilaliza o teclado
init_temp();//inicializa a temperatura
ds1307_init();//inicializa calendario

glcd_init(ON);   // iniciamos o lcd                             
glcd_fillScreen(OFF); //LIMPAMOS 

ds1307_set_date_time(15,6,5,2,22,35,00);

glcd_rect(0,0,127,15,0,1);
glcd_text57(18,5,ponto,1,on);
glcd_text57(38,5,ponto,1,on);

while(true){

{
ds1307_get_date(day,month,yr,dow);
ds1307_get_time(hrs,min,sec);

sprintf(v_hrs,"%02u",hrs);
glcd_text57(5,5,v_hrs,1,on);
sprintf(v_min,"%02u",min);
glcd_text57(25,5,v_min ,1,on);
sprintf(v_sec,"%02u",sec);
glcd_text57(45,5,v_sec ,1,on);
{



  k=kbd_getc();
   if(k!=0){
   k=k-48;
   sprintf(kk,"%02u",k);
   glcd_text57(10,35,kk ,1,on);
   }
   
   
adc = read_temp_c();
sprintf(mystring,"%f", (float)adc);
glcd_text57(50, 5, mystring, 1, ON);

}

}
}
}
antonio
Byte
 
Mensagens: 209
Registrado em: 15 Out 2006 12:34

Re: problema com codigo para GLCD

Mensagempor andre_luis » 02 Abr 2011 20:32

Antonio,

Voce poderia detalhar mais o problema em si, do tipo, informando como voce fez os testes ? O que aparece é sempre o último parametro do código, após o teclado ? ( tenho uma suspeita, mas queria confirmar )

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor antonio » 03 Abr 2011 08:08

Hoi Andre !

Bem ...o problema è o seguinte o ciclo while não funciona com os 3 parametros juntos ,ou seja com o teclado, temperatura e relogio!no mesmo ciclo.

Exemp;

Código: Selecionar todos
while(true){

{
ds1307_get_date(day,month,yr,dow);
ds1307_get_time(hrs,min,sec);

sprintf(v_hrs,"%02u",hrs);
glcd_text57(5,5,v_hrs,1,on);
sprintf(v_min,"%02u",min);
glcd_text57(25,5,v_min ,1,on);
sprintf(v_sec,"%02u",sec);
glcd_text57(45,5,v_sec ,1,on);
{


Assim o ciclo while funciona ou seja o relogio funciona legal! assim como para o teclado e temperatura !
agora se eu ponho os 3 parametros dentro do while não funciona nenhum dos parametros , o relogio temperatura e teclado !
o ciclo while abaixo não funciona !
Exemplo;
Código: Selecionar todos

while(true){

{
ds1307_get_date(day,month,yr,dow);
ds1307_get_time(hrs,min,sec);

sprintf(v_hrs,"%02u",hrs);
glcd_text57(5,5,v_hrs,1,on);
sprintf(v_min,"%02u",min);
glcd_text57(25,5,v_min ,1,on);
sprintf(v_sec,"%02u",sec);
glcd_text57(45,5,v_sec ,1,on);
{



  k=kbd_getc();
   if(k!=0){
   k=k-48;
   sprintf(kk,"%02u",k);
   glcd_text57(10,35,kk ,1,on);
   }
   
   
adc = read_temp_c();
sprintf(mystring,"%f", (float)adc);
glcd_text57(50, 5, mystring, 1, ON);

}

}
}
}


Eu jah fiz tudos os testes com FOR() WHILE () abre chave fechando chave etc, mas os 3 parametros dentro do mesmo ciclo não me funciona !
O que stou fazendo errado??
Caso não foi muito claro , estejam o vontade em perguntar !!
Desde jah agradeço
antonio
Byte
 
Mensagens: 209
Registrado em: 15 Out 2006 12:34

Mensagempor andre_luis » 03 Abr 2011 11:03

Mesmo se voce não apertar qualquer tecla, não aparece nada ?

Dica : Retira a rotina do teclado e vê como o resto se comporta.

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor styg » 03 Abr 2011 12:21

Cara, pra começar, se você usar indentação no seu código fica bem mais fácil de analisar, tanto a gente quanto você. Seu código mais legível ficaria assim:

Código: Selecionar todos
main()
{
//BYTE sec,min,hrs,day,month,yr,dow;
setup_ccp1(ccp_off);
setup_ccp2(ccp_off);

kbd_init();//inicilaliza o teclado
init_temp();//inicializa a temperatura
ds1307_init();//inicializa calendario

glcd_init(ON);   // iniciamos o lcd                             
glcd_fillScreen(OFF); //LIMPAMOS

ds1307_set_date_time(15,6,5,2,22,35,00);

glcd_rect(0,0,127,15,0,1);
glcd_text57(18,5,ponto,1,on);
glcd_text57(38,5,ponto,1,on);

while(true)
   {
      {
      ds1307_get_date(day,month,yr,dow);
      ds1307_get_time(hrs,min,sec);

      sprintf(v_hrs,"%02u",hrs);
      glcd_text57(5,5,v_hrs,1,on);
      sprintf(v_min,"%02u",min);
      glcd_text57(25,5,v_min ,1,on);
      sprintf(v_sec,"%02u",sec);
      glcd_text57(45,5,v_sec ,1,on);
         {
         k=kbd_getc();
         if(k!=0)
            {
            k=k-48;
            sprintf(kk,"%02u",k);
            glcd_text57(10,35,kk ,1,on);
            }
         adc = read_temp_c();
         sprintf(mystring,"%f", (float)adc);
         glcd_text57(50, 5, mystring, 1, ON);
         }
      }
   }
}


Pra mim, tem muitas chaves inuteis no teu codigo, eu reescreveria assim:

Código: Selecionar todos
main()
{
//BYTE sec,min,hrs,day,month,yr,dow;
setup_ccp1(ccp_off);
setup_ccp2(ccp_off);

kbd_init();//inicilaliza o teclado
init_temp();//inicializa a temperatura
ds1307_init();//inicializa calendario

glcd_init(ON);   // iniciamos o lcd                             
glcd_fillScreen(OFF); //LIMPAMOS

ds1307_set_date_time(15,6,5,2,22,35,00);

glcd_rect(0,0,127,15,0,1);
glcd_text57(18,5,ponto,1,on);
glcd_text57(38,5,ponto,1,on);

while(true)
   {
   ds1307_get_date(day,month,yr,dow);
   ds1307_get_time(hrs,min,sec);

   sprintf(v_hrs,"%02u",hrs);
   glcd_text57(5,5,v_hrs,1,on);
   sprintf(v_min,"%02u",min);
   glcd_text57(25,5,v_min ,1,on);
   sprintf(v_sec,"%02u",sec);
   glcd_text57(45,5,v_sec ,1,on);

   k=kbd_getc();
   if(k!=0)
      {
      k=k-48;
      sprintf(kk,"%02u",k);
      glcd_text57(10,35,kk ,1,on);
      }

   adc = read_temp_c();
   sprintf(mystring,"%f", (float)adc);
   glcd_text57(50, 5, mystring, 1, ON);
   }
}


Veja que essa é uma dica genérica, independente do teu mcu.
[/code]
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Mensagempor antonio » 03 Abr 2011 12:51

Incrivel mas não roda nem a forte reza!!

Pessoal eu jàh testei tudo mas não funciona !!

Com o exemplo do colega Lucas a unica que funciona eh o relogio , na temperatura aparece 0.00 e mais nada,no teclado nada quer pressiona ou não uma tecla ¨!

depois meti um for() no parametro teclado para testar , e aí funcionou beleza o teclado mas o resto ficou bloqueado!

Nota ...em relação a temperatura penso que para mostrar a temperatura o formato não seja o mais correto ,mas dando uma pesquisa não encontrei nada que me ajudasse visto eu querer mostrar em formato decimal!
Como vou resolver isto??

a modificaçao !
Código: Selecionar todos
while(true)
{
ds1307_get_date(day,month,yr,dow);
ds1307_get_time(hrs,min,sec);

sprintf(v_hrs,"%02u",hrs);
glcd_text57(5,5,v_hrs,1,on);
sprintf(v_min,"%02u",min);
glcd_text57(25,5,v_min ,1,on);
sprintf(v_sec,"%02u",sec);
glcd_text57(45,5,v_sec ,1,on);

   for(;;){  // com este for funciona bz o teclado ,mas não o resto
          k=kbd_getc();
              if(k!=0)
                 {
                 k=k-48;
                   sprintf(kk,"%02u",k);
                    glcd_text57(10,35,kk ,1,on);
                   }
          }
adc = read_temp_c();
sprintf(mystring,"%f", (float)adc);
glcd_text57(50, 35, mystring, 1, ON);
}
}
antonio
Byte
 
Mensagens: 209
Registrado em: 15 Out 2006 12:34

Mensagempor styg » 03 Abr 2011 13:42

Antonio,

essa função kbd_getc(), ela aguarda até que uma tecla seja pressionada ou ela só checa se tem uma chave pressionada naquele momento?

imagino que ela cheque só no momento, por isso quando fez um loop infinito funcionou o teclado.

também por isso não funciona o resto (loop infinito)

quanto a função de escrita no glcd, será que uma escrita não está sobrepondo outra?

e a temp se nao quiser mostrar em float pode fazer com int. multplica a leitura do adc por 100 p exemplo 23.15°C ficaria 2315, aí na hora de escrever faz algo como:

Código: Selecionar todos
t1 = (2315 / 100);
t2 = (2315 % 100);
sprintf(mystring,"%2i.%2i°C",t1,t2;


ou ainda

Código: Selecionar todos
t1 = (2315 / 1000);
t2 = (2315 % 1000) / 100;
t3 = (2315 % 100) / 10;
t4 = (2315 % 10);
lcd_data_out(t1+0x30);
lcd_data_out(t2+0x30);
lcd_data_out(0x2E);
lcd_data_out(t3+0x30);
lcd_data_out(t4+0x30);
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Mensagempor antonio » 03 Abr 2011 15:24

A função kbd_getc() o que faz eh quando pressiona uma tecla mostra a tecla no glcd, ficando assim a mostrar essa tecla atè que seja precionada outra !

A função de escrita esta bem ,não se sobreponte em qualquer outra !pelo menos penso eu !

A função de temperatura esta dando pau, não sei ao certo porque não mostra direito a temperatura !

Bem aceito mais ajuda caso ainda seja possivel! os meus conhecimentos chegaram ou estõ chegando ao fim!
antonio
Byte
 
Mensagens: 209
Registrado em: 15 Out 2006 12:34

Mensagempor andre_luis » 03 Abr 2011 15:42

Em que pinos do uC está ligado o barramento do DS1307 ?

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor antonio » 03 Abr 2011 16:03

andre_teprom escreveu:Em que pinos do uC está ligado o barramento do DS1307 ?

+++


Andre os pinos sao 17 e 18
Pino 17=RC2->SCL
Pino 18=RC3->SDA

Cara eu usei estes pinos porque foi os que estavam livres !
antonio
Byte
 
Mensagens: 209
Registrado em: 15 Out 2006 12:34

Re: problema com codigo para GLCD

Mensagempor andre_luis » 03 Abr 2011 16:32

antonio escreveu:
Código: Selecionar todos
#define DAL_SCL PIN_C2
#define DAL_SDA PIN_C3



Os mesmos pinos no qual o DS1631 já está pendurado ?

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: problema com codigo para GLCD

Mensagempor antonio » 03 Abr 2011 16:45

andre_teprom escreveu:
antonio escreveu:
Código: Selecionar todos
#define DAL_SCL PIN_C2
#define DAL_SDA PIN_C3



Os mesmos pinos no qual o DS1631 já está pendurado ?

+++


Sim..a unica diferença eh o endereço do DS1631 do ds1307 são diferentes!
antonio
Byte
 
Mensagens: 209
Registrado em: 15 Out 2006 12:34

Re: problema com codigo para GLCD

Mensagempor andre_luis » 03 Abr 2011 19:30

Antonio,

Mas um trabalha com I2C e outro com SPI.
Tenha em mente que nem quando os 2 periféricos sejam I2C não é garantia de funcionamento, caso os 2 tenham barramento de endereço interno com tamanho diferentes ( ex.: 8 bits x 16 bits ).

Já passei por isso ao tentar utilizar no mesmo barramento físico um DS1307 e um 24C64.

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: problema com codigo para GLCD

Mensagempor antonio » 04 Abr 2011 03:33

andre_teprom escreveu:Antonio,

Mas um trabalha com I2C e outro com SPI.
Tenha em mente que nem quando os 2 periféricos sejam I2C não é garantia de funcionamento, caso os 2 tenham barramento de endereço interno com tamanho diferentes ( ex.: 8 bits x 16 bits ).

Já passei por isso ao tentar utilizar no mesmo barramento físico um DS1307 e um 24C64.

+++


Não os dois trabalham com I2C (eu SPI nunca trabalhei)

Andre eu fiz um codigo em C parecido com este para um PIC 16F877A e um LCD 16x2,com o DS1307 e o DS1631 no mesmo barramento e funcionou beleza !

Agora estou fazendo os teste para o uc 18F452 e GLCD e esta dando PAU , penso devia funcionar sem problema tambem visto as diferencas serem poucas do 16F877A para 18F452 e do LCD 16X2 para o GLCD!

Procurando na net não tenho encontrado nada de jeito , penso que o pessoal gosta pouco do funcionamento do GLcd ! penso eu !!

Vou continuando com os testes,mas me reta pouco para continuar !com pena minha claro!
antonio
Byte
 
Mensagens: 209
Registrado em: 15 Out 2006 12:34

Mensagempor andre_luis » 04 Abr 2011 20:33

styg escreveu:...será que uma escrita não está sobrepondo outra?...


Isso faz bastante sentido.
Poderia considerar essa possibilidade.

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Próximo

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x