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
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.
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
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.
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
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
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.