[Risolto] PROBLEMA IDE O SKETCH AMR ???

Per abilitare e disabilitare la seriale ti conviene usare un define e la macro indef.

Un link alla discussione o al codice sarebbe gradito.

Codice...

Scusate ! Ecco il codice.

Ho esegiuto un cambiamento, inserendo una void "VIEWCFGALM" che contiene la visualizzazione delle "MEDicine" alla linea di codice 943 ed il carattere ora mi appare sulla scritta "Suoneria__P||t._2", (linea di codice 698) circa 300 righe di codice prima.

:*

A_M_R_05K03.ino (46.5 KB)

Prova come ha detto Paolo, a togliere la seriale con le direttive per il compilatore.
Una semplice variabile non basta, la lib viene caricata ed inizializzata lo stesso perché il compilatore mica può sapere se durante l'esecuzione la seriale la userai oppure no.

Ho già provato, addirittura ad escluderla proprio dal codice con //, ma il problema è sempre presente.
Quello che ho creato, è un modo per chi può, di verificare se il problema è del codice o dell'IDE, al di là della modalità di attivazione o meno della seriale.

Vi ricordo che se la seriale viene disabilitata, il problema si presenta, al contrario no. Questo è il problema. :astonished:

Per Leo72 :roll_eyes:

Una semplice variabile non basta, la lib viene caricata ed inizializzata lo stesso perché il compilatore mica può sapere se durante l'esecuzione la seriale la userai oppure no.

Prova a compilare lo sketch con la variabile "ablser=1" che (abilita) la seriale e poi dimmi qualcosa !!!!!

Non è semplice come sembra ! :*

Credo che il compilatore si accorge di questo e altro, come puoi vedere dal codice compilato che cambia di circa 1K.

byte abilita = 1;

void setup() {
    if (abilita) {
        Serial.begin(9600);
    }
}

void loop() {
    static long contatore = 0;
    contatore++;
    if (abilita) {
        Serial.println(contatore, DEC);
    }
    delay(1000);
}

Compilato, viene 2836 byte.
Se metto "abilita" a 0, la compilazione dà 2836.
Questo per farti capire che il compilatore NON può sapere se nel corso del programma "abilita" cambia valore.

Ora compila questo:

#define abilita 

void setup() {
#ifdef abilita
    Serial.begin(9600);
#endif
}

void loop() {
    static long contatore = 0;
    contatore++;
#ifdef abilita
    Serial.println(contatore, DEC);
#endif
    delay(1000);
}

Compilato, dà 2820 byte.
Se commento la define iniziale, la compilazione mi dà 750 byte! Come vedi, in questo caso la seriale non viene inizializzata.

la seriale usa ram anche se non usatata, ne abbiamo discusso qualche tempo fa con la storia dei buffer.
Essi sono dichiarati alla creazione della classe Serial, che viene creata quando la Serial è inclusa, che è inclusa automaticamente.
Sempre in quella discussione puyoi trovare uno snippet di codice che risolve questo problema: il buffer viene inizializzato nella Begin, però il codice è stato provato come funzionante solo da me, quindi sarà pieno di bug (però funzionare funziona...)

edit: discussione + il codice per aruino ide 1.0.2: Velocità del loop Mega 2560 - #103 by lestofante - Software - Arduino Forum

:roll_eyes:

Intanto grazie per l'interessamento.

x Leo72, non metto in discussione quello che segnali, o sul fatto che quello che dici sia errato.
Vorrei semplicemente farti presente che se compili il mio codice, con la variabile = 1 e poi = 0, ti accorgerai che una "if" non può cambiare così tanto l'assembler per il micro.

x Lesto, il problema non è abilitare o meno la seriale, ma capire perchè quando è abilitata il problema non si presenta, mentre quando è disabilitata, il problema c'è.

Potrei lasciare abilitata la seriale per ovviare il problema, ma credo ci sia qualcosa di non chiaro in tutto questo.

Nel frattempo, ho buttato giù un hardware con un' altro display ed arduino, ma il problema rimane. =(

ma quel carattere ti compare sull'LCD?

edit: se la variabile è boolean usalal con i valori true e false, altrimenti dichiarala come byte.

Sinceramente ad occhio non vedo che problemi possano sserci, a parte il fatto che la LCD possa usare senza saperlo delle impostazioni che vengono effettuate nella Serial.begin()....

Questo: ||
come l' OR del linguaggio C.

Ho notato che spostando l'attivazione della seriale "Serial.begin" questo viene spotato in un' altro punto dei messaggi :astonished: :astonished:

ho editato il messaggio sopra

Ti devo fare le mie scuse perché tu hai dichiarato il flag di tipo "const" quindi il compilatore vede che tale variabile non può più essere modificata nel corso dell'esecuzione del programma, ed ottimizza la compilazione escludendo la seriale.
Avevi ragione tu, me ne sono accorto solo ora. Difatti nello sketch che ti ho allegato come esempio dei miei test vedi che non avevo dichiarato il flag come costante.

:wink:
No problem Leo72.

Tornando al problema "bug", mi sfugge qualcosa....... esistono dei limiti legati al numero di istruzioni "if" consecutive in uno sketch?

E' probabile che questo problema sia venuto fuori solo con l'utilizzo dell'IDE 1.0.3.

Provo a ricompilarlo con lo 0023, togliendo l'audio però, visto che non è supportato, e credo che cambi un pò troppo, e che quindi il problema non si manifesti.

Un' altra cosa che ho constatato è che il carattere "||" per il display non esiste ed ancora se al posto di un carattere alfanumerico inserisco degli spazi, il messaggio viene troncato del tutto da quel carattere in poi.

Alquanto strano no?

Se con la versione IDE 0023 il problema non si manifesta, torno ad usare quella. Eventualmente, ora ho a disposizione un codice di verifica per le nuove versioni dell' IDE.

Un ultima cosa! Se avessi usato una variabile con lo stesso nome già dichiarato nelle librerie, l' IDE si sarebbe accorto, giusto?

:grin:
Credo proprio che il problema sia legato all' IDE.

Compilato lo stesso sketch e caricato su arduino, il problema non si presenta.

CONTINUO AD USARE LA 0022-0023 IDE PER NON AVERE ALTRE SORPRESE.

Un saluto a tutti.
Giuseppe G.

In teoria no. Sono dei salti, per il micro.

E' probabile che questo problema sia venuto fuori solo con l'utilizzo dell'IDE 1.0.3.

Provo a ricompilarlo con lo 0023, togliendo l'audio però, visto che non è supportato, e credo che cambi un pò troppo, e che quindi il problema non si manifesti.

La gestione della seriale e dell'LCD sono cambiati molto da 002x a 1.0.x.

Un' altra cosa che ho constatato è che il carattere "||" per il display non esiste ed ancora se al posto di un carattere alfanumerico inserisco degli spazi, il messaggio viene troncato del tutto da quel carattere in poi.

Alquanto strano no?

A me verrebbe da pensare ad un'esaurimento della Ram.
Quando la Ram termina, su un Lcd iniziano proprio a comparire caratteri senza senso, pescati chissà dove.
Ho notato una cosa, che tu nello sketch non usi la possibilità (offerta dall'IDE 1.0) di gestire le stringhe in Flash.
Tutti i messaggi lcd.print("qualcosa") trasformali in lcd.print(F("qualcosa"))
Non hai idea di quanta Ram risparmi.
Tutte le stringhe, infatti, prima di poter essere gestite, vengono trascritte in Ram dalla Flash.
Un'altra cosa che fa lievitare il consumo di memoria sono le chiamate alla sub-routine.

Se con la versione IDE 0023 il problema non si manifesta, torno ad usare quella. Eventualmente, ora ho a disposizione un codice di verifica per le nuove versioni dell' IDE.

Il ramo 002x non viene più sviluppato. Io non obbligherei gli utenti ad usarlo.

Un ultima cosa! Se avessi usato una variabile con lo stesso nome già dichiarato nelle librerie, l' IDE si sarebbe accorto, giusto?

Sì, 2 variabili con lo stesso nome non possono convivere

:slight_smile:

A me verrebbe da pensare ad un'esaurimento della Ram.
Quando la Ram termina, su un Lcd iniziano proprio a comparire caratteri senza senso, pescati chissà dove.
Ho notato una cosa, che tu nello sketch non usi la possibilità (offerta dall'IDE 1.0) di gestire le stringhe in Flash.
Tutti i messaggi lcd.print("qualcosa") trasformali in lcd.print(F("qualcosa"))
Non hai idea di quanta Ram risparmi.
Tutte le stringhe, infatti, prima di poter essere gestite, vengono trascritte in Ram dalla Flash.
Un'altra cosa che fa lievitare il consumo di memoria sono le chiamate alla sub-routine.

Questa mi sembra una bella idea, ci provo subito !!!

:slight_smile: :slight_smile: :slight_smile: :slight_smile: :slight_smile:

FANTASTICO !!!!!!

Grazie del consiglio Leo72.

Con il comando lcd.print(F("xxxxxxxxxxxx"); ho liberato il doppio della ram che avevo prima ed il problema non si presnta.

Compilato con IDE 1.0.3.

PS.:Ma perchè nelle specifiche questa info non l' ho trovata? Non dovrei trovarla sulle specifiche della lib LiquidCrystal ?

Ciao e grazie ancora.
Giuseppe G.

tutto bene quel che finisce bene.

Noto un pò di confusione con il concetto di visibilità di variabile, e il classico problema di confondere librerie e classi, ma direi che questi concetti puoi rivedereteli con calma.

il reference IMHO avrebbe bisogno di una bella riscrittura, se solo fosse editabile come il playground...

:roll_eyes:
Ciao lesto,

come ribadisco ogni tanto nei post, non sono un programmatore di linguaggio C.

Certi concetti per me sono arabo, proprio perchè non ne conosco l'esistenza.

Per mia curiosità e se non chiedo troppo, cosa dovrei cominciare a vedere, per farmi un'idea di quello che stai dicendo ?

I concetti sono cose importanti, e l'ignoranza da parte mia, evidenzia una carenza.

Purtroppo tutto quello che fatto fino ad ora è a titolo informativo e mi piacerebbe ampliare certi concetti, ma sono consapevole che con il fai da te, non si cresce molto sotto questo aspetto se nessuno ti aiuta, quando fai da solo.

I miei interventi, sono mirati a comprendere, imparare ed a far presente che chi come me si vuole avvicinare a questo mondo, incontra ostacoli che non ne conosce neanche l'esistenza.

Il mio codice grezzo, spartano e pieno di errori, è comunque frutto della mia voglia di imparare e conoscere.

Un detto di qualcuno qui nel forum dice: chi sà fà, chi non sà fà insegna.

Grazie comunque per avermi fatto esporre il mio pensiero.

Un saluto a tutti.

Giuseppe G.