mikrocontroller.net

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


Autor: Snowman (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: thkaiser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Jäger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: snowman (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Andreas Jäger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: snowman (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Anton Linebach (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.