Página 1 de 2

Dúvida Sinistra em C

MensagemEnviado: 13 Set 2018 13:57
por Guri
Olá amigos,

Eu estou com um problema no mikroC,

Me deparei com um problema que não estou conseguindo entender.

Eu tenho uma função de interrupção do timer, eu criei um protótipo para essa interrupção, ok...até aqui tudo beleza. Tipo:

cpp code
void Timer2_interrupt() iv IVT_INT_TIM2 {
TIM2_SR.UIF = 0;
}


Agora criei um novo protótipo com outra função de DELAY, Tipo:

cpp code
void DelayMacro() {
Delay_ms(1000);
PortLed=1;
Delay_ms(500);
PortLed=0;
}


Então criei dois protótipos, sendo timer ligado na interrupção e outro que é uma rotina de tempo. Funcionam legal se chamadas lá do main...ok.

Agora se eu fizer isso dá erro na compilação "undeclarable DleayMacro(), indefinid!

cpp code
void Timer2_interrupt() iv IVT_INT_TIM2 {
TIM2_SR.UIF = 0;
DelayMacro(); // quando adiciono esse protótipo dentro desse outro protótipo dá erro, porque?
}


Pelo que entendi, o compilador esta dizendo que um protótipo não pode ser incluido em outro protótipo, isso é verdade, se é então como eu faço para chamar essa rotina DelayMacro().

Lá vem eu denovo :mrgreen: Se fosse em ASM eu simplesmente teria minha rotina DelayMacro como uma CHAMADA e poderia chamar ela de qualquer ponto do main... :oops:

Obrigado,

Re: Dúvida Sinistra em C

MensagemEnviado: 13 Set 2018 14:01
por Rodrigo_P_A
Sobre o erro eu num sei, mas vc vai mesmo chamar uma rotina de delay dentro da interrupção?

Re: Dúvida Sinistra em C

MensagemEnviado: 13 Set 2018 14:25
por Guri
É só um exemplo... :|

Re: Dúvida Sinistra em C

MensagemEnviado: 13 Set 2018 14:28
por Guri
Corrigindo para melhor entendimento: :roll:


void DelayMacro() {

PortLed=1;

}

Então criei dois protótipos, sendo timer ligado na interrupção e outro que é uma rotina de tempo. Funcionam legal se chamadas lá do main...ok.

Agora se eu fizer isso dá erro na compilação "undeclarable DleayMacro(), indefinid!

void Timer2_interrupt() iv IVT_INT_TIM2 {
TIM2_SR.UIF = 0;
DelayMacro(); // quando adiciono esse protótipo dentro desse outro protótipo dá erro, porque?
}

Re: Dúvida Sinistra em C

MensagemEnviado: 13 Set 2018 14:56
por xultz
Eu tive um problema semelhante, com outro compilador, e usando PIC.
A questão era que não era possível chamar uma função de dentro da ISR. Não lembro se era limitação do compilador ou do próprio PIC. Eu tentei até chamar a função como sendo inline (ou seja, compilador "copia" o código prá dentro da função, ao invés de pular prá função) mas mesmo assim não dava certo. A solução foi copiar o código prá dentro da ISR e pimba. Nunca mais tentei chamar uma função de dentro da ISR, mesmo porque essa é uma prática não muito boa.

Re: Dúvida Sinistra em C

MensagemEnviado: 13 Set 2018 14:57
por vtrx
Delay tem que estar declarada primeiro no prototipo das funções..

Re: Dúvida Sinistra em C

MensagemEnviado: 13 Set 2018 15:15
por eletroinf
Guri, está meio confuso de entender o seu texto.
Vamos começar pela definição de protótipo, que seria o esqueleto de uma função existente, contendo informações de variáveis de retorno, chamada, nome...
https://www.quora.com/What-is-meant-by-prototype-in-C

Bom, então tu tem a função em algum lugar e cria o protótipo para o compilador saber que existe a função em outra parte.

Obviamente o protótipo deve estar antes da parte do código em que ele é chamado.

Outro ponto é estar atendo de não utilizar a mesma função de Delay para o código "normal" e a interrupção. Mais objetivamente, o seu código pode estar executando a função de Delay e entrar na interrupção e esta chamar a mesma função, viu a bagunça que pode dar? Alguns compiladores que utilizei não avisavam desse problema, bem naquela ideia de que em C tu pode fazer tudo, inclusive "se matar".

Re: Dúvida Sinistra em C

MensagemEnviado: 13 Set 2018 15:43
por Guri
:lol: O Eletroinf e VTR mataram a charada.

Confuso!...realmente eu tenho uma enorme "rotina" que entra em loop, sempre quando tento explicar alguma coisa :roll: kkk

O problema é a DECLARAÇÂO de onde esta a CHAMADA.

Como eu tinha declarado a CHAMDA DelayMacro depois do protótipo onde ela iria rodar, o compilador não achava a rotina, por isso dava o erro de não estar achando a DelayMacro.h.

Só foi colocar o protótipo DelayMacro.h antes do outro protótipo, que era a rotina de interrupção,

Estou feliz, pela ajuda de todos vocês...

Re: Dúvida Sinistra em C

MensagemEnviado: 13 Set 2018 15:44
por Guri
Sabem com isso se chama?

....xiii, até esqueci do que ia falar, kkk :mrgreen:

Re: Dúvida Sinistra em C

MensagemEnviado: 13 Set 2018 17:42
por Red Neck Guy
Primeiro, em C protótipo é a declaração prévia da função:
void minha_funcao(void); // Isso é um protótipo


//Isso é a implementação da função
void minha_funcao(void){

//Codigos aqui

}

Quanto ao teu erro:
Nem comentarei isso, não adianta me trovar que programa em assembly :)

void DelayMacro() {
Delay_ms(1000);
PortLed=1;
Delay_ms(500);
PortLed=0;
}

Olha isso:
"undeclarable DleayMacro(), indefinid!

Re: Dúvida Sinistra em C

MensagemEnviado: 13 Set 2018 17:43
por Red Neck Guy
Deixei um tempão sem recarregar e vieram muitas respostas, agora vou deixar a reposta acima.

Re: Dúvida Sinistra em C

MensagemEnviado: 13 Set 2018 20:02
por Guri
Valeu Aquino, pela dica.

Longe de mim, "trolar" :shock:

Eu sou novato no assunto, e quando tomei referencia ao ASM, foi porque minha cabeça ainda tenta pensar desse jeito...mas estou perto da cura :roll:

Realmente foi uma grande falta de malícia da minha parte, mas aconteceu...

Agradeço a todos, :P

Re: Dúvida Sinistra em C

MensagemEnviado: 13 Set 2018 21:19
por Red Neck Guy
Mas se voce programa coisas mais complexas, acabara precisando extruturar o codigo em varios arquivos.
Geralmente eh necessario alguma declaracao do tipo EXTERN ou semelhante para que simbolos de um modulo sejam visiveis em outros.
Eh como dizer:"Eu sou sabia fazer a conta com laranjas"

Re: Dúvida Sinistra em C

MensagemEnviado: 13 Set 2018 23:31
por Guri
Você tem toda a razão Aquino...Obrigado pelas dicas, :P

Re: Dúvida Sinistra em C

MensagemEnviado: 14 Set 2018 07:47
por KrafT
Eu sou autodidata em programação e creio que o GuriVonilman também seja. O que acontece é que a falta de uma formação formal tem seus impactos. Por sorte tenho trabalhado com colegas "fodas" para dicas eventuais. Mas não é a mesma coisa, a gente sempre está defasado com o povo que estudou especificamente engenharia de software, por mais proficiente que um autodidata possa ser.

Nada disso impede que se obtenha resultados. Apenas é mais penoso.

Obs: Por outo lado, muita gente que se forma só sabe mexer com Python e Arduíno, o que é o outro extremo do problema.