www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Doppelpuls mit PIC generieren


Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Schoasch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ps ein timer reicht doch

Autor: Norbert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Norbert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rainer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Geri (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: tastendrücker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ISR = ?

Autor: Schoasch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Interrupt Service Routine.

Autor: Rainer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.