Dopo inutili ricerche su Google (ma non è facile porre la domanda giusta...), chiedo a Voi Guru:
è possibile accedere alla SRAM di Arduino? della serie effettuare quelle che in BASIC corrisponde a un POKE indirizzo,dato per scrivere, e poi leggerlo con un dato=PEEK(indirizzo)?
Vi spiego perché mi serve.
Necessito di 3 Byte "video" corrispondenti ai 3 digit di un display a 3x7segmenti.
Questi 3 Byte corrispondono all'indirizzo di memoria presente su un bus a 16 linee e al dato presente a quell'indirizzo, bus indirizzi e bus dati vengono gestiti da interrupt, per cui non posso usare variabili da leggere fuori dalla routine di interrupt.
Nella funzione void loop() effettuo la lettura di quei 3 Byte con indirizzo e dato da visualizzare sui display, e basta.
Si può fare? Qualcuno sa come?
Grazie in anticipo!
Davide
Tutta la SRAM è li per leggerla e scriverla a piacere, ma non ci sono istruzioni dedicate per farlo come in basic, ma invece basta inizializzare un puntatore ad uno specifico indirizzo di memoria e ci puoi scrivere o leggere senza restrizioni, ovviamente ogni puntatore è grande 16 bit e punta al massimo ad un byte, l'indirizzo successivo punta al byte precendente più 1 e così via.
Non è che sia chiaro, comunque prima di postare un link a delle risorse ci dobbiamo assicurare che le informazioni che cerchi siano effettivamente in SRAM e che tu sappia l'indirizzo della (o delle celle) di memoria da cui leggere o scrivere.
I link che potrei postare spazzolano la sram da 0 fino all'ultimo byte che dipende dalla MCU, perché ad esempio la MEGA ha più ram della uno. Vero è che se clicchi su mio avatar puoi arrivare al mio blog e trovare gli articoli, ma leggerli tutti e capirli se non è strettamente necessario è una perdita di tempo.
Però non è detto che si possa fare e con quali conseguenze e tutto da verificare.
Se si sceglie questa strada è necessario sapere qual'è l'indirizzo di memoria.
Certo con una MEGA o comunque con una MCU che incorpora un meccanismo per indirizzare ram esterna parallela come appunto il ATmega2560.
Il fatto è che quel modo di accedere in RAM lo si può usare solo se la MCU ha questo "meccanismo", cioè se è prevista una estensione di ram.
Diversamente come diceva @Astrobeed la ram sarà accessibile attraverso il protocollo SPI, I2c ecc.
Nel caso specifico del ATmega2560 questo meccanismo è previsto e documentato e la ram però deve essere di tipo parallelo. Anche così però non è possibile considerare l'accesso a memoria esterna uguale a quando si accede alla memoria interna.
Ritorno a "Vi spiego perché a me serve" e al fatto che non puoi usare variabili da leggere fuori dalla routine. Ecco questa affermazione non mi corrisponde al vero, ma potrebbe essere vero nel tuo specifico caso ma questo devi determinarlo tu.
Io so per certo che la funzione millis() restituisce il valore di un contatore che viene incrementato in una routine di interrupt, per cui si può fare.
Nota che nei primi 255 byte ci sono mappati i registri dell'atmega inclusi i registri I/O. Ad esempio se hai segnali collegati alla porta D per leggere il loro valore puoi usare il registro PIND che si trova all'indirizzo 0x29, ma in questo caso non ti serve neanche sapere l'indirizzo di basta la macro PIND.
In assembler accederai a qualsiasi indirizzo in maniera random, ogni indirizzo deve essere precedentemente dichiarato, l'assembler può coesistere con il C , i tempi di esecuzione delle routine in assembler sono perfettamente calcolabili, usa le ultime locazioni RAM in modo che non ci sia una sovrascrittura da parte della RAM utilizzata dal C