Forum: Mikrocontroller und Digitale Elektronik Doppelpuls mit PIC generieren


von Matthias (Gast)


Lesenswert?

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

von Schoasch (Gast)


Lesenswert?

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

von Matthias (Gast)


Lesenswert?

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 Thomas (Gast)


Lesenswert?

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

von Thomas (Gast)


Lesenswert?

ps ein timer reicht doch

von Norbert (Gast)


Lesenswert?

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.

von Norbert (Gast)


Lesenswert?

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.

von Rainer (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

"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

von Geri (Gast)


Lesenswert?

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

von tastendrücker (Gast)


Lesenswert?

@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

von Thomas (Gast)


Lesenswert?

ISR = ?

von Schoasch (Gast)


Lesenswert?

Interrupt Service Routine.

von Rainer (Gast)


Lesenswert?

@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
Noch kein Account? Hier anmelden.