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.