Hallo Zusammen,
ich bin gerade dabei eine eigene Firmware für meine ez430 Chronos zu
schreiben. Damit die Knopfzelle lange hält, soll der Prozessor zur
größten Zeit im Stromsparmodus(LPM3) verbleiben. Zum Testen habe ich
folgenden Code gschrieben (MSPGCC)
1 | #include "cc430x613x.h"
|
2 | #include <signal.h>
|
3 | #include <stdlib.h>
|
4 | #include "lcd.h"
|
5 |
|
6 |
|
7 |
|
8 | interrupt (WDT_VECTOR) WDTServiceRoutine(void) {
|
9 | SFRIFG1 &= ~WDTIFG;
|
10 | }
|
11 |
|
12 | void main(void)
|
13 | {
|
14 | P5SEL |= 0x03; // Select XIN, XOUT on P5.0 and P5.1
|
15 | UCSCTL6 &= ~XT1OFF; // XT1 On, Highest drive strength
|
16 | //UCSCTL6 &= ~XCAP_3;
|
17 | do
|
18 | {
|
19 | UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
|
20 | SFRIFG1 &= ~OFIFG; // Clear fault flags
|
21 | } while ((SFRIFG1 & OFIFG));
|
22 | PMMCTL0_H = 0xA5;
|
23 | PMMCTL0_L |= PMMHPMRE;
|
24 | PMMCTL0_H = 0x00;
|
25 |
|
26 | WDTCTL = WDT_ADLY_1000; //WDT auf 1 sec aufziehen
|
27 | SFRIE1 |= WDTIE; // WDT int ein
|
28 | initlcd();
|
29 | _EINT(); //INTs aktivieren
|
30 | LCDM1 |= (1<<5);
|
31 | while(1) {
|
32 | LCDM1 ^= (1<<7);
|
33 | LPM3; //schlafen legen
|
34 |
|
35 |
|
36 |
|
37 |
|
38 | }
|
39 | __no_operation(); // For debugger
|
40 | }
|
Dieser soll im 1sec-Takt ein Segment toggeln. Das segment bleibt jedoch
an.
Wenn ich das Seg-Togglen in den INT verlager, dann geht's. In der
Originalen Firmware sieht das ganze aber ungefähr so aus:
1 | while(1)
|
2 |
|
3 | {
|
4 |
|
5 | // When idle go to LPM3
|
6 |
|
7 | idle_loop();
|
8 |
|
9 |
|
10 |
|
11 | // Process wake-up events
|
12 |
|
13 | if (button.all_flags || sys.all_flags) wakeup_event();
|
14 |
|
15 |
|
16 |
|
17 | // Process actions requested by logic modules
|
18 |
|
19 | if (request.all_flags) process_requests();
|
20 |
|
21 |
|
22 |
|
23 | // Before going to LPM3, update display
|
24 |
|
25 | if (display.all_flags) display_update();
|
26 |
|
27 | }
|
idle_loop(); macht de facto nichts anderes als LPM3;
Was mache ich falsch bzw. welches Bit in welchem Register habe ich
übersehen.
PS: Kann mir jemand ein GUTES und tiefgängiges MSP430-Tutorial von
ähnlicher Qualität wie das AVR(GCC)-Tutorial empfehlen?