Ciao ragazzi, sto cercando di realizzare un piccolo progetto e ho la necessità di usare una sorta di SRAM o memoria esterna (magari abbastanza veloce) accessibile contemporaneamente da più microcontrollori Arduino (UNO e micro/nano).
Ho sentito parlare delle DPRAM, ma non trovo niente per Arduino e sembrerebbero troppo costose, da quel che ho letto su altri thread. Escluderei anche alcuni tipi di EEPROM che hanno questa particolarità, ma che sono abbastanza lente e non ideali per scritture continue, ed anche RAM parallele (quelle per la mega). Per l'interfaccia seriale non ho particolari esigenze...
Cosa mi proporreste? Ne esistono in commercio o devo crearmi appositamente un sistema in grado di shiftare le linee seriali della memoria sui due microcontrollori?
Avevo escluso questa soluzione perchè di arduino ne dovevo utilizzare già due xD Una delle due infatti deve fare da gestore di informazioni che gli arrivano da un bus RS485 (usando un MAX485)... volendo posso integrare i due e fargli fare entrambi i compiti.
Mi piace come idea, che microprocessore potrei utilizzare secondo te, visto che lo userò nudo e crudo (come dici tu, solo col cristallo)? Deve essere abbastanza veloce, ma comunque economico.... e per la RAM, col bus SPI magari?
l'atmega328p, che è il cuore di arduino, costa 5€, ha ram , spi, lo programmi con lò'arduino, lo stacchi e lo metti sulla sua board fatta ad-hoc.
Se cerchi in learning trovverai la "arduino on a breadbord" che ti spiega quanto è facile con il chip e qualche euro di componenti farsi quanti arduini vuoi. Di solito con arduino programmi, poi lo metti in una board a parte.
Spettacolo! E' un progetto molto interessante quello della RAM in parallelo... mi complimento per il lavoro. Mi ricordo che un po' di tempo fa discutemmo su un altro thread riguardo le FRAM (se ricordi, gpb01). Purtroppo non ho avuto modo di provarle, specialmente perchè costano troppo e vivo su quello che la mia scuola mi può fornire, a parte qualcosina di mio quando posso comprare (e non mi forniscono l'indirizzo mail scolastico per provare ad ottenere dei samples =( )
Diciamo che ho fatto una scelta. Al posto di una ram condivisa utilizzerò un microcontrollore apposito, che svolgerà anche altri compiti. Ora ci sarebbero però due problemi:
Servirebbe una RAM esterna, a singolo accesso, per memorizzare le quantità di dati non piccole che riceverò dall'arduino principale... che interfaccia utilizzo?
Considerando che l'atmega328p ha solo un'interfaccia seriale UART, e sarà quello che utilizzerò (se non mi proporrete altro magari ), come posso fare per interfacciarlo contemporaneamente con due dispositivi tramite UART? (fa parte del sistema di condivisione, ma a prescindere è questo il problema ora). Potrei utilizzare SoftwareSerial per aggiungere un'altra porta seriale virtuale, ma ipotizzo che, non esistendo un buffer hardware sull'interfaccia virtuale creata, possa perdere vari dati in presenza di delay nel codice, o altro.... o sbaglio?
Non vorrei andare in offthread, ma fa parte comunque del problema che ho
psoftware:
Potrei utilizzare SoftwareSerial per aggiungere un'altra porta seriale virtuale, ma ipotizzo che, non esistendo un buffer hardware sull'interfaccia virtuale creata, possa perdere vari dati in presenza di delay nel codice, o altro.... o sbaglio?
Sbagli ...
... la SoftwareSerial utilizza un interrupt per accorgersi dell'arrivo di dati e quindi ... non c'è delay() che tenga ... la ISR viene comunque eseguita ... quindi non perdi nulla.
Il problema potrebbe semmai essere che, se stai troppo tempo fermo e non svuoti il buffer della SoftwareSerial (... ma la stessa cosa è valida anche per la Serial) perdi caratteri perché non c'è più posto per memorizzarli.
Se hai comunque questo genere di problematiche ... la delay() te la devi scordare e gestire tutto con delle IF tramite millis().
lesto:
cavolo leo che lavorone, non l'avevo mai visto!!!
complimenti, vorrei avere il giusto tempo da dedicare alla lettura del codice.
Il codice è banale, è pilotata con degli shift register. In lettura, passi l'indirizzo con 2 595 (hai bisogno di 16 bit sugli altrettanti piedini dell'address bus della RAM) e poi leggi il dato dal data bus della memoria (8 pin per 8 bit) con un 165, che è uno shift di tipo PISO, ossia da parallelo a seriale. In scrittura, la cosa è simile, cambiano solo i segnali su alcuni pin per dire alla memoria che vuoi scrivere e non leggere. Il problema è appunto l'uso spropositato di pin.
@psoftware:
esistono delle RAM seriali a cui accedi via SPI. In questo caso ti bastano solo 3 pin per comunicare con essa, tipo questa. NOn potrebbe servire al tuo scopo? La usi con la lib SPI
arduino ha interfaccie HW usart, i2c e spi. La più veloce è senza dubbio SPI, come memoria esterna... una SD, sono la cosa più ecomonica/veloce/facile da reperire e collegare che puoi trovare
Leo grazie, è un modello ottimo ed ero quello che cercavo!
gpb01 comunque volevo giusto qualche altro chiarimento sulla SoftwareSerial... quindi se sull'interfaccia seriale creata con SoftwareSerial mi giungono dei dati, il codice mi si blocca e la libreria si occupa di acquisire le informazioni ricevute in un FIFO sw, ed in seguito l'esecuzione riprende?
Non solo con la SoftwareSerial, ma anche con la seriale hardware ... ogni carattere che arriva chiama una ISR che lo va a mettere in un buffer così, quando tu poi chiami la Serial.available() quella ti ritorna quanti caratteri sono in quel buffer.
Il tutto è ovviamente trasparente per te e per la tua applicazione ... tu da codice non devi fare nulla ... ma ovviamente, qualunque cosa stia facendo il tuo codice (salvo non essere già in una ISR) ... esso viene momentaneamente interrotto, il controllo passa alla ISR che poi ritorna il controllo al tuo codice
Guglielmo
Edit : ... e, come dice Lesto che mi ha preceduto, ricorda che, come è scritto nelle note d'uso della SoftwareSerial, anche se ne dichiari più di una, solo una è quella attiva in ricezione
Ora capisco... allora se è così va proprio bene! Penso di avere tutto l'occorrente teorico per mettermi al lavoro (a parte i materiali xD).
Ringrazio tutti per l'aiuto... e mi complimento per le conoscenze tecniche che avete sono degli argomenti molto appassionanti, ma richiedono non poco studio... Mi farebbe piacere che qualche persona importante venga a tenere qualche convegno qui in Basilicata riguardo Arduino e tutto il successo che sta generando, purtroppo di questi eventi, qui non se ne organizzano proprio