Go Down

Topic: Librerie e Timer1 (Read 10169 times) previous topic - next topic

leo72


Sembra proprio che se i caratteri vengono mandati uno alla volta, digitandoli da tastiera, non funzioni anche se i caratteri arrivano all'Arduino come posso vedere dal LED. Inoltre ho l'eco locale per cui vedo che il return c'è, in Hyperterminal infatti ritorna all'inizio della riga perché non c'è il LineFeed.

Funziona solo se metto la stringa in una casella e questa viene sparata tutta in una volta, sia nell'IDE sia nel programma terminale che uso.

Ma è normale che faccia così.
Il codice che hai pubblicato contiene ad un certo punto un blocco di codice controllato da un while:
Code: [Select]

while (inByte != terminatingChar && Serial.available() > 0)

Questo dice: cicla mentre inByte è diverso da "invio" E c'è qualcosa nel buffer seriale.
Se il tuo terminale spedisce il carattere non appena è premuto, l'Arduino lo riceve ed il buffer seriale contiene 1 carattere. Questo viene prelevato da quel ciclo while e perciò svuotato. Essendo vuoto, il programma esce dal ciclo while e va ad analizzare i dati che ha ricevuto.
Se invece spedisci tutto insieme, ovviamente funziona.

zoomx

inizio a sospettare che la routine freeram del playground non funzioni

Code: [Select]
int freeRam () {
  extern int __heap_start, *__brkval;
  int v;
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}


e che in realtà io abbia problemi di RAM. O ci siano ANCHE problemi di RAM i cui sintomi sono i reset durante l'esecuzione. A stampa dice che ci sono oltre 800 byte.

@gpb01
Io ho fatto un casino, non PaoloP! Comunque ho controllato la tua versione con la mia, dopo aver rimosso il commento e coincidono. La tua ha in più un else {} che io ho eliminato ma che forse rimetterò, riempendolo, una volta che funzionerà.

@leo72
A me serviva una routine che prendesse anche dei caratteri digitati da un terminale, per cui l'alternativa non va bene. Sono tornato alla versione iniziale che funziona.

PaoloP

Non è possibile che non funzioni per quanto è banale.
Con int v; alloca una variabile nello stack
Con il comando return calcola la differenza tra l'indirizzo della variabile appena allocata, quindi il limite dello stack, e l'indirizzo dell'heap, oppure il brkval se sono state allocate variabili col malloc.

Ti ricordo la distribuzione della memoria negli ATmega

zoomx

Ok, freeram deve funzionare, allora.

Non mi spiego, quindi, i reset.

Faccio come in Windows, allora. Torno alla ultima versione funzionante (del datalogger) e aggiungo le cose poco a poco. Avrò fatto il passo più lungo della gamba.


Grazie :)

zoomx

Dopo ulteriori esperimenti credo proprio che sia stato un problema di memoria RAM.
Ho aggiunto la sola libreria SdFat e tolto la parte dell'interrupt e non riuscivo a scrivere su SD  oppure avevo dei reset.
Ho eliminato la libreria del DS1307 e adesso la scrittura su SD funziona.

leo72

Prova usando altre librerie per scrivere sulla SD, non esiste solo quella ufficiale. Anzi, questa è abbastanza esosa in termini di risorse.
Esiste anche una piccola libreria, PetitFatFs, che offre un basso impatto di risorse e funzioni base di accesso alla SD:
http://elm-chan.org/fsw/ff/00index_p.html

zoomx

#36
May 15, 2013, 11:14 am Last Edit: May 17, 2013, 10:18 am by zoomx Reason: 1
Ho usato la SdFat ma adesso proverò il tuo suggerimento. Grazie!  :)

Edit: non ci sono ancora riuscito perché tutti gli esempi che trovo riguardano la lettura e non la scrittura.

zoomx

Sono tornato un po' indietro, ho eliminato il codice dell'interrupt ma già quello di scrittura su SD mi ha dato problemi.
Ho aperto un nuovo argomento qui:
http://forum.arduino.cc/index.php?topic=166840.0
dove sembra che abbia risolto provando varie librerie fino a trovare quella giusta.
Resta sempre il dubbio che ci siano problemi di memoria.


leo72


Resta sempre il dubbio che ci siano problemi di memoria.

Con la funzione su citata, stampa su seriale la RAM libera da diversi punti della routine di accesso alla SD e guarda se durante le operazioni di lettura/scrittura la RAM vari in modo considerevole.

zoomx

Ho messo il codice completo, dove ci sono anche le stampe su seriale della RAM libera, qui
http://forum.arduino.cc/index.php?topic=166840.0

Ma non c'è nessuna variazione. Ho messo una stampa quando apro il file, quando scrivo la breve frase di prova e quando chiudo.
Per adesso ho risolto cambiando libreria ma non sono riuscito a capire il perché. Ho messo tutti nell'altro topic perché qui mi sembra ormai OT.

Go Up