Hallo,
ich komme gerade bei einer Hausaufgabe für die Uni nicht weiter.
Es wäre nett wenn mir jemand dabei helfen könnte.
Aufgabe:
Man soll eine grüne LED mit f = 4 Hz blinken lassen. (Die rote LED habe
ich nur zum Debuggen hinzugeschaltet)
Falls man den Button drückt, dann soll der Controller in einen
künstlichen Deadlock geraten und nach 5,5 Sekunden durch den Watchdog
Timer zurückgesetzt werden. Um den Watchdog Timer zu initialisieren,
soll man ACLK als Watchdog Timer Source benutzen und das Watch Dog Timer
Control Register entsprechend setzen.
Achso, ACLK hat eine Frequenz von 32768 Hz.
Hier wäre mein Code dazu:
1 | #include <msp430g2553.h>
|
2 |
|
3 | int buttonPressed;
|
4 |
|
5 | int main(void)
|
6 | {
|
7 | WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
|
8 |
|
9 | // initialization of the basic clock module
|
10 | BCSCTL3 |= LFXT1S_2;
|
11 |
|
12 | // initialization of wdtctl register
|
13 | WDTCTL = (WDTPW | WDTSSEL | WDTCNTCL );
|
14 |
|
15 | // P1.4 -> output to red LED
|
16 | // P1.0 -> output to green LED
|
17 | P1DIR |= BIT0;
|
18 | P1DIR |= BIT4;
|
19 |
|
20 | // Initialization for interrupts
|
21 | // P1.3 -> input of button
|
22 | P1SEL &= (~BIT3); // set P1.3 SEL as GPIO
|
23 | P1DIR &= (~BIT3); // set P1.3 SEL as Input
|
24 | P1IES |= (BIT3); // falling edge 1 -> 0
|
25 | P1IFG &= (~BIT3); // clear interrupt flag for P1.3
|
26 | P1IE |= (BIT3); // enable interrupt for P1.3
|
27 | P1REN |= BIT3; // enable pull-up/-down resistor
|
28 |
|
29 | __enable_interrupt();
|
30 |
|
31 | buttonPressed = 0;
|
32 |
|
33 |
|
34 | while (1) {
|
35 | P1OUT ^= BIT0;
|
36 | if (buttonPressed == 1) {
|
37 | P1OUT ^= BIT4;
|
38 | P1OUT = 0x00;
|
39 | buttonPressed = 0;
|
40 | while (1) {
|
41 | // artificially created dead-lock
|
42 | }
|
43 | } else {
|
44 | // f = 4 Hz => T = 1 s / 4 Hz = 250 ms
|
45 | __delay_cycles(250000);
|
46 | }
|
47 | WDTCTL = (WDTPW | WDTSSEL | WDTCNTCL ); // feed the dog
|
48 | }
|
49 | }
|
50 |
|
51 |
|
52 | // Port 1 interrupt vector
|
53 | #pragma vector = PORT1_VECTOR
|
54 | __interrupt void Port_1(void)
|
55 | {
|
56 | buttonPressed = 1;
|
57 | P1IFG &= ~BIT3; // clear interrupt flag
|
58 | }
|
Probleme/Fragen hierzu:
- Wenn ich den Button drücke, dann hört die rote und die grüne LED für
ein paar Sekunden auf zu blinken. Woraus ich schlussfolgere dass sich
der Controller im Deadlock befindet. Danach blinkt nur noch die grüne
LED und wenn ich den Button nochmal drücke, scheint der Controller nicht
darauf zu reagieren, also es ändert sich nichts mehr an dem Zustand.
Woran liegt das, was genau ist passiert?
- Wie kann ich gewährleisten dass der Watchdog den Deadlock nach exakt
5,5 Sekunden zurücksetzt?
- Fallen jemandem irgendwelche Fehler bei meinem Code auf?
ps: Ich erwarte natürlich nicht dass hier jemand meine Aufgabe für mich
löst. Ein paar hilfreiche Antworten erhoffe ich mir allerdings schon :)