Forum: Mikrocontroller und Digitale Elektronik Interrupt in h Datei auslagern


von Valerie D. (valerie)


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
}

von Timmo H. (masterfx)


Lesenswert?

Für eine ISR brauchst du keine header datei (bzw keinen Prototyp) da die 
ISR nicht im Programm aufgerufen wird sondern direkt von der Hardware 
angesprungen wird.

Aber delays in eine ISR einzubauen ist böse!

von Valerie D. (valerie)


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

von Ingo (Gast)


Lesenswert?

Nunja, man sollte interrupts schon zu den Modulen packen, in denen sie 
verwendet werden, z.B. Uart-Interrupts in die Uart.c stecken!

von spontan (Gast)


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.

von Jim M. (turboj)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

Valerie D. schrieb:
> Ok. Dann belässt man die Interrupt Routinen also immer im "main-file"?

Warum? Pack sie in eine C Datei, die mit kompiliert wird.

Valerie D. schrieb:
> Wie kann ich das denn dann anders lösen?

Mit einem Timer.
Entprellung 3.3 Timer-Verfahren (nach_Peter_Dannegger)

von Harry L. (mysth)


Lesenswert?

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.

von Valerie D. (valerie)


Lesenswert?

Wolfgang schrieb:
> Pack sie in eine C Datei, die mit kompiliert wird.

Ok.

Wolfgang schrieb:
> 3.3 Timer-Verfahren (nach_Peter_Dannegger)

Danke für den Hinweis. Werde ich versuchen umzusetzen.

Harry L. schrieb:
> Ich finde es durchaus ok, Anfänger auf schlechten Programmier-Stil
> hinzuweisen.

Find ich auch ;-)

Danke für die super Resonanz.

Valerie

von Valerie D. (valerie)


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

von Timmo H. (masterfx)


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.

von Valerie D. (valerie)


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.

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.