Hur bygger man ett OneWire bibliotek?
Hur bygger man ett OneWire bibliotek?
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: 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
Med vänliga hälsningar
Daniel
Sammanfattningsvis så kan man säga så här: 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
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.
Re: Hur bygger man ett OneWire bibliotek?
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.
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.
Re: Hur bygger man ett OneWire bibliotek?
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.
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.
Re: Hur bygger man ett OneWire bibliotek?
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...
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...
Re: Hur bygger man ett OneWire bibliotek?
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.
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.
Re: Hur bygger man ett OneWire bibliotek?
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%.
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.
Re: Hur bygger man ett OneWire bibliotek?
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.
Re: Hur bygger man ett OneWire bibliotek?
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 Det betyder att man ska läsa signalen
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?
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 Det betyder att man ska läsa signalen
Kod: Markera allt
10X1010X101010X10101010X
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: Hur bygger man ett OneWire bibliotek?
Ä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å?
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å?
Re: Hur bygger man ett OneWire bibliotek?
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.
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.
Re: Hur bygger man ett OneWire bibliotek?
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?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.
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.
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. Det finns ett stort utbud av dessa på lagret.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å?
Ta en titt vid sidan 52.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: Hur bygger man ett OneWire bibliotek?
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.
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.
Re: Hur bygger man ett OneWire bibliotek?
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.
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.
Re: Hur bygger man ett OneWire bibliotek?
Ä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.
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.
Re: Hur bygger man ett OneWire bibliotek?
Utveckla gärna detta påstående.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.
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.