Mikroc - Programa não funciona

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Mensagempor gilliard » 05 Ago 2009 11:33

:D :D Primeiramente, muuuito obrigado a todos, esse forum é nota 1000. :D :D

Então galera, vamos lá:

Não estou sabendo explicar oque eu quero fazer, vou tentar explicar melhor.

Executei a rotina menu().

- Exibe no lcd AGUARDANDO....
- Aguarda algo ser digitado
- Pimba, detectou que foi pressionado a tecla 1.
- Começa a executar uma rotina externa, chamada um().
- Executa oque esta dentro da rotina um().
- Pode ser acender led, ou rodar motor ou tocar sirene, ou qualquer outra coisa, isso é de menos.

Eu só estou precisando que a rotina menu(), exibe AGUARDANDO, depois ( Fica em modo de espera, aguardando algo ser digitado, dentro da rotina menu() ) depois que detectar que algo foi digitado, executa a rotina destinada aquele digito, que serão somente 4 opções, tipo:

- digito 1 = um()
- digito 2 = dois()
- digito 3 = tres()
- digito 4 = quatro()

Não é problema de hadware, pois estou usando o mesmo hardware, que ja usei para varios outros projetos, a rotina de teclado esta OK, apenas estou tentando criar outro software, entenderam ?!?!?

Bom, muito obrigado a todos, pelas colaborações, queria poder ter a oportunidade de solucionar esse problema com vocês.

Um forte abraço a todos, vocês são nota 1000.
Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Mensagempor ze » 05 Ago 2009 15:42

aaaaaiiii... num puxa forte não...dói...!
As dicas do brown já seriam suficientes...mas...

verifique se a função teclado() está saindo MESMO com os valores conhecidos '1','2',etc. pra tal façanha faça 1 prog só pra teste tipo:
for(; ; )
{
lcdout(1,1,teclado());
}
e corrija as equalizações se for o caso.

abç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor gilliard » 05 Ago 2009 18:35

Boa Tarde lellis, referente sua insinuação, acho desnecessaria, pois não sou de puxar saco de ninguem.

Eu apenas sou fã desse forum, sempre frequentei esse forum, é muito bom, e o pessoal é tudo profissional no que fazem.

Realmente todos são nota 1000. Na real !!!!
Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Mensagempor Andre_Cruz » 05 Ago 2009 21:40

gilliard,

Não programo com o CCS, vou tentar fazer em C ANSI, com português rsrsrss

While (1) {
Mostra a mensagem no LCD

Switch(menu) {
case0: // tecla 0
sai = 1
Chama função referente a tecla 0
break;

case1: // tecla 1
sai = 1
Chama função referente a tecla 1
break
}// Switch(menu)
}// While (1)

Função da tecla0
while(sai) {
Aqui faz o que a tecla 0 deve fazer, e para sair da função da tecla 0 você faz o while ficar falso, SAI = 0
}

Função da tecla1
while(sai) {
Aqui faz o que a tecla 1 deve fazer, e para sair da função da tecla 1 você faz o while ficar falso, SAI = 0
}

Espero ter ajudado a surgir alguma idéia, se te confundi mais ainda me desculpe.

Abraço
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Mensagempor joao » 06 Ago 2009 05:46

Ola Giliard,

Acho que vc não entendeu a gente! :)

O problema é que todos entenderam o que vc quer fazer, mas da maneira que vc está escrevendo, eu(e provavelmente os outros) ainda continuamos não entendendo exatamente qual é o seu problema. Foi isso que o Lellis tentou dizer no post dele. :)

Outra coisa, aparentemente o seu código está CORRETO. Ou seja, ninguém achou um erro de lógica nele até agora, por isso que ninguém disse algo simples do tipo: "mude está linha e pronto." O que estamos tentando fazer é dar possíveis micro testes para você poder deixar o problema o menor possível. Quando você fala, o problema está na função menu() que não está funcionando, isso não nos diz nada demais, porque aparentemente está OK este pedaço de código, por isso que temos que tentar quebrar este erro em partes menores, ok?

Então, infelizmente, o que eu posso lhe pedir agora, é tentar responder as perguntas que eu te farei novamente aqui:

- Qual exatamente é o seu problema? O Menu() é apenas 1 função, então não vale dizer que é a função menu(), ok? ;) O que na função menu() não está rolando? A mensagem no LCD aparece? O problema é apenas porque não está recebendo os valores do teclado()?

- Como você pode ter certeza que a função teclado() está funcionando? Para isso, você tem que pegar o código do lellis e sobrescrever a sua função menu(), como:
Código: Selecionar todos
void menu()
{
    for(; ; )
    {
            lcdout(1,1,teclado());
     }
}

isso vai mostrar os valores retornados pela função teclado diretamente no LCD, dai vc vai poder verificar que o valor 0 do teclado é 0 no LCD. Veja bem, não estou dizendo que vc tem problemas de HW(Você falou que isso está OK) mas pode ser problema de configuração de SW para usar o HW, entende?

- Se o teclado está funcionando(testado acima), se o LCD está funcionando(porque está mostrando a mensagem na telinha) então pode ser o problema que eu te disse no último post. O tempo de espera que você está deixando é muito pequeno. Dai mude o código para isso( a função menu novamente!):

Código: Selecionar todos
void menu()
{
unsigned char tecla;

                //-------------------------------
                Lcd_custom_Cmd(Lcd_Clear); // Limpa o LCD 16x2 //
                Lcd_custom_out(1,1,"Aguardando Digito..."); // deixa a palavra "Aguardando Digito..." no LCD
                Delay_ms(20);
                //-------------------------------

                do {
                    tecla=0;// limpa o valor atual do teclado

                while (tecla==0) tecla=teclado(); // Aguarda algo ser digitado
               
                if(tecla=='1'){ // Se for digitado 1
                lcd_1();        // Executa a rotina lcd_1()
                }
               
                if(tecla=='2'){ // Se for digitado 2 então executa a rotina lcd_2()
                lcd_2();        // Executa a rotina lcd_2()
                }
                    } while(1); // Faz isso eternamente
}


- Se isso funcionar, dai vc pode finalmente tentar fazer o que o Andre_cruz sugeriu, que é usar o switch no lugar do if (é porque pessoalmente eu acho mais fácil de ler usando o switch no lugar do if ):
Código: Selecionar todos
void menu()
{
unsigned char tecla;

                //-------------------------------
                Lcd_custom_Cmd(Lcd_Clear); // Limpa o LCD 16x2 //
                Lcd_custom_out(1,1,"Aguardando Digito..."); // deixa a palavra "Aguardando Digito..." no LCD
                Delay_ms(20);
                //-------------------------------

                do {
                    tecla = teclado();
                    Switch(menu) {
                        case '1' : 
                               lcd_1();        // Executa a rotina lcd_1()
                               break;
                        case '2' : 
                               lcd_2();        // Executa a rotina lcd_1()
                               break;
                } while(1); // Faz isso eternamente
}
Como já diria um grande amigo: Só sei que nada sei!!!
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor ze » 06 Ago 2009 09:45

se depois desta do amigo joão, não der um passo sequer, sugiro que (1).

apesar de membro há bem tempo, parece desconhecer nosso estilo literário (meu de pelo - + 2) descontraído e principalmente extremamente inofensivo.
Mas caso esteja se sentindo meio emotivo, peço-te perdão (discurpintão rs) pro c. se não, vatomanocuidado com suas palavras pois pode reduzir em 1 neurônio o total de pensantes nesta casa de bilhões. (!do !=)

(1) Amigo que tal se começasse pelo + nobre uso do pic 2º +1 doido daqui? piscar um led!! é uma loucura!! conte com este idiota que vos tecla idiotices pra tal feito. só sei fazer isso!
o quê? já conseguiu?!! então passo a bola pros + experts!

abç e rs.
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor r.bertini » 14 Ago 2009 17:17

Rodei o seu projeto no proteus com o código que você postou junto.

Ao iniciar a simulação as linhas do teclado ficam em nível lógico 1 e as colunas em 0 quando se aperta uma tecla a coluna vai pra 1, mas a linha não vai pra 0.

por isso que não funciona, vou procurar uma solução e posto se descobrir algo.

Esse ckt é somente virtual ou você está simulando um ckt já pronto?

[]'s
R.Bertini
__________________________________
#include<stdio.h>
main()
{
printf("\n R.Bertini");
}
r.bertini
Bit
 
Mensagens: 28
Registrado em: 30 Ago 2008 01:43

Mensagempor Djalma Toledo Rodrigues » 14 Ago 2009 19:51

Se o teclado é matrixial quando click uma tecla o que se obtem é as coordenadas
Coluna / Linha dessa tecla .
Há que converter isso para significado da tecla.

Foi feito assim ?
.
Editado pela última vez por Djalma Toledo Rodrigues em 14 Ago 2009 20:26, em um total de 1 vez.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor r.bertini » 14 Ago 2009 19:58

r.bertini escreveu:Rodei o seu projeto no proteus com o código que você postou junto.

Ao iniciar a simulação as linhas do teclado ficam em nível lógico 1 e as colunas em 0 quando se aperta uma tecla a coluna vai pra 1, mas a linha não vai pra 0.

por isso que não funciona, vou procurar uma solução e posto se descobrir algo.

Esse ckt é somente virtual ou você está simulando um ckt já pronto?

[]'s


Veja se isso te ajuda:

http://rapidshare.com/files/267465913/t ... matriz.rar

Código: Selecionar todos
/********************** Variáveis Globais *************************/
unsigned char tecla;
/******************************************************************/

/*************************** Funções ******************************/

void menu(){
     Lcd_Out(1, 1, "Escolha a função:");
     Delay_ms(50);
     }
     
void func_1(){
     Lcd_Cmd(LCD_CLEAR);
     Lcd_Out(1,5, "Função 1");
     Lcd_Out(2,5, "Ativada");
     Delay_ms(500);
     Lcd_Cmd(LCD_CLEAR);
     }

void func_2(){
     Lcd_Cmd(LCD_CLEAR);
     Lcd_Out(1,5, "Função 2");
     Lcd_Out(2,5, "Ativada");
     Delay_ms(500);
     Lcd_Cmd(LCD_CLEAR);
     }
     
void func_3(){
     Lcd_Cmd(LCD_CLEAR);
     Lcd_Out(1,5, "Função 3");
     Lcd_Out(2,5, "Ativada");
     Delay_ms(500);
     Lcd_Cmd(LCD_CLEAR);
     }
/***********************************************************************/

void main() {
  Keypad_Init(&PORTB);
  Lcd_Init(&PORTD);         // Initialize LCD on PORTC
  Lcd_Cmd(LCD_CLEAR);       // Clear display
  Lcd_Cmd(LCD_CURSOR_OFF);  // Cursor off


  do {
     menu();

    do
       tecla = Keypad_Released();
    while (!tecla);

    if(tecla==1) func_1();
    else if (tecla==5) func_2();
    else if (tecla==9) func_3();

  } while (1);
}


Aqui no meu proteus funfou que é uma belezura.
Qualquer coisa tamos ae!!

[]'s
R.Bertini
__________________________________
#include<stdio.h>
main()
{
printf("\n R.Bertini");
}
r.bertini
Bit
 
Mensagens: 28
Registrado em: 30 Ago 2008 01:43

Anterior

Voltar para PIC

Quem está online

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

x