Arduino Uno e la RAM
La scheda Arduino Uno monta la MCU ATmega328p equipaggiata con solo 2048 celle di memoria da un byte, detto in altri termini, 2 KiB di RAM.
Potrebbe essere interessante e istruttivo visualizzare il contenuto della RAM cella per cella, potrebbe anche tornare utile per costatare che la string literal specificata con la macro F("la mia string literal") funzioni correttamente. Principalmente a me interessa l'aspetto istruttivo ma devo dire che non ho scritto la funzione seguente con questa finalità, mi sono reso conto che il codice è didatticamente valido e quindi ho deciso di scrivere questo articolo.
Cosa stampa la funzione?
La funzione inizia a stampare il contenuto di ogni cella di memoria a partire dall'indirizzo 0x100 (256) così come specificato nel datasheet della MCU. L'ultima cella di memoria allora si trova all'indirizzo 0x8FF (2303) valore calcolato così:
256 + 2047 = 2303 in decimale.
La stessa cosa ma espressa in esadecimale: 0x100 +0x7FF = 0x8FF.
Qui a seguire il contenuto stampato sul terminale seriale del simulatore WokWi:
addr 0123456789ABCDEF
100 ..e.......~.....
110 ..<.............
120 ].\........[Maur
130 oTec Software],
140 millis() vale.%s
150 %09ul .gCounter
160 = .d?...L......
170 ..
180
190
1A0 ................
1B0 ................
1C0 ................
1D0 ................
1E0 ................
1F0 ..............0.
200 ................
210 .1F0............
220 ...0..200.......
230 ...........210r.
240 ...g............
250 ..............@.
260 Px.....
270 .........
280 ................
290 ................
La funzione che permette questo output si chiama showRam() e la mostro qui di seguito:
Ora non resta che stampare il contenuto delle 16 celle di memoria, ma se il valore di una cella è un byte non rappresentabile (cioè ad esso non è associato un simbolo come A, B, C) allora stampo solo un punto. Di ciò si occupa la seguente if:
Per terminare decremento conter15 ad ogni ciclo fino che arriva a zero e riparte da 15.
Provando la funzione in un vostro programma non troverete in RAM la string literal "addr\t0123456789ABCDEF" grazie alla macro F("").
Chi volesse provare la funzione rapidamente può cliccare qui per eseguire un programma demo sul simulatore online WokWi. La demo in questione fa scorrere del testo in una riga del display impiegando una classe di nome MTScrollText ma di questa se ne parlerà in altra occasione.
Per questo articolo è tutto, buon divertimento con WokWi ed in generale con la vostra board preferita.
Quest'opera è distribuita con Licenza Creative Commons Attribuzione 4.0 Internazionale