Forum: Mikrocontroller und Digitale Elektronik MSP430F2274 LPM3 Clock ohne externen Oszi


von Daniel L. (daniel_l)


Lesenswert?

Hallo zusammen,

Ich bekomme den ACLK nicht zum Laufen. Wir wollen extrem Energie sparen 
und den LPM3 benutzen. Externer Osci ist nicht mehr möglich, da Platine 
fertig aufgebaut. Der wacht nicht mehr auf, weil der Clock nicht läuft.


Hier der Code:

BCSCTL3 = LFXT1S1 + LFXT1S_2;                      // LFXT1 = VLO
IFG1 &= ~OFIFG;                           // Clear OSCFault flag
TACCR0 = 10;
TAR = 0;
TACTL = TASSEL_1 + MC_1;
__bis_SR_register(LPM3_bits + GIE);

Ich wäre für jede Hilfe Dankbar.

Vielen Dank

von Christian R. (supachris)


Lesenswert?

Das wird ohne externe Quelle am ACLK nix, denn im LPM3 ist der interne 
DCO deaktiviert. Keine Chance. Mit dem DCO kannst du höchstens auf LPM2 
runter gehn.

von S. Z. (szimmi)


Angehängte Dateien:

Lesenswert?

Doch doch, das wird schon was mit dem VLO. Ersetze mal
BCSCTL3 = LFXT1S1 + LFXT1S_2;
durch
BCSCTL3 |= LFXT1S_2;
wie im angehaengten Beispiel.

von Christian R. (supachris)


Lesenswert?

Ach stimmt, der F2274 hat ja noch den VLO...hatte ich ganz vergessen.

von Daniel L. (daniel_l)


Lesenswert?

Vielen Dank für die Antworten. Ich habe das jetzt geändert, aber der 
Timer A will leider noch immer nicht zählen, dem zu folge wacht er nicht 
mehr auf.

von Daniel L. (daniel_l)


Angehängte Dateien:

Lesenswert?

Ich werd mal versuchen das Beispiel einzubauen. Die arbeiten dabei mit 
dem WDT-Interrupt und nicht mit dem Timer A. Hier der Code:

#include "msp430x22x4.h"

volatile unsigned int i;

void main(void)
{
  WDTCTL = WDT_ADLY_1000;                   // WDT 1s*4 interval timer
  BCSCTL1 |= DIVA_1;                        // ACLK/2
  BCSCTL3 |= LFXT1S_2;                      // ACLK = VLO
  IE1 |= WDTIE;                             // Enable WDT interrupt
  P1DIR = 0xFF;                             // All P1.x outputs
  P1OUT = 0;                                // All P1.x reset
  P2SEL = 0;                                // All P2.x GPIO function
  P2DIR = 0xFF;                             // All P2.x outputs
  P2OUT = 0;                                // All P2.x reset
  P3DIR = 0xFF;                             // All P3.x outputs
  P3OUT = 0;                                // All P3.x reset
  P4DIR = 0xFF;                             // All P4.x outputs
  P4OUT = 0;                                // All P4.x reset

  while(1)
  {
    __bis_SR_register(LPM3_bits + GIE);     // Enter LPM3, enable 
interrupts
    P1OUT |= 0x01;                          // Set P1.0 LED on
    for (i = 5000; i > 0; i--);             // Delay
    P1OUT &= ~0x01;                         // Clear P1.0 LED off
  }
}

#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer (void)
{
  __bic_SR_register_on_exit(LPM3_bits);     // Clear LPM3 bits from 
0(SR)
}

Das Beispiel funktioniert zumindest :))

von Daniel L. (daniel_l)


Lesenswert?

Also wie meistens lag das Problem, warum es nicht ging an einer anderen 
Stelle versteckt. Nur so viel, man darf den Osci natürlich nicht 
deaktivieren, wenn man ihn dann noch verwenden möchte. Hier der Code, so 
wie es funktioniert:

void Delay(unsigned long DelayTime)
{
  BCSCTL3 |= LFXT1S_2;                      // ACLK = VLO

  TACCTL0 = CCIE;
  TACCR0 = DelayTime;
  TACTL = TASSEL_1 + MC_1;

  __bis_SR_register(LPM3_bits + GIE);     // Enter LPM3, enable 
interrupts
}

und hier die Interruptroutine:

#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A(void)
{
    __bic_SR_register_on_exit(LPM3_bits);     // Clear LPM3 bits from 
0(SR)
    TACTL = 0; // stop timer
}

Vielen Dank für die Hilfe!

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.