LusoRobótica - Robótica em Português

Sistemas específicos => Arduino / AVR => Tópico iniciado por: Asilva em 07 de Dezembro de 2013, 18:41

Título: Problema com codigo
Enviado por: Asilva em 07 de Dezembro de 2013, 18:41
estou a tentar ajustar o codigo da livraria waveRP no meu projecto e estou a ter um problema.
Na livraria tem este codigo:
Código: [Seleccione]
void pauseResume(void) {
  if (!Serial.available()) return;
  uint8_t c = Serial.read();
  while (Serial.read() >= 0) {}
  if (c == 's') {
    wave.stop();
  } else if (c == 'p') {
    wave.pause();
    while (wave.isPaused()) {
      PgmPrintln("\nPaused - type 's' to stop 'r' to resume");
      while (!Serial.available()) {}
      c = Serial.read();
      if (c == 's') wave.stop();
      if (c == 'r') wave.resume();
    }
  }
}
Só me interessa utilizar o "wave.stop()", e, como estou a utilizar botões que fazem leituras numa porta analógica, pensei que este codigo seria o suficiente:
Código: [Seleccione]
void stopFile(void)
{
if ((wave.isPlaying()||wave.isRecording())&& analogRead(botaoMenu)>1000)
{
wave.stop();
}
}
Sendo que botaoMenu é a porta analógica.
Já tentei outras muitas coisas mas sem sucesso.
Este codigo é utilizado no seguinte contexto:
Código: [Seleccione]
void recordManualControl(void) {
  PgmPrintln("Recording - type 's' to stop 'p' to pause");
  uint8_t nl = 0;
  while (wave.isRecording()) {
#if DISPLAY_RECORD_LEVEL > 0
    wave.adcClearRange();
    delay(500);
#if DISPLAY_RECORD_LEVEL > 1
    Serial.print(wave.adcGetMax(), DEC);
    Serial.print(',');
    Serial.println(wave.adcGetMin(), DEC);
#else // #if DISPLAY_RECORD_LEVEL > 1
    Serial.print(wave.adcGetRange(), DEC);
    if (++nl % 8) {
      Serial.print(' ');
    } else {
      Serial.println();
    }
#endif // DISPLAY_RECORD_LEVEL > 1
#endif // DISPLAY_RECORD_LEVEL > 0
    // check for pause/stop
    pauseResume();
  }
}
E com o código que eu tento adaptar, começa a gravar mas logo no inicio os valores lidos pelo micro são apenas zeros.
Título: Re: Problema com codigo
Enviado por: tarquinio em 07 de Dezembro de 2013, 19:48
Bem assim de repente a função que mostras parece estar bem... Mas não vejo é estares a chamá-la em lado nenhum no resto do código...
Já agora outra coisa que está um bocado mal explicada no Arduino é que as portas "Analog" podes usar normalmente como portas digitais, que é +- o que estas  a fazer com:
Código: [Seleccione]
analogRead(botaoMenu)>1000
As portas A0, A5 podes inicializar normalmente com pinMode e digitalRead etc etc... usando os pinos 14 a 19.
Título: Re: Problema com codigo
Enviado por: Asilva em 07 de Dezembro de 2013, 20:17
o código é imenso e só coloquei o essencial.
botaoMenu está defenido assim: "#define botaoMenu A1"
na porta A1 tenho um divisor de tensão com 5 botões que me permite fazer 5 leituras nessa porta.
penso que o problema está no facto de:
Código: [Seleccione]
if (!Serial.available()) return;
  uint8_t c = Serial.read();
  while (Serial.read() >= 0) {}
fazer uma temporização, enquanto que:
Código: [Seleccione]
if ((wave.isPlaying()||wave.isRecording())&& analogRead(botaoMenu)>1000)
não fazer a mesma temporização.
O problema não é a diferença no nome da função ou a sua aplicação(pois ai sei como fazer), o problema é o conteudo da mesma.
É possivel na minha função fazer a mesma temporização, com uma entrada analógica existe algo do genero |analog.available|.
depois á algo que me está a fazer confusão, se diz:
Código: [Seleccione]
while (Serial.read() >= 0) {}
  if (c == 's') {
    wave.stop();
  }
então se quando Serial.read() >=0 não faz nada, como é que se c=="s" faz qualquer coisa
eu sei que eu é que não estou a perceber isto, porque com o codigo da livraria waveRP funciona bem.
Título: Re: Problema com codigo
Enviado por: senso em 07 de Dezembro de 2013, 20:30
Oh boy..
Faltam ai uns básicos sobre linguagem C/C++, e programação no geral.
Primeiro, esse código não faz "temporização" nenhuma, se realmente queres desperdiçar clocks, mete um delay na função, mas o código original não está lá a perder tempo em sitio nenhum.

Código: [Seleccione]
if (!Serial.available()) return;
  uint8_t c = Serial.read();
  while (Serial.read() >= 0) {}

Este pedaço de código vê se existem dados no buffer da porta serial, se existir lê um caracter do buffer e manda o resto para o lixo basicamente, basicamente serve para ler um caracter e depois consumir os /n ou /n/r que os terminais poderam ou não enviar, mas é basicamente para o código funcionar devidamente.

Código: [Seleccione]
uint8_t c = Serial.read();
E como podes ver, a segunda linha tem esse código, que lê um caracter do buffer serial.
A leitura de uma porta analógica pode-se considerar instantanea, não é nada se seja ultra lento para a aplicação que lhe estás a dar.