Hallo zusammen, ich plane aktuell einen Geschwindigkeitsmesser basierend auf zwei Lichtschranken und einem PIC18F44550 der per USB an einem PC hängt. Auf dem PC soll die gemessene Geschwindigkeit dargestellt werden. Die USB Kommunikation ist soweit kein Problem. Für die Lichtschranken verwende ich eine IR-Photodiode und eine IR-LED, auch das hat bisher in einer einfachen Schalter mit OP-AMP auf einem Steckboard gut geklappt. In meiner Frage hier geht es mir nur darum wie ihr mir empfehlen würdet den Anschluss und die Programmierung des PIC vorzunehmen. Meine Erfahrungen mit Mikrokontrollern sind noch sehr grundlegender Art, daher habe ich mir das Manual von dem PIC durchgelesen und mir folgendes überlget: Ich möchte die beiden integrierten Comparatoren die im PIC vorhanden sind (CCP1 und CCP2) nutzen um auszuwerten ob eine der beiden Lichtschranken unterbrochen wurde. Die erste Lichtschranke/Photodiode würde an CCP2 hängen. Ich würde den Timer3 (16 bit counter) resetten (mittels Special Event Trigger von CCP2) sobald die erste Schranke unterbrochen wurde. Die zweite Schranke würde ich an CCP1 hängen und einen Iterrupt generieren lassen, sobald diese Unterbrochen wurde und dann den aktuellen Zählerstand von Timer3 auslesen um anschliessen die Berechnung der Geschwindigkeit vorzunehmen. Dabei sind mir nun folgende Dinge nicht ganz klar: Frage 1: im manual steht das die CCP Module jeweils eine "Timer Resource" haben bzw. das ein Timer als "as the time base" verwendet wird. Was genau ist damit gemeint? Heisst das der Comparator führt bei jedem increment des Timers eine Prüfung durch (ich bin eher davon ausgegangen das er permanent vergleicht und sofort einen Iterrupt generiert sobald der Grenzwert überschritten bzw. unterschritten wird). Frage 2: wenn ich nun den Special event trigger von CCP2 nutzen möchte um Timer3 zu resetten, kollidiert das dann mit der "Timer Resoruce" Einstellung aus Frage eins? Frage 3: Wenn nun eine zweite Unterbrechung des ersten Lichstrahls stattfindet, bevor der zweite Lichtstrahl unterbrochen wurde, erfolgt in meinem aktuellen Plan ja ein weiterer Reset des Timer3 durch den CCP2, das soll natürlich nicht erfolgen. Daher die Frage wie lange dauert es den CCP2 special Event trigger nach dem ersten Durchbrechen des ersten Strahls zu deaktivieren? wird dadurch ggf. die die Auswertung des zweiten Strahls beeinflusst? (ich plane die Lichtschranken in einem Abstand von ca. 10cm aufzustellen und damit Geschwindigkeiten von ca 60 kmh zu messen. Somit ist der Zeitunterschied zwischen dem Durchbrechen der ersten und der zweiten Lichtschranke nach meinen Berechnungen 6ms) Im Ablauf würde das so aussehen: 1.) 1. Photodiode hat einen Spannungsabfall -> der als Comparator konfiguriert CCP2 erkennt die Unterbrechung und Triggert sofort einen Reset vom Timer3 2.) durch den generierten Interrupt von CCP2 wird eine Funktion aufgerufen, welche den Interrupt fpr CCP2 dekativiert und gleichzeitig den Interrupt Flag löscht 3.) Timer3 beginnt zu zählen (prescaler 1:8 damit auch langsamer Geschwindigkeiten nicht sofort zu einem, Zählerüberlauf führen, da ich ein 20Mhz Quarz einsetze) 4.) wenn nun die 2. Photodiode an CCP1 einen Spannungsabfall hat wird wieder ein Interrup generiert, welcher eine Funktion aufruft die den aktuellen Zählerstand aus dem Timer3 ausliest 5.) Anhand des Zählerstands wird nun die Geschwindigkeit berechnet (dabei sollte ja ein Zählerwert bei 20Mhz) dank einem Prescaler von 1:8 im Timer3 und dem teilen der Fosc durch 4 [waren doch 4 Takte pro Instruction beim PIC oder?]) 20.000.000Hz/4/8 = 0,0000016 Sekunden (0,0016 ms) entsprechen, korrekt? 6.) nach dem Berechnen der Geschwindigkeit wird diese per USB an den PC gemeldet und der Interrupt-Flag gelöscht und der CCP2 wieder scharf geschaltet. Danke für Euren Input und Tips. Viele Grüße Paul
Deine Ablaufpläne sind zu kompliziert. Es geht vermutlich sehr viel einfacher durch Nutzung des "Capture" modes der Timereinheit(en) im uC. Info auch hier: Beitrag "Capture/Compare"
Danke für die Antwort! Ich hatte auch einen Denkfehler drin, da ja ccp1 und ccp2 keine comparator Funktion haben sondern eine compare funtion :) somit muss ich eh die comparator Einheit nutzen, da ich möglichst keine externen komparatoren einsetzen möchte um alles simpel vom Aufbau zu halten. Kann ich mit dem internen comparator auch direkt die compare Einheit feuern? Oder braucht dIe immer eine externe Flanke? (die im Zweifel vom dem uC selbst kommt durch einen IO der vom comparator auf High gezogen wird?) Danke und Gruss Paul
Deine Idee mit dem Special Event Trigger funktioniert so nicht. Den gibt es nur im Compare Mode. Also wird er durch einen bestimmten Timerwert ausgelöst. Nicht durch einen Input. Aber du könntest beide Module im Capture Modus laufen lassen. Beide Module haben den gleichen Timer als Basis(im Timer3 Register einzustellen). Somit steht z.B.: in CCPR1 der Zeitpunkt wann die erste Schranke ausgelöst hat und im CCPR2 der Zeitpunkt für die zweite Schranke. Differenz bilden, Timerüberlauf noch berücksichtigen und du besitzt die Zeit, den Weg und... das Gesuchte :) PS: Die CCP Module haben Schmitt Trigger Eingänge, könnten bei geeigneter Beschaltung also ohne Comperatoren funktioniern.
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.