Pic, arduino, freescale, ecc. Strumenti di sviluppo, firmware e progetti.
#5218
Mi è capitato casualmente di provare la simulazione di Arduino in PROTEUS, più precisamente si trattava di pilotare un LCD via I2C con la sua bella libreria "LiquidCrystal_I2C" reperibile gratuitamente su ghithub...

Nonostante in PROTEUS sia presente l'oggetto in questione, il display non visualizza praticamente mai nulla, anche modificando il Device Address questo non vuole assolutamente funzionare...

A questo punto mi metto a ricercare in rete se qualcuno avesse risolto il problema, invece trovo tante domande simili a cui nessuno sa rispondere, e te credo!!! :idea:

Il Display I2C in PROTEUS è il modello JHD-2X16-I2C, in Internet si trova solo un datasheet non troppo completo, le poche info provengono da siti orientali e sono scritte in Cinese, poi scopro su alcuni Forum che il controller utilizzato è lo stesso del Display alfanumerico 16x2 che utilizza lo HD44780, quindi bisognerebbe riscrivere la libreria da capo e pare che nessuno lo abbia ancora fatto nonostante si leggano tanti consigli tipo:

"Devi eliminare l'Abstract Layer altrimenti non può funzionare"!!! :cry:

Già, ma che cosa intende di preciso??? :?

Così provo a modificare la libreria ma non ottengo manco la visualizzazione del cursore, spazientito dall'insuccesso e dal tempo perso :x , torno ancora in rete e finalmente trovo che utilizza il Remote 8-Bit I/o Expander for I2C-Bus PCF8574 o PCF8574A, in PROTEUS è presente nelle librerie, quindi abbozzo un tentativo e funziona al primo colpo!!! (INCREDIBILE :D )

Visto la poca chiarezza dei vari Forum sull'argomento, ho deciso di condividere lo schema qui, la configurazione è quella classica, l'unica differenza è che la libreria avendo anche la funzione backlight(); e noBacklight(); sulla P3 dell'Expander bisogna aggiungere un transistor che accenda e spenga la backlight del Display sul catodo del LED, ovvio che per la simulazione non serve come del resto il contrasto, ad ogni modo riporto lo schema completo per evitare che qualcuno lo provi realmente e poi dica che non funzioni...

LCD_I2C_Interface_Proteus.png
Non hai i permessi necessari per visualizzare i file allegati in questo messaggio.
Bios ringraziano
#5219
Si dice che chi la dura la vince 8-) , così alla fine sono riuscito a farlo funzionare nonostante un sacco di complicazioni durante il percorso di programmazione incrociata tra vari file scritti da 4 persone diverse...

Ho perciò modificato la libreria a cui facevo riferimento prima, aggiungendogli il supporto per Proteus in modo da poter simulare l'unico Display JHD-2X16-I2C presente nel programma...

Dopo tantissime ricerche fatte in rete ed esperimenti vari, ho finalmente trovato una libreria che almeno stampava i numeri, questa era scritta per i Display RGB e pareva almeno in parte funzionare, infatti le stringhe non si vedevano proprio...

Confrontando le diverse librerie ho notato che i file header preposti alla stampa erano diversi, allora con un lampo di genio ho fatto il casting alle stringhe passandole come (char *) e finalmente si sono materializzate come per magia sul Display...

Già, ma io non volevo utilizzare quella libreria dato che ne avevo già una pronta solo da rifinire, poi tutta la parte RGB non mi serviva e non potevo solo semplicemente sostituire i file header, provandoci la mia classe non veniva più riconosciuta, quindi come risolvere???

Pensa che ti ripenso, decido di fare un mix mantenendo sia il supporto per i PCF8574 e PCF8574A sia per il JHD-2X16-I2C, per questo ho inserito una direttiva per il precompilatore che a seconda della presenza della definizione svolge alcune funzioni che differiscono dalla libreria originale...

Sostanzialmente il JHD-2X16-I2C non ne vuole sapere di funzionare a 4bit, quindi devo inizializzarlo a 8bit con funzioni differenti, il comando backlight non ce l'ha e anche la trasmissione I2C differisce sostanzialmente da quella a 4bit non solo per la lunghezza, ma bisogna definire ogni volta l'area di memoria da scrivere, vedi CGRAMADDR e DDRAMADDR...

Sicuramente si potrebbe ancora migliorare, ma visto che non si trova nulla di pronto per Proteus con Arduino, cominciate a scaricarvi questa libreria (DOWNLOAD), credetemi che è stato un lavoraccio immane trovare una soluzione senza documentazione disponibile :sick: , già che ci sono, allego l'immagine della simulazione funzionante...

JHD-2X16-I2C(Proteus).png


Qui c'è lo sketch di prova che poi è presente nel file da scaricare, Buon Divertimento!!!

Codice: Seleziona tutto#include <Wire.h>
#include <LiquidCrystal_I2C_JHD1214.h>

  LiquidCrystal_I2C lcd(0x7C>>1, 16, 2);
 // JHD-2X16-I2C Display Device Addrress must be shift right by 1 to match in Proteus

void setup() {
  lcd.begin();
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("LCD DISPLAY JHD");
  delay(1000);
  lcd.setCursor(0, 1);
  lcd.printstr("1214 BY GIOROCK");
  delay(1000);
}

void loop() {
 
  lcd.setCursor(0, 1);
 
  // print the number of seconds since reset:
  lcd.print(millis()/1000);
 
  delay(100);

}

Non hai i permessi necessari per visualizzare i file allegati in questo messaggio.
#5220
Dunque, visto che ero immerso a risolvere questo problema e per non farmi mancare nulla, ho creato l'oggetto JHD-2X16-I2C-GR da utilizzare direttamente in PROTEUS (prossimamente farò un mini tutorial di come creare e installare semplici oggetti personalizzati), il Display funziona a 4bit e quindi si può utilizzare direttamente la libreria originale <LiquidCrystal_I2C> senza fare modifiche al codice...

JHD-2X16-I2C-GR(Object).png


L'oggetto in questione ha tre pin aggiuntivi per l'assegnazione dell'indirizzo (ADDRESS) delle periferica I2C, nel Child Sheet è contenuta anche la tabella con la numerazione tra gli 8 disponibili, basta collegarli o al positivo o al negativo seguendo il ben chiaro riferimento...

Ricordo che per creare dei veri oggetti VSM in Proteus è necessaria la SDK completa che va richiesta direttamente ai distributori del programma, quindi con il metodo descritto si possono solo creare interfacce personalizzate utilizzando quello contenuto nelle librerie del programma, in pratica non si possono creare oggetti interattivi gestiti da DLL custom o fare chissà che cosa, ma nel piccolo si riescono a creare o aggiungere alcune funzionalità al simulatore...

Visto che la cosa non proprio di immediata comprensione, mi riservo un po' di tempo per preparare qualcosa di decente con tanto di illustrazioni, quello che si trova in rete è veramente poco e tutto in lingua Inglese, Spagnola o Russa, lo stesso manuale non chiarisce troppo le idee, le informazioni sono tante e molto coincise, quindi è stato necessario lavorare di immaginazione per carpire alcuni meccanismi intrinsechi di Proteus...


P.S. Il file del DOWNLOAD è stato aggiornato, quindi chi lo avesse già scaricato dovrebbe fare un upgrade alla libreria, purtroppo i BUG sono sempre in agguato e ne ho trovato subito uno...
Non hai i permessi necessari per visualizzare i file allegati in questo messaggio.
Ultima modifica di GioRock il 21 gen 2018, 13:40, modificato 1 volta in totale.
#5221
Questo è il test con il Display Custom creato in Proteus, l'unica limitazione è che si può utilizzare solo un'istanza dell'oggetto per ogni progetto, diciamo che per fare dei test con un solo Display va benissimo, ma se si vuole simulare un rete di device connessa via I2C, allora conviene utilizzare la libreria <LiquidCrystal_I2C_JHD1214> con il DIsplay I2C originale JHD-2X16-I2C...

JHD-2X16-I2C-GR(ObjectTest).png


Con lo stesso metodo si possono creare le interfacce per i Display I2C 16x1, 16x4, 20x2, 20x4, 32x2, 40x2 presenti nel programma...
Non hai i permessi necessari per visualizzare i file allegati in questo messaggio.
#5222
Ho quasi preparato il tutorial, intanto gustatevi questo nuovo oggetto JHD-20x4-I2C-GR che va ad ingrassare le fila nella libreria di Proteus... :D

JHD-4X20-I2C-GR(ObjectTest).png


A differenza del 16x2 I2C che è presente nella distribuzione del programma, questo non esiste proprio e non si possono adottare gli stratagemmi della libreria per Arduino...
Non hai i permessi necessari per visualizzare i file allegati in questo messaggio.
Bios ringraziano
#5229
Bene ho risolto il problema della singola istanza, ora l'oggetto è utilizzabile per tutti i suoi 8 indirizzi all'interno del singolo progetto...

In pratica volendo eliminare gli WARNING dal DEBUG, si era creato involontariamente un conflitto tra i pin dell'oggetto i questione, a questo punto meglio quelli piuttosto che la singola istanza.

Frugando qua e là, ho poi trovato che Proteus installa già di suo alcuni esempi per l'utilizzo dei Display, peccato che l'ho scoperto solo oggi, in rete tutti rivendicano la paternità delle librerie e nessuno menziona dove le ha prese, ma queste sono presenti nella cartella Arduino di Proteus anche se vanno aggiustate per renderle compatibili con altri modelli...

Poco male, tra poco inizio a postare il mini tutorial su come fare gli oggetti in Proteus, nel marasma di Internet, le poche cose che si trovano sono tutte in Inglese e troppo scarne, per carpirne i segreti bisogna ravanare costantemente nel programma...
#5234
Cominciamo la Lezione su come Creare un Oggetto interattivo all'interno di PROTEUS di seguito verranno elencate le varie fasi da seguire per completare correttamente l'operazione...

LEZIONE 1:

Creazione di un Display I2C 20x4 Addressable

1) Creare un Nuovo Progetto

NewProject(Proteus).png


2) Dalla ToolBar selezionare l'icona Component Mode

SelectCompMode(Proteus).png


2A) Cliccare sulla lettera P per visualizzare tutti i Componenti disponibili

2B) Digitare 20x4 nella casella di testo per la ricerca

PickDevice(Proteus).png


2C) Doppio Click sull'oggetto LM044L per includerlo nella lista componenti

2D) Chiudere la finestra componenti

3) Selezionare e posizionare il Display al centro della finestra

PlaceDevice(Proteus).png


4) Selezionare l'oggetto con il tasto destro del mouse e cliccare su Decompose

Decompose(Proteus).png


A questo punto l'oggetto diverrà completamente modellabile, In pratica abbiamo due Edit Box
ridimensionabili più tutti i pin modificabili a piacimento, quindi possiamo dargli la forma che
vogliamo, l'unico requisito è di non toccare quello verde che simula il display...


Decomposed(Proteus).png


4A) Ridimensionare il Box per consentire il posizionamento dei pin a sinistra di 300inch

4B) Selezionare il pin VDD col tasto destro e ruotarlo di 90° in senso orario

RotateClockwise(Proteus).png


4C) Trascinare il pin nella posizione in alto a sinistra come da immagine

PinPlaced(Proteus).png


4D) Ripetere la stessa operazione con il pin VSS e posizionarlo in basso a sinistra

4E) Selezionare Device Pins Mode dalla ToolBar

DevicePinsMode(Proteus).png


4F) Utilizzando quello di default, cliccare su un punto vuoto qualsiasi dello schema

4G) Doppio click sul pin per aprire la finestra delle proprietà

4H) Come Pin Name mettere SCL e selezionare il tipo Passive e confermare

EditPin(Proteus).png


4I) Ripetere l'operazione per il pin SDA selezionando bidirectional

4L) Posizionare i due pin al centro tra VDD e VSS

PinPlaced2(Proteus).png


4M) Ridimensionare il Box per consentire il posizionamento dei pin a destra di 300inch

4N) Aggiungere tre pin A2, A1 e A0 del tipo passive, ruotarli di 180° e posizionarli in centro a destra del box

PinPlaced3(Proteus).png


4O) Adesso, tutti i pin al di fuori di questi vanno nascosti

4P) Doppio click su ogni pin e deselezionare Draw Body poi confermare

PinHided(Proteus).png


4Q) Doppio click sulla label NAME=LM044L si aprirà la finestra Edit Script Block

EditScriptBlock(Proteus).png


4R) Qui creiamo un promemoria per gli 8 indirizzi disponibili 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E e 0x3F

4S) Sotto a NUMROWS in alto aggiungiamo {DVCADDR="Device Address",READONLY INT}

4T) Sotto a NUMROWS in basso aggiungiamo {DVCADDR=0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F}

4U) Confermiamo e ritorniamo alla creazione del componente

5) Selezionare tutti gli oggetti che comprendono il componente poi tasto destro e cliccare Make Device

MakeDevice1(Proteus).png


5A) Prima finestra: lasciare tutto com'è modificando solamente il Device Name che diventa JHD-20X4-I2C-GR o quello che volete assegnargli

DeviceName(Proteus).png


5B) Seconda finestra: cliccare sul bottone Add/Edit per eliminare il package

Package(Proteus).png


5C) Terza finestra: cliccare il bottone Delete e confermare con Assign Package(s)

DeletePackage(Proteus).png


5D) Quarta finestra: non toccare nulla e proseguire

5E) Quinta finestra: non toccare nulla e proseguire

PropertyDefinition(Proteus).png


5F) Sesta finestra: aggiungere eventuali note in Device Notes e selezionare DISPLAY nella lista librerie poi OK per compilare

DeviceToLibrary(Proteus).png


5G) Eliminare tutti gli oggetti presenti nello schema e piazzare il nuovo componente al centro

NewDevice(Proteus).png


6) Doppio click sull'oggetto e selezionare Attach hierarchy module

AttachHierarchyModule(Proteus).png


6A) Tasto destro del mouse sull'oggetto per cliccare su Goto Child Sheet

GotoChildSheet(Proteus).png


6B) Aggiungere il componente PCF8574A alla lista e posizionarlo sulla board

6C) Aggiungere un Display LM044L sulla board

6D) Collegare il PCF8574A al Display LM044L come da schema raffigurato

LCDSchema1(Proteus).png


6E) Selezionare Terminal Mode nella ToolBar

TerminalMode(Proteus).png


6F) Cliccare su INPUT, posizionarlo di fronte al pin SCL del PCF8574A e connetterlo

6G) Doppio click sul pin per assegnargli il valore SCL nella casella String

6H) Scegliere il tipo BIDIR , posizionarlo di fronte al pin SDA del PCF8574A e connetterlo

6I) Se non si connette ruotare il pin di 180°, solo da un lato è possibile la connessione

6L) Doppio click sul pin per assegnargli il valore SDA nella casella String

6M) Scegliere il tipo INPUT e posizionarlo di fronte al pin A2 del PCF8574A e connetterlo

6N) Doppio click sul pin per assegnargli il valore A2 nella casella String

6O) Via così per A1 e A0

6P) Tasto destro sui componenti e cliccare su Edit Properties

6Q) Selezionare Hidden su Part Reference e Part Value

HiddenProperties(Proteus).png


SchematicChild1(Proteus).png


6R) Ricordarsi in seguito d rinominare il componente principale eliminando la numerazione sostituendola con un ?

7) Dal menù Design cliccare su Edit Sheet Properties

EditSheetProperties(Proteus).png


7A) Selezionare External .MOD File e confermare

ExternalMODFile(Proteus).png


7B) Questo crea un file nella cartella del progetto con estensione .MOD

7C) Il file MOD non è altro che un Modulo esterno contenente lo schema contenuto nel Child Sheet

8) Dal menù Design selezionare Edit Design Properties

EditDesignProperties(Proteus).png


8A) Aggiungere il Titolo, il Numero di Documento, la Revisione e l'Autore

9) Tasto destro sulla board e selezionare Exit To Parent Sheet

ExitToParentSheet(Proteus).png


9A) Verrà visualizzata la pagina con l'oggetto Display JHD-20X4-I2C-GR o quello che avete scelto

10) Selezionare l'oggetto e ripetere il punto 5 del Make Device

10A) ATTENZIONE: questa volta bisogna aggiungere il nome del file MOD nell'apposita casella External Module

MakeDevice2(Proteus).png


!!!ATTENZIONE!!!

Se alla fine della compilazione compare un messaggio "Internal ISIS.DLL Error", basta eliminare l'estensione MOD nella casella di testo "External Module" e ricompilare l'oggetto...


NOTE IMPORTANTI:

Una volta completato l'oggetto, è necessario copiare il file MOD nella cartella MODELS di Proteus se lo si vuole utilizzare in qualsiasi progetto, eventuali modifiche richiedono l'eliminazione di questo file prima di procedere, al termine bisogna copiare quello nuovo...

Ad ogni modo è possibile testare il componente prima di compilarlo la seconda volta per escludere eventuali BUG direttamente dal progetto nella ROOT Sheet...

Altra cosa a cui bisogna prestare attenzione, è la modifica del Child Sheet a livello globale al di fuori del suo progetto, ogni modifica si salva automaticamente nel file MOD e si ripercuote su tutti i progetti che ne fanno uso, questa pratica è vivamente sconsigliata se non si vuole impazzire a cercare fantomatici errori chissà dove...

Nel Child Sheet non è sempre presente la funzione UNDO se si eseguono contemporaneamente quelle sulla ROOT, quindi bisogna salvare una copia come Project Clip in modo da averla disponibile in caso di grosse modifiche...

Queste cose bisogna ricordarsele bene, altrimenti si rischiano conflitti o malfunzionamento degli oggetti creati ed una grande perdita di tempo e pazienza...


GioRock
Non hai i permessi necessari per visualizzare i file allegati in questo messaggio.
Bios ringraziano
piccolo segnale

Intanto fidocadj è scaricabile gratuitamente e[…]

Ciao, hai postato nella sezione dedicata alle pres[…]

[CUT] Ecco quindi che mi ritrovo a voler gestir[…]

Come tutti sapete se utilizzate PROTEUS , nonosta[…]

 scarica la nostra app android