Página 1 de 1

Programa saltando instrução

MensagemEnviado: 07 Mar 2018 13:53
por rensferreira
Fiz uma lógica para fazer toggle de uma saída. Não sou nenhum expert em c mas estou conseguindo avançar.
A lógica está até fazendo o que preciso mas não sei porque a instrução "resultado_out" dentro do else não está sendo executada. Alguém dá uma luz aí.
Algumas variáveis foram criadas apenas para debug, pois são internas da função e não estão aparecendo no debug do MikroC

Segue o código:

Código: Selecionar todos
int  toggle(int  port_in, int  posicao_in, int  port_out, int  posicao_out, int teste1, int teste2, int resultado_teste);
 void main()
{
/* Inicialização de registradores e variáveis */
  CMCON = 0b11111111;//Desliga comparador analogico
  OPTION_REG = 0b00000101; //Configura o timer0 ( prescaler 1:64 )
  INTCON.GIE = 1;  //Habilita interrupcap global
  INTCON.T0IE = 1; //Habilita interrupcao do timer0
  TMR0 = 131; //Carrega TMR0 com o valor 131 ( 256 - 125 )
  TRISB = 0b00110111;//Define os pinos da PORTB.
  TRISA = 0b10000000;//Define todas os pinos da PORTA como SAÍDAS, exceto o pino RA7.
  PORTB = 0b00000000; //Inicializa o portb em 0.
  PORTA = 0b00000000; //Inicializa o porta em 0.
  while(1)
  {

    PORTA = toggle(PORTB, 6, PORTA, 3, 0, 0, 0);
  }
}
int  toggle(int  port_in, int  posicao_in, int  port_out, int  posicao_out, int teste1, int teste2, int resultado_teste)
{

  int  mascara_in, mascara_out, resultado_out; //= (1 << posicao_in);// Move 1 para a posição da entrada.
  static set_bit;
  //posicao_in = posicao_in - 1;
  //posicao_out = posicao_out - 1;
  mascara_in = (1 << posicao_in - 1);
  mascara_out = (1 << posicao_out - 1);
  teste1 = (1 << posicao_in - 1);
  teste2 = (1 << posicao_out - 1);
  if (port_in == mascara_in)//Botão apertado.
    {
      resultado_out = port_out | mascara_out;
      resultado_teste = port_out | mascara_out;
      if (resultado_teste != port_out && set_bit == 0)
        {
          port_out = port_out ^ mascara_out;
          set_bit = 1;
        }
      else
        {
          resultado_out = 0;
          set_bit = 0;
          resultado_teste = 0;
        }
    }
  return (port_out);

}


Desde já, obrigado pela ajuda.

Re: Programa saltando instrução

MensagemEnviado: 07 Mar 2018 14:27
por denis
Pode ser que o compilador esteja otimizando as variáveis.
Experimenta isso:

Código: Selecionar todos
volatile int resultado_out;




rensferreira escreveu:Fiz uma lógica para fazer toggle de uma saída. Não sou nenhum expert em c mas estou conseguindo avançar.
A lógica está até fazendo o que preciso mas não sei porque a instrução "resultado_out" dentro do else não está sendo executada. Alguém dá uma luz aí.
Algumas variáveis foram criadas apenas para debug, pois são internas da função e não estão aparecendo no debug do MikroC

Segue o código:

Código: Selecionar todos
int  toggle(int  port_in, int  posicao_in, int  port_out, int  posicao_out, int teste1, int teste2, int resultado_teste);
 void main()
{
/* Inicialização de registradores e variáveis */
  CMCON = 0b11111111;//Desliga comparador analogico
  OPTION_REG = 0b00000101; //Configura o timer0 ( prescaler 1:64 )
  INTCON.GIE = 1;  //Habilita interrupcap global
  INTCON.T0IE = 1; //Habilita interrupcao do timer0
  TMR0 = 131; //Carrega TMR0 com o valor 131 ( 256 - 125 )
  TRISB = 0b00110111;//Define os pinos da PORTB.
  TRISA = 0b10000000;//Define todas os pinos da PORTA como SAÍDAS, exceto o pino RA7.
  PORTB = 0b00000000; //Inicializa o portb em 0.
  PORTA = 0b00000000; //Inicializa o porta em 0.
  while(1)
  {

    PORTA = toggle(PORTB, 6, PORTA, 3, 0, 0, 0);
  }
}
int  toggle(int  port_in, int  posicao_in, int  port_out, int  posicao_out, int teste1, int teste2, int resultado_teste)
{

  int  mascara_in, mascara_out, resultado_out; //= (1 << posicao_in);// Move 1 para a posição da entrada.
  static set_bit;
  //posicao_in = posicao_in - 1;
  //posicao_out = posicao_out - 1;
  mascara_in = (1 << posicao_in - 1);
  mascara_out = (1 << posicao_out - 1);
  teste1 = (1 << posicao_in - 1);
  teste2 = (1 << posicao_out - 1);
  if (port_in == mascara_in)//Botão apertado.
    {
      resultado_out = port_out | mascara_out;
      resultado_teste = port_out | mascara_out;
      if (resultado_teste != port_out && set_bit == 0)
        {
          port_out = port_out ^ mascara_out;
          set_bit = 1;
        }
      else
        {
          resultado_out = 0;
          set_bit = 0;
          resultado_teste = 0;
        }
    }
  return (port_out);

}


Desde já, obrigado pela ajuda.

Re: Programa saltando instrução

MensagemEnviado: 07 Mar 2018 15:01
por rensferreira
Huuuummmm, funcionou!

Mas já sendo chato, porque já vi que estou falando com quem sabe. Eu tenho uma outra variável a "resultado_teste" que recebe os mesmos valores da "resultado_out". A diferença é que a segunda entra como parâmetro, porquê esta é executada dentro do else a a segunda não?

Eu vi na ajuda do programa que o tipo volatile permite que o valor da variável seja atualizado a qualquer instante, esta variável recebe valores do PORTA que é o port de saída e tenho as linhas de dados de um display LCD neste port também. o objetivo é fazer um XOR que só troque o valor do bit que está na máscara.

Aqui está o programa de novo, no segundo IF eu troquei resultado_teste por resultado_out, que é a variável correta. O programa executa esta instrução em qualquer lugar, menos dentro do else.

Código: Selecionar todos
int  toggle(int  port_in, int  posicao_in, int  port_out, int  posicao_out, int teste1, int teste2, int resultado_teste);
 void main()
{
/* Inicialização de registradores e variáveis */
  CMCON = 0b11111111;//Desliga comparador analogico
  OPTION_REG = 0b00000101; //Configura o timer0 ( prescaler 1:64 )
  INTCON.GIE = 1;  //Habilita interrupcap global
  INTCON.T0IE = 1; //Habilita interrupcao do timer0
  TMR0 = 131; //Carrega TMR0 com o valor 131 ( 256 - 125 )
  TRISB = 0b00110111;//Define os pinos da PORTB.
  TRISA = 0b10000000;//Define todas os pinos da PORTA como SAÍDAS, exceto o pino RA7.
  PORTB = 0b00000000; //Inicializa o portb em 0.
  PORTA = 0b00000000; //Inicializa o porta em 0.
  while(1)
  {

    PORTA = toggle(PORTB, 6, PORTA, 3, 0, 0, 0);
  }
}
int  toggle(int  port_in, int  posicao_in, int  port_out, int  posicao_out, int teste1, int teste2, int resultado_teste)
{
  volatile int resultado_out;
  int  mascara_in, mascara_out; //= (1 << posicao_in);// Move 1 para a posição da entrada.
  static set_bit;
  //posicao_in = posicao_in - 1;
  //posicao_out = posicao_out - 1;
  mascara_in = (1 << posicao_in - 1);
  mascara_out = (1 << posicao_out - 1);
  teste1 = (1 << posicao_in - 1);
  teste2 = (1 << posicao_out - 1);
  if (port_in == mascara_in)//Botão apertado.
    {
      resultado_out = port_out | mascara_out;
      resultado_teste = port_out | mascara_out;
      if (resultado_out != port_out && set_bit == 0)
        {
          port_out = port_out ^ mascara_out;
          set_bit = 1;
        }
      else
        {
          resultado_out = 0;
          set_bit = 0;
          resultado_teste = 0;
        }
    }
  return (port_out);

}

Re: Programa saltando instrução

MensagemEnviado: 07 Mar 2018 19:05
por KrafT
Nossa! Tudo isso para togglar uma I/O? Acho que eu não sei fazer software...

Eu costumo fazer só PORTx &= ~valor; e PORTx |= valor.

Re: Programa saltando instrução

MensagemEnviado: 09 Mar 2018 10:42
por denis
O compilador deve estar ignorando esta variável pois ela não influencia em nada.


rensferreira escreveu:Huuuummmm, funcionou!

Mas já sendo chato, porque já vi que estou falando com quem sabe. Eu tenho uma outra variável a "resultado_teste" que recebe os mesmos valores da "resultado_out". A diferença é que a segunda entra como parâmetro, porquê esta é executada dentro do else a a segunda não?

Eu vi na ajuda do programa que o tipo volatile permite que o valor da variável seja atualizado a qualquer instante, esta variável recebe valores do PORTA que é o port de saída e tenho as linhas de dados de um display LCD neste port também. o objetivo é fazer um XOR que só troque o valor do bit que está na máscara.

Aqui está o programa de novo, no segundo IF eu troquei resultado_teste por resultado_out, que é a variável correta. O programa executa esta instrução em qualquer lugar, menos dentro do else.

Código: Selecionar todos
int  toggle(int  port_in, int  posicao_in, int  port_out, int  posicao_out, int teste1, int teste2, int resultado_teste);
 void main()
{
/* Inicialização de registradores e variáveis */
  CMCON = 0b11111111;//Desliga comparador analogico
  OPTION_REG = 0b00000101; //Configura o timer0 ( prescaler 1:64 )
  INTCON.GIE = 1;  //Habilita interrupcap global
  INTCON.T0IE = 1; //Habilita interrupcao do timer0
  TMR0 = 131; //Carrega TMR0 com o valor 131 ( 256 - 125 )
  TRISB = 0b00110111;//Define os pinos da PORTB.
  TRISA = 0b10000000;//Define todas os pinos da PORTA como SAÍDAS, exceto o pino RA7.
  PORTB = 0b00000000; //Inicializa o portb em 0.
  PORTA = 0b00000000; //Inicializa o porta em 0.
  while(1)
  {

    PORTA = toggle(PORTB, 6, PORTA, 3, 0, 0, 0);
  }
}
int  toggle(int  port_in, int  posicao_in, int  port_out, int  posicao_out, int teste1, int teste2, int resultado_teste)
{
  volatile int resultado_out;
  int  mascara_in, mascara_out; //= (1 << posicao_in);// Move 1 para a posição da entrada.
  static set_bit;
  //posicao_in = posicao_in - 1;
  //posicao_out = posicao_out - 1;
  mascara_in = (1 << posicao_in - 1);
  mascara_out = (1 << posicao_out - 1);
  teste1 = (1 << posicao_in - 1);
  teste2 = (1 << posicao_out - 1);
  if (port_in == mascara_in)//Botão apertado.
    {
      resultado_out = port_out | mascara_out;
      resultado_teste = port_out | mascara_out;
      if (resultado_out != port_out && set_bit == 0)
        {
          port_out = port_out ^ mascara_out;
          set_bit = 1;
        }
      else
        {
          resultado_out = 0;
          set_bit = 0;
          resultado_teste = 0;
        }
    }
  return (port_out);

}

Re: Programa saltando instrução

MensagemEnviado: 12 Mar 2018 13:20
por chrdcv
KrafT escreveu:Nossa! Tudo isso para togglar uma I/O? Acho que eu não sei fazer software...

Eu costumo fazer só PORTx &= ~valor; e PORTx |= valor.


Vai ver que o cara ganha baseado em linha que programa, sendo assim a verborragia é a parte central do trabalho! Nesse caso, a linguagem ideal seria ADA!

Re: Programa saltando instrução

MensagemEnviado: 19 Mar 2018 13:06
por rensferreira
O problema é o povo não ler as postagens, lá no primeiro post diz: "Não sou nenhum expert em c mas estou conseguindo avançar."
Não, não ganho por linha de código. Aliás não ganho um centavo com isso. Ganho e ganho muito bem viajando pelo Brasil e exterior dando suporte e manutenção em plataformas de posicionamento dinâmico.
Mas gosto de aprender coisas novas. Só isso.
Não vou incomodar mais aqui. Postei a mesma dúvida em um fórum gringo a as respostas foram muito mais educadas.
Vou cancelar a conta aqui e ficar só lá.
Obrigado.

Re: Programa saltando instrução

MensagemEnviado: 19 Mar 2018 18:32
por chrdcv
rensferreira escreveu:O problema é o povo não ler as postagens, lá no primeiro post diz: "Não sou nenhum expert em c mas estou conseguindo avançar."
Não, não ganho por linha de código. Aliás não ganho um centavo com isso. Ganho e ganho muito bem viajando pelo Brasil e exterior dando suporte e manutenção em plataformas de posicionamento dinâmico.
Mas gosto de aprender coisas novas. Só isso.
Não vou incomodar mais aqui. Postei a mesma dúvida em um fórum gringo a as respostas foram muito mais educadas.
Vou cancelar a conta aqui e ficar só lá.
Obrigado.


Desculpe-me colega caso o comentário que fiz o ofendeu. Era para ser uma brincadeira. Todos aqui creio que gostam de aprender coisas novas também e ter dificuldades também faz parte do processo de aprendizado. Eu mesmo, que fiz a brincadeira não sei nem mais do que 1% do que muitos outros aqui sabem e volta e meia faça perguntas também que para eles são coisas básicas, seja pela capacidade intelectual e/ou vivência que possuem.

Peço que não se sinta incomodado com a brincadeira ou leve para o lado pessoal!

Um abraço!

Re: Programa saltando instrução

MensagemEnviado: 19 Mar 2018 20:36
por KrafT
Tendo a tua vivência internacional e pelo trabalho que executas, sabemos que estás acostumado com adversidades e tua ira será passageira.

E pela tua profissão sabes que as repostas estão muitas vezes nas entrelinhas e são os detalhes sutis que a pessoa atenta consegue transformar na reposta que precisa/procura.

É muito difícil te dar a resposta exata, pois teria que ter o teu cenário, coisa que você abrindo a nível mundial, tem mais chance de acontecer. Por exemplo, tudo que eu preciso para meu hobby (C#), o stackowerflow me responde.

Fica aí, nem que seja para tomar uma saideira. Se aqui minguam as respostas, vicejam as amizades. Ou não.