Pulsmustererzeugung mit PIC

Gast #540684
Hallo Leute
ich habe folgendes Problem:

Ich muß ein Pulsmuster mit unterschiedlich langen High- und Low-Phasen 
erzeugen. Mir steht dazu ein PIC16F785 zur Verfügung.
Das Muster könnte z.B. so aussehen:
    ___         ________     ____________________
   |    |       |        |   |                     |
___|    |_______|        |___|                     |____

Die Dauer einzelnen High- unf Low-Phasen sollen vorher per Software 
eingestellt werden und müssen ziemlich exakt sein. Das komplette 
Signalmuster hat eine Länge von ca.4ms.
Das Pulsmuster muß weiterhin bei einem externen Ereignis an einem Pin, 
logischerweise an einem anderen Pin ausgegen werden, was ja über einen 
Interrupt gut zu realisieren ist.
Jetzt die Frage:
wie kann ich am komfortabelsten ein solches Pulsmuster erzeugen?
Ich hatte zuerst an einfache Dalay-Schleifen gedacht, was aber zu 
ungenau ist. (außerdem soll während des letzten langen Pulses auch noch 
eine Auswertung vorgenommen werden)
Dann kam mir der Compare-Mode in den Sinn, mit dem ich aber bisher nicht 
gearbeitet habe. Ist es möglich mit dem Compare-Mode ein solches Muster 
zu erzeugen, oder gibt es bessere Möglichkeiten?

vielen Dank für Eure Hilfe!!!
Gruß, Thomas
#540689
@ Thomas

>Ich muß ein Pulsmuster mit unterschiedlich langen High- und Low-Phasen
>erzeugen. Mir steht dazu ein PIC16F785 zur Verfügung.
>Das Muster könnte z.B. so aussehen:
>    ___         _______     _____________________
>   |    |       |        |   |                     |
>___|    |_______|        |___|                     |____

>Die Dauer einzelnen High- unf Low-Phasen sollen vorher per Software
>eingestellt werden und müssen ziemlich exakt sein. Das komplette

Wie exakt?

>Ich hatte zuerst an einfache Dalay-Schleifen gedacht, was aber zu
>ungenau ist.

In Assembler sind solche Schleifen auf den Takt genau.

>Dann kam mir der Compare-Mode in den Sinn, mit dem ich aber bisher nicht
>gearbeitet habe. Ist es möglich mit dem Compare-Mode ein solches Muster
>zu erzeugen, oder gibt es bessere Möglichkeiten?

Ja, das ist die günstigste und professionelle Methode.
Du musst praktisch nur sich Zeitpunkte der Signalwechsel in einer 
Tabelle ablegen. Diese kannst du dann per Compare Interrupt verarbeiten. 
Das Ganze ist dann auf den Takt des uC genau.

MFG
Falk
#540713
Bei den AVRs hat man den "Toggle Pin on Compare" Modus, damit kann man 
das Signal auf einen Quarztakt (50ns) genau erzeugen und die 
Interruptlatenz zum Laden des nächsten Compare-Wertes bleibt völlig ohne 
Einfluß (Compareregister  += nächstes Delay).


Nimmt man dann noch den "Input Capture", um die Startflanke zu erkennen, 
ist das Signal auch auf 50ns synchron dazu (Compareregister = 
Captureregister + erstes Delay).


Wenn der PIC diese beiden Modi auch hat, ist es ganz easy.


Peter
Gast #540741
Vielen Dank für eure Antworten!!!

Es sollte im µSekunden-Bereich exakt sein.

Hat zufälligerweise noch jemand ein kleines Beispielprogramm zur 
Benutzung des Compare-Modus (wenn möglich in C)?

Thomas
#540814
Also wenn ich das Datenblatt des PIC16F785 richtig verstanden habe, hat 
der weder toggle-Pin noch Compare noch Capture.

D.h. Du mußt alles zu Fuß in SW machen, da könnten 1µs Genauigkeit schon 
haarig werden.


Wie gesagt, mit nem ATTiny2313 wärs ganz easy. Und da der 2 
Compare-Einheiten hat, kann man mit der 2. die Auswertung machen.



Peter
Gast #540855
@Peter
danke für den Hinweis, dummerweise steht mir nur der PIC zur Verfügung.

Wenn also jemand ein kleines Beispiel für mich hätte wäre ich sehr 
Dankbar!!!
Im Internet findet man auch nur sehr dürftige Angaben zur Verwendung 
diese Modes.

Gruß Thomas
Gast #540862
ps: den Toggel-Pin hat er zwar nicht, dafür aber einen Compare-Modus der 
einen Interrupt auslöst mit dem man dann einfach einen Pin toggeln kann.
Thomas

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.