Forum: Mikrocontroller und Digitale Elektronik PIC18Fxxx: NOP behindert den IRQ ?


von Snowman (Gast)


Lesenswert?

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!

von thkaiser (Gast)


Lesenswert?

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.

von Andreas Jäger (Gast)


Lesenswert?

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

von snowman (Gast)


Lesenswert?

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

von Andreas Jäger (Gast)


Lesenswert?

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.

von snowman (Gast)


Lesenswert?

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

von Anton Linebach (Gast)


Lesenswert?

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