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
voidDebounceDelay(void);// Software delay
10
11
12
intmain(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
__interruptvoidP2_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
elseif(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
elseif(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
elseif(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
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!
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
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.
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)
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.
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
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:
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.
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.