Programa saltando instrução

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Programa saltando instrução

Mensagempor rensferreira » 07 Mar 2018 13:53

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.
rensferreira
 
Mensagens: 3
Registrado em: 28 Nov 2006 12:49

Re: Programa saltando instrução

Mensagempor denis » 07 Mar 2018 14:27

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.
denis
Byte
 
Mensagens: 257
Registrado em: 06 Mar 2007 12:29
Localização: Americana - SP

Re: Programa saltando instrução

Mensagempor rensferreira » 07 Mar 2018 15:01

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);

}
rensferreira
 
Mensagens: 3
Registrado em: 28 Nov 2006 12:49

Re: Programa saltando instrução

Mensagempor KrafT » 07 Mar 2018 19:05

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.
"..."Come to the edge," he said. And so they came. And he pushed them. And they flew."― Guillaume Apollinaire
Avatar do usuário
KrafT
Dword
 
Mensagens: 2228
Registrado em: 11 Out 2006 14:15
Localização: Blumenau -SC

Re: Programa saltando instrução

Mensagempor denis » 09 Mar 2018 10:42

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);

}
denis
Byte
 
Mensagens: 257
Registrado em: 06 Mar 2007 12:29
Localização: Americana - SP

Re: Programa saltando instrução

Mensagempor chrdcv » 12 Mar 2018 13:20

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!
Seu Madruga: "O trabalho não é ruim, ruim é ter que trabalhar"
Avatar do usuário
chrdcv
Dword
 
Mensagens: 1580
Registrado em: 13 Out 2006 14:13

Re: Programa saltando instrução

Mensagempor rensferreira » 19 Mar 2018 13:06

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.
rensferreira
 
Mensagens: 3
Registrado em: 28 Nov 2006 12:49

Re: Programa saltando instrução

Mensagempor chrdcv » 19 Mar 2018 18:32

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!
Seu Madruga: "O trabalho não é ruim, ruim é ter que trabalhar"
Avatar do usuário
chrdcv
Dword
 
Mensagens: 1580
Registrado em: 13 Out 2006 14:13

Re: Programa saltando instrução

Mensagempor KrafT » 19 Mar 2018 20:36

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.
"..."Come to the edge," he said. And so they came. And he pushed them. And they flew."― Guillaume Apollinaire
Avatar do usuário
KrafT
Dword
 
Mensagens: 2228
Registrado em: 11 Out 2006 14:15
Localização: Blumenau -SC


Voltar para PIC

Quem está online

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

x