Due 328 in stand alone per aggiungere un display

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

Se leggi 2 caratteri alla volta in teoria il 3° carattere non ti serve neanche. Potresti dare per scontato che l'utente abbia inserito correttamente. Oppure fare un check prima di uscire dalla maschera per verificare che sia tutto a posto chiedendo 0/1 all'utente per annula/conferma.
Io scorro invece con un tasto e l'altro lo uso per la conferma, scorrendo sui valori da impostare automaticamente (che poi uso questo sistema solo per la data/ora, poi interpreto i 2 pulsanti sempre come OK/ANNULLA o SI/NO).

Cmq il protocollo è l'ultimo dei problemi. La rete di resistenze è invece una soluzione intelligente che è molto usata. A me non era venuta a mente, anche se lo shield LCD che comprai tempo fa con un micro-joystick usava proprio questa soluzione per leggere 5 valori (le 4 direzioni + la pressione dell'astina) con un solo pin, attaccato ad un interrupt e memorizzando le letture in un buffer.

BrainBooster:
@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:
Arduino Playground - AnalogButtons

Beh, i tasti sono 16 e non si scappa, ma la matrice della tastiera è di 8 punti, quindi combacia proprio con l'immagine che hai postato, o meglio, quelli sono 7, devo aggiungere un range; distanziando abbastanza i valori delle R non penso ci siano particolari problemi. Sul PG mi pare che spieghi ( :sweat_smile:) che bisogna mettere una R da 100K verso massa, ma comunque sia sempre un banale partitore è,.

@ Leo: hai perfettamente ragione, non prevedo un "backspace" per cui se sbaglio, sbaglio e basta, ripeto la procedura, quindi posso effettivamente interpretare il secondo valore come valore+INVIO; poi se funziona tutto posso sempre pensare al terzo tasto per il backspace o per l'INVIO.

@menniti con il portexpander che hai trovato potresti fare qualcosa del genere:
http://blog.littlebirdelectronics.com/arduino-i2c-mcp-23017-lcd-interface

Anche lo shift register CD4021 può essere una soluzione, si comanda con 3 pin e legge otto ingressi

BrainBooster:
@menniti con il portexpander che hai trovato potresti fare qualcosa del genere:
http://blog.littlebirdelectronics.com/arduino-i2c-mcp-23017-lcd-interface

in pratica questo farebbe le veci del tiny84 di Leo?

Pelletta:
Anche lo shift register CD4021 può essere una soluzione, si comanda con 3 pin e legge otto ingressi
http://www.arduino.cc/en/Tutorial/ShiftIn

Sì, tutte soluzioni valide, ma io non devo risparmiare pin, almeno in questa fase, devo far dialogare due 328 tramite tx/rx, Leo lo ha fatto con I2C, lui dice che è facile trasformare il suo firmware per il funzionamento seriale, ma se avessi qualche link con un esempio specifico....proverò.

il 23017 un portexpander i2c, non è intelligete come il tiny, ma ti permetterebbe di avere tutti i pin che servon o per l'lcd e 4 io da usare a piacimento (tasti?) e di dialogare con arduino con 2 fili.

BrainBooster:
il 23017 un portexpander i2c, non è intelligete come il tiny, ma ti permetterebbe di avere tutti i pin che servon o per l'lcd e 4 io da usare a piacimento (tasti?) e di dialogare con arduino con 2 fili.

Cioè potrei pilotare l'LCD direttamente con lo sketch di Arduino usando questo PE come interfaccia I2C<->LCD? Risolverei il pilotaggio dell'LCD senza diover programmare un secondo chip? In ogni caso ho bisogno di 8 pin per gestire la tastiera e qui non posso usare il trucchetto dell'in analogico.

Allora fai una bella cosa: usa un 328 intero per gestire l'LCD e la tastierina, tot. 15 pin quindi i 14 digitali + 1 analogico.
E poi comunichi con l'altro 328 usando l'I2C.

Così separi l'I/O dalla CPU.