Hur bygger man ett OneWire bibliotek?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Hur bygger man ett OneWire bibliotek?

Inlägg av DanielM »

Jag har en liten mystisk givare som spottar ut en digital signal som är egentligen analog. Vi kan säga att signalen är mellan 0 till 100% bara för att göra det enkelt för oss. Denna signal pulserar X antal pulser där varje puls är Y millisekunder när signalen är låg och sedan lägger sig signalen på U nivå under Z millisekunder. Detta är alltså en kod som jag ska tolka. Där X indikerar vilken kod det är och denna kod avgörs om de pulsernas under Y*X millisekunder och U är den som avgör identiteten på koden då U är konstant under Z millisekunder.

Sammanfattningsvis så kan man säga så här:
Mystiskt protokoll.png
Min fråga är inte att jag behöver hjälp att skriva koden. Koden ska implementeras i en mikrokontroller. Jag är intresserad utav tips & råd från ni som har stött på ett sådant problem. Hur har ni löst ett sådant OneWire problem förut? Har ni satt upp en task som räknar antalet pulser och en annan task som mäter antal sekunder och en annan task som mäter nivån? Alltså tre taskar? Eller räcker det med for-loopar endast?

Här är en bättre bild
Mystiskt protokoll.png

Med vänliga hälsningar
Daniel
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Senast redigerad av DanielM 19 september 2019, 17:16:51, redigerad totalt 1 gång.
Användarvisningsbild
Icecap
Inlägg: 26105
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Hur bygger man ett OneWire bibliotek?

Inlägg av Icecap »

Nu är 1-Wire® en fastlagt buss och detta du beskriver är antal pulser med pause - som rent faktisk är något helt annat än 1-Wire®.

Du ska alltså mäta pulser först för att veta vilket värde som kommer och sedan en analog spänning som är värdet i sig.

Jag hade dels tagit en op-amp och gjort en schmitt-trigger funktion med kanske 80% tröskel som ville säkerställa att pulserna satt på plats.

Detta signal hade jag kopplat till en Capture-enhet som jag ville räkna pulser med. Denna del ville även trigga en timer för varje puls och trigga om den för varje puls.

När tiden har fått ut får man en interrupt mer och startar A/D-omvandlaren och hämtar värdet.

Inte våldsamt avancerat men klart ett knepigt protokoll.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Hur bygger man ett OneWire bibliotek?

Inlägg av DanielM »

Intressant lösning faktiskt! Tror du att en FreeRTOS kan lösa problemet också?

Ex:
Task 1 börjar räkna tiden när signalen är 100%. När signalen går från 100% till 0% så mäter Task 1 tiden. Tiden är X så är det +1 i räkningen.

Task 2 börjar när signalen går till 0%. När signalen ändrar sig från 0% till mellan 0% och 100% så börjar Task 2 mäta tiden. Nästa gång när signalen går mot 100% så beräknas totala tiden. Men skulle signalen gå mot 0% så startas Task 2 om. Men går signalen mot 100% så mäts tiden och är tiden Z så loggar Task 2 värdet U.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43148
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Hur bygger man ett OneWire bibliotek?

Inlägg av sodjan »

Hur nära "X" och "Y" kan "U" komma?
D.v.s. hur vet man att man har ett "U" som är 0%
eller 100% om man inte kan skilja det från X och Y?

Hm, eller vänta... Om man inte har ett nytt omslag inom
en viss tid så är det ett "U", eftersom det är längre än
både "X" och "Y". Så måste det ju vara...
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Hur bygger man ett OneWire bibliotek?

Inlägg av DanielM »

X är alltid konstant.
Y räknas alltid från 1 till 4.
Z är alltid konstant.

Om U är 0% under Z + X tid där signalen går mot 100% så mäts U.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Hur bygger man ett OneWire bibliotek?

Inlägg av DanielM »

Vad tror ni om detta förslag då?

Task HIGH: Denna task börjar mäta tiden när signalen går mot 100%. När signalen går mot 0% så beräknas tiden. Är tiden X så räknas Y med +1. Om Y > 10 så blir Y = 1. Alltså vi startar om.

Task LOW: Denna task börjar mäta tiden när signalen blir 0%.
if-sats: Skulle signalen ändra sig till 100% och sedan 0% under X+X tid så startas Task LOW om.
if-sats: Men skulle signalen ändra sig till mellan 0-100% från 0% och vara där i X+Z tid så mäts ett U.
Användarvisningsbild
Icecap
Inlägg: 26105
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Hur bygger man ett OneWire bibliotek?

Inlägg av Icecap »

Ett RTOS löser inget, det är i mitt tycke bara ett mer komplicerat sätt att uppnå samma sak. Sedan kan det såklart finnas andra anledningar till att använda ett RTOS men i detta projekt anser jag att det bara komplicerar mer.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Hur bygger man ett OneWire bibliotek?

Inlägg av DanielM »

Okej!

Men då kör jag på ditt förslag. En schmitt-trigger Op-amp. Men förstog inte det där med Capture-enhet. Vad är det för enhet? Något man själv skriver i C?

Du skrev dock detta inlägg innan jag postade den andra bilden. Som vi ser i den andra bilden så följer systemet väldigt linjärt att den börjar först med 1 puls och sedan blir det 2 och sist blir det 10 och sedan börjar den om igen.

Eller menar du att om jag använder en schmitt-trigger som visar 0 eller 1 beroende på vilken puls det är och sedan en capture-enhetet som räknar 1, 2, 3, 4.

För den första gången så är det 1 och sedan 0 och där efter kommer signalen. Nästa gång är det 1 0 1 0 och sedan kommer signalen, tredje gången så är det 1 0 1 0 1 0 och sedan kommer signalen. Då gäller det bara att avgöra när en hög signal förekommer om mätsignalen kan vara lika hög också?

Så här
Mystiskt protokoll.png
Det betyder att man ska läsa signalen

Kod: Markera allt

10X1010X101010X10101010X
Där X är när man ska mäta med ADC och inte räkna dessa som hög eller låg. Men hur vet jag att X är X och inte 1 om signalen är 100% vid mätning?
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Palle500
Inlägg: 4484
Blev medlem: 6 juni 2015, 14:53:06

Re: Hur bygger man ett OneWire bibliotek?

Inlägg av Palle500 »

Är det din egna tolkning av signalen, eller från ett datablad?
Du kan inte tala om beteckning och en bild på givaren och vilken storhet den skall mäta?
Är det endast analog signal så kanske du samplar lite för fort och i verkligheten så duger ett RC-filter för att glätta signalen till rätt DC nivå?
Användarvisningsbild
Icecap
Inlägg: 26105
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Hur bygger man ett OneWire bibliotek?

Inlägg av Icecap »

Nu vet jag ju inte vilken enhet du vill använda för att interface'a sensorn till men en Capture-enhet är generellt en hårdvara-funktion som har en räknare som tickar iväg med en given hastighet (som kan ställas i vissa steg). När det sedan sker en ändring på en input-pinne (ställbar vilken flank eller båda flanker) låsas räknarens värde i ett register.

Vid att veta räknarens klocka-hastighet och subtrahera det-nya-värdet från det-förra-värdet får man tiden mellan trigningarna och kan då mäta tid ganska exakt OCH få en interrupt när en mätning är utförd av hårdvaran.

Men i detta fall skulle jag tro att det borde räcka med en extern Interrupt-funktion som sedan används för att trigga/om-trigga en timer som "sorterar" antal pulser och - vid time-out - startar A/D-omvandlaren.

Men jag håller med: det vore guld att se databladet på sensorn, jag ser nämligen några potentiella allvarliga problem med att tolka signalerna korrekt.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Hur bygger man ett OneWire bibliotek?

Inlägg av DanielM »

Icecap skrev:Nu vet jag ju inte vilken enhet du vill använda för att interface'a sensorn till men en Capture-enhet är generellt en hårdvara-funktion som har en räknare som tickar iväg med en given hastighet (som kan ställas i vissa steg). När det sedan sker en ändring på en input-pinne (ställbar vilken flank eller båda flanker) låsas räknarens värde i ett register.

Vid att veta räknarens klocka-hastighet och subtrahera det-nya-värdet från det-förra-värdet får man tiden mellan trigningarna och kan då mäta tid ganska exakt OCH få en interrupt när en mätning är utförd av hårdvaran.

Men i detta fall skulle jag tro att det borde räcka med en extern Interrupt-funktion som sedan används för att trigga/om-trigga en timer som "sorterar" antal pulser och - vid time-out - startar A/D-omvandlaren.
Alltså en digital ingång hos en mikroprocessor från schmitt-triggern så varje gång 0 går till 1 så blir det ett räkning inuti mikroprocessorn?
Men jag håller med: det vore guld att se databladet på sensorn, jag ser nämligen några potentiella allvarliga problem med att tolka signalerna korrekt.
Palle500 skrev:Är det din egna tolkning av signalen, eller från ett datablad?
Du kan inte tala om beteckning och en bild på givaren och vilken storhet den skall mäta?
Är det endast analog signal så kanske du samplar lite för fort och i verkligheten så duger ett RC-filter för att glätta signalen till rätt DC nivå?
Har bifogat databladet. Målet med mitt lilla projekt är att jag ska partikelräkna oljan hos min bil. Det är inte jag som äger partikelräknaren, men på fabriken där en polare jobbar så kan det kanske bli min inom snar framtid. :tumupp: Det finns ett stort utbud av dessa på lagret.

Ta en titt vid sidan 52.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
adent
Inlägg: 4094
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

Re: Hur bygger man ett OneWire bibliotek?

Inlägg av adent »

Ah dina Y, X och z är ju jääääääättelångsamma, då kan du nog fixa det med ett realtids-OS, iofs lite onödigt att slösa processorkraft på något som går att lösa i hårdvara men.

X och Y verkar vara 300ms och Z 3 sekunder.

Alla har vi våra gyllene hammare... Jag hade tagit en liten AVR och låtit den räkna pulser och sedan ADC:a värdet och lagra undan det snyggt och sen haft i2c, spi eller uart-interface ut från den lilla processorn. Beror ju lite på hur upptagen din "stora" processor är och hur mycket lågnivåaccess man har till den.
DanielM
Inlägg: 2166
Blev medlem: 5 september 2019, 14:19:58

Re: Hur bygger man ett OneWire bibliotek?

Inlägg av DanielM »

Jag har programmerat mycket i Arduino men jag tycker det känns lite billigt. Det var en som tipsade mig om STM32 Nucleo utvecklingskort och dom verkar riktigt enkla att komma igång med och robusta är dom också. Dock lika robusta som Arduino, men med fler valmöjligheter hos en STM32.

Jag kan annars programmera en Raspberry Pi med Python eller C++. Detta skulle vara intressant. Tänk typ en liten enkortsdator som kan läsa utav dessa analoga värden via en ADC och även digitala värdet från en schmitt-trigger?

Men bästa vore om allt var realtidsystem. Blir så robust och elegant. Skulle inte våga ha en Raspberry Pi ha i källaren min. Vad händer om 8 år om den har stått där? Nu ska jag inte ha något i källaren i 8 år. Jag hoppas att ni förstår att jag värderar robusta system högt. Hellre att det får kosta lite men att det fungerar hela tiden. :)

Men absolut. Jag ska lägga några tankar åt ett PC-baserat system. Men då kommer det garanterat bli en Raspberry Pi.
Användarvisningsbild
Icecap
Inlägg: 26105
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Hur bygger man ett OneWire bibliotek?

Inlägg av Icecap »

Även om mikroprocessorn (µC) i en Arduino inte är av nyaste modell är den ny-tillverkad och den fallerar inte efter t.ex. 11 år.

Men en µC med t.ex. BGA-montering är definitivt mer känslig för t.ex. termiska förändringar pga. den mindre flexibilitet i just BGA kontra måsvingor och liknande.

Rent elektronisk är de två system likvärdiga men mekanisk skulle jag anse att Arduinon kan ha fördel.
ToPNoTCH
Inlägg: 4847
Blev medlem: 21 december 2009, 17:59:48

Re: Hur bygger man ett OneWire bibliotek?

Inlägg av ToPNoTCH »

adent skrev:då kan du nog fixa det med ett realtids-OS, iofs lite onödigt att slösa processorkraft på något som går att lösa i hårdvara men.
Utveckla gärna detta påstående.
Vad gör han med CPU cyklerna om han inte kör RTOS.

Ett RTOS som är Event driven genererar "normalt" färre CPU cykler och drar mindre ström, enligt min uppfattning.
Skriv svar