Forum: Mikrocontroller und Digitale Elektronik Probleme mit definierter Impulsdauer eines Ausgangs


von Alex (Gast)


Angehängte Dateien:

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

von Dennis U. (atmegadennis)


Lesenswert?

Hallo Alex,

Ich denke das da u.U. die Interrupts ins gewicht fallen könnten, hast du 
von denen denn irgendwelche aktiv ??

Und warum verwendest du nicht genau diese Interrupts zur Steuerung von 
deinem Ausgang ??

von Michael (Gast)


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

von Alex (Gast)


Angehängte Dateien:

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

von Udo R. S. (Gast)


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 :-)

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.