Forum: Mikrocontroller und Digitale Elektronik Zeitmessung der Flanke am Eingang mit C


von Bastian B. (hobby-pic)


Lesenswert?

Hallo,

ich möchte die Länge der Zeit messen, die eine Flanke an einem Eingang 
meines PICs verweilt.

Kann mir da jemand einen Tipp geben?

Ich programmiere in C (MPLAB) und komme mit meinen Experimenten nicht 
weiter.

Danke,

Basti

von Düsendieb (Gast)


Lesenswert?

Bastian Brink schrieb:
> Kann mir da jemand einen Tipp geben?

Zeig mal, was Du schon geschrieben hast und beschreibe was daran nicht 
funktioniert

von Peter D. (peda)


Lesenswert?

Bastian Brink schrieb:
> ich möchte die Länge der Zeit messen, die eine Flanke an einem Eingang
> meines PICs verweilt.

Eine Flanke hat idealer Weise die Dauer 0.
Praktisch wird sie kürzer als ein CPU-Takt sein, also mit dem MC nicht 
meßbar.

Man muß also erstmal technisch richtig beschreiben, was man messen will.
Und dann sollten die benötigten Meßparamter (Bereich, Auflösung, 
Genauigkeit) angegeben sein.


Peter

von (prx) A. K. (prx)


Lesenswert?

Bastian Brink schrieb:

> ich möchte die Länge der Zeit messen, die eine Flanke an einem Eingang
> meines PICs verweilt.

Flanke = Veränderung.
Verweilen = keine Veränderung.

Öhm... Was also wolltest du wirklich ausdrücken?

von Bastian B. (hobby-pic)


Lesenswert?

Hi!

Danke erstmal.

Mein Ziel ist es, eine serielle Datenübertragung auf zu bauen.

Ich möchte einfach ein paar Bits von einem µC zu einem Anderen mit nur 
einer Leitung übertragen.

Hierzu ist mein Ansatz die Länge des Startbits zu messen um beide µC zu 
synchronisieren.

Ich vermute aber, dass es nicht ganz sinnig ist wie ich bisher 
vorgegangen bin, aber hier ein Teil des Sender-Programms:
1
  //Ausgabe des Arrays
2
  //Startbit
3
  OUT1=1;
4
  Delay10KTCYx(cyclus);
5
  OUT1=0;
6
  Delay10KTCYx(cyclus);
7
  for (j=1; j<=7; j++)
8
  {
9
    if (ein[j]==1)
10
          {
11
                OUT1=1;
12
                pari=pari+1;
13
                Delay10KTCYx(cyclus);
14
          }
15
    else
16
    {
17
      OUT1=0;
18
      Delay10KTCYx(cyclus);
19
    }
20
  }
21
  //Parity    
22
  pari=pari%2;
23
  OUT1=pari;
24
  Delay10KTCYx(cyclus);
25
  //Stoppbit
26
  OUT1=1;
27
  Delay10KTCYx(cyclus);
28
  OUT1=0;

Jetzt gerade lese ich mich in das TIMER0 Module ein. Ist es sinnvoll in 
die Richtung zu gehen um die Bits zu empfangen?

Vielen Dank,

Basti

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


Lesenswert?

Bastian Brink schrieb:
> ich möchte die Länge der Zeit messen, die eine Flanke an einem Eingang
> meines PICs verweilt.

Bastian Brink schrieb:
> Mein Ziel ist es, eine serielle Datenübertragung auf zu bauen.
> Ich möchte einfach ein paar Bits von einem µC zu einem Anderen mit nur
> einer Leitung übertragen.
Immer diese Salamitaktik... Zum Ko/4§~...

Warum schreibst du nicht gleich, was du willst und DANN wie du dir das 
vorstellen könntest...
So bleiben immer noch Fragen:
Willst du auf der 1 Leitung in BEIDE Richtungen übertragen oder nur von 
einem uC ZUM Anderen? Warum nimmst du nicht eine "übliche" serielle 
Schnittstelle? Und vor allem: warum brauchst du 2 uCs?

Bastian Brink schrieb:
> Hierzu ist mein Ansatz die Länge des Startbits zu messen um beide µC zu
> synchronisieren.
Und weiter?

von Peter D. (peda)


Lesenswert?

Bastian Brink schrieb:
> Hierzu ist mein Ansatz die Länge des Startbits zu messen um beide µC zu
> synchronisieren.

Und wie weißt Du, daß das Starbit zuende ist?
Nimm besser eine Code mit Bitsynchronisation, wie er bei Fernbedienungen 
angewendet wird.


Peter

von Bastian B. (hobby-pic)


Lesenswert?

Hey!

Ich fang nochmal von vorne an.

Ich möchte einen binären Code
- 7 Bit
- eine Leitung
- Einweg
übertragen.

Die Programmiersprache ist C.

Mein Ansatz ist:

Sender: Startbit - Pause (Startbitlänge) - 7 Bit - Paritybit - Stoppbit

Empfänger: Messung der Länge des Startbits - Pause - 7 Bits speichern - 
Paritybitvergleich - Stoppbit abwarten - ok

Die Übertragung läuft über einen gewöhnliche I/O der µC (muss aber 
nicht)

Kann man das grundsätzlich so machen oder gibt es da vielleicht einen 
besseren Ansatz.

Vielen Dank

p.s. Ihr habt's vielleicht gemerkt, aber ich bin totaler Anfänger.

von Karl H. (kbuchegg)


Lesenswert?

Du erzeugst dir doch hier senderseitig einen Puls

  //Ausgabe des Arrays
  //Startbit
  OUT1=1;
  Delay10KTCYx(cyclus);
  OUT1=0;
  Delay10KTCYx(cyclus);

wo liegt das Problem?

Der Empfänger wartet bis die Leitung von 0 auf 1 wechselt.
Danach startet er eine Uhr
und wenn die Leitung wieder von 1 auf 0 wechselt, wird die Uhr gestoppt.

Damit weißt du, wie lange das Startbit in Einheiten des Empfängers 
gedauert hat.

Inwieweit dir da jetzt die PIC Hardware unter die Arme greifen kann, 
kann ich nicht sagen. Dazu versteh och zuwenig von PICs. Aber Timer 
klingt ja erst mal nicht so schlecht.

von Karl H. (kbuchegg)


Lesenswert?

> p.s. Ihr habt's vielleicht gemerkt, aber ich bin totaler Anfänger.

Dann wärs vielleicht vernünftig, erst mal im Web nach einer UART für 
deinen PIC zu suchen. Irgendwer wird doch sowas schon mal geschrieben 
haben.

von Bastian B. (hobby-pic)


Lesenswert?

Es gibt einen EUSART.

Genau das richtige für einen Anfänger. Ich wälz dann mal das Datenblatt.

Wenn jemand einen guten Link hat...

Trotzdem Danke erstmal

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.