Mikroc - Programa não funciona

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Mikroc - Programa não funciona

Mensagempor gilliard » 04 Ago 2009 10:17

:D Falae Pessoal, quanto tempo :D

Faz um tempão que não passava por aqui, por estar super atarefado, e quero falar que é um prazer reve-los galera, de verdade !!!!

:arrow: Bom, pessoal !!!!

Eu estou criando um programinha no compilador MikroC, para estudar, e não esta funcionando.

Ele tem que fazer o seguinte:

Dentro do void main, estou chamando uma rotina que eu denominei como menu(), e essa rotina menu(), tem que fazer o seguinte:

Código: Selecionar todos
menu(){

   Lcd_custom_Cmd(Lcd_Clear); // Limpa o LCD 16x2
   Lcd_custom_out(1,1," Hello World !!!! "// Exibe no lcd " Hello World !!!! "
   Delay_ms(9000); // Por 9 segundos

Ao iniciar a rotina, queria que fosse exibido no LCD a palavra HELLO WORLD, e aguarda algo ser digitado:

Apertou tecla 1, chama rotina um();
Apertou tecla 2, chama rotina dois();
Apertou tecla 3, chama rotina tres();
Apertou tecla 4, chama rotina quatro();



:P :P :P :P :P :P :P Pessoal, alguem me ajudaria a fazer isso funcionar. :P :P :P :P :P :P :P

Muuuuuuuuuito obrigado desde já a todos, toda ajuda será muuuito bem vinda.
Abração Pessoal !!!!
Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Mensagempor fabim » 04 Ago 2009 10:53

Coloca todo o programa que você ja fez, aqui..
Aí sim podemos ajudar.

Abraços
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor gilliard » 04 Ago 2009 12:47

:D Beleza, ta aqui o meu programinha :D

Código: Selecionar todos

//********** Inicio da rotina do teclado **********//

unsigned char teclado()
{
      unsigned char tecla;
      tecla=0;
      trisd= 0x0F;            //configura portd como entrada(teclado) e saida(LCD)
      portb.f0= 0;        //habilita primeira coluna  do teclado



      if (Button(&PORTD, 3, 50, 0)) tecla='1';
      if (Button(&PORTD, 2, 50, 0)) tecla='4';
      if (Button(&PORTD, 1, 50, 0)) tecla='7';
      if (Button(&PORTD, 0, 50, 0)) tecla='*';



      portb.f0= 1;        //desabilita primeira coluna do teclado
      delay_ms(1);
      portb.f1= 0;        //habilita segunda coluna do teclado
      if (Button(&PORTD, 3, 50, 0)) tecla='2';
      if (Button(&PORTD, 2, 50, 0)) tecla='5';
      if (Button(&PORTD, 1, 50, 0)) tecla='8';
      if (Button(&PORTD, 0, 50, 0)) tecla='0';



      portb.f1= 1;        //desabilita segunda coluna do teclado
      delay_ms(1);
      portb.f2= 0;        //habilita terceira coluna do teclado
      if (Button(&PORTD, 3, 50, 0)) tecla='3';
      if (Button(&PORTD, 2, 50, 0)) tecla='6';
      if (Button(&PORTD, 1, 50, 0)) tecla='9';
      if (Button(&PORTD, 0, 50, 0)) tecla='#';



      portb.f2= 1;        //desabilita terceira coluna do teclado
      delay_ms(100);
      return (tecla);
}

//********** Fim da rotina do teclado **********//

//********** Inicio da configuração do LCD 16x2 **********//

void inicializa_lcd(void){
Lcd_custom_Config(&PORTD,7,6,5,4.&PORTE,2,0,1);   // configurar as portas
Lcd_custom_Cmd(LCD_BLINK_CURSOR_ON);            // Apaga o cursor do LCD 16x2
Delay_ms(100);                                                      // Da um delay de 100 milisegundos
}

//********** Fim da configuração do LCD 16x2 **********//

//********** Inicio da rotina menu() **********//

menu(){

   Lcd_custom_Cmd(Lcd_Clear);                   // Limpa o LCD 16x2
   Lcd_custom_out(1,1," Hello World !!!! ");    // Exibe no lcd " Hello World !!!! "
   Delay_ms(9000);                                     // Por 9 segundos

Ao iniciar a rotina, queria que fosse exibido no LCD a palavra HELLO WORLD, e aguarda algo ser digitado:

Apertou tecla 1, chama rotina um();
Apertou tecla 2, chama rotina dois();
Apertou tecla 3, chama rotina tres();
Apertou tecla 4, chama rotina quatro();

//********** Fim da rotina menu() **********//

//********** Inicio do programa principal **********//
void main(){

trisd= 0x0F;     // Configura portd como entrada(teclado) e saida ( LCD )
trisa= 0;          // Configura porta como saida
trisc= 0;           // Configura portc como saida
inicializa_lcd(void) // Inicializa subrotina de inicialização do lcd
trisb= 0;           // Configura portb como saida

menu(); // chama a rotina menu()

}
//********** Inicio do programa principal **********//



:D :D :D :D :D Abração a todos, e obrigado por tudo. :D :D :D :D :D
Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Mensagempor gilliard » 04 Ago 2009 13:50

:D Porfavor Galera, me ajudem !!!! :D
Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Mensagempor fabim » 04 Ago 2009 13:57

qual UC você esta utilizando ?
OBS>: PORTE OU TRISE, não me lembro bem agora.
Tem que ser configurado, para que o PORTD seja uma porta e não interface PSP.

Abraços
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor gilliard » 04 Ago 2009 17:02

:D Galera, peço desculpa a todos, mas acho que não estou conseguindo me expressar bem. Vou tentar novamente. Estou utilizando pic 18f452 a 8 mhz.

Galera, eu apenas quero fazer uma rotina chamada menu(), que faça o seguinte:

Apertou tecla 1, chama rotina um();
Apertou tecla 2, chama rotina dois();
Apertou tecla 3, chama rotina tres();
Apertou tecla 4, chama rotina quatro();

Só isso que eu preciso, mais nada. Como posso montar isso, alguem me ajuda a desenvolver a rotina ?!?!?

Abraço
Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Mensagempor renanwalenczuk » 04 Ago 2009 17:35

while(1)
{
Lcd_custom_Cmd(Lcd_Clear);
Lcd_custom_out(1,1," Hello World !!!! ");
if(botao 1 presionado) rotina1();
if(botao 2 presionado) rotina2();
}

Nunca usei mikroc, então troque "botao n pressionado" pela condição em questão.(testar o botão no caso)

abraço
"O segredo da criatividade é saber como esconder as fontes."
Albert Einstein
renanwalenczuk
Nibble
 
Mensagens: 69
Registrado em: 17 Nov 2008 14:22
Localização: Canoas - RS

Mensagempor gilliard » 04 Ago 2009 17:45

Então renanwalenczuk, ´obrigado pela força amigo.

Então, é exatamente a condição " botão 1 pressionado ", que estou com dificuldades.

Abração, e desde já, muito obrigado
Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Mensagempor gilliard » 04 Ago 2009 18:37

Segue projeto no proteus para vocês testarem meu codigo abaixo, me ajudem.

A rotina void menu(), não esta fazendo, oque deveria fazer.

Link do circuito no proteus:

http://d01.megashares.com/dl/4f70217/circuito.zip

Código: Selecionar todos
//************** Inicio da rotina do teclado **********//

unsigned char teclado()
{
      unsigned char tecla;
      tecla=0;
      trisd= 0x0F;            //configura portd como entrada(teclado) e saida(LCD)
      portb.f0= 0;        //habilita primeira coluna  do teclado

      if (Button(&PORTD, 3, 50, 0)) tecla='1';
      if (Button(&PORTD, 2, 50, 0)) tecla='4';
      if (Button(&PORTD, 1, 50, 0)) tecla='7';
      if (Button(&PORTD, 0, 50, 0)) tecla='*';

      portb.f0= 1;        //desabilita primeira coluna do teclado
      delay_ms(1);
      portb.f1= 0;        //habilita segunda coluna do teclado
      if (Button(&PORTD, 3, 50, 0)) tecla='2';
      if (Button(&PORTD, 2, 50, 0)) tecla='5';
      if (Button(&PORTD, 1, 50, 0)) tecla='8';
      if (Button(&PORTD, 0, 50, 0)) tecla='0';

      portb.f1= 1;        //desabilita segunda coluna do teclado
      delay_ms(1);
      portb.f2= 0;        //habilita terceira coluna do teclado
      if (Button(&PORTD, 3, 50, 0)) tecla='3';
      if (Button(&PORTD, 2, 50, 0)) tecla='6';
      if (Button(&PORTD, 1, 50, 0)) tecla='9';
      if (Button(&PORTD, 0, 50, 0)) tecla='#';

      portb.f2= 1;        //desabilita terceira coluna do teclado
      delay_ms(100);
      return (tecla);
}
//************** Fim da rotina do teclado **********//

//********** Inicio da configuração do LCD 16x2 **********//
void inicializa_lcd(void){
   Lcd_custom_Config(&PORTD,7,6,5,4,&PORTE,2,0,1); // Configura portas //
   Lcd_custom_Cmd(LCD_BLINK_CURSOR_ON); // Apaga o cursor do LCD 16x2 //
   delay_ms (100); // Da um delay de 100 milisegundos //
}
//********** Fim da configuração do LCD 16x2 **********//

//********** Inicio da configuração da tela padrão do LCD_1 **********//
void lcd_1()
{
   Lcd_custom_Cmd(Lcd_Clear); // Limpa o LCD 16x2 //
   Lcd_custom_out(1,1,"DEU CERTO 1:"); // deixa a palavra "DEU CERTO 1:" no LCD
   Delay_ms(20);
}
//********** Fim da configuração da tela padrão do LCD_1 **********//

//********** Inicio da configuração da tela padrão do LCD_2 **********//
void lcd_2()
{
   Lcd_custom_Cmd(Lcd_Clear); // Limpa o LCD 16x2 //
   Lcd_custom_out(1,1,"DEU CERTO 2:"); // deixa a palavra "DEU CERTO 2:" no LCD
   Delay_ms(20);
}
//********** Fim da configuração da tela padrão do LCD_2 **********//

//********** Inicio da configuração da tela padrão do LCD **********//
void menu()
{
unsigned char tecla;

                do {
                    tecla=0;// limpa o valor atual do teclado
                //-------------------------------
                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);
                //-------------------------------

                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
}
//********** Fim da configuração da tela padrão do LCD **********//

//********** Rotina de gravação de nova senha**********//

void main() {

   adcon1= 0x06;          //define pinos AD como I/O de uso geral
   trisd= 0x0F;            //configura portd como entrada(teclado) e saida(LCD)
   trisa= 0;              //configura porta como saida
   inicializa_lcd(void);  //chama subrotina de inicialização do lcd
   portb= 255;            //portb em FF
   portd= 255;            //portd em FF
   
   menu();                // Chama a rotina menu()
}

//********** Fim da configuração principal ******

Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Mensagempor Gilsom » 04 Ago 2009 22:01

gilliard no Mikroc tem um exemplo de Teclado com Display,o seu arquivo tem erros e não deu para compilar.Eu fiz um dezenho e uma simulação com o exemplo do Microc,esta neste site abaixo.De uma estudada nele espero que te ajude.

Gilsom


http://rapidshare.com/files/263824285/Menu.rar.html
Gilsom
Nibble
 
Mensagens: 50
Registrado em: 15 Dez 2006 11:22

Mensagempor joao » 05 Ago 2009 06:57

Ola,

Gilliard, eu também não trabalho com MikroC, mas procurando na net sobre o assunto, tem algumas coisas que seria interessante vc olhar:

- Nesse seu último código, o TRISB=0 não existe mais. Não seria necessário incluir?

- if (Button(&PORTD, 3, 50, 0)) - Porque vc usou 50milisegundos? Nos exemplos que achei, eles usam apenas 1. E o porque você está verificando em 0 o último parametro? Pelo o que eu entendi no manual, se vc quer verificar se está pressionado, você tem que usar 1. Tente checkar isso.

- Você não está usando conversor AD né? Então não seria correto usar isso:
Código: Selecionar todos
 ADCON1 = 0b00000000; //Todos os pinos digital


- Pelo o que eu entendi, vc está deixando td sempre setado para 1 e a hora de checkar vc verifica se o botão não tem energia. Caso nào tenha, é o botão pressionado. Tem certeza que é assim? Eu achava que era td setado para 0 e dai a cada coluna vc habilitava para 1 e verificava se naquela coluna tinha algum botão pressionado, com valor lógico 1.

- E o que exatamente está acontecendo? Você disse que não tá funcionando após o menu(). Mas exatamente o que acontece? Você tem a mensagem: "Aguardando Digito..." aparecendo? Se sim, não tem como você imprimir o valor de tecla depois do Delay_ms(20), para ver o que está vindo de tecla?
Acho que o código seria + - assim:

Código: Selecionar todos
                Lcd_custom_out(1,1,"Aguardando Digito..."); // deixa a palavra "Aguardando Digito..." no LCD
                Delay_ms(20);
                //-------------------------------

                while (tecla==0) tecla=teclado(); // Aguarda algo ser digitado
                Lcd_custom_Cmd(Lcd_Clear); // Limpa o LCD 16x2 //
                Lcd_Custom_Chr(1,1, tecla); //Imprimi tecla pressionada
                Delay_ms(5000);  //5  segundos de delay.
                if(tecla=='1'){ // Se for digitado 1


Se nem o LCD está funcionando, eu te aconselho a começar a verificar o LCD, usando um exemplo bem simples:
Código: Selecionar todos
char *text = "mikroElektronika";

void main() {
TRISB = 0; // PORTB is output
Lcd_Custom_Config(&PORTB,7,6,5,4,&PORTB,2,0,3); // Initialize LCD on PORTB
Lcd_Custom_Cmd(Lcd_CURSOR_OFF); // Turn off cursor
Lcd_Custom_Out(1, 1, text); // Print text at LCD
}


Depois avisa o que acabou acontecendo com esse seu problema!

[]'s
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 gilliard » 05 Ago 2009 08:26

:D Mais uma vez, quero agradecer a todos, muito obrigado pela força :D

Então, todas as rotinas estão funcionando normalmente, apenas a bendita rotina menu(), ela não esta fazendo oque eu quero.

Essa rotina teria que fazer o seguinte, depois que ela estiver sido chamada:

Exibe AGUARDANDO... no LCD

Se apertar 1, chama a rotina um().
Se apertar 2, chama a rotina dois().
Se apertar 3, chama a rotina tres().

Quando pressionada a tecla, o digito NÃO será exibido no LCD, apenas chama a rotina pré definida, para ela chamar, só isso galera, é muito simples minha rotina, mas não seu montar.

Entenderam minha idéia ????

Obrigado.
Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Mensagempor fabim » 05 Ago 2009 09:01

giliard, tu colocou pull up no portD ?
Antes de eu dar o pitaco...

Abraços

Fabim
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor barboza » 05 Ago 2009 10:01

Sempre que vejo essas chamadas me da uma dor no coração.....
Coisas do CCS, .......

Código: Selecionar todos
Delay_ms(9000);                                     // Por 9 segundos



Já parou pra pensar o que significa 9 segundos de delay para um sistema computacional? Uma eternidade......, Morra e ressuscite daqui uns 10 anos....., Não preciso de você agora.....

Entendo que em pequenas aplicações é a solução mais imediata, mas por vicio de usar isso, muitos não entendem multi-task, escalonamento, ou mesmo multiplexação de tarefas no tempo, o mais basico em um while(TRUE){} no main.
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Mensagempor joao » 05 Ago 2009 10:49

Ola Giliard,

Pode ser um problema, não tenho certeza:

Vc tem um loop tipo isto:

Código: Selecionar todos
loop
{
    mostra_mensagem( "Aguardando Digito..." );
    checka_botoes();
}


Concorda?
agora veja só:
vc muda a mensagem para "DEU CERTO 1:" quando vc checka os botoes, certo?
O que acontece no seu loop? ele volta a mostrar a mensagem "Aguardando Digito..." depois de quanto tempo? de 20 milisegundos. Veja o código e confirme isso, pois eu acho que é isso que está acontecendo.
Eu gostaria de te dar um novo menu, para fazer o teste:
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
}


Eu coloquei a primeira mensagem para fora do loop, logo, só será mostrada 1 vez. Depois disso, só mudará caso vc pressione um botão.

E se mesmo assim não funcionar, faça o que eu te falei, imprima o valor da variavel tecla no LCD, para poder saber o que está recebendo. Se for alguma pinagem errada, vc vai saber olhando o valor recebido no LCD.

[]'s
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

Próximo

Voltar para PIC

Quem está online

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

x