SoftwareSerial su ATmega1284P

E’ possibile utilizzare la libreria SoftwareSerial su qualunque pin dell’ ATmega 1284P ?
Inoltre e’ possibile non specificare il pin di TX?
In pratica io ho l’ esigenza di ricevere il valore di alcuni sensori da una altra MCU, ma ho a disposizione 1 unico pin libero sul mio 1284P, nello specifico il pin 21 (PD7), gli altri sono tutti occupati e inoltre avrei difficolta’ a disporli in maniera diversa.
Non posso usare la I2C.
Quindi ho pensato di utilizzare una altra MCU che interroga i sensori e che invia via seriale i valori quindi riceverli con la softwareserial sul pin sopraindicato.
Fattibile? per non specificare il pin TX (visto che sono tutti occupati) poi come potrei fare?
Grazie

Ciao, non so dirti se la SoftwareSerial è compatibile con il ATmega1284P ... ma posso riportati per esperienza personale che, cercare di assegnare il pin TX ad un pin non esistente (... visto che comunque a qualche cosa [u]lo devi[/u] assegnare) ... può creare problemi.

Avevo la tua stessa situazione su un ... ATtiny85 ... e come capisci ben pochi pin a disposizione :grin: avevo assegnato a TX (... che assolutamente NON usavo) il pin inesistente 255 e ... creava un bel po' di problemi con malfunzionamneti del SW.

Mi sono salvato perché sull'ATtiny85 il pin RESET può essere usato anche come un normale pin digitale, e la cosa è controllata dai FUSE. Se però, nei fuse NON lo tocchi, praticamente tu dal SW lo vedi come un pin digitale (e la SoftwareSerial funziona correttamente assegnandolo come TX), ma è "elettronicamente" rimane connesso invece alla parte che fa il reset e così non perdi la funzionalità del reset ;)

Non conosco il ATmega1284P e non so se questa cosa è valida anche li ... :roll_eyes:

Guglielmo

No il reset credo che non posso usarlo sul 1284P. E se al TX assegnassi lo stesso pin utilizzato per altro, pero' poi non lo andei mai ad usare....sempre un pin impostato in output.

Non ricordo se avevo provato anche quella soluzione … ma, non capisco perché, mi sembra di ricordare che comunque disturbasse il pin (… che ovviamente tu devi usare per altre cose) … :roll_eyes:

Ma hai verificato la compatibilità della SoftwareSerial con il 1284P ??? Perché credo che usi gli interrupt e ci siano delle regole da rispettare (… sicuramente per la Leonardo e la Mega) …

Guglielmo

ho controllato nel reference ma ovviamente vengono menzionate solo le board UNO…MEGA ecc…
del 1284P non ne parla da nessuna parte.
Infatti ho anche questo dubbio…

Ma la softwarserial lavora solo sui pin con interrupt? perché se cosi’ fosse allora sto proprio nella mexda… :cold_sweat:

Solo su quelli su cui credo possa fare la pinChangeInterrupt e, in funzione della MCU, NON è possibile su tutti …

Guardati SoftwareSerial.cpp che trovi nelle librerie di Arduino … vedrai che comincia con un bel …

#include <avr/interrupt.h>

Guglielmo

P.S. : Inoltre, purtroppo, li usa proprio per il RX …

mmmm....bel guaio... allora dovrei provare ad usare la SPI e utilizzare quell' unico pin rimasto come "SS". Solo che la SPI la uso gia' per registrare su SD, non so se come velocita' ci rientro senza perdere pezzi per strada.....tra lettura dei dati da latra MCU, elaborazione, scrittura su SD di molte altre cose...

Non dovresti avere problema …

… sul bus SPI … UN SOLO device è attivo alla volta e sei tu che inizi e termini il colloquio e selezioni/deselezioni il device quindi … non vedo possibilità di conflitti …

Guglielmo

si si, lo so.. cio' che mi preoccupa non sono i conflitti, ma la velocita' di esecuzione di tutta la procedura. Devo fare un po di prove...

In teoria la SoftwareSerial è compatibile con tutte le MCU che possono gestire i PCINT, che sono usati per la ricezione dei dati. Il "trucco" dell'usare il pin di reset dell'Attiny85 funziona solo su quel chip perché il core Tiny mappa quel pin. Sul 1284 non mi pare che il pin di reset sia mappato dal core quindi non è usabile direttamente dalla libreria SoftwareSerial.

Se hai possibilità di utilizzare un terzo chip, anche il Tiny85, per la comunicazione seriale, potresti pensare di farlo e poi collegare questo chippino con il 1284 tramite I2C.

Il pin 21 del 1284P e' un PCINT, il 31, pero' non conoscendo bene la softwareserial non so se posso utilizzare esclusivamente quel pin e assegnare al TX un altro pin utilizzato per altre faccende, ad esempio il CS per il display. Tu cosa ne pensi? altro problema e' che i pin dell' I2C sono utilizzati dal display a 16 bit...dovrei rimappare tutto, ma comunque avrei sempre a disposizione 1 solo pin libero. Forse potrei liberare il pin utilizzato dal CS del display, visto che e' sempre attivo lo metterei fisso e libero il pin. Oppure potrei utilizzare la SPI che al momento gestisce solo la SD e utilizzare l' unico pin libero come SS per il nuovo dispositivo. Il guaio e' che ho gia' tutto il PCB stampato, e tutto il dispositivo assemblato, ho possibilita' di accedere solo al pin 21 libero e alla SPI.

Non ti consiglio di usare un pin già in uso come pin TX, perché potresti incasinare il tuo programma. La lib infatti pilota il pin TX. Sulla linea I2C puoi indirizzare fino a 127 periferiche differenti, quindi basta che tu assegni al Tiny un ID non in uso al tuo display. Però se hai già fatto il PCB è un problema.

Se usassi la SPI ? cosa ne pensi?

Deltoz: Se usassi la SPI ? cosa ne pensi?

Continuo a non capire perché hai dubbi sulla SPI ??? :roll_eyes: :roll_eyes: :roll_eyes:

Guglielmo

Perché non l' ho mai usata fino ad ora.... XD :blush: XD :blush: XD :blush: e se c'era una possibilita' di usare quel pin libero sarebbe stato meglio. a parte il referance sul sito, mi potreste indicare qualche guida sull' uso specifico della SPI in arduino? A questo punto utilizzero' una altra MCU che gestisce alcuni sensori come Slave e la mia board con il 1284P come Master che interroghera' periodicamente lo Slave.

Uno, fatto da SparkFun, lo trovi QUI, mentre info ufficiali le trovi nel Reference ...

... se poi su Google cerchi "Arduino SPI tutorials" ... che ne hai in quantità :grin: :grin: :grin:

Guglielmo

Grazie mille Guglielmo, si su Google ho gia' letto molte cose, come anche il reference, ora vedo anche l' altro link che mi hai postato.

Ultima domanda! e se usassi la OneWire ?? potrei usare questo protocollo per il mio scopo usando il pin che ho a disposizione? Grazie ancora.

Se ti va di lavorare un po' potresti scriverti/usare la "Codifica Manchester" per la quale dovrebbe bastarti UN pin ;)

Un tizio ha anche scritto una libreria per Arduino ... i dettagli li trovi QUI, mentre su GitHub c'è la libreria.

Tentar non nuoce ... ;)

Guglielmo

P.S. : Poi però fammi sapere che mi interessa ... :grin:

Grazie Guglielmo, l' idea e' ottima e la libreria menzionata sembra molto semplice da utilizzare. L' autore fa riferimento alla trasmissione via radio, ma ovviamente non cambia nulla via cavo, anzi... L' unico dubbio e' il sincronismo, credo che l' unico modo che ho di farlo funzionare e' mettere lo slave in trasmissione continua a loop e con il master nel momento che serve attivo la ricezione, pero' il pacchetto trasmesso e' a 16 bit e se io dovessi trasmettere piu' pacchetti il ricevitore non puo' sapere quel pacchetto a cosa fa riferimento. Mi spiego meglio, ammettiamo che io avessi 3 valori a 16 bit da trasmettere, attivo lo Slave che in loop trasmette i 3 word, chiamiamoli A B e C, nel momento in cui attivo il Master per ricevere i 3 word potrebbe cominciare a leggere dal B, quindi mi ritroverei una sequenza di BCA, o potrebbe cominciare con il C ricavando una sequenza CAB..... Potrei pero' sfruttare la possibilita' della libreria di mandare il 16bit codificato in 4 bit per un codice identificativo, 4 bit per il checksum e 8 bit per il dato. In questo modo con il codice identificativo posso sapere con certezza quel valore a cosa fa riferimento, pero' sono limitato all' 8bit... dovrei mandare 2 pacchetti per comporre un valore a 16bit, con conseguente perdita di tempo prezioso. cosa ne pensi?

Qualche compromesso lo devi fare ... ... io, a costo di perdere qualche frazione di tempo ... userei una trasmissione certa e controllata ... :roll_eyes:

Ripeto, la cosa migliore è fare qualche prova pratica ... non costa nulla ... ;)

Guglielmo