msp430 lmp4 timer

OP #3496301
Lesenswert?
• ▲
▼
Hallo,
ich habe ein sehr seltsames Problem mit dem msp430f5137.
Ich versuche etwas ähnliches wie hier: 
Beitrag "MSP430  Interrupts zählen (Herzfrequenz)" zu realisieren
mein code:
1
unsigned int interruptCounter = 0;
2
volatile unsigned int cycles = 2;
3

4
void Device_MSP430F5137_InitClock(int period){
5
 TA0CTL = 0x0004;   // Timer1_A3 clear.
6
 TA0CCTL0 = CCIE; // Timer1_A3 Capture/compare 0 interrupt enable.
7
 TA0CCR0 = period;  // Set TACCR0 value (8Hz//3d09) (1Hz 0x07A1)
8
 TA0CTL = TASSEL_1 + MC_1 + ID_3;   // Selected: ACLK, divider:8, Up mode.
9
}
10

11
void Device_MSP430F5137_Go_To_Sleep(){
12
 Device_MSP430F5137_InitClock(0x3d09);
13
 LED_CLR(1);
14
 _BIS_SR(LPM3_bits + GIE);
15
}
16

17
void set_Cycles(volatile unsigned int seconds){
18
 cycles = seconds;
19
}
20

21
void delay(volatile unsigned int i) { // volatile prevents unused loop to be pruned by optimizations
22
 while (i--);
23
}
24

25
void main(void) {
26
 _BIC_SR(GIE);
27
 WDTCTL = WDTPW + WDTHOLD;
28
 Device_MSP430F5137_InitClock(0x2EE0);
29
/**
30
some led init stuff
31
**/
32
 _BIS_SR(GIE);
33
 _BIS_SR(LPM3_bits + GIE);
34
 for(;;){
35
set_Cycles(20);
36
  Device_MSP430F5137_Go_To_Sleep();
37
 }
38

39
}
40

41
#pragma vector=TIMER0_A0_VECTOR
42
__interrupt void TimerA0_interrupt(void){
43
 interruptCounter++;
44
 if(interruptCounter==cycles){
45
  interruptCounter=0;
46
  _BIC_SR(LPM3_EXIT);
47
  LED_SET(1);
48
 }
49
}
So jetzt zum Problem ;)
Wenn ich das ganze über mein launchpad debugge funktioniert es wie 
gewollt.
Wenn ich den mController aber mit externer stromversorgung(usb ohne 
debug) starte übernimmt er die set_Cycles(20); nicht.

hat jemand eine Idee woran das liegen könnte?
Liebe Grüße
Lukas
OP #3496310
Lesenswert?
• ▲
▼
naja, wenn ich ihn mit dem debugger starte sieht der programmablauf etwa 
so aus:
~10 sekunden lang passiert nichts,
das led blinkt kurz,
~1,5 minuten lang passiert nichts,
das led blinkt kurz,
~1,5 minuten lang passiert nichts,
das led blinkt kurz,
...

wenn ich ihn per usb strom starte sieht das ganze dann so aus:
~10 sekunden lang passiert nichts,
das led blinkt kurz,
~10 sekunden lang passiert nichts,
das led blinkt kurz,
~10 sekunden lang passiert nichts,
das led blinkt kurz,
....

Liebe Grüße
Lukas
Gast #3496764
Lesenswert?
• ▲
▼
lukas s. schrieb:
> void main(void) {
>  _BIC_SR(GIE);
>  WDTCTL = WDTPW + WDTHOLD;
_BIC... ist nicht nötig. Nach Reset ist das Bit gelöscht.

lukas s. schrieb:
> _BIS_SR(GIE);
>  _BIS_SR(LPM3_bits + GIE);
_BIS_SR(LPM3... wurde schon gesagt. Ist zuviel, einfach löschen.

und das Ergebnis passt doch:
lukas s. schrieb:
> wenn ich ihn per usb strom starte sieht das ganze dann so aus:
> ~10 sekunden lang passiert nichts,
> das led blinkt kurz,
> ~10 sekunden lang passiert nichts,
> das led blinkt kurz,
> ~10 sekunden lang passiert nichts,
> das led blinkt kurz,
> ....

Das mit dem Launchpad kommt mir eher spanisch vor.
OP #3497045
Lesenswert?
• ▲
▼
Danke für die Antworten,

>  _BIS_SR(LPM3_bits + GIE);
_BIS_SR(LPM3... wurde schon gesagt. Ist zuviel, einfach löschen.

Ich habe nicht das ganze Script hier hoch geladen, weil es dann zu 
unübersichtlich geworden wäre, aber es macht schon Sinn, weil ich möchte 
das das System nach dem Start erst mal wieder ein schläft.

Das hier war aber tatsächlich 2 mal zu viel ;)
>  _BIC_SR(GIE);

>  Das mit dem Launchpad kommt mir eher spanisch vor.
Ich konnte den Fehler jetzt lokalisieren und es ist wohl so, dass
1
volatile unsigned int cycles = 2;
beim eintreten in lpm3 resettet/auf null gesetzt wird oder was auch 
immer - das konnte ich noch nicht genau feststellen. (in der debug 
session passiert das wohl nicht)

Benutze ich stattdessen lpm0 funktioniert es wie gewünscht.

Wo speichert man solche werte gewöhnlich? Ist es sinnvoll den Wert in 
der Interruptroutine den Flashspeicher zu schreiben/lesen?

Liebe Grüße
Lukas
Gast #3498392
Lesenswert?
• ▲
▼
lukas s. schrieb:
> Ich habe nicht das ganze Script hier hoch geladen

Dann kann man dir nicht helfen. :-(((
Der Fehler steckt meistens in den Zeilen, dien nicht gepostet werden.

lukas s. schrieb:
> Ich konnte den Fehler jetzt lokalisieren und es ist wohl so,
> dassvolatile unsigned int cycles = 2;
> beim eintreten in lpm3 resettet/auf null gesetzt wird oder was auch
> immer - das konnte ich noch nicht genau feststellen. (in der debug
> session passiert das wohl nicht)

oder eine übersinnliche Erscheinung. ;-D

lukas s. schrieb:
> Benutze ich stattdessen lpm0 funktioniert es wie gewünscht.

Und wo unterscheiden sich die beiden LPMs? Achte einmal auf die 
Takterzeuger.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.