Hallo zusammen! Ich habe da folgendes Problem. Ich habe hier einen PIC Controller (16F971), der mit 20 MHz läuft. Ich möchte gerne einen Doppelpuls generieren. Sprich einen High Puls, danach einen Low Teil und dann wieder ein High Puls. Die drei Zeiten sollen variabel sein. Erte Zeit von 20us bis 200us, zweiter Teil von 2us bis 20us und der dritte Teil ebenfalls von 2us bis 20us. Ich benutze MPLab, den CC5xfree Compiler und ein ICD2. Meine Fragen sind nun: 1)Ist das eurer Meinung nach mit diesen Zeitanforderungen überhaupt machbar? 2)Wenn es denn machbar sein sollte, wie würdet ihr das Problem angehen? Zusatz: Die gewünschten Zeiten werden über + - Taster eingestellt. Die Zeiten werden per LCD visualisiert. Es gibt dann einen Start-Taster, der den Doppelpuls einmalig ausgibt. Für Tips, Vorschläge, Ratschläge und sonstiges wäre ich dankbar. Grüßle Matthias
Welchen Controller verwendest du? Eine PIC16F971 kenne ich nicht ;-) Ich kenne nur einen PI16F917. Das ganze sollte sich eigentlich ausgehen. WEnn du einen PIC16F917 verwendest.. verwendest du dann auch das interne LCD-Modul? Naja.. für dein Problem solltest du dir halt was mit den Timern überlegen... vl alle 3 einstellen und nacheinander bzw gleichzeitig starten. mfg Schoasch
Hui, da hat sich wohl ein Tipfehler eingeschlichen. Es handelt sich um den PIC 16F871. An dem Start von 3 Timern gleichzeitig hab ich auch schon gedacht, aber ich weiß noch nicht so recht wie ich das machen könnte. Trotzdem Danle für den Vorschlag. Matthias
von der Zeitbasis hast du mit deinem PIC kein Problem. Vorausgesetzt genügend hohes Quarz. Ansonsten nicht vergessen nach dem zweiten High wieder Lowzuschalten =). Für die verschiedenen Zeiten kannst du wie Schoasch schon sagte die Timer verwenden, am besten in eine Funktion packen welche gleich die gewünschte Zeit entgegennimmt, oder eben ein paar verschiedene mit verschiedenen Vorteilern. Willst du im Betrieb die Zeitenverstellen oder Stellst du ein, pulst einmal und kommst wieder zurück oder stellst du ein, pulst ewig und willst wieder zurück? Beim zweiten Fall könntest du Interrupts benutzen. ciao
Ich würde den Mikrocontroller mit 16Mhz oder so takten. Intern wird der Takt bei den PICs ja durch 4 geteilt. Dann hast du eine Taktdauer von 250ns. Dann würde ich einen Timer mit dem vollen Systemtakt durchlaufen lassen. Einstellen kannst du dann deine Zeiten über das Capture and Compare Register (CCR). Das bedeutet: angenommen du möchtest die Impulsfolge: 20us, 2us, 2us: Du setzt dein CCR auf 80 (20us/250ns =80) und konfigurierst es so, dass ein Interrupt ausgelöst wird, wenn der Zählerstand des Timers gleich ist. Du startest den Timer und setzt das Ausgangssignal (erst Timer starten, dann Ausgangssignal setzen, da du ja auch beim rücksetzen des Ausgangssignals eine gewisse Zeit brauchst, um auf den Interrupt zu reagieren) Ein Interrupt wird ausgelöst: du setzt das ausgangssignal zurück und schreibst in das CCR 88 rein Erneut wird ein Interrupt ausgelöst, du setzt das Ausgangssignal und in das CCR wird 96 geschrieben usw. Ich hoffe, das Prinzip ist klar geworden. Ich weiß nicht, wie lange der PIC braucht, um auf einen Interrupt zu reagieren. An der Stelle könnte es ein wenig eng werden mit den 2us. Du hast da nur 8 Taktzyklen, um die Interruptroutine zu betreten, das Ausgangssignal entsprechend zu setzen, das CCR neu beschreiben und die Interruptroutine wieder zu verlassen. Leider teilt der PIC ja die Taktfrequenz nochmal intern, also evtl. noch höher takten.
Hab mir gerade nochmal das Datenblatt angeschaut. Du brauchst gar kein Interrupt aktivieren. Damit passt das dann auf jeden Fall. Du startest den Timer und setzt das Ausgangssignal. Dann wartest du in einer schleife, in der du ständig das Interruptflag abfragst. Wenn das CCR mit dem Zähler übereinstimmt, löst du kein Interrupt aus, sondern lässt dir RC2 automatisch setzen oder rücksetzen (S.57 im Datenblatt). Das Interruptflag wird auch gesetzt, auch wenn kein Interrupt aktiviert ist. Damit kannst du dann dein CCR neu beschreiben und das setzen/rücksetzen des RC2 Pins neu einstellen. Dann kannst du warten. Damit bist du deutlich schneller, da du nicht mehr die ISR aufrufen und verlassen musst.
Hallo! Ich denke einige Randbedingungen habt ihr übersehen, besonders Nobert mit seinem ohne ISR Ansatz. Matthias will doch noch Taster und LCD ansteuern! Damit wird das ohne ISR nichts! Aufgaben für die ISR. Nachdem das erste Zeitintervall noch das längste ist, würde ich hier nach der Behandlung die ISR verlassen. Die beiden anderen Zeiten würde ich dann noch in der ISR pollen, also mit einer Schleife abfragen. Ansonsten wird das mit 2us und ISR raus/rein sehr knapp! Die restlichen Aufgaben wie LCD und Tasten können dann nebenbei im Hauptprogramm erledigt werden, wobei bei einer maximalen "Frequenz" der ganzen Sachen von 1/(20us+2us+2us)=41.6kHz für die main-Schleife immer noch ein Löwenanteil von grob >= 20/24=83% bleibt. Abzüglich notwendiger Aufgaben in der ISR bleiben damit >=70% Rechenzeit. Das reicht dann für Tasten und LCD. Ich hoffe, das ist fehlerfrei ,-) Grüße Rainer
"1)Ist das eurer Meinung nach mit diesen Zeitanforderungen überhaupt machbar?" Kann überhaupt keiner sagen, solange Du nicht mit der Auflösung rausrückst, die Du haben willst. Mit einem ATMega48 (AVR) ist z.B. eine Auflösung von 50ns möglich. Da die ganze Sache nur max 240µs dauert, vergiß das mit den Interrupts und machs mit Warteschleifen in Assembler. Das ist am einfachsten und genauesten (kein Jitter). Alle anderen Sachen werden ja wohl mal 240µs warten können. In der Codesammlung ist von mir ne zyklusgenaue Warteschleife für den AVR, kann man prima dafür nutzen. Peter
Hallo Matthias Schliesse mich letzter Meinung an. Gute Ergebnisse erhältst du evtl., wenn du den inline Assembler nutzt und die Anzahl ausgewählter Instruktionen zählst. Diese lassen sich entsprechend der manuellen Vorgaben parametrieren. Diese Technik kann man umgekehrt übrigens auch anwenden um hochfrequente digitale Signale "recht genau" zu messen. Beste Grüsse Geri
@Rainer >Ich denke einige Randbedingungen habt ihr übersehen, besonders Nobert >mit seinem ohne ISR Ansatz. Matthias will doch noch Taster und LCD >ansteuern! Damit wird das ohne ISR nichts! Ich denke, das soll nicht alles Gleichzeitig passieren. Der Doppelpuls soll nur einmalig nach Tastendruck ausgegeben werden: Zitat: Zusatz: Die gewünschten Zeiten werden über + - Taster eingestellt. Die Zeiten werden per LCD visualisiert. Es gibt dann einen Start-Taster, der den Doppelpuls einmalig ausgibt
@tastendrücker: Den Zusatz hatte ich leider nicht mehr in Erinnerung, und konnte ihn beim schnellen Überlesen nicht mehr finden. Aber wenn jetzt noch eine hohe Genauigkeit gefordert wird, dann lassen sich ja einige perverse Verfahren finden! @schoasch: Danke.
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.