Probleme mit definierter Impulsdauer eines Ausgangs

Gast #1509795
Lesenswert?

Ich habe ein Problem, ich verstehe nach längerer Überlegung einfach 
nicht
woran es liegt.

Folgendes möchte ich testen/realisieren:
-----------------------------------------

Ein Ausgang (RE0) des Pics 18F46J50 soll für eine genaue Zeit auf 
High/Low
gehen.

Benutzen möchte ich dazu NOP´s bzw die Delay10TCYx(50) ("delays.h")
in C mit dem MPLAB C18 Compiler
Quarz: 12Mhz
Config siehe main.c siehe Anhang
->interner Takt müsste somit 48Mhz betragen
rein rechnerich sollte ein NOP somit 1 Cycle -> 4 Takte -> und somit 
83,3
ns dauern.

Leider messe ich immer und immer wieder 335 ns pro NOP.
Da dies ja schon nicht mit der Rechnung übereinstimmt,
brauche ich mit der Delay10TCYx(50) gar nicht weitermachen.

Woran könnte das liegen?

Ist der interen Takt doch ein anderer (->Config<-)?


Vielen Dank
Angehängte Dateien:
Gast #1510100
Lesenswert?

Wie kommst du auf einen internen Takt von 48MHz, wenn der Quartz 12MHz 
hat?
Ich glaube beim PIC wird der anliegende Takt immer durch 4 
geteilt...d.h. der rechnerische Takt von dem du augehen müsstest beträgt 
3MHz. s. auch bei sprut.de

Zitat:
"Die Taktraten-Falle
Microchip preist die Eigenschaft seiner Controller, fast alle Befehle in 
nur einem Zyklus ausführen zu können. Mit diesem Zyklus ist aber nicht 
ein Takt sondern 4 Takte gemeint.
Ein NOP-Befehl benötigt auf einem mit 10 MHz getakteten PIC also 
keineswegs nur 100 ns sondern 400 ns. Wer Zeitschleifen aufbaut sollte 
das berücksichtigen.
Der Timer läßt sich übrigens auch nur mit maximal 1/4 des externen 
Prozessortaktes füttern, wenn man den internen Takt verwendet."

aus: http://sprut.de/electronic/pic/fallen/fallen.html#takt
Gast #1510135
Lesenswert?

Vielen dank für eure Hilfe...

Interrupts dürften eigentliche alle ausgeschaltet sein. Ich habe keine
eingeschaltet. (siehe main.c im Anhang)
Ich habe schon die Warteschleife (NOP´s) mittels Debugger getestet,
dort kommen keine Interruptroutinenaufrufe vor.
Die Impulsdauer mittels TimerInterrupt wollte ich
umgehen (zu viel Aufwand).
Ich verzweifle fast.
@Michael: Die Frequenz 48Mhz kommt durch die PLL.

Ich habe die meiner Meinung nach eingestellte Takt-Config
als Blockschaltbild hochgeladen. (roter Pfad)

Danke
Alex
Angehängte Dateien:
Gast #1510235
Lesenswert?

Hast Du Dir mal angesehen, was der Compiler daraus für Assembler macht?

>Die Impulsdauer mittels TimerInterrupt wollte ich
>umgehen (zu viel Aufwand).
Wäre es nicht doch schneller gewesen der Timer zu bemühen? Zumal Du dann 
eine Funktion hättest der Du mit übergeben könntest wie lange der Puls 
dauern soll und Du gelernt hättest wie man den Timer programmiert :-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren