mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC32MX Interrupt handling


Autor: Michael S. (mistreit)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe schon viele Projekte erfolgreich auf dem PIC16 und PIC18 hinter 
mir. Sowohl in Assembler, als auch in C (XC8) bin ich gut damit klar 
gekommen.
Nun möchte ich auf PIC32 umsteigen und gehe mein erstes Projekt mir 
einem PIC32MX130F256B an (XC32 V1.42)
Jetzt verzweifel ich an einer im Grunde primitiven Sache, wo ich schon 
seit vielen Stunden am Suchen und Forschen bin und einfach nicht mehr 
weiter weiss:
Timer1 läuft und soll beim Erreichen eines bestimmten Wertes einen 
Interrupt auslösen. In der ISR soll dann eine LED getoggelt werden.
Das mit dem Timer funktioniert auch, aber er will einfach nicht die ISR 
aufrufen.
Das ist sowohl im Simulator, als auch auf der Zielhardware so.
Auffällig ist, dass, wenn ich in die Datei list.lst auch zu sehen ist, 
dass die ISR nicht compiliert wurde also in Assembler-Code umgesetzt 
wurde.

Hier mein Source-Code:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <xc.h>
#include "config32MX130F256B.h"
#include "PIC32MX130_Test_V101.h"
#include <sys/attribs.h>


void __ISR_AT_VECTOR(_TIMER_1_VECTOR, IPL7AUTO) Timer1Handler(void);


void main(void)
{
// init PIC
    init();
    LED=0;

    TMR1    =   0;
    PR1     =   0x0008;
    T1CONbits.TCKPS = 1;        // Prescaler auf 1:64
    T1CONbits.ON = 1;           // Timer1 ON


    INTCON = 0;
    INTCONbits.MVEC = 1; //Multivector mode: 1 = multi, 0 = single 
vector
    IFS0bits.T1IF = 0;  //Flag auf 0 setzen
    IPC1bits.T1IP = 7;  //Priority setzen
    IPC1bits.T1IS = 0;  //Subpriority auf 0
    IEC0bits.T1IE = 1;   // enable timer 1 IRQ

    __builtin_enable_interrupts();


    while(1)
    {
////////// Timer Test
////////        if ( IFS0bits.T1IF==1)
////////        {
////////            LED = !LED;
////////            IFS0bits.T1IF=0;
////////        }
    }


void __ISR_AT_VECTOR(_TIMER_1_VECTOR, IPL7AUTO) Timer1Handler(void)
CoreTimerHandler(void)
    {
        LED = !LED; //LED in ISR toggeln
        IFS0bits.T1IF = 0;
    }
}

Es kann doch nicht so schwer sein.
Irgendeiner eine Idee was ich da falsch mache?
Mir wäre auch schon geholfen, wenn mir jemand mal seine Sources eines 
funktionierenden Iinterupts schickt, was ich mir im Simulator anschauen 
kann.

Autor: Jim Meba (turboj)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael S. schrieb:
> Es kann doch nicht so schwer sein.
> Irgendeiner eine Idee was ich da falsch mache?

Beim geposteten Code ist die Timer Fuktion innerhalb von main(){} - 
versuche das besser außerhalb.

Da sehe ich auch 2 Funktionsnamen hintereinander. Dürfte der Compiler so 
auch nicht verstehen.

Autor: Michael S. (mistreit)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen, vielen Dank für die schnelle Antwort!

Oh man, wie blöd kann man sein (nicht falsch verstehen, bezieht sich auf 
mich!!!)! Du hast natürlich vollkommen recht die ISR hat in main nichts 
verloren!
Aber was meinst Du mit 2 Funktionsnamen hintereinander?

Autor: Michael S. (mistreit)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jim,

ich habe mal weiter probiert.
Jetzt statt __ISR_AT_VECTOR  __ISR verwendet und damit läuft es.
Der Hauptfehler war also das die ISR in der main-Routine. Echt peinlich, 
vor allem wenn man bedenkt, wie viele Stunden ich mit der Suche 
verbracht habe....
Auf jeden Fall noch mal vielen Dank. Jetzt kann ich endlich mit der 
eigentlichen Programmierung anfangen...

Schönen Sonntag Abend!

Autor: 987654 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jim M. schrieb:
> Da sehe ich auch 2 Funktionsnamen hintereinander. Dürfte der Compiler so
> auch nicht verstehen.

Das sind nicht 2 Funktionsnamen. `__ISR_AT_VECTOR(v,...)` bzw. 
`__ISR(v,...)` sind Makros, die zu grob zu 
`__attribute__((interrupt,vector(v),nomips16))` expandieren. Sprich: Sie 
machen deine Funktion zu einem interrupt handler.

Autor: Michael S. (mistreit)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, danke für die Erklärung!

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.