Forum: Mikrocontroller und Digitale Elektronik PIC32 externer Interrupt


von Benjamin (Gast)


Lesenswert?

Hallo,

ich habe ein PIC32 MX795F512L. An diesem ist ein externer ADC 
angeschlossen. Dieser ADC hat ein Alert-Pin, welcher in meiner 
Programmroutine einen Interrupt auslsen soll. Dafr gibt es beim PIC ja 
die 5 EXT_INT-Pins.

Mein Code für die Intialisierung:
1
INTConfigureSystem(INT_SYSTEM_CONFIG_MULT_VECTOR);
2
INTEnableInterrupts();
3
INTSetVectorPriority(INT_EXTERNAL_3_VECTOR, INT_PRIORITY_LEVEL_5);
4
INTSetVectorSubPriority(INT_EXTERNAL_3_VECTOR, INT_SUB_PRIORITY_LEVEL_2);
5
INTClearFlag(INT_INT3);
6
INTEnable(INT_INT3, INT_ENABLED);

Mein Code für die Funktion:
1
int test = 0;
2
void __ISR(_EXTERNAL_3_VECTOR, ipl5) ExternalInterruptHandler3(void)
3
{
4
    test++;
5
    DBPRINTF("%d \n", test);
6
    INTClearFlag(INT_INT3);
7
}

Folgendes Problem habe ich nun: Wenn ich wie im Code den EXT_INT 3 (also 
Pin 35 auf dem J10 des I/O Expansion Boards) verwende wird nie ein 
Interrupt ausgelst. EXT_INT 1 oder 2 dagegen lst dauerhaft einen 
Interrupt aus.
Ob dabei der Pin auf High oder Low ist interessiert ihn wenig. Das 
Signal vom ADC ist auf High und wird, wenn dieser fertig ist kurzzeitig 
auf Low gesetzt. (Sollte dies ein Problem sein, kann man dass auch noch 
tauschen!).

Habe ich in meinem Code ein Fehler? Habe ich etwas vergessen?

Ich bin fr jeden Tipp dankbar!

von Arc N. (arc)


Lesenswert?

Hatte auch mal so ein ähnliches "Problem"... Kann es sein das der Pin 
noch auf Analogeingang eingestellt ist? Register AD1PCFG...

von Benjamin (Gast)


Lesenswert?

Das wäre möglich.

Wie kann ich den Analogeingang deaktivieren bzw. den Pin als EXT_INT-Pin 
einstellen?

von Chris B. (dekatz)


Lesenswert?

Benjamin schrieb:
> Wenn ich wie im Code den EXT_INT 3 (also
> Pin 35 auf dem J10 des I/O Expansion Boards)

Kenne das "I/O Expansions board" nicht.
Wenn der MX795F512L im TQFP100 Gehäuse ist, dann liegt INT3 auf Pin66 
(ander Gehäuseformen habe ich jetzt nicht nachgesehen).
Schon getestet ob der Pin35/J10 auf den Pin66 geht?... gibt es da 
eventuell irgendwo einen Jumper der gesteckt/entfernt werden muss?

Analogfunktion hat der Pin66 keine, aber er ist auch die SCL-Leitung von 
I2C-Modul #1. Gibt es da irgendwo I2C-Chips welche da dran hängen und 
den INT verhindern??

von Benjamin (Gast)


Lesenswert?

Hier erstmal der Link zur Beschreibung des I/O Boards: 
http://ww1.microchip.com/downloads/en/DeviceDoc/51950A.pdf

Stecken kann ich etwas auf J10 und J11. Ein Pin 66 gibt es da nicht. 
Vielleicht kann sich den Plan ja mal jemand anschauen und mir sagen, ob 
ich mit Pin 35 auf J10 richtig bin.

von Benjamin (Gast)


Lesenswert?

Ach ja und wegen I2C: Das Modul 1 wird vom Ethernet-Controller 
verwendet. Das 2. Modul wird für den externen ADC (16bit) verwendet.

von Chris B. (dekatz)


Lesenswert?

> Vielleicht kann sich den Plan ja mal jemand anschauen und mir sagen, ob
> ich mit Pin 35 auf J10 richtig bin.

Ja der passt.

> Das Modul 1 wird vom Ethernet-Controller
> verwendet.
????
Der Pin kann als "Alternate Ethernet transmitt clock" verwendet werden.
Wenn die Funktion tatsächlich? aktiviert ist, dann wird der INT3 
natürlich nicht funktionieren.
Du kannst ja in der Configuration das mal einstellen (keine Ahnung was 
die Defaulteinstellung ist).
Findet sich im Configword 3: <FETHIO> ( 0 = alternate, 1 = default 
Ethernet I/O Pins).

von Benjamin (Gast)


Lesenswert?

In der Konfiguration steht:
1
#pragma config FETHIO = OFF
Heißt also die alternative wird verwendet. Richtig?

Und was hat das mit dem INT3 zu tun?

von Chris B. (dekatz)


Lesenswert?

Benjamin schrieb:
> Und was hat das mit dem INT3 zu tun?

Schon mal das Pin-Diagramm des PIC32MX795F512L angesehen?
Das meinte ich vorhin schon mit Pin66:
Pin 66 : AETXCLK/SCL1/INT3/RA14
Pin 66 kann folgende Funktionen haben:
RA14    ordinärer Portpin
INT3    externer Interrupt #3
SCL1    Clock von I2C1
AETXCLK Ethernet transmit Clock

Natürlich kann nur 1 Funktion gleichzeitig den Pin verwenden, wenn I2C1 
oder die alternative Ethernet-Pinzuordnung aktiviert ist, geht INT3 eben 
nicht mehr.

von Benjamin (Gast)


Lesenswert?

OK.

Und warum löst  EXT_INT 1 oder 2 dauerhaft einen Interrupt aus?
Wo liegt da dann das Problem (Code wie oben-> alle Verweise auf EXT_INT3 
eben ersetzt durch EXT_INT1 oder EXT_INT2)?

von Chris B. (dekatz)


Lesenswert?

Benjamin schrieb:
> OK.
>
> Und warum löst  EXT_INT 1 oder 2 dauerhaft einen Interrupt aus?
> Wo liegt da dann das Problem (Code wie oben-> alle Verweise auf EXT_INT3
> eben ersetzt durch EXT_INT1 oder EXT_INT2)?

Ich habe mich noch nie mit dem Ethernetmodul der PIC32 beschäftig, also 
rate ich mal auf der "untersten Ebene" der Pinfunktionalität:
Wenn die alternativen Ethernetpins aktiviert sind, dann ist AETXCLK (TX 
steht für transmit) als AUSGANG definiert und kann daher keinen 
Interrupt EINGANG darstellen (unabhängig davon ob da irgendein Ethernet 
dran hängt).

Die INT1 und INT2 teilen sich die Pins 18 und 19 auch mit den Ethernet, 
AERXD0/INT1/RE8 und AERXD1/INT2/RE9 (RX steht für receive) und die 
dürften dann als EINGANG geschaltet sein und damit INTerrupttauglich.

Vielleicht genügt es ja auch einfach den Port RA14 auf Input 
umzuschalten (TRISAbits.TRISA14 = 1)??? Einfach mal ausprobieren, auch 
das mit den Configregister.....

(Ich habe hier nur das DB für die PIC32MX5XX/6XX/7XX Controller offen 
mit der Pinbelegung und recht viel mehr kann ich momentan auch nicht 
rauslesen)

von Benjamin (Gast)


Lesenswert?

Ich bins nochmal.

Ich habe das ganze jetzt umgebaut und auf "INT1" gestellt. Ich habe die 
Dokumentation zu den Interrupts beim PIC gelsen, bin jedoch damit nich 
ganz glücklich. Mein Code ist aktuell so:
1
PORTEbits.RE8 = 1;
2
INTConfigureSystem(INT_SYSTEM_CONFIG_MULT_VECTOR);
3
INTEnableInterrupts();
4
IEC0CLR = 0x00000080;       // deaktivieren
5
IPC0 = 0x00001E00;          // Konfiguration
6
INTCONCLR = 0x00001002;     // Konfiguration
7
IFS0CLR = 0x00000080;       // Reset
8
IEC0SET = 0x00000080;       // aktiveren

Dabei erhalte ich nach kurzer Zeit folgende Meldung in der "Debugger 
Console":
No source code lines were found at current PC 0x9d04e03c

In der Map-File steht, dass 0x9d04e03c der "_DefaultInterrupt" ist.

Hat da jemand eine Idee, was falsch sein könnte?

von Benjamin (Gast)


Lesenswert?

Nach langem Ausprobieren, bin ich dem Problem nun einiges näher kommen. 
Ich benutze wie viele andere auch, das Etherner Starter Kit.
Dabei gibt es folgende Probleme mit den verschiedenen Interrupts des 
PICs:
INT4: Wird für die Ethernet-Kommunikation benötigt (Transmit -> TX)
INT3: Ist der externe Clock für die Ethernet-Kommunikation 
(standardmäßig wird diese benutzt!)
INT2: Wird für die Ethernet-Kommunikation benötigt (Receive -> RX)
INT1: Wird für die Ethernet-Kommunikation benötigt (Receive -> RX)
INT0: Ist mit der LED1 verbunden.

Gerade versuche ich mit INT0 zu arbeiten. Nachdem ich den Pin als 
Eingang umfunktioniert habe, sieht man nun, dass die LED leuchtet (mein 
Pegel ist standardmäßig auf High -> also OK!). Lege ich den Pegel auf 
Low geht die LED aus, der Interrupt wird jedoch nicht ausgeführt. Habt 
Ihr da noch eine Idee?

Aktueller Code:
1
PORTDbits.RD0 = 1;
2
// Interrupt
3
INTConfigureSystem(INT_SYSTEM_CONFIG_MULT_VECTOR);
4
INTEnableInterrupts();
5
mINT0ClearIntFlag();
6
mINT0SetIntPriority(7);
7
mINT0SetEdgeMode(0);
8
mINT0IntEnable(0);
1
void __ISR(_EXTERNAL_0_VECTOR, ipl7) ExternalInterruptHandler0(void)
2
{
3
    LED2_IO ^= TRUE;
4
    DBPRINTF("INT4 \n");
5
    mINT0ClearIntFlag();
6
}

Weder eine Ausgabe noch ein LED blinken erfolgt -> Interrupt wird also 
nicht ausgeführt!!!

von Benjamin (Gast)


Lesenswert?

Durch die LED und den LED-Vorwiderstand wird das Ergebnis verfälscht un 
der Pegel nicht auf Low heruntergezogen.

Man hat nur die Möglichkeit die LED auszulöten.

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.