Interrupt in h Datei auslagern

OP #3266295
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
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
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.
Valerie D. schrieb:
>> Für eine ISR brauchst du keine header datei
>
> Ok. Dann belässt man die Interrupt Routinen also immer im "main-file"?

Nein. Aber auch nicht in einer ".H" Datei, sondern in einer (weiteren) 
".c" Datei. Spätestens dann sollte man auch über ein Makefile 
nachdenken, wenn man keine IDE benutzt.
spontan schrieb:
> Machen kann man alles, wenns in Deiner Applikatin nicht stört, lass es
> drin.

Ich finde es durchaus ok, Anfänger auf schlechten Programmier-Stil 
hinzuweisen.
Wie sollen sie es sonst richtig lernen.
Daß "Frickelei manchmal funktioniert" haben die Meisten schon leidvoll 
erfahren müssen.
OP
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
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
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

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.