Vai al contenuto

Gestire potenziometro digitale I2C sul bus di espansione

Home Forum Controllori SlimLine e Netsyst (LogicLab) Gestire potenziometro digitale I2C sul bus di espansione

Stai visualizzando 5 post - dal 1 a 5 (di 5 totali)
  • Autore
    Post
  • #36091
    Marcello
    Partecipante

    Devo comandare un potenziometro digitale DS1803 della Maxim-Dallas (Datasheet) con uno SlimLine PCB135**** Software Code SFW184B040 (E’ l’ultima versione ?). 

    Ho letto nel forum che non è possibile utilizzare come indirizzi quelli compresi tra 16#20 e il 16#2F ma come si vede dal Datasheet gli indirizzi possono essere compresi tra 16#28 e 16#2F. Cercando in rete ho trovato che non ci sono potenziometri digitali che abbiano il “device identifer” maggiore di 2#0101. Non dovendo collegare espansioni è possibile utilizzare questi indirizzi ?

    Come potete immaginare ho provato e il risultato è questo: La funzione di controllo mi ritorna TRUE (come se fosse andato a buon fine). Volendo leggere il dato scritto questa ritorna sempre 0 anche se il dato che ho scritto è > 0.

    Utilizzando SysGetLastError questa mi restituisce sempre 9953100 ovvero il codice di errore che identifica “out of range” come se l’indirizzo assegnato fosse maggiore di 16#7F ma ovviamente non è così (Indirizzo assegnato 16#28 ovvero 2#0101000). Come posso risolvere ?

    #39804
    Sergio Bertana
    Amministratore del forum

    La versione software SFW184B040 è l’ultima disponibile. I nostri moduli di espansione sono mappati nel range da 16#20 a 16#2F e naturalmente se esiste uno dei nostri moduli allo stesso indirizzo non è possibile collegare altri dispositivi. La funzione SysI2CWrRd comunque esegue un controllo sulla presenza di un nostro modulo e nel caso si tentasse di indirizzarlo darebbe errore 9953105.

    Ma l’errore 9953100 che tu citi è proprio una semplice verifica sul valore di Address passato alla funzione, quindi mi viene il dubbio che tu passi effettivamente un valore maggiore di 16#7F. Sarebbe utile avere il tuo programma, se vuoi puoi inviarlo a support. Come vedi in questo screenshot se si passa il valore 2#00101000 non si ha alcun errore.

    Ti consiglio comunque di verificare con i comandi Telnet I2CSts ed SlineInfos se sul tuo bus di espansione viene individuato correttamente il tuo DS1803 (Screenshot). Come vedi nello screenshot vi è un modulo PCB122B100 connesso al bus di espansione I2C extension bus, il modulo ha indirizzo 0x0 (Indirizzo I2C 16#20).

    Il bus indicato come I2C auxiliary bus è un bus I2C interno al modulo CPU a cui sono connessi dispositivi interni, in questo caso il chip di real time clock.

    Li avrai già visti ma ti rimando a questo topic ed a questo topic, per informazioni utili. Comunque cercando con la chiave I2C nel forum potrai trovare altre informazioni.

    #39805
    Marcello
    Partecipante

    Ho seguito i consigli di effettuare delle verifiche con Toolly e il risultato stà nello screenshot allegato.

    Viene trovato il dispositivo all’indirizzo 16#28 ma non viene rilevato nessun modulo collegato (?).  Ho ricontrollato i collegamenti e posso confermare che il pin 9 è connesso al pin SDA ed il pin 7 al SCL. I segnali A0, A1, A2 sono a GND. Ecco lo screenshot del programma che ho realizzato.

    #39806
    Sergio Bertana
    Amministratore del forum

    Andiamo per ordine, il risultato dei tests in Telnet è corretto, viene rilevato il tuo DS1803 all’indirizzo 16#28 quindi vuol dire che è connesso correttamente al bus e che l’indirizzo è corretto (Avendo i pins A0, A1, A2 connessi a GND). Non vedi alcun modulo perchè non hai altri moduli connessi, nel mio esempio come ti ho detto avevo un modulo di estensione connesso.

    Guardando il tuo programma vedo che hai realizzato una FB solo per appoggiare i valori da scrivere via I2C, Ok soluzione che può anche essere accettabile, ma nel tuo FB scrivi: Write:= ADR(Wiper); Dove Write è di tipo USINT. Ma compilando ti troverai una warning del tipo:

    AUMENTA_DIMINUSCI(3) – warning G0065: WRITE => Destination may be too small to store current result

    Questo è un grave errore, l’operando ADR() ritorna un indirizzo che è un valore a 32 bits non lo puoi ritornare in una variabile a 8 bits. Quindi devi usare per Write un tipo DWORD o meglio @USINT. Ma visto che usi il linguaggio ST per la FB perchè non fare tutto in ST ? Ecco un sempio di scrittura di un potenziometro.
     
      WrData[0]:=16#A9; (* Command byte *)
      WrData[1]:=16#55; (* Valore potenziometro 0 *) 
      Result[0]:=SysI2CWrRd(16#28, 2, ADR(WrData), 0, NULL);

    Ti allego il programma DigitalPot di esempio per il download.

    #39807
    Marcello
    Partecipante

    Stò ancora prendendo dimestichezza con LogicLab e non avevo dato così tanta importanza al Warning perchè non immaginavo che il puntatore fosse a 32bit. La prossima volta starò più attento.

    Grazie ancora e complimenti per il vostro servizio di assistenza davvero imbattibile.

Stai visualizzando 5 post - dal 1 a 5 (di 5 totali)
  • Devi essere connesso per rispondere a questo topic.