www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430 Timer Uhr sekundentakt


Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo zusammen,

ich möchte mir mal versuchshalber eine ur mit dem msp430f149 bauen.
gibt es irgendwelche tutorials, die zeigen, wie man einen 1s takt
erzeugen kann?

Gruß
Markus

Autor: Jörg S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Am aller einfachsten geht das wohl mit dem Watchdog Timer und einem
32kHz Quarz.
Direkt bei TI gibt es zu jedem Prozessor-Typ Code Beispiele. Da sollte
sich auch zum Watchdog was finden lassen.

Autor: Jörg S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hatte das mal selber programmiert (IAR Compiler!):

// Watchdog einstellen:
WDTCTL = WDTPW + WDTHOLD + WDTCNTCL + WDTTMSEL + WDTSSEL + WDTNMI;   //
Watchdog stop, Timer auf "0", Counter-Mode, ACLK, NMI
IE1 |= WDTIE;               // Watchdog Interrupt Enable
WDTCTL = 0x5A3C ;           // Watchdog Start

_EINT();                    // Interrupt generell an


// ISR:
#pragma vector=WDT_VECTOR
__interrupt void WATCHDOG_ISR (void)  // Wird jede Sekunde ausgeführt
{
  sekunde++;
}

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

vielen dank. ich habe mir mal das codebeispeil von ti zur brust
genommen. (RTC) das funktioniert genz prima,lasse erst einmal als test
eine led im sekundentakt an und ausgehen.




Gruß
Markus

Autor: SupaChris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jo, mit dem WDT gehts am einfachsten. Hab für ein prohejt auf Arbeit das
auch so gemacht. Allerdings mit Sync auf UTC vom PC aus und Wecker usw
:-) Ist nicht mal viel, grade mal 1600 Bytes.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
U.a. stehts so ähnlich in den Beispielcodes von TI:

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  P1DIR |= 0x01;                            // P1.0 output
  CCTL0 = CCIE;                             // CCR0 interrupt enabled
  CCR0 = 32769;
  TACTL = TASSEL_1 + MC_2 + ID_0;           // ACLK, contmode,
Vorteiler 0

  _BIS_SR(LPM3_bits + GIE);                 // Enter LPM3 w/ interrupt
}

// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
  P1OUT ^= 0x01;                            // Toggle P1.0
  CCR0 += 32769;                            // Add Offset to CCR0
}

Autor: Lucas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo! Ich arbeite zum ersten mal mit dem MSP430!
Es ist auch das erste mal das ich Mikrocontroller programmiere!
Würde gerne wissen wie ich den Controller vom sleep in den wake up und 
wieder zurück, versetzen kann! So das es sich z. B. alle paar Sekunden 
oder Minuten!
Schmal ein danke schön für jede Hilfe...!
LG Lucas

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du die Beispiele die es auf der TI Homepage gibt, dir mal ansiehst, 
und verstehst, ist das kein Problem.

In den LPM3 beispielsweise schickt man den MSP430 mit

_BIS_SR(LPM3_bits + GIE);

Wird ein Interrupt ausgelöst, geht der MSP automatisch in den Active 
Mode.

Ist die Interrupt Service Routine zu Ende, wechselt der MSP erst mal 
wieder in den LPM, der vorher aktiviert war.

Will man den MSP nach Beenden der ISR wach halten muss man das 
gespeicherte Statusregister auf dem Stack verändern, z.B. so:

_BIC_SR_IRQ(LPM3_bits);

das lösche die LPM3-Bits auf dem Stack und nach dem RETI ist der MSP 
noch im Active Mode.

Schau dir insbesondere mal die Application Note SLAA264 an.

Autor: nawhki (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Bei mir haengt aber das Code nach dem LPM3 (beim Simulator und FET 
Debug). Ich verwende das MSP430F449 (Olimex MSP430F449STK2).Habe aber 
dieselbe Einstellungen.
Hab jemand eine Idee warum es so it ? Hab 2 Stunden den Fehler 
gesucht..aber leider keine gefunden..

mfg
nawhki

Autor: Jörg S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lös doch mal mit dem Debugger manuell ein Interrupt aus. Wird der dann 
bearbeitet?

Autor: nawhki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, der wird nicht bearbeitet... Das Code haengt...

Autor: nawhki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also. Hab das Problem geloest. Es liegt an das neue Kickstart 3.42A. Hab 
der V3.41A verwendet und das Code geht einwandfrei...

Beitrag #2140758 wurde vom Autor gelöscht.
Autor: Pie Sp (pie_s)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen, ich experimentiere momentan mit dem MSP 430 (M430G2553).

Ich habe den Code von Oliver getestet und auf Timer A läuft das ganze 
einwandfrei. Ich möchte den Microcontroller alle 8 Sekunden aus dem 
Schlafmodus per Timer Interrupt wecken und wieder in den Schlafmodus 
versetzen. Das habe ich jetzt versucht auf Timer B zu transferieren und 
bis jetzt bin ich einwandfrei gescheitert.

Mein Programm sieht wie folgt aus:

#include <msp430g2553.h>

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  P1DIR |= 0x01;                            // P1.0 output
  TA1CCTL2 = CCIE;                             // CCR0 interrupt enabled
  TA1CCR0 = 32769;
  TA1CTL = TASSEL_1 + ID_3 + MC_2 + ID_0;           // ACLK, divider 
(8s), contmode,


  _BIS_SR(LPM3_bits + GIE);                 // Enter LPM3 w/ interrupt
}

// Timer A0 interrupt service routine
#pragma vector= TIMER0_A1_VECTOR
__interrupt void Timer1_A3 (void)
{
  _BIC_SR_IRQ(LPM3_bits);               // Enter LPM0 w/ interrupt
  P1OUT ^= 0x01;                            // Toggle P1.0
  TA1CCR0 += 32769; // Add Offset to CCR0
}



Ich verstehe nicht, woher der Vektor und die Funktion _interrupt void 
Timer1_A3 kommt. Ich habe mich durch die Datenblätter geschlagen und bin 
zu dem Schluss gekommen, dass es so sein müsste aber wirklich ein 
Kochrezept habe ich nicht. Ich würde mich sehr freuen, wenn jemand die 
Muße hätte, einen Blick drüber zu werfen. Besten Dank!

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pie Sp schrieb:
> Ich verstehe nicht, woher der Vektor und die Funktion _interrupt void
> Timer1_A3 kommt.

Was meinst mit "woher"? Die Funktion ist ein Interrupthandler, d.h. 
sie wird unabhängig vom Rest des Programmes durch Hardware immer dann 
aufgerufen, wenn der Timer1_A3 seinen Interrupt auslöst.

Der Interruptvektor ist eine Erweiterung des C-Compilers, um solche 
Funktionen überhaupt umsetzen zu können (C selbst weiß nichts von 
Interrupts oder Nebenläufigkeit), und verknüpft die Interruptquelle mit 
der aufzurufenden Funktion -- der MSP430 kennt mehrere Interrupts, die 
alle mit eigenen Interrupthandlern benutzt werden können.

In Deiner main() initialisierst Du den Timer so, daß er unter bestimmten 
Umständen einen Interrupt auslöst. Welche das sind, steht nicht im 
Datenblatt, sondern im zu Deinem 'G2553 gehörenden "MSP430x2xx Family 
User's Guide" (www.ti.com/lit/ug/slau144j/slau144j.pdf). Dort wird jeder 
einzelne Peripheriebaustein ausführlich beschrieben.

Autor: TimerA3 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pie Sp schrieb:
> versucht auf Timer B zu transferieren
Der G2553 hat keinen TimerB, er hat zwei TimerA3.
http://www.ti.com/general/docs/datasheetdiagram.ts...
Wirf einen Blick in das Headerfile deines Compiler. Dort findest du die 
Bezeichnungen für die beiden Timer.

Oliver schrieb:
> // Timer A0 interrupt service routine
> #pragma vector=TIMERA0_VECTOR
> __interrupt void Timer_A (void)
und
Pie Sp schrieb:
> // Timer A0 interrupt service routine
> #pragma vector= TIMER0_A1_VECTOR
> __interrupt void Timer1_A3 (void)
ist nicht richtig transformiert. Bei dir sollte es
#pragma vector= TIMER1_A0_VECTOR
lauten. Im FAmily User Guide unter Timer A findest du am Ende die 
Interruptvektoren.

Pie Sp schrieb:
> TA1CCTL2 = CCIE;                             // CCR0 interrupt enabled
Gibt den Interrupt für CCR2 frei. Für CCR0 ist das TA1CCTL0 zuständig.

Pie Sp schrieb:
> _BIC_SR_IRQ(LPM3_bits);               // Enter LPM0 w/ interrupt
Die Zeile in der ISR ist überflüssig.

Du solltest zuerst ohne LPM testen. Dafür wird eine while(1); in main 
benötigt.

Autor: Pie Sp (pie_s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
achso, das bedeutet, ich muss der Funktion nur den Namen des Bausteines 
geben und dann ist der Rest erledigt?

#pragma vector= TIMER0_A1_VECTOR
__interrupt void Timer_B (void)
{
  _BIC_SR_IRQ(LPM3_bits);               // Enter LPM0 w/ interrupt
  P1OUT ^= 0x01;                            // Toggle P1.0
  TA1CCR0 += 32769; // Add Offset to CCR0
}

Ich habe jetzt den Namen der Funktion auf "Timer_B" geändert, da der 
Timer laut Users Guide so heißt.

Ich habe auch den Vector gefunden, "Timer_B interrupt vector TBIV Read 
only 011Eh Reset with POR". Wie komme ich jedoch von der Codezeile 
"#pragma vector= TIMER0_A1_VECTOR" auf die richtige Bezeichnung. Ich 
denke "IMER0_A1_VECTOR" ist nicht korrekt. Mir fehlt das Veständnis 
dafür obwohl ich bereits im 6. Semester Elektrotechnik studiere, 
peinlich :-D

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pie Sp schrieb:
> achso, das bedeutet, ich muss der Funktion nur den Namen des Bausteines
> geben und dann ist der Rest erledigt?

Nein, Du musst auch den passenden Vektor verwenden, sowie die 
Registerzugriffe anpassen.

Sieh in den von mir verlinkten "Family User's Guide", und sieh Dir die 
von TI veröffentlichten Codebeispiele (www.ti.com/lit/zip/slac463) an, 
die zeigen für jeden Peripheriebaustein, wie er zu verwenden ist, und 
wie die jeweils dazu passenden Interruptvektoren aussehen sollen.

Ein Zusammenklicktool für Peripheriinitialisierungen ist TIs "Grace":
http://www.ti.com/tool/Grace#descriptionArea

das kannst Du Dir auch ansehen.

Autor: TimerA3 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pie Sp schrieb:
> Ich habe jetzt den Namen der Funktion auf "Timer_B" geändert, da der
> Timer laut Users Guide so heißt.
Guten Morgen, bitte aufwachen: Der G2553 hat keinen Timer B.

Und es gibt
TIMER0_A0
TIMER0_A1
TIMER1_A0
TIMER1_A1
was vier unterschiedliche Interruptvektoren sind.

Lies meinen Beitrag oben.

Autor: Thomas Sch. (doschi_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zum M430G2553  findest Du die notwendige Literatur hier:

http://www.ti.com/product/MSP430G2553?keyMatch=G25...
--> http://www.ti.com/product/MSP430G2553/technicaldocuments

1) MSP430G2x53, MSP430G2x13 Mixed Signal Microcontroller (Rev. J)
   http://www.ti.com/lit/gpn/msp430g2553
2) MSP430x2xx Family User's Guide (Rev. J)
   http://www.ti.com/lit/pdf/slau144
3) MSP430G2553 Device Erratasheet (Rev. G)
   http://www.ti.com/lit/pdf/slaz440
Bitte lesen!

Die "code examples" für den G2553 kannst Du unter 
http://www.ti.com/lit/sw/slac485e/slac485e.zip  laden (/slac463  ist für 
die Gxx1-Reihe).

: Bearbeitet durch User
Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas Sch. schrieb:
> (/slac463  ist für die Gxx1-Reihe).

Danke für die Korrektur, ist mir offensichtlich durch die Lappen 
gerutscht.

Autor: Pie Sp (pie_s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die Informationen. Ich habe mit Grace gearbeitet und bin 
ziemlich schnell auf die gewünschte Funktion gekommen.

Dieses Plugin ist ja hervorragend.

Gruß

Philipp

@falls jemand Interesse an dem Quellcode hat, könnte ich Ihn hier auch 
noch veröffentlichen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.