Forum: Mikrocontroller und Digitale Elektronik MSP430-G2231 TimerA0 - ACLK mit 1 sekunde


von DerKerl (Gast)


Lesenswert?

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! :)

von Leser (Gast)


Lesenswert?

Zwei Dinge sind zu tun:
1. ACLK konfigurieren
2. Timer konfigurieren

Beides steht sehr gut erklärt im Family User Guide.

von DIPL_THC_SIDO (Gast)


Lesenswert?

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
}

von Jan S. (db8jo)


Lesenswert?

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

von Popper (Gast)


Lesenswert?

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.

von Jan S. (db8jo)


Lesenswert?

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.

von Der K. (derkerl)


Lesenswert?

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 :)

von Johannes D. (-x-plosiv)


Lesenswert?

> 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

von Der K. (derkerl)


Angehängte Dateien:

Lesenswert?

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
}

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Der K. (derkerl)


Lesenswert?

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?

von Johannes D. (-x-plosiv)


Lesenswert?

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

von Der K. (derkerl)


Lesenswert?

> 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?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Der Kerl schrieb:
> hier ein bild von dem was ich mein mit "gestopft".

Hier ist kein Bild.

von Der K. (derkerl)


Angehängte Dateien:

Lesenswert?

den Anhang vergessen :D

von Johannes D. (-x-plosiv)


Lesenswert?

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

von Der K. (derkerl)


Lesenswert?

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.

von oimel (Gast)


Lesenswert?

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

von Johannes (Gast)


Lesenswert?

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)

von Johannes D. (-x-plosiv)


Lesenswert?

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.

von Coder (Gast)


Lesenswert?

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.

von Minimal (Gast)


Lesenswert?

Low Power und ACLK geht auch ohne Quarz. Dafür gibt es den VLO mit 
12kHz.

von Der K. (derkerl)


Lesenswert?

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

von minimal (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.