Hallo! Auf dem PIC18Fxxx habe ich ein (Assemlber-) Programm geschrieben welches mittels Timer-IRQ einen LED-Multiplexer ansteuert. Soweit so gut, das funktioniert prima. Nur ist mir jetzt aufgefallen das wenn der Prozessor in eine Routine läuft in der viele NOP`s vorkommen wird der IRQ scheinbar gestört, d.h. die LED`s flackern. Ich habe mal den Takt für die LED`s testweise verdoppelt aber das Problem besteht dann unverändert. Die vielen NOP`s in meiner Routine habe ich aus Timing Gründen drin (natürlich nicht im IRQ selbst!) und frage mich jetzt warum ein NOP das auslösen eines IRQ hindert? Andere Befehle tun das doch auch nicht? Oder nimmt der Prozessor das "No Operation" tatsächlich wörtlich :-) Danke für alle Tipps im voraus!
ich kenne mich jetzt leider nicht mit dem PIC aus - aber ein NOP sollte solche Dinge nicht veranstalten. Schau mal, ob Du evtl. irgendwo vorher/nachher Register veränderst, die auch im Interrupt benutzt werden oder ob Du den Interrupt abschaltest.
Hallo "Snowman", was denn nun? Werden die NOPs nun im Interrupt durchlaufen oder nicht? Wenn die NOPs aus Timinggründen vorhanden sind (was auch der einzige Grund für NOPs ist), ist doch wohl in der Routine mit den NOPs ein Timer-Interrupt ausgeschaltet, oder? Sonst wurde ja das "mühsam errechnete" und mit NOPs erreichte Timing gestört werden. Beschreib doch mal, was im Tiner-Interrupt ausgeführt wird, und wann die NOPs durchlaufen werden. Andreas
Hi, nun es ist so: der Timer-IRQ schaltet die LED`s um (insgesamt 8 Bänke). Der Timer-IRQ hat einen Takt von ca. 600 Hz (600:8 = 75 Hz Frequenz pro LED). Soweit läuft das stabil und dank der 75 Hz sieht man auch kein Flimmern. Nun habe ich einen Routine die ein 24LC64 EEPROM ausliest bzw. beschreibt, die I2C-Kommunikation habe ich bis jetzt auf dem "Soft"- weg gelöst, soll heissen ich schalte SDA/SCL quasi per Hand anstelle der fertigen I2C-Schnittstelle im PIC (vielleicht sollte ich das mal probieren..). Jedenfalls benötigt diese Routine einige NOP`s da das EEPROM ja die Daten nicht so schnell liefern bzw. schreiben kann. Es kommt hier nicht auf exaktes Timing an, es geht halt nur darum ein paar Pausen einzulegen. Somit habe ich also einkalkuliert das ein IRQ zwischendurch die NOP-Pausen unterbricht um die LED`s an- zusteuern. Ich dachte ja auch das ich evtl. irgendwo ein Register beschreibe was die LED`s betrifft doch komischerweise ist das Problem weg sobald die NOP`s rausfliegen (dann geht natürlich das EEPROM nicht mehr g). Was ich übrigens auch festgestellt habe das ein Zurücksetzen des Watchdog-Timers den Timer initalisiert (= LED`s flackern), aber zumindestens das konnte ich mit dem Datasheet klären. Also wenn ein NOP nun den IRQ nicht behindert dann muß der Fehler wohl doch irgendwo anders liegen, zumindest bin ich damit schonmal wieder ein Stückchen schlauer, danke :-)
Ein NOP behindert den IRQ garantiert nicht. Du kannst ja mal anstelle der NOPs Dummy-Befehle einsetzen, z.B. "IORLW 0" oder so. Dann müsste der gleiche fehler auftreten. Aber Achtung: Nicht-NOP-Befehle verändern Register! Zu I2C: Ich kenne keinen, der die interne PIC-I2C-Schnittstelle nutzt. Vielleicht, weil die (sehr ausführliche) Beschreibung im Datasheet etwas abschreckt. Aber irgendwann werde ich da mal ran gehen... Andreas.
Das ist auf dieser Seite ganz gut erklärt, aber als ich es mal ausprobierte funktionierte seltsamerweise das auslesen nicht: http://www.sprut.de/electronic/pic/grund/i2c.htm
leider ist bei sprut nach jedem Byte das einsetzen des Acknow setzen nicht enthalten. ist nur ein Auszug ;noch nicht alle Bytes gelesen i2cr9 bsf status, rp0 ;Bank 1 bcf sspcon2, ackdt ;ein Acknow schreiben (L) bsf sspcon2, acken bcf status, rp0 i2cr8 btfss pir1, sspif goto i2cr8 bsf status, rp0 bsf sspcon2, rcen ; Daten Empfang einschalten bcf status, rp0 bcf pir1, sspif goto i2cr7
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.