Pages: [1] 2   Go Down
Author Topic: sketch spesso errati...  (Read 1894 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 1
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ciao, da due settimane spesso mi capita di ricercare sul web, e quindi praticamente ovunque capiti sketch.
bene a parte i primi sperimentali, su led o altro, tutti gli skech moolto più interessanti per il mio progetto una volta caricati hanno mostrato errori.
intendo dire che ho provato a caricarne su temi come collegamento rc da modellismo, servi in combinazione con la ricevente, ma poi il risultato è stato fallimentare.
la cosa sulla quale ho proprio bisogno di voi è il modo per interpretare i messaggi di errore di arduino, in fase di verifica skech.
per me sono come geroglifici !!! e come posso correggere o provare a correggere il programma se non capisco dove (relativamente indicato dalla riga di errore) e sopratutto se non capisco come ?!??!
grazie !!!
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Metti i messaggi, però...

Cmq gli errori che si possono verificare sono in genere:
1) lo sketch usa una o più librerie che non ci sono sul sistema. Soluzione: scaricarle
2) una libreria che si sta usando è incompatibile con la versione dell'IDE in uso. Soluzione: aggiornare la libreria
3) lo sketch è stato scritto per una versione diversa dell'IDE. Soluzione: cercare di adattare lo sketch o cercarne uno compatibile con l'IDE che si sta usando
Logged


Offline Offline
Newbie
*
Karma: 1
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

vero i messaggi sarebbero stati di aiuto ma non si possono copiare ed incollare  smiley e quindi...cmq l'obiettivo mio finale sarebbe quello di cogliere la logica dei messaggi in genere, con letture o altro, e poi vedere i vari casi sepcifici. almeno mi sembrava la cosa più ovvia, anzi la cosa più immediata è stata quella di caricare altri programmi simili senza errori  smiley-grin smiley-grin smiley-grin
ma volevo cogliere il senso....questo era l'intento.
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 251
Posts: 21272
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Perché non puoi copiarli e incollarli?

esempio:
Quote
AnalogReadSerial:11: error: expected initializer before 'Serial'
AnalogReadSerial:12: error: expected declaration before '}' token

Ciao Uwe
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 38
Posts: 3282
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
vero i messaggi sarebbero stati di aiuto ma non si possono copiare ed incollare
come no???? seleziona le righe rosse col mouse che trovi in basso nell'IDE, con ctrl+c le copi e con ctrl+v incolli qui.

per quello che riguarda gli errori ce ne sono veramente tanti ognuno ha un significato, non esiste un criterio generico per spiegarti come e dove cercare l'errore senza vederlo e a volte nonostante si conosca la descrizione dell'errore serve anche guardare lo sketch.
Logged

no comment

Offline Offline
Newbie
*
Karma: 1
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ma come ?!?! ho già imparato qualcosa....io ho fatto solo il tentativo con il tasto destro del mouse adesso ci riprovo.....
codice sano sano preso e copiato :
Code:
// R/C RADIO PPM SIGNAL READ (USING TIMER1 INPUT CAPTURE AND OVERFLOW INTERRUPTS) 
// AND SERVO OUTPUT ON OC1A, OC1B pins [Disabled now] 
// SERVO OUTPUT FUNCTION USING TIMER2 OVERFLOW INTERRUPT  
 
#include "conf.h" 
#ifdef SERVODECODE 
#else 
// Timer1 Overflow  
// Detects radio signal lost and generate servo outputs (overflow at 22ms (45Hz)) 
ISR(TIMER1_OVF_vect){ 
  //TCNT1 = 20000;        // at 16Mhz (0.5us) (65535-20000) = 22 ms (45Hz) 
  //OCR1A = 20000 + (Servo1<<1);  // Output for servos... 
  //OCR1B = 20000 + (Servo2<<1); 
  //TCCR1A = 0xF0;        // Set OC1A/OC1B on Compare Match 
  //TCCR1C = 0xC0;        // Force Output Compare A/B (Start Servo pulse) 
  //TCCR1C = 0x00;         
  //TCCR1A = 0xA0;      // Clear OC1A/OC1B on Compare Match
 
  TCNT1 = 0; 
  Timer1_last_value=0xFFFF;  // Last value before overflow... 
  // Radio signal lost... 
  radio_status = 0;  
}
 
// Capture RX pulse train using TIMER 1 CAPTURE INTERRUPT 
// And also send Servo pulses using OCR1A and OCR1B [disabled now] 
// Servo output is synchronized with input pulse train
 
ISR(TIMER1_CAPT_vect) 
{
   if(!bit_is_set(TCCR1B ,ICES1)){          // falling edge? 
         if(Rx_ch == MAX_CHANNELS) {        // This should be the last pulse... 
             Pulses[Rx_ch++] = ICR1;   
             radio_status = 1;              // Rx channels ready... 
          } 
         TCCR1B = 0x42;              // Next time : rising edge 
         Timer1_last_value = TCNT1;  // Take last value before reset         
         TCNT1 = 0;                  // Clear counter
         // Servo Output on OC1A/OC1B... (syncronised with radio pulse train) 
         //TCCR1A = 0xF0;        // Set OC1A/OC1B on Compare Match 
         //TCCR1C = 0xC0;        // Force Output Compare A/B (Start Servo pulse) 
         //TCCR1C = 0x00;       
         //TCCR1A = 0xA0;       // Clear OC1A/OC1B on Compare Match     
   }
 
   else {                                 // Rise edge 
          if ((ICR1-ICR1_old) >= SYNC_GAP_LEN){   // SYNC pulse? 
                Rx_ch = 1;                // Channel = 1 
                Pulses[0] = ICR1; 
            } 
          else { 
            if(Rx_ch <= MAX_CHANNELS) 
               Pulses[Rx_ch++] = ICR1;    // Store pulse length 
            if(Rx_ch == MAX_CHANNELS) 
               TCCR1B = 0x02;             // Next time : falling edge 
            }
    } 
   ICR1_old = ICR1; 

 
// Servo Input PPM Initialization routine 
void RxServoInput_ini() 

  pinMode(icpPin,INPUT); 
  Rx_ch = 1; 
  //TCCR1A = 0xA0;           // Normal operation mode, PWM Operation disabled, clear OC1A/OC1B on Compare Match 
  TCCR1A = 0x00;             // COM1A1=0, COM1A0=0 => Disconnect Pin OC1 from Timer/Counter 1 -- PWM11=0,PWM10=0 => PWM  
  TCCR1B = 0x42;             // TCNT1 preescaler/8 (16Mhz => 0.5useg, 8 Mhz => 1useg), Rising edge 
  TIMSK1 = _BV(ICIE1)|_BV (TOIE1);   // Enable interrupts : Timer1 Capture and Timer1 Overflow 
  Neutro[1] = 1037; 
  Neutro[2] = 1037; 
  Neutro[3] = 1037; 
  Neutro[4] = 1037; 
  Servo1 = 1037; 
  Servo2 = 1037; 
}
 
int RxGetChannelPulseWidth( uint8_t channel) 

  unsigned int result; 
  unsigned int result2; 
  unsigned int pulso_ant; 
  unsigned int pulso_act;  
 
  // Because servo pulse variables are 16 bits and the interrupts are running values could be corrupted. 
  // We dont want to stop interrupts to read radio channels so we have to do two readings to be sure that the value is correct...
 
  result =  Pulses[channel]; 
  result2 =  Pulses[channel]; 
  if (result != result2) 
    result =  Pulses[channel];   // if the results are different we make a third reading (this should be fine) 
  pulso_act = result; 
  pulso_ant = Pulses[channel-1]; 
  result2 =  Pulses[channel-1]; 
  if (pulso_ant != result2) 
     pulso_ant = Pulses[channel-1];   // if the results are different we make a third reading (this should be fine) 
    result = (result - pulso_ant)>>1;        // Restamos con el valor del pulso anterior y pasamos a microsegundos (reloj a 0.5us)  
  if ((result > MIN_IN_PULSE_WIDTH)&&(result < MAX_IN_PULSE_WIDTH))  // Out of range? 
    return result; 
  else 
    { 
    return Neutro[channel]; 
    } 

#endif 
 
// SERVO SIGNAL OUTPUT (USING TIMER2 OVERFLOW INTERRUPT AND TIMER1 READINGS) 
ISR (TIMER2_OVF_vect) 
{  
  int us; 
  int aux; 
  if (Servo_Channel < num_servos){ 
    Servo_Timer2_timer1_stop = TCNT1;       // take the timer1 value at this moment 
    // Now we are going to calculate the time we need to wait until pulse end 
    if (Servo_Timer2_timer1_stop>Servo_Timer2_timer1_start)   // Timer1 reset during the pulse? 
      Servo_Timer2_pulse_length = Servo_Timer2_timer1_stop-Servo_Timer2_timer1_start; 
    else 
      Servo_Timer2_pulse_length = ((long)Servo_Timer2_timer1_stop + Timer1_last_value) - (long)Servo_Timer2_timer1_start; 
    us = (Servos[Servo_Channel].value) - (Servo_Timer2_pulse_length>>1); 
    us -= 2;  // Adjust for the time of this code 
    if (us>1) 
      { 
      us <<= 2; // Translate us to the 4 cyles loop (1/4 us) 
      __asm__ __volatile__ (  // 4 cycles loop = 1/4 us  (taken from delayMicroSeconds function) 
        "1: sbiw %0,1" "\n\t"            // 2 cycles 
        "brne 1b" : "=w" (us) : "0" (us) // 2 cycles 
        ); 
      } 
    digitalWrite( Servos[Servo_Channel].pin,LOW);    // pulse this channel low 
    Servo_Channel++;                                 // increment to the next channel 
    } 
  else 
    Servo_Channel = 0;                // SYNC pulse end => Start again on first channel 
  if (Servo_Channel == num_servos){           // This is the SYNC PULSE 
    TCCR2B = _BV(CS20)|_BV(CS21)|_BV(CS22);   // set prescaler of 1024 => 64us resolution (overflow = 16384uS)  
    TCNT2 = 0x04;   //64usx4 = 256us 
    } 
  else{ 
    TCCR2B = _BV(CS20)|_BV(CS22);                  // Set prescaler of 128  (8uS resolution at 16Mhz)  
    TCNT2 = Servos[Servo_Channel].counter;         // Set the clock counter register for the overflow interrupt 
    Servo_Timer2_timer1_start = TCNT1;             // we take the value of Timer1 at the start of the pulse 
    digitalWrite(Servos[Servo_Channel].pin,HIGH);  // Pulse start. Let´s go... 
    } 

 
void Servo_Timer2_ini() 
{  
  // Servos must have correct values at this moment !! Call First Servo_Timer2_set() function... 
  // Variable initialization   
  Servo_Channel = 0; 
  TIMSK2 = 0;  // Disable interrupts  
  TCCR2A = 0;  // normal counting mode  
  TCCR2B = _BV(CS20)|_BV(CS22);            // Set prescaler of 128  (8uS resolution at 16Mhz) 
  TCNT2 = Servos[Servo_Channel].counter;   // Set the clock counter register for the overflow interrupt 
  TIFR2 = _BV(TOV2);  // clear pending interrupts;  
  TIMSK2 =  _BV(TOIE2) ; // enable the overflow interrupt       

 
void Servo_Timer2_set(uint8_t servo_index, int value) 

  int aux;
  if (value > SERVO_MAX_PULSE_WIDTH) 
    value = SERVO_MAX_PULSE_WIDTH; 
  else if (value < SERVO_MIN_PULSE_WIDTH) 
    value = SERVO_MIN_PULSE_WIDTH; 
  Servos[servo_index].value = value; // Store the desired value on Servo structure 
  value = value - 20;  // We reserve 20us for compensation... 
  // Calculate the overflow interrupt counter (8uS step) 
  aux = value>>3;  // value/8 
  Servos[servo_index].counter = 256 - aux;
« Last Edit: December 18, 2012, 07:55:12 pm by UweFederer » Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 10
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


ed ecco gli errori
 
ricevente.ino:7:19: error: conf.h: No such file or directory
ricevente.ino: In function 'void __vector_13()':
ricevente:43: error: 'Timer1_last_value' was not declared in this scope
ricevente:49: error: 'radio_status' was not declared in this scope
ricevente.ino: In function 'void __vector_10()':
ricevente:67: error: 'Rx_ch' was not declared in this scope
ricevente:67: error: 'MAX_CHANNELS' was not declared in this scope
ricevente:69: error: 'Pulses' was not declared in this scope
ricevente:71: error: 'radio_status' was not declared in this scope
ricevente:77: error: 'Timer1_last_value' was not declared in this scope
ricevente:97: error: 'ICR1_old' was not declared in this scope
ricevente:97: error: 'SYNC_GAP_LEN' was not declared in this scope
ricevente:99: error: 'Rx_ch' was not declared in this scope
ricevente:101: error: 'Pulses' was not declared in this scope
ricevente:107: error: 'Rx_ch' was not declared in this scope
ricevente:107: error: 'MAX_CHANNELS' was not declared in this scope
ricevente:109: error: 'Pulses' was not declared in this scope
ricevente:111: error: 'Rx_ch' was not declared in this scope
ricevente:111: error: 'MAX_CHANNELS' was not declared in this scope
ricevente:119: error: 'ICR1_old' was not declared in this scope
ricevente.ino: In function 'void RxServoInput_ini()':
ricevente:133: error: 'icpPin' was not declared in this scope
ricevente:135: error: 'Rx_ch' was not declared in this scope
ricevente:147: error: 'Neutro' was not declared in this scope
ricevente:155: error: 'Servo1' was not declared in this scope
ricevente:157: error: 'Servo2' was not declared in this scope
ricevente.ino: In function 'int RxGetChannelPulseWidth(uint8_t)':
ricevente:181: error: 'Pulses' was not declared in this scope
ricevente:207: error: 'MIN_IN_PULSE_WIDTH' was not declared in this scope
ricevente:207: error: 'MAX_IN_PULSE_WIDTH' was not declared in this scope
ricevente:215: error: 'Neutro' was not declared in this scope
ricevente.ino: In function 'void __vector_9()':
ricevente:237: error: 'Servo_Channel' was not declared in this scope
ricevente:237: error: 'num_servos' was not declared in this scope
ricevente:239: error: 'Servo_Timer2_timer1_stop' was not declared in this scope
ricevente:245: error: 'Servo_Timer2_timer1_start' was not declared in this scope
ricevente:247: error: 'Servo_Timer2_pulse_length' was not declared in this scope
ricevente:251: error: 'Servo_Timer2_pulse_length' was not declared in this scope
ricevente:251: error: 'Timer1_last_value' was not declared in this scope
ricevente:253: error: 'Servos' was not declared in this scope
ricevente:253: error: 'Servo_Timer2_pulse_length' was not declared in this scope
ricevente:285: error: 'Servo_Channel' was not declared in this scope
ricevente:285: error: 'num_servos' was not declared in this scope
ricevente:297: error: 'Servos' was not declared in this scope
ricevente:299: error: 'Servo_Timer2_timer1_start' was not declared in this scope
ricevente.ino: In function 'void Servo_Timer2_ini()':
ricevente:317: error: 'Servo_Channel' was not declared in this scope
ricevente:325: error: 'Servos' was not declared in this scope
ricevente.ino: In function 'void Servo_Timer2_set(uint8_t, int)':
ricevente:343: error: 'SERVO_MAX_PULSE_WIDTH' was not declared in this scope
ricevente:347: error: 'SERVO_MIN_PULSE_WIDTH' was not declared in this scope
ricevente:353: error: 'Servos' was not declared in this scope
ricevente:365: error: expected `}' at end of input

un poco lungo ma ecco il senso...............grazie mille
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 251
Posts: 21272
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Nella prima riga c'é:
Quote
ricevente.ino:7:19: error: conf.h: No such file or directory
Vuol dire che non trova la libreria conf.h
Tutti gli altri errori sono consegueze della libreria non trovata ad ecezzione di:
Quote
ricevente:365: error: expected `}' at end of input
Che potrebbe sigificare che i numero di parentesi aperte non corrisponde al numero di parentesi chiuse. Questo errore comunque potrebbe anche essere una conseguenza della libreria mancante. Vedi se sparische quando hai la libreria.

Hai installata la libreria?

Ciao Uwe
Logged

Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ciao, da due settimane spesso mi capita di ricercare sul web, e quindi praticamente ovunque capiti sketch.
bene a parte i primi sperimentali, su led o altro, tutti gli skech moolto più interessanti per il mio progetto una volta caricati hanno mostrato errori.
intendo dire che ho provato a caricarne su temi come collegamento rc da modellismo, servi in combinazione con la ricevente, ma poi il risultato è stato fallimentare.
la cosa sulla quale ho proprio bisogno di voi è il modo per interpretare i messaggi di errore di arduino, in fase di verifica skech.
per me sono come geroglifici !!! e come posso correggere o provare a correggere il programma se non capisco dove (relativamente indicato dalla riga di errore) e sopratutto se non capisco come ?!??!
grazie !!!

prendere per " buoni "   sketch  dalla rete    senza che segue il filmato  o foto del progetto  funzionante   è una follia

e poi la strada più giusta   e quella di farsi da soli lo sketch su "misura"
Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 251
Posts: 21272
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

e poi la strada più giusta   e quella di farsi da soli lo sketch su "misura"
gingardu hai letto il Sketch? Ti sfido a scriverne uno simile.
Ciao Uwe
Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9179
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

gingardu hai letto il Sketch? Ti sfido a scriverne uno simile.

+1  smiley-grin
Logged

Offline Offline
Sr. Member
****
Karma: 8
Posts: 293
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


e poi la strada più giusta   e quella di farsi da soli lo sketch su "misura"

ad ingegneria del software 1 e 2 mi hanno insegnato l'esatto contrario: se si può bisogna sfruttare il già fatto... tutto sommato sbattendosene del come è stato fatto... che dopo la curiosità ti porti al capire come è stato fatto quello è per la ns sete di conoscenza ma non per il fine del progetto.

Logged

Parma
Offline Offline
Edison Member
*
Karma: 20
Posts: 2359
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ad ingegneria del software 1 e 2 mi hanno insegnato l'esatto contrario: se si può bisogna sfruttare il già fatto... tutto sommato sbattendosene del come è stato fatto... che dopo la curiosità ti porti al capire come è stato fatto quello è per la ns sete di conoscenza ma non per il fine del progetto.

Guarda che il "make or buy" non si applica in questi casi, un conto è comprare un qualcosa che funziona (es. libreria) che richiederebbe mesi di sviluppo perché più conveniente, un conto invece è scaricare dal web a caso del codice che non va che si potrebbe scrivere in poche ore..  smiley
Logged

Offline Offline
Sr. Member
****
Karma: 8
Posts: 293
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


Guarda che il "make or buy" non si applica in questi casi, un conto è comprare un qualcosa che funziona (es. libreria) che richiederebbe mesi di sviluppo perché più conveniente, un conto invece è scaricare dal web a caso del codice che non va che si potrebbe scrivere in poche ore..  smiley

questa è una libreria che nella fattispecie muove un servo... gioca con registri ed interrupt per settare timer eccetera...non è proprio una banalità ed è molto più facile sbagliarla che farla giusta: se c'è già, funziona e fa quello che ci serve non vedo perchè non usarla: qui manca un file alla fine. A me sinceramente gli insegnamenti di ingegneria davano fastidio e li per li ho trovati a volte scontati a volte banali a volte noiosi...del resto da studente... però poi quando l'ho fatto per lavoro ho capito che alcune cose non erano proprio così campate in aria e che alle volte è meglio ad esempio fare un codice chiaro che possa essere corretto piuttosto che risparmiare 1 byte di una variabile e tornando allo sfruttamento del codice fatto da altri in realtà è una prassi che facciamo tutti chi più integralmente chi meno ed obiettivamente più ambizioso è il progetto più devi salire sulle spalle dei giganti che ti hanno preceduto.
forse però sono andato un po' troppo ot con questo argomento...mi scuso: solo un'opinione

« Last Edit: December 19, 2012, 04:15:45 am by qsecofr » Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

@palmirorov:
1) lo sketch usa una o più librerie che non ci sono sul sistema. Soluzione: scaricarle
Non basta prendere uno sketch, ricopiarlo e sperare che funzioni.
Devi intanto anche capirne un po' di programmazione e linguaggio C. Se in cima allo sketch vedi degli #include, questi sono "ordini" dati al compilatore di includere altre porzioni di codice che si chiamano librerie. Una libreria è una specie di "estensione" del tuo programma. E' un codice che mette a disposizione del tuo sketch dei nuovi comandi e delle nuove funzioni. Spesso non sono inclusi con l'IDE perché scritti da terzi. Quindi devi procurartele te, altrimenti il tuo sketch non potrà mai essere compilato.
Logged


Pages: [1] 2   Go Up
Jump to: