- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 10 von 16

Thema: SPI Interrupt wird ZU SPÄT ausgelöst nach Sendevorgang

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Hallo NRicola,
    Du hast uns nicht verraten welchen PIC der 18er Serie Du benutzt.
    Es gibt beim 18F252 z.B. ein Problem im SPI Interface im SlaveMode
    Für deinen PIC gibt es ganz sicher auch einen "ERRATA" Sheet, weil es gibt keine funktionierenden PICs...
    Spass muss sein, ich liebe die Dinger trotzdem.
    Schau mal dort rein, eventuell hilft es dann weiter.

    hier mal der Hinweis vom PIC18F252:
    Module: MSSP (SPI, Slave Mode)
    In its current implementation, the SS (Slave
    Select) control signal, generated by an external
    master processor, may not be successfully recognized
    by the PIC® microcontroller operating in
    Slave Select mode (SSPM3:SSPM0 = 0100). In
    particular, it has been observed that faster
    transitions (those with shorter fall times) are more
    likely to be missed than than slower transitions.
    Work around
    Insert a series resistor between the source of the
    SS signal and the corresponding SS input line of
    the microcontroller. The value of the resistor is
    dependent on both the application system’s
    characteristics and process variations between
    microcontrollers. Experimentation and thorough
    testing is encouraged.
    This is a recommended solution. Others may exist.

    zudem würde ich mir mal den Assemblercode von der Interruptfunktion ansehen.
    Ich weis nicht was der Compiler dort für einen "overhead" für Register sichern usw. reinbaut.
    Bei einer Free Version von Microchip hab ich hier schon haarsträubenden code erlebt....
    Wenn er erstmal 50 Zeilen Code abarbeiten muss bis er deinen Zeile zum Bitsetzen erreicht
    kommt da natürlich einiges an Zeit zusammen.
    Geändert von Siro (03.06.2018 um 20:37 Uhr)

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    14.04.2005
    Ort
    Freiberg
    Alter
    42
    Beiträge
    311
    Hallo Siro,

    danke für den Hinweis mit den Errata-Sheets. Das hat mich wachgerüttelt. Ich hatte einen Mikrocontroller als perfektes Gerät angesehen (nennen wir es Gottesteilchen). Ist ja doch erstaunlich, was dann später noch gefummelt werden muss...

    Dennoch habe ich für meinen PIC18f45k20 nicht wirklich den passenden aller Einträge gefunden.
    Den ASM-Code anzuschauen wäre ein Ansatz. Aber zum einen ist mir nicht klar, wie ich da ran komme, wenn ich in C programmiere und mit MPLAB/XC8 arbeite. Zum anderen habe ich aber auch mal den ganz popligen Test gemacht, INT0 auszulösen. Also ein Rechtecksignal an PB0 und dann Ausgang RD5 umschalten lassen.
    Code:
        TRISB  = 1;
        ANSELH = 0x00;
        INTCON = 0;
        INTCON2 = 0;
        INTCON2bits.INTEDG0 = 0; // Flanke ist bei mir negativ
        INTCONbits.INT0IE = 1;
        INTCONbits.INT0IF = 0;
        RCONbits.IPEN     = 0;
        INTCONbits.GIE    = 1;
    Auch hier (mit den internen 16MHz Clock) habe ich einen Verzug zwischen den Flanken von 11µs (=176 Clock cycles). So etwas fundamentales kann ja eigentlich nicht mehr falsch zwischen C und ASM implementiert sein. Oder etwa doch??
    Daher wäre meine Vermutung, dass es eher noch etwas systematisches ist. Was könnte ich vergessen haben oder welches Register könnte mich noch ausbremsen? Ist dem interrupt-Prozess noch irgendein Timer oder anderer Trigger hinterlegt? Nach dem Schaubild "9-1 Intterrupt Logic" im Datenblatt eigentlich nicht.
    Ich habe bis jetzt vorwiegend mit den high/low Prioritäten des Interrupts herumgespielt. Das lief alles auf's gleiche hinaus.

    Grüß
    NRicola
    Gurken schmecken mir nicht, wenn sie Pelz haben!

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von NRicola Beitrag anzeigen
    Auch hier (mit den internen 16MHz Clock) habe ich einen Verzug zwischen den Flanken von 11µs (=176 Clock cycles). So etwas fundamentales kann ja eigentlich nicht mehr falsch zwischen C und ASM implementiert sein. Oder etwa doch??
    Daher wäre meine Vermutung, dass es eher noch etwas systematisches ist. Was könnte ich vergessen haben oder welches Register könnte mich noch ausbremsen? Ist dem interrupt-Prozess noch irgendein Timer oder anderer Trigger hinterlegt? Nach dem Schaubild "9-1 Intterrupt Logic" im Datenblatt eigentlich nicht.
    Ich habe bis jetzt vorwiegend mit den high/low Prioritäten des Interrupts herumgespielt. Das lief alles auf's gleiche hinaus.
    Zwei Vorbemerkungen: Die Interruptpriorität spielt nur eine Rolle, wenn zwei Interrupte gleichzeitig eintreffen. Das ist hier aber nicht der Fall. Und der CPU-Takt ist ein Viertel des Systemtaktes. die 176 Clock cycles sind also 44 Befehlstakte.

    Aber mal ganz allgemein zu Interrupten und Interrupthandlern. Ein Interrupt kann jederzeit eintreten, daher muß der Prozessor nach abbarbeiten des Handlers 100% im gleichen Zustand sein, wie davor. Ansonsten würde das Haupprogramm nicht mehr richtig funktionieren. Ein Teil wird automatisch passieren, kost aber auch seine Zeit. So muß der Programmcounter auf dem Stack gesichert werden und die Anfangsadresse des Handlers muß geladen werden. Jeder Speicherzugriff dauert mindestens einen Prozessortakt, wieviel das in Summe bei einem PIC18 sind, weiß icht jetzt nicht. Jetzt ist der Prozessor also im Interrupthandler und muß als erstes alle Prozessorflags sichern, ohne sie dabei zu verändern. Da ein Interrupthandler eine normale C-Funktion ist, müssen dann alle Register gerettet werden, die der Compiler benutzt. Dazu gehören auch die, die in irgendwelchen Systemfunktionen für die Behandlung von longs oder für Multiplikation und Division benutzt werden, der Interrupt könnte ja gerade in der Bearbeitung einer solchen Funktion aufgetreten sein.

    Auch kann der Compiler nicht vorhersagen, welche Register eine Libraryfunktion benutzt, die später nur als Objectcode dazugelinkt wird. Ich halte also die 44 Prozessorzyklen für die Interruptpräambel und für den Code, der vor deinem Portbitsetzen abläuft für nichts ungewöhnliches. Das Wiederherstellen des Prozessorzustands am Ende des Interrupts wird ähnlich lange dauern.

    In Assembler wird das nur marginal besser. Bei ganz simplen Aufgaben des Interrupts kann man da besser sein, man muß aber bei jedem Befehl, den man schreibt, genau überlegen, was man tut. Und das auch, wenn man (oder auch ein anderer Programmierer) das Programm Monate oder Jahre später debugged. In C ist das kein Problem, ein paar Zeilen mehr im Interrupthandler und das Hauptprogramm läuft immer noch ungestört.

    Zitat Zitat von Siro Beitrag anzeigen
    zudem würde ich mir mal den Assemblercode von der Interruptfunktion ansehen.
    Ich weis nicht was der Compiler dort für einen "overhead" für Register sichern usw. reinbaut.
    Bei einer Free Version von Microchip hab ich hier schon haarsträubenden code erlebt....
    Wenn er erstmal 50 Zeilen Code abarbeiten muss bis er deinen Zeile zum Bitsetzen erreicht
    kommt da natürlich einiges an Zeit zusammen.
    Mit Begriffen wie "haarsträubenden" wäre ich zurückhaltend. Es klingt so, als wären die Compilerprogrammier Vollpfosten und hätten ihr Handwerk nicht gelernt. Ich würd mir das erst erlauben, wenn ich selbst einen Compiler geschrieben hätte, der alle Regressionstest besteht.

    Und die Vorstellung, daß ein Optimizer da viel machen kann, ist irrig. Auch der kann später hinzugelinkten Objectcode nicht wirklich analysieren. Ein 8-Bit Prozessor braucht für die Behandlung der in C gängigen Datentypen wie int oder long nun mal mehrere Register. Bei "großen" Prozessoren wird das mit den Registern besser, dafür ist der Code des Interrupthandlers wahrscheinlich nicht im Cache und muß erst aus dem langsamen Hauptspeicher geladen werden (und verdrängt dabei möglicherweise den Code des Hauptprogramms). Das ist dann zwar anders, aber nicht unbedingt besser.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Ich will den Compiler nicht schlecht machen Klebwax,
    ich weis aber und das wird sogar angezeigt, dass im "Free" Mode der Code "äußerst" ungünstig wird, so würde ich das mal nennen.

    Dies ist meine Standard Meldung bei allen Projekten:

    You have compiled in FREE mode.
    Using Omniscient Code Generation that is available in PRO mode,
    you could have produced up to 60% smaller and 400% faster code.
    See http://www.microchip.com/MPLABXCcompilers for more information.
    Daher ist es gut möglich, dass hier die "zusätzlichen" Zeiten kommen könnten.
    400 Prozent ist doch erheblich.....

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von Siro Beitrag anzeigen
    Daher ist es gut möglich, dass hier die "zusätzlichen" Zeiten kommen könnten.
    400 Prozent ist doch erheblich.....
    Ich kenne die Meldung. Aber "60% smaler and 400% faster" glaub ich erstmal nicht. Da müsste eher ein "or" stehen. Typisch dealt man zwischen "faster" and "smaler". Loop unroling macht den Code länger, aber schneller. Berechnungen über Tabellen zu machen ebenfalls. Für die Rechnungen mit ints oder longs Inlinecode zu verwenden oder Systemfunktionen zu callen genauso. Und die Spitzenwerte sind, wie bei Benchmarks so üblich, wirklich Spitzenwerte unter idealen Bedingungen. Der Optimizer arbeitet auch sicher im wesentlichen auf C-Ebene, das wird sich auf sowas wie eine Interrupt-Präambel kaum auswirken. Der Optimizer wird nicht plötzlich umschaltbare Registerbänke oder ähnliches entdecken.

    Der XC8 ist für Microchip sicher ein Verlustgeschäft. Ohne einen funktionierenden, fehlerfreien Compiler kann man aber keine CPUs für Milliarden von $ an Profis verkaufe, sie müssen sich das also antun. Ich glaube, diese Meldung soll die professionellen Kunden, die mit den "deep pockets", dazu bringen, wenigstens einen Beitrag zur Entwicklung und Wartung des Compilers beizutragen.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Ich finde der Compiler sollte umsonst sein, (logisch aus privaten Interesse natürlich )
    Aber eine Verbreitung der Chips geht meiner Meinung nach auch durch Privatanwender voran,
    was ich privat nutze, setzte ich dann auch in der Entwicklung in der Firma ein.
    Bei mir war es zumindest so.
    -----------

    Zum Thema Assembler Listing:

    Um ein Assembler Listing zu bekommen must Du erst etwas einstellen: ich beziehe mich auf die MPLABX-IDE

    Du klickst oben im Menü
    File
    Project Properties

    oder auch rechte Maustaste in dem Projects Fenster links.


    Dann gibt es vermutlich 2 Konfigurationen
    eventuell aber auch nur eine.
    Dort musst Due auf Conf und dann den Unterpunkt "Loading" wählen.
    Hier muss rechts in das Kästchen ein Haken rein bei "Load symbols when......

    Nun musst das Projekt neu compiliert (Builded) werden.
    Erst dann wird auch ein Assembler File erstellt.

    Nun gehst Du oben im Menü auf
    "Window" --> Debugging --> Output --> Disamply listing file


    Nun sollte sich das Assembler Fenster öffnen.


    Bei mir heisst die Funktion
    void __interrupt isr(void)

    Dann kannst Du Dir den erzeugten code anschauen.

    Ich hab mal Bildchen angehangen:
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken MPLABX_1.jpg   MPLABX_2.jpg  
    Geändert von Siro (07.06.2018 um 12:24 Uhr)

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Ich habe mal eben ein Project mit deinem PIC erstellt
    und dies ist der erzeugte Assembler Code der interrupt Funktion:

    Code:
    unsigned char spi_reg_addr;
    18:            
    19:            void interrupt isr(void)
    20:            {
    21:                if (PIR1bits.SSPIF == 1)
    0052  A69E     BTFSS PIR1, 3, ACCESS
    0054  D006     BRA 0x62
    22:                {
    23:                    spi_reg_addr=SSPBUF;
    0056  CFC9     MOVFF SSPBUF, spi_reg_addr
    0058  F018     NOP
    24:                    SSPBUF=0x00;
    005A  0E00     MOVLW 0x0
    005C  6EC9     MOVWF SSPBUF, ACCESS
    25:                    RD5=0;
    005E  9A83     BCF PORTD, 5, ACCESS
    26:                    PIR1bits.SSPIF = 0;
    0060  969E     BCF PIR1, 3, ACCESS
    27:                }
    28:            }
    0062  C012     MOVFF 0x12, 0x1C


    er sichert keine Register und ein RETFIE vermisse ich auch.
    Muss man da noch was einstellen, vermutlich erscheint es nicht im Listingfile ??
    Geändert von Siro (07.06.2018 um 12:50 Uhr)

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    Der XC8 ist für Microchip sicher ein Verlustgeschäft. Ohne einen funktionierenden, fehlerfreien Compiler kann man aber keine CPUs für Milliarden von $ an Profis verkaufe, sie müssen sich das also antun. Ich glaube, diese Meldung soll die professionellen Kunden, die mit den "deep pockets", dazu bringen, wenigstens einen Beitrag zur Entwicklung und Wartung des Compilers beizutragen.
    Also wenn einer Fragen zum Thema XC Compiler von Microchip hat, her damit, hatte gerade erst vor einer Woche den FAE von microchip zu Besuch bei uns und darüber intensiv unterhalten. Der XC8 ist wohl ein übernommener und ewig weiterentwickelter Compiler (der Ursprung ist mir entfallen weil es bei uns um den XC16 ging) der aber so schnell nicht sterben wird, er nannte ihn den wohl am besten optimierten Compiler.

    Microchip ist eine Firma in der keine Querfinanzierung gemacht wird und daher kosten die "Fortgeschrittenen" Feature halt Geld da die Abteilung die u.a. den Compiler pflegt sich damit finanzieren muss.

    Deine Behauptung das es nur für die deep-pockets ein Anreiz sein soll ist definitiv falsch. Die Optimierung kann immense Geschwindigkeitsvorteile bringen und 400% sind nicht aus der Luft. Man nehme z.B. einen Switch Case mit 30 Einträgen (ein etwas großer zugegeben aber nicht zwingend ungewöhnlich). Den kann ich mittels gewöhnlicher "If ElseIf" lösen, entsprechend langsam ist das ganze. Ich kann aber auch (Vorausgesetzt alle cases sind wertemäßig ansteigend und haben unterneinander weniger Abstand als 5) einen switch case in eine Sprungtabelle umwandlen. Das ist codemäßig kleiner als die ganzen Bedingungen und ERHEBLICH schneller!

    Kommt also mehr oder minder auf die zu optimierende Funktion an, dann sind 400% absolut real!

    Viele Funktionen wie "garbage collecting unused methodes" und andere code optimierungen lassen sich aber auch ohne optimierungsstufe realisieren. Schon allein damit methoden in einzelne sektionen packen zu lassen und dann hinterher im linker (hat der XC8 so nicht) dann unreferenzierte sektionen löschen zu lassen kann einen Code schnell viel kleiner machen, vor allem wenn man Softwaremodule einsetzt.
    Das ist stnadradmäßig nicht an, beim atmel GCC aber schon.
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

Ähnliche Themen

  1. SPI Interrupt wird nicht ausgelöst nach Sendevorgang
    Von steckplatte im Forum PIC Controller
    Antworten: 4
    Letzter Beitrag: 25.04.2018, 20:08
  2. Interrupt wird nicht ausgelöst.
    Von DarkSoldier im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 28.04.2013, 14:42
  3. Interrupt wird nicht ausgelöst
    Von Michael_am32 im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 02.08.2010, 00:37
  4. Es wird kein Interrupt ausgelöst
    Von MrTaco im Forum C - Programmierung (GCC u.a.)
    Antworten: 9
    Letzter Beitrag: 19.07.2010, 16:48
  5. Wann wird ein Interrupt ausgelöst?
    Von CKroll im Forum PIC Controller
    Antworten: 2
    Letzter Beitrag: 08.09.2004, 08:16

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress