ADS1115 met 16F648A basic

Ik heb ADS1115 gekocht om mee te stoeien.
na veel leeswerk in de documentatie en proberen ben ik zover
dat ik een spanning kan meten en die op het scherm heb staan.
nu komt mijn probleem :
hoe kan ik de 4 poorten tegelijk op mij scherm krijgen.
individueel lukt mij dat wel.

pic basic code:


Device 16F628A                
Config HS_OSC, WDT_OFF, PWRTE_ON, LVP_OFF, BODEN_OFF, MCLRE_OFF
Xtal 20
All_Digital TRUE
Clear
 
Symbol ADS_SDA = PORTA.0  ; ADS1115
Symbol ADS_SLC = PORTA.1  ; ADS1115
 
;        76543210
PORTA = %00000000  
TRISA = %00000011
  
Dim Dat15       As Word
Dim Resultaat_0 As Float
Dim Resultaat_1 As Float

Cls
DelayMS 100

Lees_ADC:

    While 1 = 1
                                            ;5432109876543210
        I2COut ADS_SDA, ADS_SLC, $90, $01, [%1100000100000011]  ; configuratie
                                            ; |||
                                            ; 100 = AIN0 ingang en met ADDR naar aarde.
                                            ; 101 = AIN1 ingang en met ADDR naar aarde.
                                            ; 110 = AIN2 ingang en met ADDR naar aarde.
                                            ; 111 = AIN3 ingang en met ADDR naar aarde.
        DelayMS 15                          
        I2CIn ADS_SDA, ADS_SLC, $90, $48, [ Dat15 ]  ; uitlezen
        DelayMS 5                   
        Resultaat_0 = Dat15 * 0.0001869                                           
        Resultaat_1 = Dat15 * 0.1869
        Print At 1,1, Dec3 Resultaat_0, " Volt"
        Print At 2,1, Dec0 Resultaat_1, " mvolt"
        DelayMS 15
                                           
    Wend

End

Je kunt die A/D toch gewoon 4x uitlezen en dat op het display zetten?
Meestal is een wat nieuwere pic met A/D (bijv. 16F1847) wat handiger... (als je aan 10bit A/D genoeg hebt)

[Bericht gewijzigd door Arco op 26 november 2018 21:08:59 (44%)]

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

waarom ik deze gebruik is omdat deADS1115 net zo duur is als een referentie chip.
en ik heb nog nooit zo`n stabiele uitlezing gehad tot op de mvolt.

ik moet ze alle 4 apart instellen via de configuratie.
na elke keer de configuratie in te stellen op de goede ingang kan ik deze uitlezen uit bit15.

als ik dus ingang 1 configureer en uitlees en naar regel 1 lcd schrijf is er niets aan de hand.
configureer ik ingang 2 en schrijf deze weg naar regel 3 van de lcd
komt die ook op regel 1 te staan.

zowel regel 1 als regel 3 wisselen van ingang 1 en 2

er zit een multiplexer in de ADS1115 en dat verklaart misschien het een en ander maar
ik weet niet goed hoe ik daar mee om moet gaan gaan.

hier het voorbeeld :

pic basic code:


Device 16F628A                
Config HS_OSC, WDT_OFF, PWRTE_ON, LVP_OFF, BODEN_OFF, MCLRE_OFF
Xtal 20
All_Digital TRUE
Clear
 
Symbol ADS_SDA = PORTA.0  ; ADS1115
Symbol ADS_SLC = PORTA.1  ; ADS1115
 
;        76543210
PORTA = %00000000  
TRISA = %00000011
  
Dim Dat15       As Word
Dim Resultaat_0 As Float
Dim Resultaat_1 As Float

Dim Data2       As Word
Dim Resultaat_2 As Float
Dim Resultaat_3 As Float

Cls
DelayMS 100

Lees_ADC:

    While 1 = 1
                                            ;5432109876543210
        I2COut ADS_SDA, ADS_SLC, $90, $01, [%1100000100000011]  ; configuratie
                                            ; |||
                                            ; 100 = AIN0 ingang en met ADDR naar aarde.
                                            ; 101 = AIN1 ingang en met ADDR naar aarde.
                                            ; 110 = AIN2 ingang en met ADDR naar aarde.
                                            ; 111 = AIN3 ingang en met ADDR naar aarde.
        DelayMS 15                          
        I2CIn ADS_SDA, ADS_SLC, $90, $48, [ Dat15 ]  ; uitlezen
        DelayMS 5                   
        Resultaat_0 = Dat15 * 0.0001869                                           
        Resultaat_1 = Dat15 * 0.1869
        Print At 1,1, Dec3 Resultaat_0, " Volt"
        Print At 2,1, Dec0 Resultaat_1, " mvolt"
        DelayMS 15
                                             ;5432109876543210
        I2COut ADS_SDA, ADS_SLC, $90, $01, [%1101000100000011]  ; configuratie
                                            ; |||
                                            ; 100 = AIN0 ingang en met ADDR naar aarde.
                                            ; 101 = AIN1 ingang en met ADDR naar aarde.
                                            ; 110 = AIN2 ingang en met ADDR naar aarde.
                                            ; 111 = AIN3 ingang en met ADDR naar aarde.
        DelayMS 15                          
        I2CIn ADS_SDA, ADS_SLC, $90, $48, [ Data2 ]  ; uitlezen
        DelayMS 5                   
        Resultaat_2 = Data2 * 0.0001869                                           
        Resultaat_3 = Data2 * 0.1869
        Print At 3,1, Dec3 Resultaat_2, " Volt"
        Print At 4,1, Dec0 Resultaat_3, " mvolt"
        DelayMS 15                                   
    Wend

En

als ik dus ingang 1 configureer en uitlees en naar regel 1 lcd schrijf is er niets aan de hand.configureer ik ingang 2 en schrijf deze weg naar regel 3 van de lcd komt die ook op regel 1 te staan.

Aansturing van het LCD dus, geen ADS1115 probleem.

Je PIC Basic code lijkt niet compleet, maak van Lees_ADC een functie waarin je ook het kanaal meegeeft, bv Lees_ADC(2), vervolgens de cursor van het LCD op de juiste regel zetten, 2 voor dat je de gemeten waarden erop zet.

It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.

Eerst de lay-out op orde krijgen, daarna de ADC, dan de cijfertjes op de juiste plaats.

De zinloosheid des levens is nog geen rechtvaardiging voor sisyphusarbeid.

Niet alle libraries ondersteunen 4x20 displays. Vaak werkt het dan wel als je regel 1 en 3 als 1 geheel ziet...
(door hisoriche opbouw zitten veel displays qua geheugen nogal verknipt in elkaar... ;) )

code:

"Regel 1.............Regel 3"
Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com
Sjoerd Kreyns

Golden Member

Volgens mij moet je met declare aan het begin van het programma doorgeven welke interface je gebruikt voor het LCD.

Iets als

pic basic code:

DECLARE LCD_INTERFACE 4

Daarna werkt

pic basic code:

PRINT AT 4,1

wel

[Bericht gewijzigd door Sjoerd Kreyns op 27 november 2018 08:50:51 (13%)]

SMD weerstandjes zoeken in grijze vloerbedekking is ook een uitdaging ... 8*1=255 ... Het nadeel van ruimte: Als je het hebt, staat het binnen de kortste keren weer vol.

@Roland.

als ik dus ingang 1 configureer en uitlees en naar regel 1 lcd schrijf is er niets aan de hand.configureer ik ingang 2 en schrijf deze weg naar regel 3 van de lcd komt die ook op regel 1 te staan.

nog een keer.
als ik meting 1 weg schrijf naar regel 1 werkt dit goed.
als ik meting 2 weg schrijf naar regel 3 werkt het goed.
nu komt het vervelende deel. ik heb dus twee waardes die elkaar wisselen zowel op regel 1 als regel 3 komen de twee waardes te staan.
net als een scanner ( multiplexing ? )
dit gebeurt zowel op regel 1 als regel 3( het maakt niet uit welke regel combinatie ik gebruik )
het aansturen van de lcd werkt gewoon goed. gaat met proton basic.
ik zit zelf een beetje aan de adressering te denken van de ads1115.
volgens mij doe ik daar iets verkeerd en worden de gemeten waardes elke keer naar het zelfde adres weg geschreven waardoor het afwisselend te voor schijn komt. welke regel ik dan ook gebruik.

Als de tekst op de verkeerde regel van het display staat, heeft dat niks met de A/D converter te maken, maar met de aansturing van het display.
Display wel als 4 regelig ingesteld? Schrijf eerst eens 4 vaste teksten naar de regels en kijk of dat wel goed gaat.

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

@Arco
@Sjoerd
@Hunter
@Roland

het printen is helemaal geen probleem.
werkt uitstekend alle regels geen problemen mee.
alles waar het hoort te staan. welk commando dan ook.

Ik lees toch heel wat anders:

configureer ik ingang 2 en schrijf deze weg naar regel 3 van de lcd komt die ook op regel 1 te staan.

Verder niet belangrijk voor de werking, maar 'ADS_SLC' zou 'ADS_SCL' moeten zijn... ;)

[Bericht gewijzigd door Arco op 27 november 2018 17:31:59 (23%)]

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

@Arco

configureer ik ingang 2 en schrijf deze weg naar regel 3 van de lcd komt die ook op regel 1 te staan.

ik lees de Waarde uit AIN0 zet dit in Dat15 dit komt op het scherm
daarna lees ik de Waarde uit AIN1 zet dit in Data2 dit komt op het scherm

en dan komt het probleem dat de waardes van Dat15 en Data2 elkaar afwisselen.
ik lees apart in maar flipflopt het door elkaar
hoop dat het nu duidelijker is.
het gaat om de waardes en niet om het scherm zelf.

Ik ken picbasic niet verder, maar zo te zien klopt je adres niet. (1e parameter zou adres met '1' ervoor moeten zijn voor 16 bit. (vreemde notatie...)
Verder zou adres '00' of '01' moeten zijn. (hoe je aan 0x48 komt weet ik niet...)

pic basic code:


   I2COut ADS_SDA, ADS_SLC, $C8, $01, [%1100000100000011]  
   ..
   I2CIn ADS_SDA, ADS_SLC, $C8, $00, [ Dat15 ] 
   ..
   I2COut ADS_SDA, ADS_SLC, $C8, $01, [%1101000100000011]              
   ..
   I2CIn ADS_SDA, ADS_SLC, $C8, $00, [ Data2 ]  
Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

het probleem zat hem in de DelayMS 15 tussen beide metingen.
heb dit op DelayMS 100 gezet en het werkt nu goed.
weer iets geleerd tja stom stom stom.
dank allen voor het mee denken.

Een delay van 100mS is dan nog steeds te kort; je hebt de SPS op 8 ingesteld... (dus moet > 125mS zijn...)

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com
hadv

Golden Member

Op 28 november 2018 01:24:31 schreef Arco:
Ik ken picbasic niet verder, maar zo te zien klopt je adres niet. (1e parameter zou adres met '1' ervoor moeten zijn voor 16 bit. (vreemde notatie...)
Verder zou adres '00' of '01' moeten zijn. (hoe je aan 0x48 komt weet ik niet...)

pic basic code:


   I2COut ADS_SDA, ADS_SLC, $C8, $01, [%1100000100000011]  
   ..
   I2CIn ADS_SDA, ADS_SLC, $C8, $00, [ Dat15 ] 
   ..
   I2COut ADS_SDA, ADS_SLC, $C8, $01, [%1101000100000011]              
   ..
   I2CIn ADS_SDA, ADS_SLC, $C8, $00, [ Data2 ]  

Arco: de compiler voegt zelf de 0 of 1 toe afhankelijk van de richting. Als er al een 0 of 1 staat wordt die overschreven.

Just find out what you like and let it kill you

Ik had dit gelezen:

I2CIN Control, Address, Var{, Var}

Sends Control and Address out the I2C clock and data lines and puts the byte(s) received into Var.

The lower 7 bits of the Control byte contain the control code along with chip select or additional address information, depending on the particular device.
The high order bit is a flag indicating whether the following Address is to be sent as an 8 bit or 16 bit address. If this flag is low, the Address is sent as 8 bits. The control code for a serial EEPROM is %1010.

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

pic basic code:


                                            ;5432109876543210
        I2COut ADS_SDA, ADS_SLC, $90, $01, [%1100000100000011]  ; configuratie
                                            ; |||
                                            ; 100 = AIN0 ingang en met ADDR naar aarde.
                                            ; 101 = AIN1 ingang en met ADDR naar aarde.
                                            ; 110 = AIN2 ingang en met ADDR naar aarde.
                                            ; 111 = AIN3 ingang en met ADDR naar aarde.
        DelayMS 15                          
        I2CIn ADS_SDA, ADS_SLC, $90, $48, [ Dat15 ]  ; uitlezen

$90 = %10010000 dit is het adres van de ADC
$01 = %00000001 dit is de config adres van de ADC
$48 = %01001000 dit is pointer register van de ADC, zie plaatje

I2COut ADS_SDA, ADS_SLC, $C8, $01, [%1100000100000011]
..
I2CIn ADS_SDA, ADS_SLC, $C8, $00, [ Dat15 ]
..
I2COut ADS_SDA, ADS_SLC, $C8, $01, [%1101000100000011]
..
I2CIn ADS_SDA, ADS_SLC, $C8, $00, [ Data2 ]

$C8 = %11001000 ??? niet voor deze ADC

maar het werkt nu in ieder geval goed.

pic basic code:


Clear
 
Symbol ADS_SDA = PORTA.0  ; ADS1115
Symbol ADS_SLC = PORTA.1  ; ADS1115
 
;        76543210

en inderdaad, het moet ADS_SCL / ADS_SDA zijn.
ik ben creatief ha ha ha.
groet Piet

Ik heb schijnbaar niet de goede datasheet gehad... ;) (kan die niet meer terugvinden nu)
Blijft wel dat 100mS te kort is bij 8 SPS (samplerate), minimum is dan 125mS.
De chip heeft trouwens een conversion_ready output, waarom gebruik je die niet? (dan wacht je nooit langer als nodig)

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com

Had het al op 125ms gezet.

De chip heeft trouwens een conversion_ready output, waarom gebruik je die niet? (dan wacht je nooit langer als nodig)

hoe wie wat waar.
conversion_ready output, dat moet ik dan eerst eens op en uitzoeken in het manual.

ik ga eens kijken

Eerste bladzijde van de datasheet... :)

Arco - "Simplicity is a prerequisite for reliability" - hard en software ontwikkeling: www.arcovox.com