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
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 ??
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.