hallo. weisst jemand von euch wie ich timer einstelle für paar sekunden sleepmode? welche register sollen definiert werden, ich habe bei TI-code angeschaut aber leider habe nichts verstanden. kommt mir alles neu vor.
Wie sleepmode? Du willst den MSP schlafen legen und ihn mit dem Timer nach ein paar Sekunden aufwachen lassen?
Sowas geht am besten mit dem WDT, der Timer A ist viel zu mächtig für solche kinkerlitzchen. Schau dir mal die C-Demos von TI an, da ist sowas gut beschrieben.
hallo, ja Jörg so ein art ja.aber mit Timer und kein wait schleife oder so. ich schau mal in C von TI. aber falls jemand Idee hat bitte schön
Mit dem Watchdog so in der Art: WDTCTL = WDTPW + WDTHOLD + WDTCNTCL + WDTTMSEL + WDTSSEL + WDTNMI; // Watchdog anhalten, Timer auf "0", Counter-Mode, ACLK, NMI IE1 |= WDTIE; // Watchdog Interrupt Enable WDTCTL = 0x5A3C ; // Watchdog Start _EINT(); // Interrupt generell an ...CODE.... LPM3; // schlafen legen ...CODE... // Watchdog ISR #pragma vector=WDT_VECTOR __interrupt void WATCHDOG_ISR (void) { LPM3_EXIT; } Voraussetzung ist natürlich das der ACLK einen Takt hat.
wie lange dauert der LPM3? wo kann ich die zeit änedern? welcher register muss ich einstellen? danke
Entweder über den Frequnenzteiler vom ACLK (je nach MSP Typ) oder im Watchdog Register (WDTCTL) den Wert für WDTIS. Bei ACLK = 32,768KHz und Standardeinstellung für WDTIS = 00, kommt der Interrupt jede Sekunde.
halo, icih habe mir das angeschaut klingt bisschen einfacher, nur ich weiss nicht wie und wo kann ich die 5sekunden einsetzen oder erreichen??? hier ist ein 8Mhz quarz eingesetzt, wird dann druch 8 dividiert oder? der CCR0 = 50000, heisst doch es wird bis 50000 gezählt? ////// void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT P4DIR |= 0x02; // P4.1 output CCTL0 = CCIE; // CCR0 interrupt enabled CCR0 = 50000; TACTL = TASSEL_2 + MC_2 + ID_3; // SMCLK, up mode _BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt } // Timer A0 interrupt service routine #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A (void) { P4OUT ^= 0x02; // Toggle P5.1 using exclusive-//OR CCR0 += 50000; } ////////
8MHz sind schon recht viel um damit 5 Sekunden Interrupts zu machen :) Timer A mit Teiler 8 = Takt 1MHz -> 1uS pro Schritt, also würde man einen Timer benötigen der bis 5.000.000 Zählt (wenn ich mich nicht verrechnet habe). Du müsstest deinen Takt also vorher im Basic Clock Modul noch mal runter teilen. Allerdings ist ein Low Power Mode 0 relativ witzlos (bringt ja nicht viel). Kein 32,768KHz Quarz zur Hand? Der 8MHz Hängt an XT2? Welchen MSP benutzt du eigentlich?
kein 32,768khz. ich habe 2*8Mhz angeschlossen. ich kann aber wenn es nicht geht mit 8Mhz, der quarz mit 32 tauschen, muss nur halt umlöten. aber wenn es mit 8 mhz auch geht dann kann ich erstmal probieren. was sagst du dazu
Zweimal einen 8MHz Quarz an einen MSP430 anzuschliessen macht absolut keinen Sinn. Und einen LowPower Modus mit einem 8MHz Quarz zu benutzen macht eigentlich auch keinen sinn, da dann viel unnötige Leistung verbrutzelt wird. Also wie bereits in anderen Beiträgen vorgescholagen, einen 8MHz Quart durch einen 32.768kHz Quarz tauschen. Übrigens sind 8MHz ausserhalb der Spezifikationen, falls der MSP430 mit 3.3V gespiesen wird. Ca 7MHz sind bei 3.3V das Maximum. Im Datenblatt gibts so eine Grafik, welche die maximale Clock Frequenz in Abhängigkeit der Speisespannung aufzeigt. Aber Du bist nicht der erste, der diese Grafik übersehen hat. Mir sind sogar schon Eval. Boards untergekommen, die mit 3.3V arbeiten und der MSP mit 8MHz betrieben wird...
ok ich tausche erstmal den Quarz. dann schaue ich wie sich das verhalten mit dem code. bis dann leute
Ja genau. Den langsamen Quarz am besten an XIN/XOUT anschliessen und den schnellen Quarz an XT2IN/XT2OUT. Den Timer für den Aufweck-IRQ kannst du dann vom ACLK Takt speisen, welcher vom langsamen Quarz stammt. Die CPU (MCLK) kannst Du wahlweise vom langsamen oder schnellen Quarz takten lassen. Am besten jedoch vom schnellen, so viel ich weiss. Damit kann die CPU ihre Aufgabe schnell erfüllen und sich dann gleich wieder schlafen legen (LPM).
> Übrigens sind 8MHz ausserhalb der Spezifikationen, falls der MSP430 > mit 3.3V gespiesen wird. Ca 7MHz sind bei 3.3V das Maximum. Wie heißt es so schön: It depends. Es gibt neuere MSP430-Varianten, die bei 3.3V Versorgungsspannung für 16 MHz Takt spezifiziert sind, das sind die MSP430F2001..3 und 2011..3. Die können diese Taktfrequenz auch mit dem internen DCO erzeugen, was natürlich nur eingeschränkt genau ist (~2.5%).
Er hat aber den MSP430F169 und bei diesem ist es definitiv ausserhalb der Specs. Aber Du hast recht, es gibt jetzt neue Typen die das vertragen.
ich habe den 32khz angeschlossen, und diesen program zum test geschrieben, aber es kommt nix. void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT P4DIR |= 0x02; // P4.2 output CCTL0 = CCIE; // CCR0 interrupt enabled TACTL = TASSEL_1 + MC_2; // SMCLK, up mode _BIS_SR(LPM3_bits + GIE); // Enter LPM0 w/ interrupt } // Timer A0 interrupt service routine #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A (void) { P4OUT ^= 0x02; // Toggle P4.2 using exclusive-OR }
Evt. das vergessen: _EINT(); //Interrupt generell an Was für ein Compiler hast du?
Kinder, Kinder, guggst Du im Anhang. Richtigen Header includieren (#include <msp430x16x.h> glaub ich) und dann testen. Alles auf der TI-Homepage zu finden.
danke euch. lösung gefunden endlich mal :)) musste einfach nur interrupt auslösen. => _BIS_SR(GIE); und ein variable als zähler definieren, der mir 5 mal zählt wenn 50000 erreicht ist. mehr war nicht
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.