Interrupt in h Datei auslagern

OP #3266295
Lesenswert?

Hallo,

Ich habe an einem MSP 430 2272 4 Taster (an Port 2) und 8 Led´s (an Port 
1) angeschlossen.
Nun habe ich eine interrupt routine geschrieben, mit der ich bestimmte 
Led´s an und ausmachen kann.

Ich weiß nun aber nicht, wie ich meine interrupt routine in eine h und c 
Datei auslagern kann.
Wäre über eine Hilfestellung dankbar.
Hier ist noch mein aktueller Code:
1
#include "io430.h"
2
#include "LedLauflichter.h"
3

4
#ifndef __IAR_SYSTEMS_ICC__
5
#include <signal.h>
6
#endif
7

8
// Function prototypes
9
void DebounceDelay(void);     // Software delay
10

11

12
int main(void)
13
{
14
  WDTCTL = WDTPW + WDTHOLD;   // Stop watchdog timer
15

16
  P1DIR = 0xFF;               // P1.0-P1.7 as output
17
  P2IES = 0x27;               // interrupt edge select for P2 input pins hi/lo
18
  P2IE = 0x27;                 // interrupt enable for P2 input pins
19
  __enable_interrupt();       // enable general interrupt
20

21
  for(;;) {
22
    
23
  }
24
 
25
}
26

27
// interrupt service routine for Port2
28
#ifdef __IAR_SYSTEMS_ICC__
29
#pragma vector=PORT2_VECTOR
30
__interrupt void P2_ISR(void)
31
#else
32
interrupt (PORT2_VECTOR) P2_ISR(void)
33
#endif
34
{
35
   DebounceDelay();                           // call delay subroutine
36
   if(P2IFG & 0x01)                           // P2.0 caused the interrupt?
37
   {                     
38
      Lauflicht();
39
      P2IFG &= ~ 0x01;                       // yes, toggle P1.0 and reset P2.0 interrupt flag
40
   }
41
   else if(P2IFG & 0x02)                     // or P2.1 caused the interrupt?
42
   {            
43
      P1OUT ^= 0x02; 
44
      P2IFG &= ~ 0x02;                       // yes, toggle P1.1 and reset P2.1 interrupt flag
45
   }
46
   else if(P2IFG & 0x04)                     // or P2.2 caused the interrupt?
47
   {            
48
      P1OUT ^= 0x04; 
49
      P2IFG &= ~ 0x04;                       // yes, toggle P1.2 and reset P2.2 interrupt flag
50
   }
51
   else if(P2IFG & 0x10)                     // or P2.5 caused the interrupt?
52
   {            
53
      P1OUT ^= 0x10; 
54
      P2IFG &= ~ 0x20;                       // yes, toggle P1.3 and reset P2.5 interrupt flag
55
   }
56
}
57

58
void DebounceDelay(void)
59
{
60
  volatile unsigned int i;
61
  for (i = 50000; i > 0; i--);
62
}
OP #3266309
Lesenswert?

Timmo H. schrieb:
> Für eine ISR brauchst du keine header datei

Ok. Dann belässt man die Interrupt Routinen also immer im "main-file"? 
Ich dachte der übersichtlichkeit wegen lagere ich diese aus.

Timmo H. schrieb:
> Aber delays in eine ISR einzubauen ist böse!

Warum? könntest du mir das erklären?
Eigentlich soll das der Taster Entprellung dienen.
Wie kann ich das denn dann anders lösen?

Valerie
Gast #3266316
Lesenswert?

Tasten mit Interrrupt ist böse, Delay ist im Interrupt böse.

Das sind hier die geltenden Meinungen.

Machen kann man alles, wenns in Deiner Applikatin nicht stört, lass es 
drin.

Wenn Du es aber besser machen willst, dann schau hier ins Tutorial.
OP #3270000
Lesenswert?

Hallo nochmal,

Ich scheitere leider am Versuch, den Interrupt für Port 2 in eine eigene 
C datei auszulagern. Wenn ich meinen "interrupt code" in der main stehen 
habe funktioniert es. Packe ich es in eine eigene C datei, so bekomme 
ich folgenden Fehler:

Error[Pe159]: declaration is incompatible with previous "DebounceDelay" 
(declared at line 15)

Hier noch der Code der .c Datei:
1
#include "io430.h"
2

3
#ifndef __IAR_SYSTEMS_ICC__
4
#include <signal.h>
5
#endif
6

7
// interrupt service routine for Port2
8
#ifdef __IAR_SYSTEMS_ICC__
9
#pragma vector=PORT2_VECTOR
10
__interrupt void P2_ISR(void)
11
#else
12
interrupt (PORT2_VECTOR) P2_ISR(void)
13
#endif
14
{
15
   DebounceDelay();                          
16
   if(P2IFG & 0x01)                          
17
   {                     
18
      P1OUT ^= BIT0; 
19
      P2IFG &= ~ BIT0;                       
20
    
21
   }
22
   else if(P2IFG & 0x02)                     
23
   {            
24
      P1OUT ^= BIT1; 
25
      P2IFG &= ~ BIT1;                       
26
   }
27
   else if(P2IFG & 0x04)                     
28
   {            
29
      P1OUT ^= BIT2; 
30
      P2IFG &= ~ BIT2;                       
31
   }
32
   else if(P2IFG & 0x20)                     
33
   {            
34
      P1OUT ^= BIT3; 
35
      P2IFG &= ~ BIT5;                       
36
   }
37
}
38

39
void DebounceDelay(void)
40
{
41

42
volatile unsigned int i;
43
  for (i = 50000; i > 0; i--);
44
}

Valerie
#3270015
Lesenswert?

Entweder du machst einen Prototypen über die ISR für DebounceDelay 
(sonst kennt die ISR die Funktion ja nicht).

-oder du packst die gesamte Funktion DebounceDelay über deine ISR, dann 
brauchst du keinen Prototyp.

-oder packst die DebounceDelay wiederum in eine eigene C-Datei (z.B. 
debounce.c) und machst eine entsprechende Header-Datei (z.B. debounce.h) 
mit dem Prototyp für DebounceDelay, welche du dann wiederum in der 
C-Datei in der sich die ISR befundet includest. Dann hättest du 
gleichzeitig den Vorteil, das du deine DebounceDelay auch in anderen 
Funktionen durch einbinden des entsprechenden headers verwenden kannst.

Oder aber du kaufst dir einfach mal ein C-Buch.
OP #3270047
Lesenswert?

Timmo H. schrieb:
> -oder packst die DebounceDelay wiederum in eine eigene C-Datei (z.B.
> debounce.c) und machst eine entsprechende Header-Datei (z.B. debounce.h)
> mit dem Prototyp für DebounceDelay, welche du dann wiederum in der
> C-Datei in der sich die ISR befundet includest. Dann hättest du
> gleichzeitig den Vorteil, das du deine DebounceDelay auch in anderen
> Funktionen durch einbinden des entsprechenden headers verwenden kannst.

Danke Timmo, hat funktioniert.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren