Forum: Mikrocontroller und Digitale Elektronik msp430 lmp4 timer


von lukas s. (lukas_s46)


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

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

lukas s. schrieb:
> übernimmt er die set_Cycles(20); nicht

Wie stellst Du das fest?

von lukas s. (lukas_s46)


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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Wie sieht Deine Hardware aus?


Ansonsten:
1
  _BIS_SR(GIE);
2
  _BIS_SR(LPM3_bits + GIE);  // <--
3
  for(;;)
4
  {
5
    set_Cycles(20);
6
    Device_MSP430F5137_Go_To_Sleep();

Damit schickst Du Deinen MSP430 schon schlafen, bevor Du _Go_To_Sleep 
aufrufst.

von lukas s. (lukas_s46)


Lesenswert?

ich benutze den 
MSP430-CCRFLCD(http://www.mcmelectronics.com/product/OLIMEX-MSP430-CCRFLCD-/83-14825) 
von Olimex.
 Wenn ich die Zeile
1
_BIS_SR(LPM3_bits + GIE);
auskommentiere habe ich wieder unstetiges Verhalten.
Per Launchpad funktioniert es - ohne geht er nur noch sehr kurz in lpm3 
und wacht sofort wieder auf...

Danke für dich Hilfe!,
Lukas

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Womit erzeugst Du den Takt für das System?

Irgendwie fehlt mir in Deiner main die Initialisierung der 
Takterzeugung.

von Horst (Gast)


Lesenswert?

Per default ist der DCO aktiv mit knapp nem MHz.

von Horst (Gast)


Lesenswert?

Ach...seh grad...ACLK. Haste da was dran?

von LPM (Gast)


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.

von lukas s. (lukas_s46)


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

von Oscar K. (sieges)


Lesenswert?

Horst schrieb:
> Ach...seh grad...ACLK. Haste da was dran?
Das ist die entscheidende Frage und vor allem wie dein Init dazu 
aussieht.
cheers

von LPM (Gast)


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.

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
Noch kein Account? Hier anmelden.