Forum: FPGA, VHDL & Co. zwei Signalpulse ordnen


von TM F. (p_richner)


Angehängte Dateien:

Lesenswert?

Hallo zusammen

Ich habe ein Signal, in dem regelmässig zwei Signalimpulse vorkommen. 
Die Zeitdauer zwischen Impuls eins(t1) zu Impuls zwei ist anders als 
Zeitdauer Impuls zwei(t2) zu Impuls eins(siehe Anhang). Ich muss per 
Software herausfinden, welcher Impuls zuerst kommt. Wie kann ich das 
machen?? Es können auch Beispiele in C sein.
Ich programmiere einen XMOS XS1-L1-128. Als Programmierumgebung benütze 
ich xTIME composer studio. Hier mein Code, wie weit ich bisher gekommen 
bin:
1
int count1=0,count2=0,flag=0;
2
3
// Synchronisation auf erster Signalimpuls
4
5
    signal_in when pinseq(1) :> void; 
6
    signal_in when pinseq(0) :> void;
7
8
// Warten auf positive Flanke des Signals, solange
9
// count1 hochzählen, um Zeitdauer zu erkennen
10
11
    while(flag ==0)
12
    {
13
     par{
14
            {
15
                signal_in when pinseq(1) :> void;
16
                flag=1;
17
            }
18
            count1++;
19
        }
20
    }
21
22
// Auf negative Flanke des Signals warten
23
24
    signal_in when pinseq(0) :> void;
25
26
// Warten auf positive Flanke des Signals, solange
27
// count2 hochzählen, um Zeitdauer zu erkennen
28
29
    while(flag ==1)
30
        {
31
         par{
32
                {
33
                    signal_in when pinseq(1) :> void;
34
                    flag=0;
35
                }
36
                count2++;
37
            }
38
        }



Danke für die Hilfe.

freundlich grüsst
p_richner

von Schlumpf (Gast)


Lesenswert?

Philipp Richner schrieb:
> Ich muss per
> Software herausfinden, welcher Impuls zuerst kommt.

hmm, da stellt sich mir die Frage, wie man bei einer fortlaufenden 
Pulsfolge den Begriff "zuerst" überhaupt definiert.

von Klakx (Gast)


Lesenswert?

Wie wärs mit counter hochzählen lassen.

pseudo-code:

#anfang
start counter

when rising_edge
val1 = counter

when rising_edge
val2 = counter

when rising_edge
val3 = counter


t1 = val2-val1
t2 = val3-val2

when t1 > t2 dann "größerer abstand zuerst" else "kleiner abstand"
goto #anfang


natürlich ist hier das problem, das du das Programm nicht in der Mitte 
der Pulse starten solltest. Ansonsten brauchst du noch eine 
Timeoutbedingung um das Programm neuzustarten bzw. im richtigen Moment 
zu starten.

von Duke Scarring (Gast)


Lesenswert?

Philipp Richner schrieb:
> Ich habe ein Signal, in dem regelmässig zwei Signalimpulse vorkommen.
Verräts Du uns, wo das Signal herkommt?

Beim durchlesen Deiner Problembeschreibung habe ich den Eindruck 
gewonnen, daß Du eine einfache Sache kompliziert lösen willst.

Duke

von TM F. (p_richner)


Lesenswert?

Das Signal kommt von einer Telefonanlage als Abfrage, ob an der Leitung 
ein Gerät angeschlossen ist. Das gesuchte Signal-bit ist das links von 
t1, obige Skizze.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Wie erkennt man den "Anfang"? Gibt es im Signalverlauf eine längere 
Pause und danach einen "Wiederanfang"?

von TM F. (p_richner)


Lesenswert?

Die Signaldauer t2 ist länger als t1.

von Gustl B. (-gb-)


Lesenswert?

Na dann

Wenn fallende_Flanke dann Zähler <= 0;

Wenn steigende_Flanke dann
 Wenn Zähler > Schwellwert dann t2 <= 1;
 Andernfalls
 t1 <= 1
 Ende;
Ende;

Du musst Dir eben einen Schwellwert in Zählereinheiten überlegen der 
zwischen t1 und t2 unterscheidet. Also wenn du Takte zählst dann kannst 
du so einen Schwellwert für die Zeit vergleichen.
An der nächsten steigenden Flanke siehst du dann immer am Zähler ob das 
bis dahin jetzt ein t1 oder ein t2 war.

Du kannst auch genauere Fenster setzen und dazwischen einen Bereich 
nehmen in dem neue Impulse weder als t1 noch als t2 gezählt werden weil 
unklar.

Und bitte nicht das Signal von außen als Takt verwenden, also da nicht 
direkt mit risig_edge rangehen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Philipp Richner schrieb:
> Die Signaldauer t2 ist länger als t1.
Klar, sehe ich. Meine Frage war die nach dem Anfang.
> Ich habe ein Signal, in dem regelmässig zwei Signalimpulse vorkommen
Und welcher ist jetzt "der Erste", wenn die beiden immer hintereinander 
kommen. Oder heißt hier "regelmässig" etwas anderes?

> Ich muss per Software herausfinden, welcher Impuls zuerst kommt.
Zeig mal:
1
       ___   ___     ___   ___     ___   ___
2
   ..._   ___   _____   ___   _____   ___   __...

von TM F. (p_richner)


Angehängte Dateien:

Lesenswert?

@Gustl
Ich denke, dass mit der Möglichkeit von Gustl das Problem zu lösen ist.
Danke für die Antwort.

@Lothar
Ich suche das umrandete bit im Anhang.

Freundlich grüsst
p_richner

von Schlumpf (Gast)


Lesenswert?

Philipp Richner schrieb:
> @Lothar
> Ich suche das umrandete bit im Anhang.

Du hast aber geschrieben:

Philipp Richner schrieb:
> Ich muss per
> Software herausfinden, welcher Impuls zuerst kommt.

Und da ist ein himmelweiter Unterschied..

Ein einer wiederkehrenden Signalfolge gibt es keinen Anfang und Ende.
Daher kann man auch nicht rausfinden, welches Bit "zuerst" kommt, wenn 
es keinen Zustand gibt, der eindeutig als Start identifiziert werden 
kann.

Wenn du aber den Puls finden willst, der nach der langen Pause kommt, 
dann ist das was Anderes. Du kannst z.B. das Signal abtasten und die 
steigende Flanke erkennen. Mit dieser steigenden Flanke startest du 
einen Zähler, der den Systemtakt zählt.
Mit jeder steigenden Flanke des Signals wird der Zähler zurückgesetzt.
Hat der Zähler einen Wert erreicht, der der Dauer einer Pulsbreite + t2 
entspricht, und erkennst du dann eine wieder einen Impuls auf dem 
Signal, befindest du dich an der steigenden Flanke des gesuchten Impuls.
Sinnvollerweise legt man sich nicht auf einen exakten Zählerwert fest, 
sondern auf einen Bereich, den man noch als "gültig" interpretiert.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.