Hallo, ich habe ein Problem mit dem MSP30F449, das ich einfach nicht lösen kann. Ich habe das Olimex Development Board für den F449 mit LCD (MSP430-F449STK2) und versuche gerade ein Testprogramm für das LCD zu schreiben. Programmiert wird das ganze mit IAR Workbench und dem MSP_FET430UIF von TI. Nun zum Problem: Lade ich das Beispielprogramm von der Olimex Webpage auf den MSP430 läuft alles problemlos. Sowohl mit Spannungsverorgung durch das Programmiergerät als auch mit abgeklemmten Programmer und externer Spannungsversorgung. Lade ich mein eigenes Testprogramm herunter, dann funktioniert es mit angeschlossenem Programmiergerät wie es soll. Mit externer Spannungsversorgung und ohne Programmiergerät tritt jedoch ein Fehler auf: Das Programm scheint zwar mehr oder weniger richtig abzulaufen, jedoch ist die Anzeige im LCD nur kurz bei Wechsel sichtbar und verblasst dann sofort. Versorge ich das ganze wieder durch das Programmiergerät bleibt der Fehler bestehen. Erst wenn ich ein anderes Programm aufspiele und dann wieder das Testprogramm läuft alles wieder normal. Ich würde mich freuen, wenn irgendjemand hier dazu einen Lösungsvorschlag hätte.
Da würde ich mal checken: - welcher Oszillator ohne Programmiergerät läuft (s. Datasheet) - ob bei ext. Oscillator das Tuningflag abgewartet wird, damit dieser stabil läuft, bevor es weitergeht, Bisschen wenig Infos, Quelltexte wären hilfreich.
Ggf. der Watchdog, der bei angestecktem Debugger deaktiviert wird?
Anbei mal der Code. Watchdog wird einfach angehalten. Eigentlich ist der ganze Code ja so kurz, dass ich darin keine Ursache finde. Das Verhalten zeigen beide meiner zwei Platinen, Programmiergerät habe ich gerade nur eins.
1 | #include "io430x44x.h" |
2 | #include <intrinsics.h> |
3 | #include <stdint.h> |
4 | |
5 | #define LCDMEMS 20
|
6 | uint8_t * const LCDMem = ( uint8_t * ) &LCDM1; |
7 | |
8 | void InitLCD (void); |
9 | |
10 | int main( void ) |
11 | {
|
12 | // Stop watchdog timer to prevent time out reset
|
13 | WDTCTL = WDTPW + WDTHOLD; |
14 | FLL_CTL0 = XCAP18PF; |
15 | BTCTL |= BTFRFQ1; //Flcd = ACLK /128; |
16 | InitLCD(); |
17 | //alle Elemente d LCD anschalten
|
18 | for (int i = 0; i < LCDMEMS; ++i) { |
19 | LCDMem[i] = 255; |
20 | }
|
21 | |
22 | __low_power_mode_3(); |
23 | |
24 | return 0; |
25 | }
|
26 | |
27 | void InitLCD (void) |
28 | {
|
29 | int i; |
30 | for ( i = 0; i < LCDMEMS; ++i) { |
31 | LCDMem[i] = 0; |
32 | }
|
33 | P5SEL = 0XFC; |
34 | LCDCTL = LCDP0 | LCDP1 | LCDP2 | LCDMX0 | LCDMX1 | LCDSON | LCDON; // S0-S39, 4Mux, LCD an |
35 | }
|
mfg
Ich würde einmal in der main() eine Endlos-Schleife implementieren und den Low-Power-Mode unterbinden.
Ich scheine die Lösung gefunden zu haben:
1 | BTCTL |= BTFRFQ1; |
BTCTL wird bei einem Reset nicht auf einen definierten Ausgangswert zurückgesetzt. Ohne das ODER funktioniert es. Vielen Dank für eure Unterstützung.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.