Hallo, ik heb niet zo gek lang geleden een sensor gekocht met een aanverwant I2C protocol namelijk: de SHT-75
Ik heb deze aan de praat gekregen op mijn uC.
Deze sensor heeft echter geen instelbaar adres, maar ik zou toch graag 6 van deze sensoren op alleen de sda en scl lijn willen leggen.
Is het mogelijk om deze sensoren een voor een van spanning te voorzien door middel van multiplexen en zodoende met één adres betrouwbare gegevens te winnen van alle 6 de sensoren ?
Ik hoop dat iemand mij hiermee kan helpen.
Gr
roel.
Je kunt elke temp. sensor aan/uit zetten met behulp van transistoren. Deze transistoren kun je aansturen met je µC Zo kun je ze 1 voor 1 benaderen.
Als je de I2C afhandeling doet m.b.v bitbanging dan kun je elke sensor z'n eigen SDA lijn geven,de SCL kan gemeenschappelijk zijn
free_electron
Silicon Member
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
zet een 4052 in je SDA lijn en gebruik die om je SDA te multiplexen.
er zijn ook speciale i2c multiplexers zoals de pca9554
Uitschakelen van de sensors is niet handig volgens mij. Dat kan wel, maar daarna kun je de I2C niet meer aansturen zonder de Sensors via de SCL/SDA te gaan voeden. Dat gaat dus niet werken.
Ik zou in dit geval een multiplexer gebruiken in de SCL lijn. SDA kan ook wel, maar is voor mij toch minder logisch. Als je de SDA uitzen en wel SCL genereert dan blijft de sensor toch data naar binnen klokken, al is dat dan telkens een hoog signaal.
free_electron
Silicon Member
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
neen, je snapt niet hoe I2C werkt... je MOET SDA schakelen.
de uitgeschakelede kanalen zien een logisch hoog op hun SDA. jij mag daar clocken zoveel je wilt er gebeurt niks ( die dingen clocken zelfs niks binnen want er gebeurt geen START operatie... om een START te hebben moet SDA naar nul gaan terwjk SCL hoog is.
de afgekoppelde chips hebben SDA altijd hoog staan. die reageren geneens op SCL. er komen botweg geen START condities , en zolang die er niet zijn slapen i2c schips.)
als jij SCL omschakelt dan zit je daar continue START en STOp operaties te rammen... ( van de afgeshcakelde kanalen is SCL hoog en SDA toggelt nog steeds.... das dus niks anders dan START- STOp - Start- STOp en wie weet in welke toestand je exit...
trouwnes je clock moet super proper zijn tussen al je chips dus frut je daar beter niks tussen.
[Bericht gewijzigd door Henry S. op (24%)]
Oke, bedankt voor de info.
Even ter verduidelijking, de sht-75 is een sensor, met een protocol die lijkt op i2c. maar echt i2c is het niet.
Wel werken ze op een sda en scl lijn.
Ik heb van deze sensor data ontvangen, en kan deze omzetten in temperatuur en relatieve vochtigheid. Dit werkt dus.
Nu lees ik hier dat ik de SDA lijn zou moeten multiplexen.
Maar, wat gebeurd er nu als ik de SCL, SDA, en ground parralel leg, en vervolgens de sensoren 1 voor 1 van spanning voorzie ?
De sampletijd hoeft niet snel te zijn, dus enige opstarttijd voor deze sensor kan hier in geïntegreerd worden.
Hier een softwarevoorbeeld :
Symbol l1 = PORTA.0
Symbol l2 = PORTA.1
Symbol l3 = PORTA.2
Symbol l4 = PORTA.3
Symbol l5 = PORTE.0
Symbol l6 = PORTE.1
Symbol a = PORTA
Symbol e = PORTE
Symbol s = 1000 'sampletijd
Symbol t = 100 'tijd tussen samples
Dim TELLER As Byte
Dim TELLER1 As Byte
Dim DUMMY As Byte
TRISA = %00000000
TRISE = %00000000
PORTA = %00000000
PORTE = %00000000
Clear
DelayMS 500
Cls
sensorA:
TELLER = %00000001
While 1 = 1
Low a :DelayMS t
a = TELLER
GoSub sensD
TELLER = TELLER << 1
If TELLER = %00010000 Then
a = $00
GoTo sensorE
EndIf
Wend
sensorE:
TELLER1 = %00000001
While 1 = 1
Low e :DelayMS t
e = TELLER1
GoSub sensD
TELLER = TELLER << 1
TELLER1 = TELLER1 << 1
If TELLER1 = %00000100 Then
e = $00
GoTo sensorA
EndIf
Wend
sensD:
Print At 1, 1, "sensor: "
Select TELLER
Case $1 :Print At 1, 9, "Een "
Case $2 :Print At 1, 9, "Twee"
Case $4 :Print At 1, 9, "Drie"
Case $8 :Print At 1, 9, "Vier"
Case $10 :Print At 1, 9, "Vijf"
Case $20 :Print At 1, 9, "Zes "
EndSelect
GoSub meting:
Return
meting:
'************** Hier komt de volledige meting + controle van sensor
'*******************************
DelayMS s
Return
End
Bij set submenu meting:
Word er gewacht, totdat de gehele meting en controle ervan verricht is.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Waarom niet gewoon een aparte data input voor elke sensor? (en gemeenschappelijke clock)
Dat kost net zoveel pinnen en is wat frisser dan het geknoei met de voeding steeds er op en er af...
Daar heb ik nog niet aan gedacht als ik eerlijk ben.
Het is inderdaad minder geknoei met de spanning maar wel meer geknoei met de software.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Software valt wel mee. Je kunt ze allemaal op bijv poort B aansluiten.
Je kunt er dan 7 aansluiten (en houdt de achtste pin over voor de clock)
Bij iedere clockpuls lees je poort B, en heb je in een keer de data van alle sensors...
Bij iedere clockpuls lees je poort B, en heb je in een keer de data van alle sensoren.
Dit gedeelte snap ik even niet, sorry
Het lijkt me niet, dat de uC alle data van alle sensoren in een keer in alle verschillende variabele zet. En zeker niet met deze sensor, waarbij meer dan 2 byte's variabele gebruikt word.
Het klinkt aannemelijk, maar verklaar uw nader !
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Zeg voor het gemak dat de sensors aan portb.1....portb.7 zitten.
Portb.1 is dan het databit van sensor 1, portb.2 van sensor 2, enz....
Je moet dan nog wel zelf het betreffende bit it de juiste variabele stoppen...
Ik weet niet hoe dat met picbasic het simpelste gaat, maar in assembly stop je het bit in kwestie in het Carry bit en doet dan een shift van de gewenste variabele...
Voorbeeld in assembly (voor 12 bits wordt dit dus 12x uitgevoerd):
movf portb,w ;port inlezen
movwf portb_copy
rrf portb_copy
rrf portb_copy ;bit 1 naar carry
rlf data1_lo ;en naar variable 1
rlf data1_hi
rrf portb_copy ;bit 2 naar carry
rlf data2_lo ;
rlf data2_hi
rrf portb_copy
rlf data3_lo
rlf data3_hi
rrf portb_copy
rlf data4_lo
rlf data4_hi
rrf portb_copy
rlf data5_lo
rlf data5_hi
rrf portb_copy
rlf data6_lo
rlf data6_hi
rrf portb_copy
rlf data7_lo
rlf data7_hi
Oké bedankt, ik snap dat principe.
Waarschijnlijk dat ik zelf nog voor verwarring zorg.
Het was uiteindelijk wel de bedoeling om de sensoren op alleen portA aan te sluiten.
Hetgeen wat jij in assembly hebt geschreven daar is ongeveer het zelfde als wat ik had hierboven. Alleen word bij jou geloof ik op het moment van shiften de data meteen in een variabele gezet? Bij mij word er eerst naar een submenu gegaan, en vervolgens gemeten.
Het principe wat ik zelf in gedachten had heb ik op een breadboard gezet. en aan een tijdelijk gebrek aan alle A poorten moest het even zo.
Het werkt wel. De vertraging ertussen in is echt miniem.
sample tijd is 1 sec per sensor, om en om.
Dus iedere seconden heb ik de data van alles sensoren.
Het word een langzaam proces over een tijd van 2 uur.
Dus de sample tijd zal nog aanzienlijk langzamer worden.
Ik heb het ontwerp uitgewerkt en het werkt.
Ik krijg van 6 sensoren de data binnen over 1 sda lijn.
Alle data onafhankelijk van elkaar dus zonder dat deze andere data stoort.
Volgende stap is de data te versturen via een terminal.
groeten