Hallo zusammen,
vielen Dank für die zahlreichen Tipps!
@Peter
"Nach goto_lpm läuft Dein Programm aus dem Main raus - ganz schlecht!"
Die haupt_routine() ist immer noch ausserhalb der main(),
ist das im unten gezeigten Code noch ein Problem?
@Falk
danke für die HW Lösung, die war mir schon bekannt.:-)
Wie kann ich sicherstellen (messen) dass ich keinen Interrupt auslasse?
Angenommen die haupt_routine() dauert so lange, dass schon wieder ein
Interrupt ansteht.
Ich habe meine Struktur wie folgt angepasst.
Es würde mich freuen, wenn Ihr mir hiezu noch euren Kommentar geben
könnt.
1 | // #includes, #defines etc.
|
2 |
|
3 | void main(void) //wird nur einmal nach power on reset durchlaufen
|
4 | {
|
5 | // Initialisierung BasicTimer1
|
6 | // erzeugt alle 976,5µs einen Interrupt
|
7 |
|
8 | // sowie sonstige Initialisierungen
|
9 | // alles was vor der Hautproutine nur einmalig passiert
|
10 |
|
11 | haupt_routine();
|
12 | }
|
13 |
|
14 | void haupt_routine(void)
|
15 | {
|
16 | for (;;) // Hauptschleife forever
|
17 | {
|
18 | // hier wird auch nach der ISR weitergemacht
|
19 | // ggf. µC-Pin setzen für Laufzeitmessung
|
20 |
|
21 | if (10ms Flag gesetzt?)
|
22 | {
|
23 | // hier alles rein was alle 10ms erledigt werden muss
|
24 | // z.B. Schalter abfragen, Sensoren abtasten etc.
|
25 | }
|
26 | if (1000ms Flag gesetzt?)
|
27 | {
|
28 | // hier alles rein was jede Sekunde erledigt werden muss
|
29 | // z.B Uhr aktualisieren (Sekunde++) etc.
|
30 | }
|
31 |
|
32 | // ggf. µC-Pin rücksetzen für Laufzeitmessung
|
33 |
|
34 | LPM3; // µC in Low Power Mode (LPM) versetzen
|
35 | }
|
36 | }
|
37 |
|
38 |
|
39 | #pragma vector=BASICTIMER_VECTOR
|
40 | __interrupt void basic_timer_ISR(void)
|
41 | {
|
42 | // Aufruf alle 976,5µs
|
43 | // In der ISR NUR Flags setzen!
|
44 |
|
45 | if (10mal aufgerufen) // dann 10ms_Flag setzen
|
46 | if (1024mal aufgerufen) // dann 1000ms_Flag setzen
|
47 |
|
48 | LPM3_EXIT; // erst mal wach bleiben
|
49 | }
|