Dúvida Subrotina

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Mensagempor Djalma Toledo Rodrigues » 07 Dez 2009 23:04

gilliard escreveu:Bom... Coloquei o break; após a chamada da subrotina lcd();...


Não se deve violar a Subrotina , ela só deve sair após a última } que corresponde ao Return em ASM

pois o Endereço de Retorno o PC +1 ficou no Stack

Não entendo porque você insiste nisso.

Ficaria melhor :

A Subrotina Teclado , retorna com Valor da Tecla precionada

O Prog. Principal, se for o caso, Chama a SubRotina LCD - esta retorna ao Programa Principal

Sugestão: faça o Fluxograma para vizualisar a Lógica do procedimento

DJ
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor gilliard » 07 Dez 2009 23:57

Chama a SubRotina LCD - esta retorna ao Programa Principal


Este é justamente o meu problema, to fazendo do jeito que vocês estão sugerindo, mas continua travando dentro da subrotina lcd ();
Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Mensagempor Jozias del Rios » 08 Dez 2009 00:00

gilliard, começe a eliminar coisas da rotina lcd()

elimine cada uma das linhas, até achar a culpada por "travar".

se vc chegar num ponto em que:

Código: Selecionar todos
void lcd() {

}


então saberá que a rotina lcd() não tem nada a ver com isso.
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 » 08 Dez 2009 07:35

gilliard.

só uma perguntinha.

Esta parte if tecla=='1';<<<

a rotina teclado..

C tem certeza que ele retorna um ASCII do numero 1, ao invés de simplesmente 0x01 ?

unica coisa que poderia trabar seria isto...

Porque pense.
Criou algo infinitamente esperando o ASCII 0x30 + 1 = '1'.
só que o teclado retorna apenas 0x01.
Aí frodanha né ?

troca o '1', por 1 sem aspas...

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 gilliard » 08 Dez 2009 18:16

Bom, fiz o teste do teclado, e não deu em nada de novo rrsss.

Pessoal, oque vocês acham de eu disponibilizar o meu projeto do proteus ?!?!? Dai daria para vocês me acompanharem.

Pois eu já tentei de tudo aqui, e não sei mais oque fazer.

Uma coisa que notei, é que se eu tirar o DELAY_MS da subrotina lcd(), funciona normalmente, ela retorna para o void main, mas sem o DELAY_MS, não daria nem para ler a msg no lcd.

E me desculpem a insistência, é que eu preciso que essa subrotina sempre volte para o void main, pois todo o programa, passará por ela, em determinadas situações, e sem essa rotina voltando para o void main, não conseguirei fazer meu projeto.
Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Mensagempor barboza » 08 Dez 2009 19:03

Não sei se já foi dito, mas isso esta parecendo problema com stack overflow.

Faça o seguinte teste:

Ao inves de:
Código: Selecionar todos
void lcd(void)
{
    ....
    delay(x);
}

void main(void)
{
   ....
   lcd();
   ....
}


Tente isso só para testar:

Código: Selecionar todos
void lcd(void)
{
    ....
}

void main(void)
{
   ....
   lcd();
   delay(x);
   ....
}



os nomes são mera ilustração, mas o proposito é tirar o delay de dentro do lcd e subir um nivel.
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 Djalma Toledo Rodrigues » 08 Dez 2009 19:21

gilliard escreveu: ... E me desculpem a insistência, é que eu preciso que essa subrotina sempre volte para o void main....

Não entendo porque você insiste nisso

Se quer que a subrotina sempre volte ao Main , chame-a somente de dentro do Main

Lembre-se que o Conteúdo do PC (Programa Counter) + 1 ficou no Stack
logo a Subrotina só pode terminar normalmente ( Return no ASM )
caso contrário bagunça o Stack Pilha


Sobre o Delay:

#include <delays.h> // esta lá ?

DJ
Editado pela última vez por Djalma Toledo Rodrigues em 08 Dez 2009 22:24, em um total de 1 vez.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor fabim » 08 Dez 2009 19:38

gilliard escreveu:Bom, fiz o teste do teclado, e não deu em nada de novo rrsss.

Pessoal, oque vocês acham de eu disponibilizar o meu projeto do proteus ?!?!? Dai daria para vocês me acompanharem.

Pois eu já tentei de tudo aqui, e não sei mais oque fazer.

Uma coisa que notei, é que se eu tirar o DELAY_MS da subrotina lcd(), funciona normalmente, ela retorna para o void main, mas sem o DELAY_MS, não daria nem para ler a msg no lcd.

E me desculpem a insistência, é que eu preciso que essa subrotina sempre volte para o void main, pois todo o programa, passará por ela, em determinadas situações, e sem essa rotina voltando para o void main, não conseguirei fazer meu projeto.


AAAAAAAA mu fioti, se lascou de verde e amarelo !!!

Problemas nos delays, e outras funções. do mikroC Pascal<<

São provenientes, do mecanismo ant caloteiro, ou *****..

eu não uso nadinha nativo do mikroC, tudo na unha@@@

MEstre Sifu
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 guest2003 » 08 Dez 2009 20:18

Bom, eu avisei que tinha alguma coisa haver com o Delay...

[]'s
http://www.sethi.com.br (Institucional)
http://www.sethi3d.com.br (Impressoras 3d)
http://www.sethi.com.br/blog (Blog Impressoras 3d)
Avatar do usuário
guest2003
Word
 
Mensagens: 746
Registrado em: 13 Out 2006 11:48
Localização: Campinas - SP

Mensagempor gilliard » 08 Dez 2009 21:24

Djalma infelizmente meu problema não é tão simples assim, a subrotina lcd(), tem que ficar acima de tudo em meu programa, senão as rotinas que chama a subrotina lcd(), não irá localizar a mesma. Preciso que ela fique acima de tudo, e após terminar, retorne ao void main.

Fiz o teste de colocar o delay_ms dentro do void main, abaixo da rotina lcd(), e travou tudo .....
Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Mensagempor Djalma Toledo Rodrigues » 08 Dez 2009 21:59

Sim claro . Isso é exigência do C. as Funções tem que ser declaradas antes de Main
mas, o que eu disse foi:

Se quer que a subrotina sempre volte ao Main , chame-a somente de dentro do Main"

O que é bem diferente.

Código: Selecionar todos
     void lcd()  // Esta é a Função lcd
      {                   // (declarada antes de Main)
       ...
       }                 //  Aqui é o Return   


      void main() 
            {
               ...                         
               lcd();   // Aqui é  chamada a Função  lcd   
                .        // <----- Aqui é para onde Retorna
               ...       
             } 


Entendido ?

DJ
Editado pela última vez por Djalma Toledo Rodrigues em 08 Dez 2009 22:45, em um total de 1 vez.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor gilliard » 08 Dez 2009 22:41

Bom Djalma, ta acontecendo o seguinte, fiz oque você me sugeriu, e logo que o programa inicia, ele chama a subrotina lcd(), e exibe a mensagem normalmente, e retorna para o void main.

Até ai, beleza. Mas..... quando eu chamado a subrotina lcd(), novamente, apertando a tecla 1 no teclado, ele chama a subrotina lcd(), mas dai trava.

Só esta funcionando, quando ela inicia pelo void main, caso eu precise chamar novamente a subrotina lcd(), ela trava.
Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Mensagempor Djalma Toledo Rodrigues » 08 Dez 2009 23:08

Trava a Função teclado porque há probrema aí

Fabim já levantou a questão do Delay, do '1', do while (1); ...


DJ
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor Sergio38br » 09 Dez 2009 06:51

Bom dia, parece-me que o problema é de base....

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

Mensagempor ze » 09 Dez 2009 06:54

pra mim o problema está no b.i.o.s. ou seja entre a cadeira e o teclado. tô quase pegando o meu burro e indo a galope aí fazer pra ti. Bosta, ops! posta o proj completo pro pessoar ver pro c, uai.
-use o debug,
-rode passo a passo,
-veja rodando em asm (iéca),
-verifique é o wdog, desligue-o
-etc...este deve resolver

Mas o fabim já cantou: pode ser o compilador. Se seu cod for<2K baixe a versão demo (vá-te reto!) e faça o teste. Mesmo se for > faça um menor pra teste. E no futuro não use as funções mastigadas do mikroc. Ajuda mas atrapalha.

Carái!!!
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

AnteriorPróximo

Voltar para PIC

Quem está online

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

cron

x