i2c (/smbus) counter

Heeft met elektronica te maken maar het is geen elektronica

Postby eriksl » Tue Jun 26, 2012 12:00 am

Voor mijn home automation heb ik op allerlei plaatsen sensors (temperatuur/vochtigheid/stroomverbruik, via 1 kWh-puls) in het huis (zie eerdere berichten daarover van mij).

Op dit moment gebruik ik daar sensors voor (inclusief LDR voor de kWh-puls) en velleman k8055 bordjes (2x a/d 8 bits converters, 5x digitaal in, 2x counter in, 2x pwm/analoog uit, 8x digitaal uit, naar USB).

Dat gaat op zich aardig, maar geeft wat problemen. Eén ervan is de beperkte resolutie van de 8-bits adc's. Ik zorg al dat de opamps precies "getuned" zijn om de maximale range van de inputs te gebruiken. Dan nog blijft 8 bits vaak erg mager. Dat probleem heb ik al "opgelost" door andere boards te kopen, waarop alleen een 12-bits adc zit, met een input multiplexer voor acht inputs. Ben daar alleen nog niet aan toegekomen

Een ander probleem is de eeuwige storing op het analoge deel, zeker als de draden wat langer zijn. Als je tien metingen neemt, dan kunnen acht metingen redelijk betrouwbaar zijn (wijken +/- 5% af) en twee waarden zitten dan helemaal bij de bodem of helemaal bij de top. Als je elke keer een enkele meting neemt, dan gaat je grafiek dus alle kanten op. Ik "los het nu op" door utp cat 5 kabels te gebruiken, dat scheelt al een heel stuk, maar dan nog moet ik 32-64 samples nemen en middelen om een goed stabiele waarde te krijgen.

Ik ga nu een andere aanpak volgen, zoveel mogelijk digitaal. Dat heeft nog een ander voordeel, als de sensor zegt "25.2" graden, dan bedoelt hij dat ook Met een tmp36 op een a/d converter moet je nog het één en ander gaan meten en omrekenen om een goede vertaling tussen uitgangsvoltage van de sensor en uitgangswaarde van de adc te krijgen.

Ik heb een ELV USB I2C converter gekocht (leuke prijs: ongeveer dertig euro!) en een stel sensors die via I2C c.q. SMBus uit te lezen zijn. De digipicco heb ik al aan de gang (ik zie net dat die in dit of volgend Elektor besproken wordt!). Afgezien van dat veel sensors wel héél erg klein zijn (een sotje kan ik nog wel solderen, maar nog kleiner is echt een probleem, ik heb net een soic-8 van 4x5 mm gesoldeerd (tsl2550d), het lijkt zowaar gelukt te zijn!) moet dit beter gaan lukken denk ik. Ik zal nog wel even de voortgang laten weten.

Waar ik nu tegenaan loop, is dat ik de ook de counters van de vellemans in dit systeem wil onderbrengen. De counters gebruik ik om met een ldr de 1 kWh-pulse van de meter op te vangen. Dat kan (/wil) dus niet met polling, de pulsen kunnen vrij snel achter elkaar komen als ik hier vier pitten en twee ovens tegelijk aan heb staan. Met de huidige counters gaat dat goed. Ik kan alleen geen i2c ic vinden die simpelweg een input (of meerdere) kan tellen, geheel zonder hulp.

Ik zie wel meer mensen die op zoek zijn, maar geen antwoord :-/ Ik heb een donkerbruin vermoeden dat het een generieke counter met parallelle output op acht pootjes gaat worden en die dan op een 8 bits i/o expander aansluiten. Wordt dan wel weer twee ic's PER input en de counter kan niet gereset worden.

Heeft er iemand misschien een slimmer idee?'
eriksl
 
Posts: 515
Joined: Thu Jan 02, 2014 3:28 pm

Postby eriksl » Tue Jun 26, 2012 12:00 am

Ik zie inmiddels dat de 74590 ook een reset input heeft. Ik zou dus kunnen doen: 7 lijnen van de i/o expander als input voor 7 bits input en de achtste als output voor reset.
eriksl
 
Posts: 515
Joined: Thu Jan 02, 2014 3:28 pm

Postby schueler » Tue Jun 26, 2012 12:00 am

erikslAls je elke keer een enkele meting neemt, dan gaat je grafiek dus alle kanten op. Ik "los het nu op" door utp cat 5 kabels te gebruiken, dat scheelt al een heel stuk, maar dan nog moet ik 32-64 samples nemen en middelen om een goed stabiele waarde te krijgen.


Dit probleem kom ik geregeld tegen en neem daarom een aantal samples, bijvoorbeeld 8. Als de waarden die ik per sample meet te veel afwijkt van de gemiddelde zal het meestal om een spike gaan en gooi ik die weg. Daarmee trekt de spike de gemiddelde waarden niet omhoog of omlaag.


erikslWaar ik nu tegenaan loop, is dat ik de ook de counters van de vellemans in dit systeem wil onderbrengen. De counters gebruik ik om met een ldr de 1 kWh-pulse van de meter op te vangen. Dat kan (/wil) dus niet met polling, de pulsen kunnen vrij snel achter elkaar komen als ik hier vier pitten en twee ovens tegelijk aan heb staan. Met de huidige counters gaat dat goed. Ik kan alleen geen i2c ic vinden die simpelweg een input (of meerdere) kan tellen, geheel zonder hulp.

Ik zie wel meer mensen die op zoek zijn, maar geen antwoord :-/ Ik heb een donkerbruin vermoeden dat het een generieke counter met parallelle output op acht pootjes gaat worden en die dan op een 8 bits i/o expander aansluiten. Wordt dan wel weer twee ic's PER input en de counter kan niet gereset worden.

Heeft er iemand misschien een slimmer idee?


Waarom gebruik je geen interrupts?!?
Die zijn juist hier voor gemaakt...

Je zou ook de bordjes van arduino kunnen gebruiken. Kosten zijn niet zo hoog en het programmeren is vrij eenvoudig. Het meeste wordt voor je gedaan, zoals ook bij de mbed van ARM/NXP.



Maar om een antwoord te geven op je vraag:

Ik weet even niet hoeveel tijd er zit tussen de pulsen maar dat doet er niet heel veel toe voor het verhaal.

Stel een timer zo in dat het een overflow geeft bij 1ms.
In een routine getriggerd door de overflow van die timer tel je steeds 1 op bij een variabele ( bv teller1 ) en zet je de timer. ( hoeft niet perse maar zal het verhaal niet te moeilijk maken ).

Maak een interrupt routine wat op een opgaande flank van een input pin reageert. Mag ook neer gaande flank zijn uiteraard... In deze interrupt routine kopieer je de counter waarde van de variabele teller1. Zet een flag ( bv teller_valid ) op 1.

In de hoofd lus hof je nu alleen te kijken of teller_valid 1 is en dan weet je dat er een puls is geweest. kopieer de waarde en te teller_valid terug op 0.


Vrij simpel en zeer stabiel.



Ben
schueler
 
Posts: 1433
Joined: Thu Jan 02, 2014 10:40 am

Postby eriksl » Tue Jun 26, 2012 12:00 am

SchuelerDit probleem kom ik geregeld tegen en neem daarom een aantal samples, bijvoorbeeld 8. Als de waarden die ik per sample meet te veel afwijkt van de gemiddelde zal het meestal om een spike gaan en gooi ik die weg. Daarmee trekt de spike de gemiddelde waarden niet omhoog of omlaag.

Dat is precies wat ik ook al doe... Eerst het gemiddelde uitrekenen en dan nog een keer de hele reeks doorlopen en de uitliggers eruit gooien en dan nog een keer het gemiddelde nemen. Dat klinkt heel logisch en handig, maar valt in de praktijk behoorlijk tegen. In de eerste plaats is het behoorlijk lastig om een goed criterium te vinden voor wat een "spike" is, die kunnen namelijk ook redelijk dicht bij een geldige waarde liggen! Verder is het nemen van een sample met een k8055 redelijk tijdroven, als je er 64 wilt nemen, dan ben je zo tien seconden verder. Minder dan 64 levert mij geen herhaalbaar correcte resultaten op. En in de laatste plaats: het lost het het probleem niet op. Nou had ik zowiezo altijd al wat tegen analoog, dus een reden des te meer om het nu meteen goed (= digitaal) op te lossen.


Waarom gebruik je geen interrupts?!?
Die zijn juist hier voor gemaakt...

Een interrupt op een i2c bus? Welke draad is dat?


Je zou ook de bordjes van arduino kunnen gebruiken. Kosten zijn niet zo hoog en het programmeren is vrij eenvoudig. Het meeste wordt voor je gedaan, zoals ook bij de mbed van ARM/NXP.

Dat was natuurlijk een inkoppertje en ik had er meteen bij moeten uitleggen waarom dat niet kan. Een microcontroller in het algemeen, en zeker bepaalde modellen, zou meteen alle "problemen" oplossen: i2c bus, meerdere adcs, meerdere pwm's, meerdere i/o's, counters enz. Maar dat kan dus niet. Ik heb op meerdere plaatsten in het huis nettopjes staan (x86-64 arch dus, draait een "gewone" linux op). Die nettopjes doen meer dan alleen meten. Zo is er een waaraan een webcam hangt, in de kinderkamer. Met een microcontroller wordt dat al erg lastig, alleen een kleine groep heeft een netwerk-aansluiting, en geen een heeft de processing om video transcoding te doen (anders was het geen microcontroller...). De complete (! niet uitgeklede microcontroller-linux-omgeving) maakt het voor mij heel eenvoudig om vanalles te maken en aan te passen. Dat onderdeel is dus niet discussierbaar


Stel een timer zo in dat het een overflow geeft bij 1ms.
In een routine getriggerd door de overflow van die timer tel je steeds 1 op bij een variabele ( bv teller1 ) en zet je de timer. ( hoeft niet perse maar zal het verhaal niet te moeilijk maken ).

Maak een interrupt routine wat op een opgaande flank van een input pin reageert. Mag ook neer gaande flank zijn uiteraard... In deze interrupt routine kopieer je de counter waarde van de variabele teller1. Zet een flag ( bv teller_valid ) op 1.

In de hoofd lus hof je nu alleen te kijken of teller_valid 1 is en dan weet je dat er een puls is geweest. kopieer de waarde en te teller_valid terug op 0.

Allemaal leuk, maar op welke draadjes van de i2c-bus gaat dat gebeuren

Het idee is, mocht het niet helemaal duidelijk zijn geweest, dat al die nettopjes een usb naar i2c converter krijgen. De i2c bus, daar komt alles aan. Ik moet het even nakijken, maar volgens mij kan ik een i2c bus over utp best wel een aantal meters lang maken. De converter komt dus bij de computer, de sensors (en in dit geval de counter) een eind verderop, op de i2c bus. Met een i2c-ic dat inputs kan tellen zou dat heel simpel geweest zijn, maar die lijken dus niet te bestaan...

Overigens bedenk ik me dat een 7 bits counter waarschijnlijk niet eens genoeg is. Ik wil de sensor maar eens per minuut uitlezen, maar hij moet ook een langere periode kunnen overbruggen. Ik kan maximaal 35A uit het net trekken, bij 230V is dat 8000 W. Doe je dat uur lang, dan heb je in 60 minuten 8000 keer een kWh puls gehad, is ongeveer 130 pulsen per minuut is ongeveer 2 pulsen per seconde. Met een zeven bits counter red je dan maar 64 seconden. Dat wordt dus een zestien (vijftien) bits counter icm met een 16 bits i/o expander, volgens mij zijn die er wel. Dan kom je tot 16384 seconden is 273 minuten is 4.5 uur. Das wel genoeg
eriksl
 
Posts: 515
Joined: Thu Jan 02, 2014 3:28 pm

Postby eriksl » Tue Jun 26, 2012 12:00 am

Nog even opgezocht, theoretisch kan de bus 10 meter zijn, maar er zijn mensen die 100 meter hebben gehaald, over utp, desnoods met een lagere klok (en dat is geen probleem hier, die kan ik instellen). Da's dus (inderdaad) een stuk praktischer dan usb verlengen. Met speciale i2c repeaters kun je nog veel verder komen, maar dat is even niet van belang.
eriksl
 
Posts: 515
Joined: Thu Jan 02, 2014 3:28 pm

Postby anneo » Tue Jun 26, 2012 12:00 am

Lijkt mij dat je met een ATtiny25 een heel eind kunt komt.Die heeft maar 8pinnen een I2C aan boord,heet daar USI.
Op een interruptpin kun je de LDR aansluiten en in soft bij elke verandering op die pin een teller ophogen.Des noods meerdere registers achter elkaar om ver te kunnen tellen.Via de bus de stand opvragen of op nul zetten.
Zit ook een 10bit ADC in (4 ingangen).En de soft bepaalt op welk adres moet gereageerd.
Anne
anneo
 
Posts: 1339
Joined: Thu Jan 02, 2014 10:36 am

Postby eriksl » Tue Jun 26, 2012 12:00 am

Die gedachtengang had ik op zich ook al gevolgd

Maar dan zit je nog steeds aan het programmeren van een microcontroller (met alles wat daarbij komt kijken). In dit geval zul je ook i2c slave moeten programmeren, want de microcontrollers hebben, als ze voor i2c al meer support hebben dan alleen hardware, alleen master support...

Zou een leuk elektor-projectje zijn, met voorgeprogrammeerde uC, maar dan verkopen ze er maar één vrees ik
eriksl
 
Posts: 515
Joined: Thu Jan 02, 2014 3:28 pm

Postby schueler » Tue Jun 26, 2012 12:00 am

De meeste kunnen ook wel slave aan, sowieso softwarematig.
Ik heb net even gekeken en de attiny85 kan gewoon een i2c slave zijn waarvan je de adc kunt lezen of een counter waarden... wat jij programmeert eigenlijk.

Elektor heeft zelfs een artikel toegewijd aan de attiny13 en attiny2313...
I2C Slave Kernel for ATtiny13 and `2313

Maar het zou ook met de mcp23017 kunnen.
En ja, I2C heeft wel degelijk een interrupt!!!
Het betekend dan wel een extra touwtje, maar ook de mcp23017 ondersteunt dit. Zowel op poort A als op B.

Maar mijn voorkeur zou dan toch gaan naar een kleine ucontroller te voorzien van een i2c slave met counter.


Ben'
schueler
 
Posts: 1433
Joined: Thu Jan 02, 2014 10:40 am

Postby eriksl » Wed Jun 27, 2012 12:00 am

SchuelerDe meeste kunnen ook wel slave aan, sowieso softwarematig.

Ja uiteindelijk kun je natuurlijk elke gpio pin wel als sda/scl gebruiken, maar dan moet je er wel een boel omheenprogrammeren. Iets wat op i2c reageert is 1, een correcte i2c implementatie is heel andere koek!


Ik heb net even gekeken en de attiny85 kan gewoon een i2c slave zijn waarvan je de adc kunt lezen of een counter waarden... wat jij programmeert eigenlijk.

Als je bereid bent de i2c slave zelf te programmeren (of eventueel uit een library over te nemen), dan kun je bijna elke microcontroller wel gebruiken. Begrijp me niet verkeerd, ik ben gek op microcontrollers en ja, ik denk ook dat een microcontroller (zeker zoiets als een attiny) een veel mooiere oplossing is als digitale counter dan een generieke counter met een i/o expander. Je hebt niet eens een hardware counter nodig, de pins van de attiny's kunnen zodanig geprogrammeerd worden dat ze een interrupt geven bij een "edge", de teller kan dan in software, zoveel bits als je wilt, vier poorten.

Maar zoals ik altijd weer moet zeggen, ik heb momenteel gewoon echt niet de tijd om eens grondig in microcontrollers te duiken, zodanig dat ik er echt wat mee kan. De leercurve is immers nogal steil...


Elektor heeft zelfs een artikel toegewijd aan de attiny13 en attiny2313...
I2C Slave Kernel for ATtiny13 and `2313

Dat is 'm inderdaad wel ja Als ze nou ook even kant-en-klare code hadden voor de implementatie van vier 16 bits counters dan zou het geweldig zijn Ik vind ook hier wel weer de beschrijving in het artikel erg minimaal, zoals vaak bij projecten met microcontrollers. Ik ben benieuwd hoeveel mensen dit zo kunnen nabouwen en aanpassen, met een zelfgeprogrammeerde attiny.

Mijn handen gaan hier wel van jeuken Misschien toch wel een leuk beginpunt voor microcontrollers-educatie... Kan ik zeer waarschijnlijk wel weer ergens een pc met windows gaan installeren, dat is dan wel weer zó jammer he...


En ja, I2C heeft wel degelijk een interrupt!!!
Het betekend dan wel een extra touwtje, maar ook de mcp23017 ondersteunt dit. Zowel op poort A als op B.

i2c heeft géén interrupt lijn. Het heet niet voor niets ook wel "two wire interface". Veel i2c slaves hebben een interrupt-uitgang, maar dat staat helemaal los van de i2c-specificatie. Anyway, het zou in deze context toch niks oplossen.
eriksl
 
Posts: 515
Joined: Thu Jan 02, 2014 3:28 pm

Postby eriksl » Wed Jun 27, 2012 12:00 am

Bij Conrad (niet eens echt de goedkoopste) kosten ze € 2,08 en € 2,22 dat is waarschijnlijk minder dan een i/o expander en een counter bij elkaar :-/
eriksl
 
Posts: 515
Joined: Thu Jan 02, 2014 3:28 pm

Next

Return to Allerlei

Who is online

Users browsing this forum: No registered users and 1 guest