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
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.
Doch doch, das wird schon was mit dem VLO. Ersetze mal BCSCTL3 = LFXT1S1 + LFXT1S_2; durch BCSCTL3 |= LFXT1S_2; wie im angehaengten Beispiel.
Ach stimmt, der F2274 hat ja noch den VLO...hatte ich ganz vergessen.
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.
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 :))
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.