Go Down

Topic: sketch spesso errati... (Read 2405 times) previous topic - next topic

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 !!!

leo72

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

vero i messaggi sarebbero stati di aiuto ma non si possono copiare ed incollare  :) 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  :D :D :D
ma volevo cogliere il senso....questo era l'intento.

uwefed

Perché non puoi copiarli e incollarli?

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


Ciao Uwe

pablos

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.
no comment

#5
Dec 19, 2012, 01:13 am Last Edit: Dec 19, 2012, 01:55 am by UweFederer Reason: 1
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: [Select]
// 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;



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

uwefed

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

gingardu


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"
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

uwefed


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

astrobeed


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


+1  :D

qsecofr



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.


flz47655


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..  :)

qsecofr

#13
Dec 19, 2012, 10:10 am Last Edit: Dec 19, 2012, 10:15 am by qsecofr Reason: 1


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..  :)


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


leo72

@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.

Go Up