Hallo! Ich programmiere am MSP430G2231. Ich würde gerne den Timer A0 über den ACLK benutzen + Interrupt. Wie kann ich nun die Zeit des ACLK so einstellen, dass ich jede sekunde einen Interrupt bekomme? Da ich später noch die Low-Power-Modes benutzen möchte, muss es der ACLK sein. Ich habe schon versucht mit dem TimerA0 input divider /8 zu arbeiten - das scheint aber nicht zu reichen.. Freue mich schon über eure Beiträge! :)
Zwei Dinge sind zu tun: 1. ACLK konfigurieren 2. Timer konfigurieren Beides steht sehr gut erklärt im Family User Guide.
High ho!
1 | #include <msp430g2211.h> |
2 | #include <lcd.h> |
3 | |
4 | int d = 0; |
5 | char data[5]; |
6 | |
7 | void main(void){ |
8 | |
9 | |
10 | WDTCTL = WDTPW+WDTHOLD; // Stop WDT |
11 | |
12 | P1DIR = 0xFF; // All P1.x outputs |
13 | P1OUT = 0x00; |
14 | |
15 | __delay_cycles(10000); |
16 | |
17 | lcd_init(); |
18 | |
19 | CCR0 = 32768; |
20 | TACTL = TASSEL_1 + MC_2; // AMCLK, contmode |
21 | |
22 | __bis_SR_register(LPM0_bits + GIE); |
23 | |
24 | }
|
25 | |
26 | #pragma vector=TIMERA1_VECTOR
|
27 | __interrupt void Timer_A(void) |
28 | {
|
29 | CCR0 += 32768; |
30 | itoa(d++ , data); |
31 | lcd_putStr(data); |
32 | }
|
Wenn Du ein 32.768 kHz Uhrenquarz angeschlossen hast (Bei dem G2231 vermute ich, dass du ein Launchpad hast?), kannst Du auch sehr einfach den Watchdogtimer nehmen - sofern Du ihn nicht als Watchdog benötigst.
1 | /* Handle WDT interrupt, called 1x per second */
|
2 | #pragma vector=WDT_VECTOR
|
3 | __interrupt void Sekunde(void) |
4 | {
|
5 | }
|
6 | |
7 | int main(void) |
8 | {
|
9 | WDTCTL = WDT_ADLY_1000; /* WDT 1000ms via ACLK @ 32kHz */ |
10 | BCSCTL3 = XCAP_2; /* Select XCAP 2 for LFX1 */ |
11 | IE1 |= WDTIE; /* Enable WDT interrupt */ |
12 | _EINT(); /* Enable Interrupts */ |
13 | for (;;){ |
14 | _BIS_SR(LPM3_bits); /* Sleep */ |
15 | }
|
16 | }
|
Funktioniert wie gesagt so nur mit externem Uhrenquarz, der ACLK benutzt dieses per default wenn vorhanden! Gruß, Jan
Jan S. schrieb: > Wenn Du ein 32.768 kHz Uhrenquarz angeschlossen hast (Bei dem G2231 > int main(void) > { > WDTCTL = WDT_ADLY_1000; /* WDT 1000ms via ACLK @ 32kHz */ > BCSCTL3 = XCAP_2; /* Select XCAP 2 for LFX1 */ > IE1 |= WDTIE; /* Enable WDT interrupt */ > _EINT(); /* Enable Interrupts */ > for (;;){ > _BIS_SR(LPM3_bits); /* Sleep */ > } > } > Danke für das schöne Beispiel. Eine klitze kleine Optimierung sehe ich noch: Die for Schleife ist bei Low Power nicht nötig. Nach Ende einer ISR wird der Status inkl. Power Mode vom Stack gepoppt. In main() wird nach Low Power kein Bfehl mehr ausgeführt.
Popper schrieb: > Eine klitze kleine Optimierung sehe ich noch: Die for Schleife ist bei > Low Power nicht nötig. Nach Ende einer ISR wird der Status inkl. Power > Mode vom Stack gepoppt. In main() wird nach Low Power kein Bfehl mehr > ausgeführt. Danke für den Hinweis, das ist in dem Codeausschnitt wirklich unnötig. In meinen ISR steht aber folgendes ...
1 | _BIC_SR_IRQ(LPM3_bits); |
... damit der MSP nach der ISR wach bleibt. Natürlich steht in der for Schleife dann auch noch mehr code vor dem Schalfen gehen.
halli Hallo :) vielen dank für eure zahlreichen beiträge. Ja ich benutze das Launchpad - allerdings kann ich leider den watchdog nicht beutzen (da ich nicht weiß wie ich den Uhrenquarz anschließe :P) -> evtl könnt ihr ja kurz beschrieben wie das geht? :) Den code von Sido funktioniert mit ein paar ergänzungen ganz gut - leider komm ich beim zeitmessen auf ca 3 sekunden :/ und zum user-guide: irgentwie komm ich in den abschnitt "Basic clock modul+" nicht so ganz klar :P (Ist jedes Basic clock system control register für ein bestimmten clock oder wie läuft das?) freu mich auf eure antworten :)
> nicht beutzen (da ich nicht weiß wie ich den Uhrenquarz anschließe :P) > -> evtl könnt ihr ja kurz beschrieben wie das geht? :) Auf dem Launchpad, rechts oben neben dem Prozessorsockel, sind nebeneinander zwei kleine Pads und etwas abseits ein größeres. Da muss der (vermutlich bereits im Launchpad enthaltene, war zumindestens bei mir so) Uhrenquarz drauf. Die beiden Beinchen kommen auf die kleineren Pads und das Gehäuse wird mit dem großen Verbunden
Ist das Schwarze noch ein extra gehäuse? (hab angst was kaputt zu machen ^^) achja - hier mal mein code der komischer weiße nur im debugger läuft :/
1 | // INCLUDES
|
2 | #include <msp430.h> |
3 | |
4 | // DEFINES
|
5 | #define TRUE 1
|
6 | #define FALSE 0
|
7 | #define LED1 BIT0
|
8 | #define LED2 BIT6
|
9 | #define BUTTONS2 BIT3
|
10 | |
11 | // MAIN
|
12 | int main(void) { |
13 | WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer |
14 | |
15 | P1DIR |= BIT0+BIT6; |
16 | P1IE |= BUTTONS2; |
17 | |
18 | P1OUT = 0; |
19 | |
20 | TACTL = TASSEL_1 + MC_0 + TAIE; // TIMERA0 ACLK + STOP + Interrupt |
21 | TACCTL0 = CCIE; // Interrupt |
22 | TACCR0 = 32768; |
23 | |
24 | __enable_interrupt(); |
25 | }
|
26 | |
27 | // TIMER A0 - ISR
|
28 | #pragma vector=TIMERA0_VECTOR
|
29 | __interrupt void Timer_A (void) { |
30 | |
31 | static unsigned int flag = 0; |
32 | |
33 | if(flag) { // LED2 toggeln |
34 | P1OUT &= ~(LED2); |
35 | flag = 0; |
36 | } else { |
37 | P1OUT |= LED2; |
38 | flag = 1; |
39 | }
|
40 | |
41 | TACCR0 += 32768; |
42 | |
43 | TACTL &= ~(TAIFG); // Interrupt-flag löschen |
44 | }
|
45 | |
46 | // BUTTON S2 - ISR
|
47 | #pragma vector=PORT1_VECTOR
|
48 | __interrupt void Port_1 (void) { |
49 | |
50 | TACTL |= MC_2; // Timer A0 aktivieren |
51 | |
52 | P1OUT |= LED1; // LED1 als anzeige das TimerA0 aktiv |
53 | |
54 | P1IFG &= ~(BUTTONS2); // Interrupt-flag löschen |
55 | }
|
Der Kerl schrieb: > Ist das Schwarze noch ein extra gehäuse? Das ist eine Verpackung. Kannst Du löten? Wenn nein, lass den Quarz in seiner Verpackung.
habe eine super anleitung gefunden was das löten des Quarzes angeht :) http://justinstech.org/2010/07/msp430-launchpad-dev-kit-how-too/ -> warum muss ausgerechnet R29 eingelötet werden (das loch "gestopft" :D )? kann mir dennoch einer sagen wieso mein code nur unter debugging läuft?
Der Kerl schrieb: > habe eine super anleitung gefunden was das löten des Quarzes angeht :) > > http://justinstech.org/2010/07/msp430-launchpad-dev-kit-how-too/ > > -> warum muss ausgerechnet R29 eingelötet werden (das loch "gestopft" :D > )? Jap genau das muss gemacht werden, aber ich kann mich Rufus nur anschließen, überleg dir, ob du das machst, je nachdem wie gut du Löten kannst, weil es für Ungeübte schon etwas fummelig sein kann. Was du mit R29 meinst versteh ich nicht??? Und in dem Tut. steht ja auch nix davon... > kann mir dennoch einer sagen wieso mein code nur unter debugging läuft? Hast du nach dem Verlassen des Debuggers (Code Composer von TI? oder was nutzt du) denn einen Power-Reset gemacht? Denn nach beenden der Debug-Session wird der Prozessor lediglich angehalten, aber nicht resetet. Ist zu mindestens bei mir so unter CC 5.3.0
> Was du mit R29 meinst versteh ich nicht??? Und in dem Tut. steht ja auch > nix davon... hier ein bild von dem was ich mein mit "gestopft". > Hast du nach dem Verlassen des Debuggers (Code Composer von TI? oder was > nutzt du) denn einen Power-Reset gemacht? Denn nach beenden der > Debug-Session wird der Prozessor lediglich angehalten, aber nicht > resetet. Ist zu mindestens bei mir so unter CC 5.3.0 ja, ich benutze zur Zeit CCS 5.3 Wie mache ich denn einen power-reset? Gibt es eine Möglichkeit auch das flashen ohne debuggen durchzuführen damit ich ihn direkt real testen kann?
Nein das ist ok so. Das sind eig. bloß extra Kontakte wenn man einen Quarz mit einem anderen Rastermaß benutzt. Schaut ganz brauchbar aus auf dem Bild ;-) Nach dem Ende der Debugg-Session einfach mal denn VCC-Jumper abziehen und wieder stecken, oder das USB-Kabel kurz abstöpseln. Da der Debugger dann nicht initialisiert wird, sollte er ganz normal aus dem Flash starten. Ob man ohne Debugger direkt programmieren kann? Bestimmt, aber ich weiß leider nicht wie... Aber das ist ja kein ernsthaftes Problem. Du programmierst ihn über den Debugger, beendest die Session, machst einen Power-Reset und dann läuft ja alles wie gewünscht. Vorausgesetzt die Software spielt dann auch mit :D
ok - dann werd ich wohl die löcher erstmal leer lassen und schauen obs geht bevor ich was zuviel löte was ich im moment nicht brauche ^^ also ich hab schon mehrfach versucht das usb-kabel an und auszustecken - es funktioniert nur das einschlaten der led1 -> ob timerA0 läuft kann ich nicht sagen, da led2 sich nicht toggelt. wenn ich es im debugger laufen lasse (mit breakpoints in ISR von TimerA0) klappt alles wunderbar.
Die Frage: "Gibt es eine Möglichkeit auch das flashen ohne debuggen durchzuführen damit ich ihn direkt real testen kann? " Die Antwort: Mit der "FET-Pro430 Lite Software ( FREE )" http://www.elprotronic.com/download.html kannst ohne den lästigen CCS-Debugger den Käfer im Launchpad flashen. Vielleicht muss man dafür zuvor ein Intel-hex-file im CCS generieren. Für Kommandozeilenfreaks gibt es noch den http://processors.wiki.ti.com/index.php/MSP430_Flasher_-_Command_Line_Programmer
Ok, ich hab mir gerade erst jetzt den Code auch mal genauer anssehen können da ich zuvor noch auf Arbeit war. Schau dir deine Timer Init nochmal an Dein Code: > TACTL = TASSEL_1 + MC_0 + TAIE; // TIMERA0 ACLK + STOP + Interrupt Datenblattausschnitt: > MCx Bits 5-4 Mode control. > Setting MCx = 00h when Timer_A is not in use conserves power. > > 00 Stop mode: the timer is halted. > 01 Up mode: the timer counts up to TACCR0. > 10 Continuous mode: the timer counts up to 0FFFFh. > 11 Up/down mode: the timer counts up to TACCR0 then down to 0000h (Lösung: dein Timer steht)
Hups, da ist der Logib wohl verschwunden ^ | Das war ich PS. mir ist dann aber schleierhaft wie das im Debugger geht... Oh ich habs gerade erst gesehen, du aktivierst ihn ja über den Tastendruck... Nichts für ungut, hatte ich übersehen rotwerd.
Unabhängig von Deinem eigentlichem Problem, solltest Du dir die Codebeispiele von TI anschauen. Sehr schön ist auch das Grace-Plugin: Damit kannst Du über eine GUI die Peripherals konfigurieren. Weiterhin gibt es noch ein Launchpad Workbook. Gibt es beim Launchpad Wiki.
Low Power und ACLK geht auch ohne Quarz. Dafür gibt es den VLO mit 12kHz.
Hallo Leute, ich hab das Problem behoben :) zum flashen: bei ccs v5.3 wird sobald man debuggt die software geflasht - das heißt sobald man den stecker kurz zieht und wieder einsteckt sollte euer programm ohne probleme direkt starten zum vlo: yes! damit läuft alles perfekt! zum timer:
1 | TACCR0 += 32768; |
das ist totaler quatsch (es kommt irgentwann zu nem überlauf ?!) - TAR sollte einfach auf 0 gesetzt werden sobald es den wert in taccr0 erreicht zum problem das es im debugger lief und nicht im realen: ich hatte das basic-clock-modul falsch konfiguriert
1 | BCSCTL1 &= ~XTS; // Low-frequency mode |
2 | BCSCTL3 |= LFXT1S_2; // VLOCLK |
so geht alles! vielen dank an die helfer! ;) CLOSED
Der Kerl schrieb: > das ist totaler quatsch (es kommt irgentwann zu nem überlauf ?!) - TAR > sollte einfach auf 0 gesetzt werden sobald es den wert in taccr0 > erreicht Naja, wirf doch einmal einen Blick in den family user guide. Der Timer kann in verschiedenen Modi betrieben werden. Da ist bestimmt auch für dich etwas dabei. ;-)
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.