Go Down

Topic: problema con l'incorporazione di un codice (sto esplodendo) (Read 804 times) previous topic - next topic

awambawamb

heilà.

qualche giorno fa mi sono messo a fare una roba semplice con arduino: il sequencer che vedete in questa pagina

http://www.beavisaudio.com/projects/digital/arduinopunkconsole/


solo che il codice ha un bug: il pulsante Start/Stop non fa la funzione che dice di fare (devo tenerlo premuto per far uscire il suono).

allora mi sono messo alla ricerca ed ho trovato questo:

http://www.arduino.cc/en/Tutorial/Switch


dato che presi singolarmente i due codici "funzionano", ne ho dedotto che avrei potuto incorporare il codice dello switch nel codice del sequencer, così da avere risolto il problema.
come? copiando il codice e cercando di evitare collisioni tra i pin utilizzati in comune nei due codici. tipo muovendo il controllo dello switch al pin 10, e dicendo al sequencer di guardare cosa succede al pin 13 per sapere se far partire il sequencer o meno.

E INVECE NO! una volta incorporato, ricevo uno o due errori di "unexpected unqualified-id before { token" e non riesco a localizzarlo... ma credo che il problema stia nel modo in cui incorporo il codice dello switch...

...e non capiso il perchè :\

...un aiutino su come "mergere" i due codici?
Grazie!
grazie!!!!

leo72

Il problema pare una parentesi di troppo o di meno.
Ti devi mettere con pazienza a ricontrollarle tutte finché non trovi l'errore.

awambawamb

il bello è che adesso il codice originale del sito adesso non va più.

LOL.

una divinità superiore ed alquanto burlona ha cambiato la pagina nottetempo?

Madwriter


Il problema pare una parentesi di troppo o di meno.
Ti devi mettere con pazienza a ricontrollarle tutte finché non trovi l'errore.

notepad++ può aiutarti :D
"Due cose sono infinite: l'universo e la stupidità umana, ma riguardo l'universo ho ancora dei dubbi..." Albert Einstein

leo72



Il problema pare una parentesi di troppo o di meno.
Ti devi mettere con pazienza a ricontrollarle tutte finché non trovi l'errore.

notepad++ può aiutarti :D

Geany può aiutarti  :P

awambawamb

non riesco a capire.

vi comunico il codice e l'errore... sembra che ogni "compilatore" parli una lingua sua :\

questo è il codice
Code: [Select]
/* ======================================================================
Arduino Punk Console
A simple programmable 8 step tone sequencer
by dano/beavisaudio.com
Revs
-----------------------------------
15 Sept  djh  initial version
======================================================================*/
// Map all the input and output pins
#define AnalogInFrequency 1
#define AnalogInTempo 2
#define AnalogInDuration 0
#define DigitalOutSignal 11
#define DigitalInSwitch0 2
#define DigitalInSwitch1 3
#define DigitalInSwitch2 4
#define DigitalInSwitch3 5
#define DigitalInSwitch4 6
#define DigitalInSwitch5 7
#define DigitalInSwitch6 8
#define DigitalInSwitch7 9
#define DigitalOutLED 1
// Set up the array for each step
int steps[] = {100,120,140,160,180,200,220,240};
// misc housekeeping
int duration = 50;
int pitchval = 1;
int fPlayMode = true;
int lastPushedStep = -1;
int Button = 0; //This is the default "Button Off" and 1 is "Button On"
int OldButton = 0; //I'll explain later
// Initialize the tempo
int tempo = 100;

/* switch
*
* Each time the input pin goes from LOW to HIGH (e.g. because of a push-button
* press), the output pin is toggled from LOW to HIGH or HIGH to LOW.  There's
* a minimum delay between toggles to debounce the circuit (i.e. to ignore
* noise). 
*
* David A. Mellis
* 21 November 2006
*/

int inPin = 10;         // the number of the input pin
int outPin = 13;       // the number of the output pin

int state = HIGH;      // the current state of the output pin
int reading;           // the current reading from the input pin
int previous = LOW;    // the previous reading from the input pin

// the follow variables are long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long time = 0;         // the last time the output pin was toggled
long debounce = 200;   // the debounce time, increase if the output flickers



void setup()

{
  pinMode(inPin, INPUT);
  pinMode(outPin, OUTPUT);
}

{
  // setup pin modes (Digital pins are input by default, but
  // I like to set 'em explicitly just so the code is clear.
  pinMode (DigitalInSwitch0, INPUT);
  pinMode (DigitalInSwitch1, INPUT);
  pinMode (DigitalInSwitch2, INPUT);
  pinMode (DigitalInSwitch3, INPUT);
  pinMode (DigitalInSwitch4, INPUT);
  pinMode (DigitalInSwitch5, INPUT);
  pinMode (DigitalInSwitch6, INPUT);
  pinMode (DigitalInSwitch7, INPUT);
  pinMode (DigitalOutSignal, OUTPUT); 
  pinMode (DigitalOutLED, OUTPUT);
  // setup comms for the LCD display
  Serial.begin(9600);

  StartupMessage();
}
void StartupMessage()
{
  clearLCD();
  Serial.print ("BEAVIS: Arduino");
  delay(300);
  Serial.print (254, BYTE);
  Serial.print (192, BYTE);
  Serial.print ("Punk Console!");
  delay (2000);
  clearLCD();
  Serial.print ("Beavis: APC");
}

void clearLCD()
{
  Serial.print(254, BYTE);
  Serial.print(1, BYTE);
}

void loop()
{
  // Main sequence loop 
  for (int i=0; i<8; i++)
  {   
    // Are we playing or stopping?
   {
  reading = digitalRead(inPin);

  // if the input just went from LOW and HIGH and we've waited long enough
  // to ignore any noise on the circuit, toggle the output pin and remember
  // the time
  if (reading == HIGH && previous == LOW && millis() - time > debounce)
  {
    if (state == HIGH)
      state = LOW;
    else
      state = HIGH;

    time = millis();   
  }

  digitalWrite(outPin, state);

  previous = reading;
}
   
    fPlayMode = digitalRead (13);
    digitalWrite (DigitalOutLED, HIGH);
    // Check the Hardware
     readSwitches();
     readPots();

    // update the display
    updateDisplay();

    // Make the noise
    if (fPlayMode)
    {
      freqout (steps[i], duration);
    }
    digitalWrite (DigitalOutLED, LOW);

    // Pause between steps
    delay (tempo);       
  }
}

void updateDisplay()
{
  Serial.print (254, BYTE);
  Serial.print (192, BYTE);
  Serial.print ("T:");
  Serial.print (tempo);
  Serial.print (" d:");
  Serial.print (duration);
if (lastPushedStep != -1)
{
    Serial.print ("*");
    Serial.print (lastPushedStep);
}
}
// Read the current values of the pots, called from the loop.
void readPots ()
{
    tempo = (analogRead (AnalogInTempo) * 1.9);
    duration = (analogRead (AnalogInDuration));     
}
// Read the current values of the switches and
// if pressed, replace the switch's slot frequency
// by reading the frequency pot.
void readSwitches()
{
  // reset last pushed button number
  lastPushedStep = -1;

  // check switch 0, if pressed, get the current freq into step 0, etc. etc.
  if (digitalRead (DigitalInSwitch0) == HIGH)
  {
    steps[0] = analogRead(AnalogInFrequency);
    lastPushedStep = 1;
  }

  else if (digitalRead (DigitalInSwitch1) == HIGH)
  {
    steps[1] = analogRead(AnalogInFrequency);
    lastPushedStep = 2;
  }

  else if (digitalRead (DigitalInSwitch2) == HIGH)
  {
    steps[2] = analogRead(AnalogInFrequency);
    lastPushedStep = 3;
  }
  else if (digitalRead (DigitalInSwitch3) == HIGH)
  {
    steps[3] = analogRead(AnalogInFrequency);
    lastPushedStep = 4;
  }
  else if (digitalRead (DigitalInSwitch4) == HIGH)
  {
    steps[4] = analogRead(AnalogInFrequency);
    lastPushedStep = 5;
  }
  else if (digitalRead (DigitalInSwitch5) == HIGH)
  {
    steps[5] = analogRead(AnalogInFrequency);
    lastPushedStep = 6;
  }
  else if (digitalRead (DigitalInSwitch6) == HIGH)
  {
    steps[6] = analogRead(AnalogInFrequency);
    lastPushedStep = 7;
  }
  else if (digitalRead (DigitalInSwitch7) == HIGH)
  {
    steps[7] = analogRead(AnalogInFrequency);
    lastPushedStep = 8;
  }
}


//freqout code by Paul Badger
// freq - frequency value
// t - time duration of tone
void freqout(int freq, int t)
{
  int hperiod;     //calculate 1/2 period in us
  long cycles, i;

  // subtract 7 us to make up for digitalWrite overhead - determined empirically
  hperiod = (500000 / ((freq - 7) * pitchval));             

  // calculate cycles
  cycles = ((long)freq * (long)t) / 1000;    // calculate cycles
  for (i=0; i<= cycles; i++)
  {              // play note for t ms 
    digitalWrite(DigitalOutSignal, HIGH); 
    delayMicroseconds(hperiod);
    digitalWrite(DigitalOutSignal, LOW); 
    delayMicroseconds(hperiod - 1);     // - 1 to make up for fractional microsecond in digitaWrite overhead
  }
}


e questo è l'errore:

Code: [Select]
sketch_oct06a_pippo.cpp:76:1: error: expected unqualified-id before '{' token


solo che le righe 75-76-77 sono queste:

Code: [Select]

pinMode (DigitalInSwitch5, INPUT);
pinMode (DigitalInSwitch6, INPUT);
pinMode (DigitalInSwitch7, INPUT);


e nessuna traccia di parentesi graffe :\

Madwriter

prova un po con questo
Code: [Select]
/* ======================================================================
Arduino Punk Console
A simple programmable 8 step tone sequencer
by dano/beavisaudio.com
Revs
-----------------------------------
15 Sept  djh  initial version
======================================================================*/
// Map all the input and output pins
#define AnalogInFrequency 1
#define AnalogInTempo 2
#define AnalogInDuration 0
#define DigitalOutSignal 11
#define DigitalInSwitch0 2
#define DigitalInSwitch1 3
#define DigitalInSwitch2 4
#define DigitalInSwitch3 5
#define DigitalInSwitch4 6
#define DigitalInSwitch5 7
#define DigitalInSwitch6 8
#define DigitalInSwitch7 9
#define DigitalOutLED 1
// Set up the array for each step
int steps[] = {100,120,140,160,180,200,220,240};
// misc housekeeping
int duration = 50;
int pitchval = 1;
int fPlayMode = true;
int lastPushedStep = -1;
int Button = 0; //This is the default "Button Off" and 1 is "Button On"
int OldButton = 0; //I'll explain later
// Initialize the tempo
int tempo = 100;

/* switch
*
* Each time the input pin goes from LOW to HIGH (e.g. because of a push-button
* press), the output pin is toggled from LOW to HIGH or HIGH to LOW.  There's
* a minimum delay between toggles to debounce the circuit (i.e. to ignore
* noise). 
*
* David A. Mellis
* 21 November 2006
*/

int inPin = 10;         // the number of the input pin
int outPin = 13;       // the number of the output pin

int state = HIGH;      // the current state of the output pin
int reading;           // the current reading from the input pin
int previous = LOW;    // the previous reading from the input pin

// the follow variables are long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long time = 0;         // the last time the output pin was toggled
long debounce = 200;   // the debounce time, increase if the output flickers



void setup()

{
  pinMode(inPin, INPUT);
  pinMode(outPin, OUTPUT);
}
void loop()

{
  // setup pin modes (Digital pins are input by default, but
  // I like to set 'em explicitly just so the code is clear.
  pinMode (DigitalInSwitch0, INPUT);
  pinMode (DigitalInSwitch1, INPUT);
  pinMode (DigitalInSwitch2, INPUT);
  pinMode (DigitalInSwitch3, INPUT);
  pinMode (DigitalInSwitch4, INPUT);
  pinMode (DigitalInSwitch5, INPUT);
  pinMode (DigitalInSwitch6, INPUT);
  pinMode (DigitalInSwitch7, INPUT);
  pinMode (DigitalOutSignal, OUTPUT); 
  pinMode (DigitalOutLED, OUTPUT);
  // setup comms for the LCD display
  Serial.begin(9600);

  StartupMessage();
}
void StartupMessage()
{
  clearLCD();
  Serial.print ("BEAVIS: Arduino");
  delay(300);
  Serial.print (254, BYTE);
  Serial.print (192, BYTE);
  Serial.print ("Punk Console!");
  delay (2000);
  clearLCD();
  Serial.print ("Beavis: APC");
}

void clearLCD()
{
  Serial.print(254, BYTE);
  Serial.print(1, BYTE);
}

void loop()
{
  // Main sequence loop 
  for (int i=0; i<8; i++)
  {   
    // Are we playing or stopping?
   {
  reading = digitalRead(inPin);

  // if the input just went from LOW and HIGH and we've waited long enough
  // to ignore any noise on the circuit, toggle the output pin and remember
  // the time
  if (reading == HIGH && previous == LOW && millis() - time > debounce)
  {
    if (state == HIGH)
      state = LOW;
    else
      state = HIGH;

    time = millis();   
  }

  digitalWrite(outPin, state);

  previous = reading;
}
   
    fPlayMode = digitalRead (13);
    digitalWrite (DigitalOutLED, HIGH);
    // Check the Hardware
     readSwitches();
     readPots();

    // update the display
    updateDisplay();

    // Make the noise
    if (fPlayMode)
    {
      freqout (steps[i], duration);
    }
    digitalWrite (DigitalOutLED, LOW);

    // Pause between steps
    delay (tempo);       
  }
}

void updateDisplay()
{
  Serial.print (254, BYTE);
  Serial.print (192, BYTE);
  Serial.print ("T:");
  Serial.print (tempo);
  Serial.print (" d:");
  Serial.print (duration);
if (lastPushedStep != -1)
{
    Serial.print ("*");
    Serial.print (lastPushedStep);
}
}
// Read the current values of the pots, called from the loop.
void readPots ()
{
    tempo = (analogRead (AnalogInTempo) * 1.9);
    duration = (analogRead (AnalogInDuration));     
}
// Read the current values of the switches and
// if pressed, replace the switch's slot frequency
// by reading the frequency pot.
void readSwitches()
{
  // reset last pushed button number
  lastPushedStep = -1;

  // check switch 0, if pressed, get the current freq into step 0, etc. etc.
  if (digitalRead (DigitalInSwitch0) == HIGH)
  {
    steps[0] = analogRead(AnalogInFrequency);
    lastPushedStep = 1;
  }

  else if (digitalRead (DigitalInSwitch1) == HIGH)
  {
    steps[1] = analogRead(AnalogInFrequency);
    lastPushedStep = 2;
  }

  else if (digitalRead (DigitalInSwitch2) == HIGH)
  {
    steps[2] = analogRead(AnalogInFrequency);
    lastPushedStep = 3;
  }
  else if (digitalRead (DigitalInSwitch3) == HIGH)
  {
    steps[3] = analogRead(AnalogInFrequency);
    lastPushedStep = 4;
  }
  else if (digitalRead (DigitalInSwitch4) == HIGH)
  {
    steps[4] = analogRead(AnalogInFrequency);
    lastPushedStep = 5;
  }
  else if (digitalRead (DigitalInSwitch5) == HIGH)
  {
    steps[5] = analogRead(AnalogInFrequency);
    lastPushedStep = 6;
  }
  else if (digitalRead (DigitalInSwitch6) == HIGH)
  {
    steps[6] = analogRead(AnalogInFrequency);
    lastPushedStep = 7;
  }
  else if (digitalRead (DigitalInSwitch7) == HIGH)
  {
    steps[7] = analogRead(AnalogInFrequency);
    lastPushedStep = 8;
  }
}


//freqout code by Paul Badger
// freq - frequency value
// t - time duration of tone
void freqout(int freq, int t)
{
  int hperiod;     //calculate 1/2 period in us
  long cycles, i;

  // subtract 7 us to make up for digitalWrite overhead - determined empirically
  hperiod = (500000 / ((freq - 7) * pitchval));             

  // calculate cycles
  cycles = ((long)freq * (long)t) / 1000;    // calculate cycles
  for (i=0; i<= cycles; i++)
  {              // play note for t ms 
    digitalWrite(DigitalOutSignal, HIGH); 
    delayMicroseconds(hperiod);
    digitalWrite(DigitalOutSignal, LOW); 
    delayMicroseconds(hperiod - 1);     // - 1 to make up for fractional microsecond in digitaWrite overhead
  }
}
"Due cose sono infinite: l'universo e la stupidità umana, ma riguardo l'universo ho ancora dei dubbi..." Albert Einstein

awambawamb

EUREKA!!!!

ho trovato l'errore, con un metodo del tipo cancella-vedi se carica-ctrl+z-e così via...

per un motivo a me sconosciuto, dovevo scrivere:

Code: [Select]
void setup()

{
 // setup pin modes (Digital pins are input by default, but
 // I like to set 'em explicitly just so the code is clear.
 pinMode (DigitalInSwitch0, INPUT);
 pinMode (DigitalInSwitch1, INPUT);
 pinMode (DigitalInSwitch2, INPUT);
 pinMode (DigitalInSwitch3, INPUT);
 pinMode (DigitalInSwitch4, INPUT);
 pinMode (DigitalInSwitch5, INPUT);
 pinMode (DigitalInSwitch6, INPUT);
 pinMode (DigitalInSwitch7, INPUT);
 pinMode (DigitalOutSignal, OUTPUT);  
 pinMode (DigitalOutLED, OUTPUT);
 pinMode(inPin, INPUT);
 pinMode(outPin, OUTPUT);
 // setup comms for the LCD display
 Serial.begin(9600);
 StartupMessage();
}


al posto di:

Code: [Select]
void setup()

{
 pinMode(inPin, INPUT);
 pinMode(outPin, OUTPUT);
}

{
 // setup pin modes (Digital pins are input by default, but
 // I like to set 'em explicitly just so the code is clear.
 pinMode (DigitalInSwitch0, INPUT);
 pinMode (DigitalInSwitch1, INPUT);
 pinMode (DigitalInSwitch2, INPUT);
 pinMode (DigitalInSwitch3, INPUT);
 pinMode (DigitalInSwitch4, INPUT);
 pinMode (DigitalInSwitch5, INPUT);
 pinMode (DigitalInSwitch6, INPUT);
 pinMode (DigitalInSwitch7, INPUT);
 pinMode (DigitalOutSignal, OUTPUT);  
 pinMode (DigitalOutLED, OUTPUT);
 // setup comms for the LCD display
 Serial.begin(9600);

 StartupMessage();
}


per una ragione che assolutamente non comprendo,

Code: [Select]
{
 pinMode(inPin, INPUT);
 pinMode(outPin, OUTPUT);
}


non va bene.

grazie a tutti cmq!!!! :D

lesto

motivo assolutamente misterioso??

Quote
void setup()

{
  pinMode(inPin, INPUT);
  pinMode(outPin, OUTPUT);
}

{


quì ci sta l'errore. ma immagino che parlarti di funzione non abbia senso... quandi lascio la info ai posteri
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

awambawamb

Quote
quì ci sta l'errore. ma immagino che parlarti di funzione non abbia senso


non c'è problema, ho risolto :)

dato che smanetto con il codice da un giorno e non ho mai mai mai studiato programmazione all'infuori di un pò di TurboPASCAL al liceo, mi ritengo abbastanza soddisfatto!

grazie ancora!

leo72

Ma anche nel Turbo Pascal si avevano i blocchi di codice... Se tu scrivi

Code: [Select]
void setup() {
abc
}
{
  def
}

mi dici il blocco "def" a chi appartiene?  ;)

Madwriter


Ma anche nel Turbo Pascal si avevano i blocchi di codice... Se tu scrivi

Code: [Select]
void setup() {
abc
}
{
  def
}

mi dici il blocco "def" a chi appartiene?  ;)

io amavo il pascal :D
"Due cose sono infinite: l'universo e la stupidità umana, ma riguardo l'universo ho ancora dei dubbi..." Albert Einstein

awambawamb

uh... la uno?

no no, io con la programmazione sono a livello ameba. l'importante è che adesso funzioni :D

più o meno qualcosa ho capito :P

leo72


io amavo il pascal :D

Anch'io. Secondo me è stato uno dei migliori linguaggi strutturati degli anni '80. Per semplicità e potenza faceva concorrenza al C.

Go Up