" Snellire " il codice

volevo chiedere se e possibile associare il codice tra parentesi graffe a "qualcosa"
im modo da scrivere solo una parola
questo per evitare di ripetere per molte volte la stessa cosa e finire di esaurire le risorse

if (C2 >= 0 && C2 <= 10)
{
// OO
digitalWrite (2, LOW);
digitalWrite (3, LOW); //centrale
digitalWrite (4, HIGH); //destro
digitalWrite (5, LOW);
digitalWrite (6, LOW);
digitalWrite (7, LOW);
digitalWrite (8, LOW);
digitalWrite (9, LOW);
digitalWrite (10,HIGH);
digitalWrite (11, HIGH); }

Parli di una funzione?

SetOutput(LOW, LOW, HIGH, LOW, LOW, LOW, LOW, LOW, HIGH, HIGH);

...
void SetOutput(boolean Out2, boolean Out3, boolean Out4, ... boolean Out11) {
digitalWrite (2, Out2);
digitalWrite (3, Out3);  //centrale 
digitalWrite (4, Out4);  //destro
digitalWrite (5, Out5);
digitalWrite (6, Out6);
digitalWrite (7, Out7);
digitalWrite (8, Out8);
digitalWrite (9, Out9);
digitalWrite (10,Out10);
digitalWrite (11, Out11);
}

Pensavo di aver avuto un dejavù..ed infatti

Stai chiedendo la stessa cosa?
N.

GINGARDU:
questo per evitare di ripetere per molte volte la stessa cosa e finire di esaurire le risorse

Anche se realizzi una macro, o una funzione dedicata, per snellire la scrittura del codice sempre e comunque dovrai avere quel tot di istruzioni in cascata ripetute tot volte, anche se non le vedi nel codice direttamente verranno comunque compilate con il relativo impegno della flash/ram.

questo non me lo dovevi dire ]:smiley: ]:smiley: ]:smiley:

allora ci stiamo prendendo in giro da soli =( =( =(

alla fine per scrivere meno "scriviamo" di piu :fearful:

puoi usare gli array (quì uso 2 array paralleli, ma una matrice è più "pulita" per evitare diverse dimensioni tra i 2 array):

int dimensioneArray=10;
int arrayPin[] = {2,3,4,5,6,7,8,9,10,11};
int arrayStato[] = {HIGH,HIGH,LOW,HIGH,LOW,HIGH,HIGH,LOW,LOW,LOW}; //attenzione HIGH e LOW non sono boolean ma int!!!

int settaPin(int pin[], int stati[], int dimensione){
   for(int i=0;i<dimensione;i++){
      digitalWrite(arrayPin[i], stati[i]);
   }
}

altra versione, che però deve settare tutti i pin in nel range da "inizio" a "fine":

int settaPin(int stati[], int inizio, int fine){
   for(int i=inizio;i<fine;i++){
      digitalWrite(i, stati[i]);
   }
}

In tutti i casi devi fare attenzione alle dimensioni e all'inizializzazione degli array, ovviamente

astrobeed:

GINGARDU:
questo per evitare di ripetere per molte volte la stessa cosa e finire di esaurire le risorse

Anche se realizzi una macro, o una funzione dedicata, per snellire la scrittura del codice sempre e comunque dovrai avere quel tot di istruzioni in cascata ripetute tot volte, anche se non le vedi nel codice direttamente verranno comunque compilate con il relativo impegno della flash/ram.

Il pre processore in questo non esegue nessuna ottimizzazione?
Sapevo,forse erroneamente, che una serie di operazioni identiche consecutive venivano comunque ridotte ad un unico set di istruzioni chiamato ripetutamente.

Dipende da come il compilatore ottimizza il codice. Per avere la certezza di ciò andrebbe disassemblato un firmware compilato.

se vuoi allegerire le istruzioni di digitalwrite,potresti considerare l'idea,se hai molte digitalwrite di pin consecutivi con valori noti a compile-time,di settare direttamente i registri..in questo modo setti(o resetti) più pin per volta..

astrobeed:

GINGARDU:
questo per evitare di ripetere per molte volte la stessa cosa e finire di esaurire le risorse

Anche se realizzi una macro, o una funzione dedicata, per snellire la scrittura del codice sempre e comunque dovrai avere quel tot di istruzioni in cascata ripetute tot volte, anche se non le vedi nel codice direttamente verranno comunque compilate con il relativo impegno della flash/ram.

Macro e funzioni sono due cose completamente diverse. Se scrivi una funzione e la richiami in 10 punti del codice non hai occupazione di progmem pari a 10 x dimensione della funzione. In altre parole, il codice di una funzione non viene ripetuto (ricopiato) ad ogni chiamata, ma è presente una sola volta in tuto il programma e viene, appunto, soltanto "richiamato".

leo72:
Dipende da come il compilatore ottimizza il codice. Per avere la certezza di ciò andrebbe disassemblato un firmware compilato.

E la madonna.... se non ricordo male è possibile avere in uscita insieme al file hex anche il file asm , non occorre disassemblare.

m_ri:
se vuoi allegerire le istruzioni di digitalwrite,potresti considerare l'idea,se hai molte digitalwrite di pin consecutivi con valori noti a compile-time,di settare direttamente i registri..in questo modo setti(o resetti) più pin per volta..

he he ci sono arrivato ma in ritardo ormai avevo quasi scritto tutto
comunque anche se mi fa incazz*** ho deciso di ririscrivere tutto l'ambaradan

cosi la prossima volta imparo =(

e quando faccio un qualcosa ci penso bene quali pin assegnare e a risparmiare pin e memoria
accorpare pin dove possibile

ah mannaggia l'esperienza