Forum: Mikrocontroller und Digitale Elektronik PIC Empfänger auswerten


von Georg D. (georgdonner)


Lesenswert?

Hallo,
ich weiß das dieses Thema schon öfters behandelt wurde, aber ich habe 
trotzdem eine Frage.

Für mein elektrisches Einziehfahrwerk muss ich 3 Servosignale vom
Empfänger (Jeti Duplex R10) auswerten.

Hier die 2 Möglichkeiten, die ich mir überlegt habe:

1. Servosignale an Pins legen, die bei einem Signalwechsel einen
   Interrupt auslösen und die Zeit des Impulses mit einem Timer stoppen.
2. Capture-Modul verwenden => Problem: Das Modul kann entweder auf die
   steigende Flanke oder auf die fallende Flanke triggern. Kann man
   die Flanke (fallend oder steigend)während das Modul arbeitet
   umstellen oder führt das zu Problemen?

Welche Methode wäre besser (falls die 2.Möglichkeit überhaupt 
funktioniert)?

Falls jemand eine bessere Lösung parat hat würde ich mich sehr freuen,
wenn er mir diese erklären könnte.

Als Microcontroller möchte ich einen PIC18f67K22 verwenden.

lg
Georg

von Max H. (hartl192)


Lesenswert?

Ich würde dass CCP verwenden und das Bit für die Flanke bei jedem 
Capture interrupt toggeln. Bei jeder fallenden Flanke musst du die 
vergangene Zeit ausrechnen.

Die IRS würde dann ca. so aussehen

if(PIR2bits.CCP2IF)
{
  PIR2bits.CCP2IF=0;    // Clear CCP2 Interrupt Flag

  Timer=CCPR2;
  if(flanke_bit==fallen)
  {
    servo=timer_new-timer_old;
  }
  timer_old=timer_new;
  flanke_bit=~flanke_bit;
}
Wenn du einen 16bit Timer hast müssen die variablen timer_new und 
timer_old genau 16bit lang sein.

von chris (Gast)


Lesenswert?

Ich wuerde dir von Interrupts abraten. Was brauchst du genau ?

von Max H. (hartl192)


Lesenswert?

M. H. schrieb:
> if(flanke_bit==fallen)
Das würde so aussehen:
  if(CCP2CONbits.CCP2M0==0)   //Fallende Flanke

M. H. schrieb:
> flanke_bit=~flanke_bit;
Und das so:
  CCP2CONbits.CCP2M0=~CP2CONbits.CCP2M0;


chris schrieb:
> Ich wuerde dir von Interrupts abraten. Was brauchst du genau ?
Was ist an einem Interrupt falsch?

Da dein PIC 7 CCP-Module hat kannst du es dir leicht machen und für 
jedes Signal ein CCP verwenden, wenn du nicht mehr als 4 für irgendetwas 
Anderes brauchst. Und bei 6 kurzen Interrupts in 20ms geht wenig 
Rechenzeit für die Auswertung der Signale drauf.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

M. H. schrieb:
> Ich würde dass CCP verwenden und das Bit für die Flanke bei jedem
> Capture interrupt toggeln. Bei jeder fallenden Flanke musst du die
> vergangene Zeit ausrechnen.

Das gilt aber nur, wenn du das Servosummensignal anzapfst.

Wenn du schon die ausgewerteten SIgnale vom Empfänger hast, muss man die 
Zeitdifferenz von der steigenden zur fallenden Flanke auswerten.

So gesehen hat der TO schon recht, wenn er fragt, ob man die 
Flankenrichtung in der ISR umstellen darf.
Beim PIC weiß ich es nicht, ich kann mir aber nicht vorstellen, dass das 
ein Problem wäre.

von Max H. (hartl192)


Lesenswert?

Karl Heinz schrieb:
> Das gilt aber nur, wenn du das Servosummensignal anzapfst
Nein. Wenn du meinen Quellcode angesehen hättest, hättest du gesehen, 
dass ich bei beiden Flanken ein Interrupt habe und die Zeit seit dem 
Letzten Interrupt nur bei der fallenden auswerte.

M. H. schrieb:
> Ich würde dass CCP verwenden und das Bit für die Flanke bei jedem
> Capture interrupt toggeln. Bei jeder fallenden Flanke musst du die
> vergangene Zeit ausrechnen.
Vllt. hätte ich "die vergangene Zeit seit dem letzten Interrupt" 
schreiben sollen.

Beim Summensignal muss man nur auf die steigende flanke schauen und bei 
jeder Flanke die Differenz ausrechnen. Ist die Differenz größer 2ms 
beginnt das Signal von vorne.

Karl Heinz schrieb:
> Beim PIC weiß ich es nicht, ich kann mir aber nicht vorstellen, dass das
> ein Problem wäre.
Ist kein Problem, habe ich eimal so gemacht.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

M. H. schrieb:
> Karl Heinz schrieb:
>> Das gilt aber nur, wenn du das Servosummensignal anzapfst
> Nein. Wenn du meinen Quellcode angesehen hättest, hättest du gesehen,
> dass ich bei beiden Flanken ein Interrupt habe und die Zeit seit dem
> Letzten Interrupt nur bei der fallenden auswerte.

Ah. Jetzt hab ich das entscheidende Wort in der Beschreibung gesehen: " 
bei jedem Capture interrupt"

Ja, dann ist das ok. Ich seh nur in deinem Code nicht, wie du 
zuverlässig unterscheidest, ob der Interrupt durch die fallende oder die 
steigende Flanke ausgelöst wurde. Du hast da anscheinend ein 
Software-Flag welches du umschaltest und vertraust darauf, dass das 
schon stimmen wird. Würde ich nicht tun. In der ISR hat man jede Menge 
Zeit, so dass ich den Capture dezidiert auf die richtige Flanke 
umstellen würde. Alternativ könnte man auch ganz einfach am Pin selber 
nachsehen ob er 0 oder 1 ist.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

edit:

Aber auf jeden Fall mit dem Capture Modul und Interrupts. Genau dafür 
hat man sie ja. Von daher kann ich diesem Einwand
Beitrag "Re: PIC Empfänger auswerten"
nichts abgewinnen. Zumal einem das RC-Protokoll nun wirklich mehr als 
genügend Zeit gibt um die möglichst exakt vermessenen Pulse dann auch 
auszuwerten.

: Bearbeitet durch User
von Max H. (hartl192)


Lesenswert?

Karl Heinz schrieb:
> Ich seh nur in deinem Code nicht, wie du
> zuverlässig unterscheidest

Ich habe "flanke_bit==fallen" geschrieben, weil ich nicht gewusst habe 
wie das bit heißt, habe es dann aber nachgeschlagen und konnte es nicht 
mehr ändern da ich zu spät war.

Mit dem bit CCP2CONbits.CCP2M0 kann man, wen der Rest des CCP2CON 
richtig eingestellt ist auf welche Flanke das Capture-Modul reagiert.

M. H. schrieb:
> M. H. schrieb:
>> if(flanke_bit==fallen)
> Das würde so aussehen:
>   if(CCP2CONbits.CCP2M0==0)   //Fallende Flanke
>
> M. H. schrieb:
>> flanke_bit=~flanke_bit;
> Und das so:
>   CCP2CONbits.CCP2M0=~CP2CONbits.CCP2M0;

: Bearbeitet durch User
von Georg D. (georgdonner)


Angehängte Dateien:

Lesenswert?

Erst einmal Danke für die hilfreichen Antworten.
Allerdings habe ich noch etwas im Datenblatt gefunden, bei dem ich mir 
nicht sicher bin was es heißen soll.

Ich habe mir das Control-Register des Enhanced-CCP-Moduls angesehen und 
dabei festgestellt, dass man einen "Capture Mode (0011)" (rot markiert)
einstellen kann.
Es steht nicht dabei auf welche Flanke in diesem Mode getriggert wird.
Auch in der Beschreibung des ECCP steht nichts.

Beim normalen CCP steht beim Control-Register bei 0011 "Reserved".

Ich hoffe Ihr könnt mir helfen oder soll ich Microchip kontaktieren?

Anhang 1: Control-Register des ECCP, rot Markierung beachten, Mode 0011
Anhang 2: Beschreibung des ECCP (in der Beschreibung ist der Mode 0011
          nicht vorhanden)
Anhang 3: Control-Register normales CCP (Mode 0011 ist Reserved)

Nochmals vielen Dank für eure Hilfe.

lg
Georg

von Max H. (hartl192)


Lesenswert?

Ich würde einfach 0100 und 0101 verwenden und das bit null bei jedem 
Interrupt toggeln und den Zustand 0011 ignorieren.

: Bearbeitet durch User
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.