"spela in pulståg" och utvärdera?

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
ToPNoTCH
Inlägg: 5147
Blev medlem: 21 december 2009, 17:59:48

Re: "spela in pulståg" och utvärdera?

Inlägg av ToPNoTCH »

Det är alltså ingen klocka inblandad ?

Det är misstänkt likt 1-wire.
Christian
Inlägg: 86
Blev medlem: 3 november 2003, 22:54:49

Re: "spela in pulståg" och utvärdera?

Inlägg av Christian »

Såhär ser pulståget ut (inspelat med ljudkort).. Nu vill jag behandla datan med en PIC.. Jag lyckades få med början till en ny sekvens i pulståget längst till höger så att man kan se vad som händer "mellan" informationen.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: "spela in pulståg" och utvärdera?

Inlägg av sodjan »

Ja, det där var inte lätt att tolka.
Och bilden är svårläst, aldeles för låg upplösning i de intressanta delarna.
Har du ingen specifikation/dokumentation över signalen ?
Var kommer den ifrån ?

> Följt av 4 bitar vindriktning och 12 bitar vindhastighet.

Hur vet du det ?
Christian
Inlägg: 86
Blev medlem: 3 november 2003, 22:54:49

Re: "spela in pulståg" och utvärdera?

Inlägg av Christian »

Okej här är början på signalen, men det verkar komma någon form av störningar innan detta som man kan se i den förra bilden. Detta grundar jag på att nivån inte dippar lika långt ner som en nolla gör i övriga delen av pulståget. Har inte någon officiell specifikation över protokollet utan har fått det beskrivet av en annan person som sysslat med en likadan vindsensor. Det är en sensor av typen som följer med väderstationer. Fabrikatet är Lacrosse och vindsensorn heter Tx-12. Det påstods att signalen skulle börja med en startsekvens fem bitar 11011, följt av 4 bitar riktning följt av 12 bitar hastighet. Resterande bitar skulle vara en repetition av denna datan. Totalt 37 bitar. Signalen skall även inverteras. Nu är bara frågan hur man lättast behandlar datan med en mikroprossessor?
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46954
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: "spela in pulståg" och utvärdera?

Inlägg av TomasL »

Hittar den här informationen om Lacrosse stationer,
The serial protocol is as follows-
a.. Approx 1.2mS bit time >> 833 bps
b.. inverted data - 0V = logic 1, +3.3V = logic 0
c.. one long (20 bit) stream with start frame and end checksum
d.. issued every 2 seconds while /CE is true (held at 0V)
e.. 00100bbbbvvvvvvvvvvvvcccc
f.. 00100 start frame
g.. bbbb bearing, lsb first, 0-15 cardinal points from North, clockwise
rotation, 0=N, 1=NNE, etc
h.. vvvvvvvvvvvv velocity, lsb first, 0-4096, turbine counts over previous 2
second period, non accumulating
i.. velocity count appears somewhat nonlinear- the turbine is quite sensitive
to small gusts below 5 knots that would not move a conventional cup anemometer,
but less so at higher speeds
j.. knots = velocity/8 seems to be a reasonable approximation across typical
wind speed ranges
k.. cccc checksum, appers to be simple XOR of the 4 bbbb, vvvv,vvvv,vvvv
nibbles
Hope this is of value,
Från Yahoo groups http://tech.groups.yahoo.com/group/Lacr ... ssage/1672
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: "spela in pulståg" och utvärdera?

Inlägg av jesse »

Det är ju en asynkron signal , så man behöver räkna tiden och sampla i rätt ögonblick.
Eftersom det är 20 bitar så kan det var lämpligt att korrigera tiden vid varje flank, dvs. trigga om.
Signalen i pauserna verkar vara en "Hi-Z" utgång, dvs. öppen. Så du bör lägga ett pull-up motstånd där för att få en ren etta ut. Annars riskerar du få slumpartad data in.

Då vet du att om det varit kontinuerligt "etta" i över 20 perioder (x 1.2 ms) så kan du vara beredd och vänta på startsignalen - ett byte till "nolla".

Vid varje flank räknar du tiden och samplar vid 0,6 - 1,8 - 3,0 - 4,2 - 5,4 ms och läser in bitarna. Om en ny flank upptäcks i mellan nollas timern så att eventuell drift i tiden korrigeras. Du börjar alltså om 0.6 ms efter varje flank.
När du är klar har du fått in en fin rad med 20 bitar.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Christian
Inlägg: 86
Blev medlem: 3 november 2003, 22:54:49

Re: "spela in pulståg" och utvärdera?

Inlägg av Christian »

Tack för alla svar! Jag undrade just vad signalen höll på med mellan skickandet av informationen (Hi-Z).

Med andra ord så behöver jag alltså sätta upp en interrupt funktion som "lyssnar efter" flanker uppåtgående och nedåtgående, och sen ha en timer som tickar.

Men hur samplar man egentligen en bit? Jag hade ju tänkt mig en bit-array där jag bara lägger in värdet på den samplade biten med avseende på tillståndet på en pinne vid en viss tidpunkt.
Men jag förmodar att det inte är riktigt så enkelt..? Bör jag ha tex en char variabel som jag gör en logisk operation på med avseende på ett nytt bitnummer i variabeln, och sedan när jag nått över 8 bitar fortsätta att manipulera bitarna i en ny innehållsvariabel? Hoppas man förstår vad jag menar..
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: "spela in pulståg" och utvärdera?

Inlägg av jesse »

När du väl hittat en flank så vet du ju egentligen redan vilket värde biten kommer att ha, men om du vill göra det "snyggt" så mäter du alltså 0.6 ms efter flanken för att sedan läsa in biten.

timingen gör du t.ex. med en timer som du nollställer vid flanken och sedan har du satt ett värde som motsvarar 0.60 ms och som t.ex. genererar ett interrupt eller så kollar du en flagga som sätts av timern.

Sedan läser du av biten i vanlig ordning.

Själv hade jag lagt in biten längst ner i en 32-bitars variabel (du programmerar i C antar jag?) och flyttat upp de andra bitarna ett steg:

Kod: Markera allt

uint32_t resultat = 0;


// här inträffar tidpunkten då en bit ska läsas in

bit = PINB & (1 << PB3); // läser in bit
resultat <<= 1; // flytta alla bitar et steg upp
if (bit) resultat |= 1; // lägg till etta längst ner
På så vis får du alla 32 bitarna snyggt packade i en enda variabel.
labmaster
Inlägg: 2919
Blev medlem: 5 april 2011, 01:10:25

Re: "spela in pulståg" och utvärdera?

Inlägg av labmaster »

Litet förtydligande bra!

Du startar alltså en klocka på negativ flank och låter klocka ticka 60 mS sedan läser du av och startar klockan igen, väntar 60 mS och läser. Detta gör du fem gånger och kontrollerar ifall det blir 001100 som är startsekvensen. Om det är 1 vid andra avläsningen så har du fått en falsk flank eller så har den tappat takten. Därför tror jag att det är bäst att bygga en så kallad "state machine" som bara går ett steg fram ifall den får vad som förväntas. I annat fall hoppar den tillbaka och väntar på ny negativ flank. Om programmet kommer till slutet på sekvensen så vet du att den har tagit emot en startsekvens och då kommer första biten i meddelandet starta 60 mS efter sista biten i startsekvensen. Det vill säga du fortsätter att vänta 60 mS med hjälp av timern innan du läser. Varje gång det kommer en flank justerar du timern. Om du ritar ett pulsdiagram på detta så ser du enkelt hur det funkar. Rita gärna en markör där du läser av bitarna eller ännu hellre ett diagram på timern där pulsen går från hög till låg i läsögonblicket. På så sätt ser du enkelt vad som händer ifall timern driver åt något håll. Du ser också vad det innebär att justera klockan vid en flank på insignalen.

By the way, vad använder du för program att rita pulstågen, det såg ju tjusigt ut.

Blev det tydligare? :)
Christian
Inlägg: 86
Blev medlem: 3 november 2003, 22:54:49

Re: "spela in pulståg" och utvärdera?

Inlägg av Christian »

Japp blir tydligare och tydligare =)
Men det känns ju som att det som är startsekvensen skulle kunna dyka upp i datainnehållet om man har otur, då är detta inte ett villkor för att ta emot data längre.. Så då lär det ju vara säkrare att lyssna efter gappet mellan informationssekvenserna (20 perioder), för att sedan förvänta sig en startsekvens. Jag skulle ju kunna låta programmet detektera 20 ettor i rad, lagra de första bitarna som kommer med en negativ flank, dessa skulle kunna lagras i min 32 bitars variabel med uppflytt osv och kolla efter fem stycken om det motsvarar startsekvensen. Om så är fallet så fyller jag bara på med bitar i vanlig ordning och tills jag har informationen jag behöver.

Funderar på om jag skulle köra följande som test och jobba vidare på det när det fungerar:
Ett interrupt triggas när en flank kommer, jag läser av värdet efter 0.6ms, om det är en etta skickar jag asc11: '1' till com-porten på en dator, '0' om det är en nolla. Fortsätter så efter 0.6ms om inte en ny flank kommit (i så fall startar jag om timern) så kommer signalen att visas i hyperterminalen som asc11 tecken. Detta kan jag sen jobba vidare på för då vet ajg att min timing och triggning fungerar. Låter vettigt? Känns som det är svårt att debugga koden annars.

Jag har inte ritat pulserna manuellt utan det är det riktiga pulståget som kommer från anemometern inspelat från ljudkortet och programmet heter Audacity.
Användarvisningsbild
Icecap
Inlägg: 26645
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: "spela in pulståg" och utvärdera?

Inlägg av Icecap »

Jag hade faktisk använd en Capture-enhet och fångad varje flank som kommer. Självklart läser man nivån vid en sådan interrupt, då kan man enkelt avgöra bit-nivå, längd och filtrera bort störningar.
labmaster
Inlägg: 2919
Blev medlem: 5 april 2011, 01:10:25

Re: "spela in pulståg" och utvärdera?

Inlägg av labmaster »

Tack för tipset om programmet.

Den här typen av asyncront protokoll är inget ovanligt och det dyker upp i många sammanhang. Du skall alltid starta en timer vid första negativa flanken och börja att läsa de första fem bitarna. Om mönstret 001100 dyker upp så vet du att det är starten på pulståget. Det kan naturligtvis dyka upp samma sekvens, 001100 mitt i meddelandet men då kör du inte programkoden som lyssnar efter startsekvensen så det är inget problem. Det vill säga, har du väl fått 001100 så vet du att det kommer 20 bitar data inklusive checksumma. Om man vill vara på den säkra sidan så kan man synkronisera timern som räknar 60 mS vid en flank positiv flank men denna interrupt skall inte starta sökningen efter 001100 så länge du inte har läst alla bitar i meddelandet.

Sök på nätet efter state machine, jag tror du kommer att hitta beskrivningar på hur en sådan implementeras.
Nerre
Inlägg: 27217
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: "spela in pulståg" och utvärdera?

Inlägg av Nerre »

State machine-delen behöver man väl egentligen bara för att kolla efter startsekvensen? När man fått en startsekvens så läser man ju in resterande bitar utan att kolla dem.

Sen kan det ju hända att man börjar "lyssna" mitt i ett paket, då kan man få en falsk triggning om sekvensen förekommer mitt i paketet, men det gör inget eftersom man sen använder checksumman för att avgöra om paketet blev rätt. Får man en falsk triggning får man med största sannolikhet en felaktig checksumma och kan kasta paketet.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: "spela in pulståg" och utvärdera?

Inlägg av jesse »

> Du skall alltid starta en timer vid första negativa flanken

Man måste ju kunna avgöra vad som är "första". I det här fallet är det ju rejäla pauser mellan pulstågen, vilket är en bra indikation på att "nu ska jag vänta på första negativa flanken".

Jag skulle använt pausen som "startindikator" och sedan läst in 20 bitar rakt av efter första "nollan". Sedan kan jag kolla om de fem första bitarna stämmer.
labmaster
Inlägg: 2919
Blev medlem: 5 april 2011, 01:10:25

Re: "spela in pulståg" och utvärdera?

Inlägg av labmaster »

Det är inte svårt att avgöra vilken flank som är den första. Det är den som först dyker upp helt enkelt :). Svårare än så var det inte.

Det man sedan har att avgöra är om den första flanken är början på pulståget och det vet man inte innan mönstret 001100 har dykt upp. Om det gör det så är det bara att hoppa till nästa steg och läsa in bitarna för "b". Om istället 011100 dyker på så är det bara att hoppa tillbaka och vänta på nästa flank redan på bit nummer två eftersom det var en etta och maskinen förväntade sig en nolla.

Den som är snabb ser genast ett orosmåln. Det skulle ju kunna dyka upp 001100 mitt i meddelandet och visst är det så. Är maskinen inte i synk så börjar den läsa fel data men som tidigare nämnts i denna tråd hanteras detta genom att checksumman blir fel och således kan paketet kastas som garbage. Då är det bara att sätta maskinen i läge noll och vänta på nästa negativa flank.

Asynkrona seriella pulståg är alltid lättare att hantera med en state machine i mjukvaran. Men man väljer själv den väg som känns bäst. Har man väl kommit på hur en state machine är konstruerad så brukar det vara det mest naturliga valet i asynkrona processer. För mig som varit med i svängen med maskinnära programutveckling i över 20 år blir valet enkelt. Andra får göra på sitt sätt.
Skriv svar