collapse

* Links de Robótica

* Posts Recentes

URGENTE - display de 7 segmentos com backpack por helderjsd
[Hoje às 12:03]


Preços e fabricantes de pcb por Sérgio_Sena
[Ontem às 10:20]


Palavras Cruzadas por Njay
[Ontem às 02:24]


Isaac Asimov - I, Robot por senso
[18 de Setembro de 2017, 03:41]


Apresentação por TigPT
[17 de Setembro de 2017, 07:31]


ic SL440 da Plessey? por senso
[16 de Setembro de 2017, 13:11]


Compra Colectiva RS-Amidata por brunus
[15 de Setembro de 2017, 22:31]


Ideias para construir um quadrúpede simples por zordlyon
[15 de Setembro de 2017, 10:18]


Preparar bancada de testes por jm_araujo
[14 de Setembro de 2017, 10:24]


Mitos: mudança da ilumação tradicional p/ iluminação a LEDs? por LVirtual
[14 de Setembro de 2017, 07:46]

Autor Tópico: Problema com codigo  (Lida 895 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.389
  • 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