Moin, ich benutze den MSP430 FG4619, und möchte einen Tastendruck per Interrupt abfangen. Alles ist soweit initialisert, mit Port1 funktioniert das auch, nur die Taster an Port 2 bringen nicht das gewünschte Ergebnis. Eine Vermutung ist jetzt: Die Funktion selbst wird in den Speicherbereich der Adresse Port2_vector geschrieben, und der Speicher reicht dort nicht. (Beim Interrupt fuer Port2 steht mehr Code) Oder ist der mspgcc schlau genug, und packt die Funktion woanders hin? Dann müsste ich den Fehler woanders suchen. Vom Interrupt scheint er auch ncihr zurückzuspringen. Dass mspgcc handbuch sagt: "push pc,sr on stack...Fetch the interrupt vector into the PC" - was sagt mir das jetzt?
Ohne Deinen Sourcecode zu sehen, und zu sehen, wie Du die Interrupthandler deklariert hast, können wir nur unsere Glaskugeln polieren.
In der Init:
1 | // Taster Interrupts
|
2 | P1IE |= 0x20; // Pin 1.5 |
3 | P2IE |= 0xBF; // alle Pins |
4 | |
5 | // Edge selection; falling edge
|
6 | P1IES |= 0x20; |
7 | P2IES |= 0xBF; |
Interrupt Funktionen
1 | interrupt (PORT1_VECTOR) pin1interrupt(void) |
2 | {
|
3 | P1IFG = 0; |
4 | showNumber('a'); |
5 | wait(65535); |
6 | wait(65535); |
7 | wait(65535); |
8 | showNumber('o'); |
9 | wait(65535); |
10 | wait(65535); |
11 | wait(65535); |
12 | if(P1IFG && 0x20) |
13 | decrOff2(); |
14 | P1IFG = 0; |
15 | }
|
16 | |
17 | interrupt (PORT2_VECTOR) pin2interrupt(void) |
18 | {
|
19 | P2IFG = 0; |
20 | showNumber('b'); |
21 | wait(65535); |
22 | wait(65535); |
23 | wait(65535); |
24 | showNumber('o'); |
25 | wait(65535); |
26 | wait(65535); |
27 | wait(65535); |
28 | if(P2IFG && 0x80) |
29 | incrOff2(); |
30 | if(P2IFG && 0x40) |
31 | incrOff2(); |
32 | P2IFG = 0; |
33 | }
|
Es geht aber eigtl. um den compiler mspgcc...
Die Deklaration ist richtig für den GCC. Hast du signal.h includiert? Und solche ewigen Waits in der ISR sind ein absolutes No-Go.
> Und solche ewigen Waits in der ISR sind ein absolutes No-Go.
Die werden auch das Problem sein. Zusätzlich zum Aufruf der ominösen
Funktion "showNumber", die merkwürdigerweise Buchstaben übergeben
bekommt.
Das Design ist kaputt.
Die vielen waits sind für das debuggen gedacht, ebenso wie die Funktion showNumbers, welche eine Zahl auf 7-Segment anzeigen darstellt. Es funktioniert witzigerweise, wenn ich die Frequenz des Controllers "runterdrehe". Vermutlich sind also die wait Aufrufe (?) daran schuld. Ist sehr schlecht zu debuggen. Ja, signal.h ist inkludiert. Danke für die Hilfe Christian und Rufus. Ich denke, ich komme jetzt klar.
Dann bau doch in deine Main routine eine Statemaschine. Diese Steuerst du dann von deinen Interrupten aus an und du kannst wunderbar debuggen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.