Dúvida Subrotina

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Dúvida Subrotina

Mensagempor gilliard » 02 Dez 2009 23:20

Eu fiz uma subrotina, que é chamada dentro do void main, eu gostaria que ao terminar de executar, ela automaticamente retorne ao void main, qual a solução ?!?!?

Código: Selecionar todos
void lcd(){

Lcd_custom_cmd(LCD_CLEAR);

Lcd_custom_cmd(LCD_CURSOR_OFF);

Lcd_Custom_out(1,2,"Seja Bem Vindo");

Delay_ms(500);

}


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

Mensagempor Sergio38br » 03 Dez 2009 02:16

Se vc imaginar que o que esta dentro de void main() é todo o seu programa , onde mesmo que vc quer retornar??Se for para o ponto de onde vc chamou a rotina, basta um return.

[ ]`s
Sergio
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor gilliard » 03 Dez 2009 07:28

:D Opa Sérgio38br, beleza !!!! :D

Cara, então .... Dentro do void main eu chamei a rotina lcd(); dai eu queria, que quando terminar de executar a rotina com o delay que eu estipulei ai, voltasse pra dentro do void main !!!!

Então ficaria assim ?!?!?

Código: Selecionar todos
void lcd(){

Lcd_custom_cmd(LCD_CLEAR);

Lcd_custom_cmd(LCD_CURSOR_OFF);

Lcd_Custom_out(1,2,"Seja Bem Vindo");

Delay_ms(500);

return;

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

Mensagempor proex » 03 Dez 2009 07:48

A função void lcd() esta dentro do Main?
proex
Dword
 
Mensagens: 2101
Registrado em: 11 Out 2006 14:05
Localização: São Paulo

Mensagempor gilliard » 03 Dez 2009 07:56

A subrotina lcd() esta fora do void main, mas dentro do void main, tem uma chamada para a subrotina lcd().

Eu gostaria que após terminar de executar, volte a rodar oque esta dentro do void main.

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

Mensagempor proex » 03 Dez 2009 08:35

Entao o problema deve ser outro pois quando vc fecha a chave na funçao LCD, o complilador automaticamente sabe que tem que retornar para o Main.

.
proex
Dword
 
Mensagens: 2101
Registrado em: 11 Out 2006 14:05
Localização: São Paulo

Mensagempor Jozias del Rios » 03 Dez 2009 08:44

Para que ponto do "void main" você deseja que lcd() retorne??
Os vencedores são aqueles que sabem o que fazer se perderem.
Os perdedores são aqueles que não sabem o que fazer se ganharem.
Avatar do usuário
Jozias del Rios
Byte
 
Mensagens: 279
Registrado em: 31 Out 2009 03:36
Localização: SJCampos-SP

Mensagempor gilliard » 03 Dez 2009 08:55

Então... Faz de conta que o programa é esse ... Vamos simular uma situação aqui, não vou configurar lcd, nem nada, é só para simular mesmo, ok.

Imagina assim:

1- O Void Main inicio

2- O LED fica piscando por 1 segundo

3- Dai chama a rotina LCD();

4- O LCD exibe Seja Bem Vindo, por 500 milisegundos

5- Acabou os 500 ms, então volta ao Void Main, e começa tudo de novo....

Código: Selecionar todos
void lcd(){

Lcd_custom_cmd(LCD_CLEAR);

Lcd_custom_cmd(LCD_CURSOR_OFF);

Lcd_Custom_out(1,2,"Seja Bem Vindo");

Delay_ms(500);

}

// ********** Programa principal **********//

void main (){

trisb = 1;
portb = 1;

portb.f7 =~ portb.f7;
delay_ms(1000);

lcd();

}


Deve ser simples, mas eu estou apanhando aqui. rrssss
Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Mensagempor Jozias del Rios » 03 Dez 2009 08:57

Altere:

Código: Selecionar todos
void lcd(){

Lcd_custom_cmd(LCD_CLEAR);

Lcd_custom_cmd(LCD_CURSOR_OFF);

Lcd_Custom_out(1,2,"Seja Bem Vindo");

Delay_ms(500);

}

// ********** Programa principal **********//

void main ()
{

    while (1)
    {

        trisb = 1;
        portb = 1;

        portb.f7 =~ portb.f7;
        delay_ms(1000);

        lcd();
    };
}
Os vencedores são aqueles que sabem o que fazer se perderem.
Os perdedores são aqueles que não sabem o que fazer se ganharem.
Avatar do usuário
Jozias del Rios
Byte
 
Mensagens: 279
Registrado em: 31 Out 2009 03:36
Localização: SJCampos-SP

Mensagempor gilliard » 03 Dez 2009 09:46

Então.... A rotina lcd() é chamada em varias partes do programa, as vezes é chamada em subrotinas, as vezes no void main, etc....

Eu precisaria achar uma solução, para inserir dentro da própria subrotina lcd(), assim, independente da onde ela for chamada, ela sempre volta para o void main, tem como fazer isso ?!?!?
Editado pela última vez por gilliard em 03 Dez 2009 10:00, em um total de 1 vez.
Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Mensagempor Jozias del Rios » 03 Dez 2009 09:50

Não. Você quer quebrar a estrutura básica de um programa em C: sua compartimentação em funções.

Tem outro jeito de fazer o que vc precisa.

Mas basicamente, se o main() chama subrotinas, e estas chamam o lcd(), então quando o lcd() retornar, as subrotinas devem retornar ao main()
Os vencedores são aqueles que sabem o que fazer se perderem.
Os perdedores são aqueles que não sabem o que fazer se ganharem.
Avatar do usuário
Jozias del Rios
Byte
 
Mensagens: 279
Registrado em: 31 Out 2009 03:36
Localização: SJCampos-SP

Mensagempor gilliard » 03 Dez 2009 10:05

Não, é assim amigo......

É tudo por if else, então dependendo do que acontecer dentro do void main, ou ela chama o lcd(), ou ela chama uma outra subrotina, tipow teclado(), dai dentro do teclado, dependendo do que eu apertar chama a mesma rotina lcd(), não é infinito, entendeu ???

Tudo depende do que eu fizer, ela não fica chamando, chamando chamando infinitamente, entendeu ?!?!?

Apenas preciso fazer o lcd() terminar de executar, e voltar para o void main, só isso... rssss de resto, me viro aqui......
Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Mensagempor Jozias del Rios » 03 Dez 2009 10:15

então, as subrotinas, por exemplo teclado() e porta() devem retornar ao main(), assim:

Código: Selecionar todos
void lcd()
{
    print_lcd( /* atualiza lcd */ );
}

void teclado()
{
    char c = getch();
   
    if (c == 27)
    {
        lcd();
    }
    else
    {
        print_lcd( c );
    }
}

void porta()
{
    if ( /* analisa a porta */ )
    {
        lcd();
    }
}

void main()
{
    /* setup */

    while (1)
    {
        if ( teclado_tem_tecla() )
            teclado();

        if ( porta_mudou() )
            porta();

        delayms(1000);

        lcd();
    }
}



Perceba que as subrotinas teclado() e porta() ao acabarem retornam à quem as chamou, que foi o main(). O lcd() também é uma subrotina, e também retorna a quem a chamou, que pode ser o main(), pode ser o teclado() ou pode ser o porta().
Os vencedores são aqueles que sabem o que fazer se perderem.
Os perdedores são aqueles que não sabem o que fazer se ganharem.
Avatar do usuário
Jozias del Rios
Byte
 
Mensagens: 279
Registrado em: 31 Out 2009 03:36
Localização: SJCampos-SP

Mensagempor fabim » 03 Dez 2009 10:21

void lcd_giliard(char *text){

}



void main(void){
while(1){
Seu programa aqui dentro.


}
}


O menininho complicado.

Veja que a sub rotina fica sobre o main certo ?

Suponha que dentro do main onde chama a rotinha.

if(butão 1){
lcd_giliard("complicado eim ?);
}else{
lcd_giliard("não precionado!);}

Observe esta sentença...

Quando o compilador enxergar o comando lcd_giliard, ele sabe que é uma chamada de sub rotina, ele vai dar o call a rotina, e quando a rotina acabar ou seja quando fazer tudo que tem que fazer.
Ele retorna para a linha que a chamou + 1.
Se for uma sentença conforme coloquei a cima, o compilador se vira, pra sair da sentença e fazer o que esta abaixo dela..

Agora, se quer chamar o lcd_giliard() e quando acabar ela voltar direto pra cá.
void main(void){
""""""""""aqui""""""""""
E não la linha abaixo ou sentença abaixo, a qual chamou o lcd_giliard ......

aí depende apenas do seu raciocinio.

Lembre-se que em linguagem de alto nivel, não é bom perder endereço de retorno e ser reescrito!!
Isto pode causar estouro da stack, pois ao gar um GOTO main tu não retornou uma casa de stack, e isto vai até estourar!!
Em asm não tem este problema, principalmente nos 12F e 16F..

Te aconselho,,,,

void main(void){
inicio: // isto é um label!!!!


X
X
X
X
X
X
X
X
if(tale e coisa coisa e tale){
lcd_giliard();
}
if(flag setado pela rotina lcd_giliard() )
_asm goto inicio;

E assim por diante!!

Adios Amigos !!
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 » 03 Dez 2009 11:08

Obrigado pelo " complicado " Fabim hehehehehe realmente sou mesmo rrssss

Então... Isso que vocês tão fazendo, e me explicando, eu ja fiz varias vezes, mas o problema, não é chamar a subrotina .....

O problema é que quando a subrotin lcd (), FAZ TUDO QUE TEM QUE FAZER, ele não esta voltando para o VOID MAIN, entendeu ?!?!?

Esse é meu unico problema.
Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Próximo

Voltar para PIC

Quem está online

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

x