CLC Frickeln mit zwei Logikzellen

Der chaotische Hauptfaden

Moderatoren: Heaterman, Finger, Sven, TDI, Marsupilami72, duese

Antworten
Benutzeravatar
ferrum
Beiträge: 139
Registriert: Mi 23. Jul 2014, 11:58
Wohnort: Bayern

CLC Frickeln mit zwei Logikzellen

Beitrag von ferrum »

Servus Miteinander,
ich bin beim durchblättern von dem Datenblatt von PIC16F Controllern auf zwei interessante Feature gestoßen. Einige PIC16F besitzen sogenannte CLC (Configurable Logic Cell). Diese können pro Zelle mit je 4 Programmierbaren Eingängen 8 Verschiedene Logik Funktionen annehmen. Aber das eigentlich tolle daran ist dass die Zellen unabhängig vom ALUtakt sind.Das Andere ist ein NCO(Numerical Controled Oscillator) Ein ebenfalls vom Takt unabhängiger 20Bit Addierer der Pro Takt einen Einstellbaren Wert Addiert. Ich hab mich einfach mal hingesetzt und damit ein wenig damit herum gespielt . Herausgekommen sind zwei hoffentlich halbwegs brauchbare Projekte. Das erste ist ein zwei Chip Frequenzzähler bis 45MHz das zweite ist eine PLL.
Frequenzzähler:
Zugrunde liegender Chip ist ein PIC16F1503
Ich habe mir hier 2 Betriebsmodi ausgedacht.
A) Mit 1MHz Referenz entweder über lokalen Quarz oder über externe Referenz (bis 2s Torzeit)
B) Mit externer Tor Time Control Zähler zählt solange Tor Time Signal high ist (bis 5s Torzeit)
Grundsätzliche Idee:
Der NCO wird als Zähler genutzt welche per Software zurückgesetzt wird, die Anzahl der Überläufe wird per Software Interrupt gezählt.
Das zu zählende Signal wird über die CLC auf die NCO geleitet. Das Torsignal aktiviert die Weiterleitung in der CLC und Startet bzw. Stoppt den Zähler dadurch automatisch --> Der Zeitkritische Software Anteil sinkt auf ein Minimum.
Im Modus A wird die Torzeit über den Timer1 erzeugt dessen Ausgang direkt auf die CLC konfiguriert ist die PIC nutzt die Referenzfrequenz gleichzeitig als Takt. Im Modus B wird die Tor Zeit direkt aus dem Eingang auf die CLC gegeben Hier ist die Verwendete Taktfrequenz egal.
Die Software erfährt per Interrupt von dem Ende der Zählerroutine, liest die Gemessenen Werte aus und setzt den Zähler zurück. Die Ausgabe der Werte kann wahlweise erfolgen wenn der Zähler steht oder während des Messens da die ALU hier eigentlich nichts zu tun hat.
Realisierung:
Ich hoffe man kann mein gekrakel lesen! Ich beginne mit der Erklärung am besten von hinten.
NCO
Der NCO wird so Programmiert dass immer 1 zu dem Aktuellen Wert Addiert wird. Somit entspricht der Wert im NCO Register der Anzahl der Taktdurchgänge. Da die 20Bit des NCO ca. 1*10^6 Entsprechen wird der NCO bei der Maximalfrequenz(lt. Datenblatt 45MHz) Überlaufen. Deshalb wird ein der NCO Interrupt aktiviert um die Anzahl der Überläufe zu Zählen. Da der NCO von dem Softwarezustand Unabhängig ist(also während des Interupt weiterläuft) ist die Programmierung des Interupt nicht Zeitkritisch solange sie nicht länger dauert als die Zeit zwischen 2 Überläufen. Die Dauer zwischen 2 Überläufen Beträgt minimal 23ms daraus ergibt sich dass das Zählen der Überläufe in maximal 5,8*10³ Instructions realisiert werden muss. Ich hab 9 gebraucht :D. Bei 45MHz und 2s Torzeit ergibt sich ein Speicherbedarf von mindestens 27Bit. Da Ganze Byte leichter zu realisieren sind zähle ich 1 Byte Überläufe mit, zusammen mit den 20Bit des NCO ergibt sich ein Speicheraufwand von 28Bit. Somit beträgt die Maximale Torzeit bei 45MHz ca. 5s. Als Taktquelle des NCO kann leider neben Taktfrequenzen nur der Output von CLC1 gewählt werden.
CLC1
Die Aufgabe von CLC1 ist es das zählen zu starten bzw. zu stoppen. Dies wird durch Verwendung des AND Gatters realisiert die zu Zählende liegt an CLC1IN0 an, das Start/Stop Signal wird von CLC2 Erzeugt.
CLC2 ModusA
In Modus A Ist es die Aufgabe von CLC2 Das Start bzw. Stop Signal zu erzeugen. Der Start geschieht per Software das Stoppen automatisch durch Timer 1. Der Timer erzeugt beim Überlauf einen kurzen Impuls dieser wird dem J-K Flip Flop in den Reset Zugeführt folglich geht der Flip Flop Output auf 0 ==> das Zählen Stoppt. Dadurch muss keine weitere Softwareinteraktion zu Stoppen erfolgen was diesen Teil der Software Zeit unkritisch macht. Das Starten war das Problem an dem ich fast verzweifelt wäre. Ursprünglich hatte ich einen R-S Flip Flop für diese Aufgabe angedacht. Der Gedanke war Set per Software kurz auf High zu ziehen. Das Problem war dass die Software den Befehl zu beginn des 4ten Teils des Befehlszyklus beendet. Der Timer bezieht seinen Takt allerdings aus dem Zyklus Takt (¼) Folglich Startet der Zähler einen Takt zu früh ohne dass man dies durch einen anderen Timer Wert kompensieren kann. Deshalb wurde hier auf ein Takt gesteuertes Flip Flop zurückgegriffen. Da der Zyklus Takt nicht auf der internen Input Selection der CLC zur Verfügung steht musste dieser extern gebypasst werden. Dies geschieht durch das aktivieren von CLKOUT und externes Verbinden mit CLC2IN0.
CLC2 ModusB
In Modus B hat CLC2 die Simple Aufgabe die Torzeitkontrolle In CLC1 Weiterzuleiten. Deshalb wurde ein 4 Input AND gewählt bei dem 3 Eingänge auf high sind. Um Inputkompatibel mit Modus A zu Bleiben wird als Input CLC2IN1 gewählt Das zurücksetzten des Zählers geschieht wieder per Software per Interupt on Change auf dem Input. Evtl könnte es sinnvoll sein hier einen ½ Frequenzteiler aus einem D Flip Flop zu frickeln (In CLC2) wenn man Eine externe Referenz mit Frequenz und nicht on Time der Torzeit hat.(noch in bearbeitung)
Timer 1 nur Modus A
Der Timer generiert in Modus A Die Torzeit aus dem Zyklus Takt. Da es sich um einen 16Bit Timer mit einem Prescaler von maximal 8 Handelt ergibt sich die maximale Torzeit zu ca. 2s. Wie schon beschrieben wird der Interupt zum Zurücksetzten Aktiviert.
Hardware:
Da der Zähler auf einem Chip realisiert wird ist sehr wenig externe Hardware nötig neben dem PIC16F1503 ist noch ein 74HC04 als Quarzoszillator und Eingangspuffer notwendig und ein 7805 für die 5V Betriebsspannung. Der Rest sind 3 BNC Anschlüsse und Allerweltsbauteile die jeder rumfliegen hat.
Umsetzung:
Getestet hab ich das ganze bis jetzt nur auf dem Steckbrett heute Abend wird das ganze noch geätzt. Es passt alles auf eine 75*50mm Einseitige Platine 2 Drahtbrücken (SMD THT Mischbestückung). Anschlüsse sind alle so realisiert dass man sie über Pfostenstecker zur Frontplatte führen kann.
Bild
Bild
Bild
Bild
PLL:
Die PLL habe ich zwar bereits geplant allerdings noch nicht getestet ich möchte jetzt keine ungelegten Eier Beschreiben wenn sich dann noch alles ändert Ich werde das demnächst mal reinstellen.
lg Flo
Antworten