collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[27 de Março de 2024, 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: Problema com codigo  (Lida 2163 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline Asilva

  • Mini Robot
  • *
  • Mensagens: 29
Problema com codigo
« 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.

Offline tarquinio

  • Mini Robot
  • *
  • Mensagens: 529
Re: Problema com codigo
« Responder #1 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.

Offline Asilva

  • Mini Robot
  • *
  • Mensagens: 29
Re: Problema com codigo
« Responder #2 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.

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Problema com codigo
« Responder #3 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.
Avr fanboy