Due 328 in stand alone per aggiungere un display

Nel mio circuito il 328 usa tutti i suoi pin per il lavoro che deve svolgere; tramite i seriali vedo sul monitor il menu, faccio le scelte, leggo i risultati, fin qui tutto ok. Stavo pensando di usare un display (16x2 o anche 20x4 se necessario) al posto del monitor seriale, ma naturalmente non ho pin sul primo 328, vorrei quindi usare un secondo 328 (come base di partenza per le prove, ma potrebbe poi essere qualcosa di più piccolo) per gestire il solo display. Mi date indicazioni per il dialogo tra le due mcu? possibilmente qualche link da studiare (anche in inglese se non c'è altro :sweat_smile:). Aggiungo che in realtà anche i due pin tx/rx del primo 328 sono usati, ma ho una tempistica per la quale, nel momento in cui mi serve il menu non vengono usati, non posso fare la stessa cosa con altri 8 per gestire il display (a proposito, leggevo che si potrebbe pilotare l'LCD con 4 bit invece che 8, sarebbe utile per risparmiane sulla seconda mcu, altre info? finora non ho MAI usato display)

Io le ho vari LCD e occupo al massimo 6pin DB7-DB4 , E, R/W
il problema secondo me è prendere i dati da seriale e visualizzarli...
potresti per ogni riga mettere una stringa e fai una lettura seriale con una condizione numerica per cui passi un numero 244 e visualizzi ciò che ti viene inviato dalla seriale nella prima riga per
243 visualizzi nella seconda e via dicendo.....

Usa un Attiny84: ha i piedini sufficienti per gestire l'LCD in modalità 4 bit. Comunichi con l'Atmega328 via I2C (2 soli pin), fai un piccolo protocollo di comunicazione fra i 2.
Se vuoi tutto il codice, posso spedirti sia il firmware dell'Attiny84 sia quello dell'Atmega328 così vedi come ho risolto.

Salve, ci sono molti modi per usare un display lcd soltanto che non saprei cosa consigliarti visto che dici di aver occupato tutti i pin. Ad esempio se usi i pin analogici 4 e 5 per gestire qualcosa tramite protocollo I2C potresti aggiungerci nello stesso bus un
port expander PCF8574 per controllare direttamente il display senza usare un altro atmega ( Ardugonic: Controlling an LCD Display via I2C bus ).
A proposito se usi un altro atmega dovrai farlo comunicare con il primo in qualche maniera quindi o con la seriale o con il bus I2C.
Se decidi di usare un altro atmega a questo punto puoi anche comandare il display anche tramite uno shift register 74hc595 con la libreria shiftlcd usando solo tre pin ( Arduino Adventures: Controlling an LCD Display with a Shift Register ) Questo metodo lo uso sempre e funziona molto bene, in pratica con soli tre pin si comanda l'lcd; ora ti voglio mettere la pulce nell'orecchio: chissà se si potrà usare anche con un attiny....
Buone prove e spero di esserti stato di auito
Ciao

Edit
Ammazza, ma anche la mattina state attivi? Mentre scrivevo questo post già 2 messaggi... :slight_smile:
Non è una critica, anzi....

Hai posta.

Pelletta:
Ammazza, ma anche la mattina state attivi? Mentre scrivevo questo post già 2 messaggi... :slight_smile:

Beh, mi sono alzato alle 5:20 e sono entrato a lavoro alle 6:00. Diciamo che sono già operativo da un bel po' :stuck_out_tongue:

Grazie a tutti!!! (@ Leo: ricevuta XD)
Provo a riepilogare:
la soluzione di ratto è troppo complicata, ho un codice niente male, non posso infilarci dentro troppa roba.
Soluzione I2C: mi andrebbe benissimo il tiny84 ma i pin A5-A6 (ragioniamo in termini Arduino) del 328 sono occupati e attivi, quindi mi sa che non posso usarli per comunicare. Secondo Bud Pelletta potrei usare un PCF8574, ma il tiny per me sarebbe uguale, inoltre ce l'ho.
Soluzione seriale: come detto dispongo periodicamente dei due pin PD0-PD1 per inviare dati al monitor seriale, vorrei quindi poter usare questi soli due pin per uscire su un display, posso adottare qualsiasi soluzione hardware, ma anche qui un tiny85+HC595 o un tiny84 da solo sono la stessa cosa.
Quindi la domanda secca è:
Posso usare tx/rx per comunicare con un attiny/atmega che mi piloterà il display? In questo caso mi basterà sostituire i tipici comandi della scrittura seriale con quelli della scrittura LCD per vedere il menu dull'LCD?
Tenete presente che questo è solo il problema base :sweat_smile: visto che dovrò implementare una tastiera tipo esadecimale (che spero esista :fearful:) per poter fornire al 328 le scelte di menu (0÷5) ed i valori in esadecimale (00-FF).
Che dite, è dura? Il circuito funziona tranquillamente col monitor seriale, ora implemento lo schema per sganciarlo dall'IDE ed usare HypoTerminal, pensavo proprio di liberarmi del PC, e creare lo standalone PURO.

menniti:
la soluzione di ratto è troppo complicata, ho un codice niente male, non posso infilarci dentro troppa roba.

Usa un display LCD seriale.

M ai pin A4/A5 sono usati per altro, non per comunicare con un altro dispositivo I2C, giusto?

Cmq puoi usare RX/TX, il procedimento è lo stesso che usare l'I2C con l'unico limite che la comunicazione è "diretta" e non condivisibile. Poi puoi adattare i miei firmware per comunicare fra Tiny e Mega, cambia solo il modo di come invii/ricevi i dati.

PS:
nel firmware che ti ho spedito, quello relativo al 328, c'è anche una parte di acquisizione di numeri usando 2 soli pulsantini (scorrimento e selezione). Lì mi fermo a 0-9 ,ma nulla vieta di allargare il range a 0-F con poche righe di codice.

astrobeed:

menniti:
la soluzione di ratto è troppo complicata, ho un codice niente male, non posso infilarci dentro troppa roba.

Usa un display LCD seriale.

Un LCD seriale emula in tutto e per tutto il monitor dell'IDE? Se è così sarebbe comodissimo, ma mi resterebbe il problema della gestione della tastiera, in ogni caso mi devo interfacciare ad un altro chip, giusto?
I pin A4/A5 (prima ho sbagliato :blush:) servono per altro, sì, sono segnali di programmazione, ciò significa che potrei contestualmente usarli per l'I2C senza che mi disturbino il circuito?
L'idea dei due tasti la vedo scomoda, considerando che devo inserire due-tre valori in hex starei lì troppo tempo, se non riesco a fare una cosa seria non vale la pena, tanto vale restare sul PC.
In poche parole all'avvio della procedura il display mi mostra un menu (0÷5), inserisco il numero di scelta, il menu mi dà conferma e mi dice di procedere; premo un pulsante sul circuito ed il display mi mostra 2-3 valori in hex e quindi mi chiede di inserire i nuovi valori, p.es. 00 (INVIO) - FF (INVIO) - 0F(INVIO). Il display mi dà conferma dell'accettazione dei nuovi valori e la procedura finisce.
Attualmente uso la tastiera del PC ed il monitor seriale dell'IDE, a breve elimino il monitor seriale a favore di HypoTerminal, vorrei implementare come opzione un tastierino + LCD "interattivi"

Se i pin non li usi per l'I2C credo che poi darebbero noia quando usati per comunicare.
Un display seriale significa che ha alloggiato un micro (alle volte anche un Atmega168 SMD) che replica ciò che fa il mio firmware per l'Attiny84, ossia converte i segnali RX/TX o I2C in classici comandi per un display parallelo.

leo72:
Se i pin non li usi per l'I2C credo che poi darebbero noia quando usati per comunicare.
Un display seriale significa che ha alloggiato un micro (alle volte anche un Atmega168 SMD) che replica ciò che fa il mio firmware per l'Attiny84, ossia converte i segnali RX/TX o I2C in classici comandi per un display parallelo.

Quindi mi andrebbe bene solo per mostrare dati, visto che non mi resterebbe più nulla per interfacciare la tastiera. Niente, l'unica è capire se e come posso usare i due pin seriali per colloquiare con un altro micro che piloti il display e la tastiera; in pratica dovrei riuscire a fare ciò che tu hai fatto con i due pin dell'I2C, ma usando i due pin seriali. Pelletta lo suggeriva ma non mi ha dato altri elementi.
La cosa dovrebbe essere fattibile: il monitor seriale mi permette di ricevere ed inviare dati inseriti con la testiera colloquiando solo con tx/rx del micro, quindi dovrei usare un altro micro+display+tastiera come se fosse un monitor seriale.

Esatto. Basta connettere RX/TX, cioè incrociare i canali in modo che quando l'Atmega1 trasmette l'Atmega2 riceve e viceversa. Poi piloti la tastierina ed il display con l'Atmega2 e spedisci i dati da e per l'Atmega1.

leo72:
Esatto. Basta connettere RX/TX, cioè incrociare i canali in modo che quando l'Atmega1 trasmette l'Atmega2 riceve e viceversa. Poi piloti la tastierina ed il display con l'Atmega2 e spedisci i dati da e per l'Atmega1.

e che ci vuole? :fearful: :blush:
Ok, allora devo separare le due cose altrimenti entro in una jungla da cui non uscirò che cadavere =(
Nei prox giorni spero di finire con HypoTerminal.
Passo due: metto in piedi atmega (per iniziare)+LCD + due tastini per imparare la tecnica di interattività con LCD
Passo tre: sostituisco i tastini con un tastierino esadecimale (intanto ho visto che è una semplice matrice 4x4)
Passo finale: faccio colloquiare i due micro
Se non trapasso prima per vecchiaia; naturalmente faccio un po' di prove con il tuo firmware e con ciò che c'è sul PlayGround

Ma hai già tanta roba pronta nei miei firmware, di che ti lamenti? :wink:
PS: sì, un tastierino si riduce ad una matrice di tasti, quindi con 8 pin sei a posto. 6 pin li usi per il display (modalità 4 bit), 1 pin per un eventuale transistor per staccare la retroilluminazione (consigliato! solo quella porta via in media sui 240/250 mA, ossia 100 volte quello che consuma il resto del display!), 2 pinx per RX/TX. Alla fine consumi tutti i 14 pin digitali del 328 più 3 pin analogici. Ce la dovresti fare.

@menniti perchè sprecare tutti quei pin per la matrice quando potresti controllare 5 0 6 tasti con un pin analogico?
basta fare una scala di resistenze (più precise sono e meglio è ) e di pulsanti e leggere da analog read .
tipo così:

La mia idea era proprio quella di ricostruire un LCD seriale visto quel che costano.... ma in effetti... con 16-17 euro ne hai uno finito :slight_smile:

gli lcd seriali sono un pò più incasinati da gestire perchè sullo stesso canale trasmetti sia il testo da mostrare, sia i comandi per il display, però sono comodissimi da usare perchè in pratica è semplice convertire l'output del serial monitor in output per l'lcd e poi si usano 2 pin che altrimenti non verrebbero usati, liberandone altri.

@ Leo: infatti studierò a partire dal tuo firmware XD

BrainBooster:
@menniti perchè sprecare tutti quei pin per la matrice quando potresti controllare 5 0 6 tasti con un pin analogico?
basta fare una scala di resistenze (più precise sono e meglio è ) e di pulsanti e leggere da analog read .
tipo così:

Questa è un'idea molto interessante, potrei poi arrivare ad usare un micro più piccolo visto che risparmio 7 pin. La tolleranza delle resistenze comunque mi obbligherebbe ad accettare un range di valori per ogni tasto, quindi inutile prevedere roba a 0,5-1-2%.

Stavo anche pensando al fatto che in realtà NON ho un "invio", ma potrei "leggere" il 3° tasto della sequenza impostandolo p.es. su 0, cioè premo FF0 o 0F0 o 000 per impostare i due valori iniziali ed "accettarli" con lo 0 finale

@ ratto: se non avessi la necessità di interagire lo prenderei fatto, nel mio caso lo "costruisco" perché mi serve leggere la tastiera.

Ho trovato su Internet "MCP23017-E/SP I/O expander i2c 16 bit", a che cosa dovrebbe servire? se non sbaglio sul canale I2C le varie periferiche si collegano in parallelo

@menniti se lo fai con pochi tasti (fino a 5) puoi usare anche le resistenze comuni e non quelle di precisione, i range sono abbastanza ampii e riconoscibili e potresti sfruttare addirittura la pressione di 2 tasti contemporanei.
c'è anche una libreria per gestirli:
http://www.arduino.cc/playground/Code/AnalogButtons