Forum: Mikrocontroller und Digitale Elektronik MSP430F149 Interrupt


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Mike (Gast)


Lesenswert?

Hallo
brauche drinnend einen Profi für Timmer Interrupts beim MSP430.

Wer hat eine Ahnung??

Gruss Mike

von Dirk (Gast)


Lesenswert?

Hi,

du musst schon dein Problem beschreiben (am besten so ausfuehrlich wie
es geht) damit dir auch jemand helfen kann.


Mfg

Dirk

von Mike (Gast)


Lesenswert?

ok Dirk

Ich brauche eine Funktion (am Besten mit dem TimerB) welche mir alle
100stel sekunden eine varabel um 1 erhöht.
leider habe ich von interrupt keine Ahnung. mit dem Timer jedoch kenne
ich mich schon einwenig aus.

von Mike (Gast)


Lesenswert?

hallo

wo sind den hier die Profis???

von Fritz Ganter (Gast)


Lesenswert?

Du kannst für jeden Interrupt eine Interruptroutine definieren, die
ausgeführt wird wenn der Interrupt eintritt.

Wie das geht, sollte bei deinem Compiler beschrieben sein.

Wichtig ist, diese varible mit voilatile zu definieren.

von Mike (Gast)


Lesenswert?

Danke Fritz

Die Doku des Prozessors habe ich durchgelesen, jedoch verstehe ich noch
vieles nicht. Der Timer ist ziemlich klar.
Kennst du den den MSP430F149 genauer???

von Fritz Ganter (Gast)


Lesenswert?

Nö, nur AVR, und da geht es so:

SIGNAL (SIG_OUTPUT_COMPARE2)
{
...
}

statt SIGNAL kann man auch INTERRUPT schreiben, da werden dann aber die
Interrupts in der IR nicht gesperrt.

von Mike (Gast)


Lesenswert?

tja, dies hilft mir leider nicht sehr viel weiter, aber trotzdem danke.
Wirklich noch niemand auf dieser Site mit Timmer Interrupt beim MSP430
zu tun gehabt?

von Sebastian (Gast)


Lesenswert?

Doch, türlich. Ich bin glaube ich der einzige in diesem Forum, der den
MSP430F149 benutzt. :-)

Was möchtest du denn genau? Timer_B benutzen, Up-Mode, bis x zählen
lassen, dann eine Variable erhöhen. Das sollte doch kein Problem sein.
Welchen Quartz verwendest du? 32kHz? 800kHz DCO (intern)? 8MHz? Mehr
Infos, bitte. In den IR-Handler kommt dann einfach ein

  my_var++;

Fertig. :-)

von Sebastian (Gast)


Lesenswert?

OK, bevor noch mehr Fragen kommen, hab ich mir mal 'nen Sourcecode
ausgedacht:

#include <msp430x14x.h>

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;             // watchdog aus
  TBCCTL0 = CCIE;                       // TBCCR0 interrupt anmachen
  TBCCR0 = 20000;                       // das musst du noch anpassen
  TBCTL = TBSSEL_2 + MC_1;              // SMCLK verwenden, upmode
  _BIS_SR(LPM0_bits + GIE);             // ab in den LPM0 ...
}

#pragma vector=TIMERB0_VECTOR
__interrupt void Timer_B (void)
{
  meinevariable++;                      // oder was auch immer ...
}

Du musst den Wert für TBCCR0 noch anpassen an deine 1/100-Sekunde, das
darfst du aber selber ausrechnen. :-)

Das alles hab ich auch auf meiner Homepage (www.mathar.com) bei den
Tutorials stehen. ;-)

Grüße, Sebastian

von OldBug (Gast)


Lesenswert?

Hi!

Ich nutze auch den F149, aber mit so spärlichen Infos macht es einfach
keinen Spaß zu antworten :(
Und das dann erst recht, wenn schon jemand nach genaueren Infos fragt.
Mike mag uns ja nichtmal erzählen, welchen Compiler er nutzt...

Gruß,
Patrick...

von Mike (Gast)


Lesenswert?

okok, ich benutze die normale IAR Version, welche zum FET Tool
mitgeschickt wird.
Was soll ich den noch weiter erzählen als ich bis jetzt geschrieben
habe???

Gruss Mike

von Mike (Gast)


Lesenswert?

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;             // watchdog aus
  TBCCTL0 = CCIE;                       // TBCCR0 interrupt anmachen
  TBCCR0 = 20000;                       // das musst du noch anpassen
  TBCTL = TBSSEL_2 + MC_1;              // SMCLK verwenden, upmode
  _BIS_SR(LPM0_bits + GIE);             // ab in den LPM0 ...
}

#pragma vector=TIMERB0_VECTOR
__interrupt void Timer_B (void)
{
  meinevariable++;                      // oder was auch immer ...
}

Danke für die Hilfe Sebastian. Dieses File habe ich auch auf der IAR
Site gefunden.
Was ich noch nicht ganz begreife ist, was der Ausdruck
_BIS_SR(LPM0_bits + GIE); genau macht. Einerseits schickt er mir den
MSP in den low Power modus und das GIE habe ich keine Ahnung für was
das ist.

Für den Timer habe ich mal folgendes Programmiert:

TBCTL |= 0x0144;  konfiguration des Timers
TBCCTL0 = 0x0010; Interrupt enable
TBCCR0 = 36863;   bis zu diesem Wert soll von 0 an gezählt werden
TBCTL |= 0x0050;  Timer start

der Timer wird im Up mode betrieben. Der ACLK wird durch 2 geteilt,
somit komme ich mit meinem externen 7,3718MHz Quarz direkt auf
1/100Sekunde.

Aus dem pdf dokument slas... habe ich den Interruptvektor gefunden
somit schreibe ich die Interruptroutine ausserhalb des Mains
folgendermassen:

#pragma vector=TIMERB0_VECTOR
__interrupt void Timer_B (void)
{
  testen++;
}

Da bei jedem durchlauf des timers das CCIFG flag gesetzt wird, sollte
doch dies den Interrupt auslösen und die Routine aufrufen.

folgende do while schleife befindet sich im Main
 do
{
P4OUT=0x01;
}while (testen<50);
P4OUT=0x00;

somit sollte die globale variabel alle 1/100 sekunden um i erhöht
werden. Sobald diese den wert>50 erreicht, sollte diese schleife
verlassen werden und der ausgang p4.0 auf low gehen.
leider bleibt dieser immer auf high.

so, diese infos sollten vorerst mal reichen ;o)

von OldBug (Gast)


Lesenswert?

Wie hast Du "testen" denn deklariert?

Sie sollte global und volatile deklariert werden, in etwa so:

volatile int testen;

Gruß,
Patrick...

von Mike (Gast)


Lesenswert?

ok, werde dies mal kurz testen, das volatile habe ich vergessen.
du hörst von mir

von Mike (Gast)


Lesenswert?

habe es getestet, jedoch ohne erfolg. die leitung bleibt immer noch auf
high hängen, das heisst die do while schlaufe wird nicht verlassen.

ist es überhaupt richtig, dass bei einem druchlaufen des timers der
interrupt mit dem TIMERB0_VECTOR aufgerufen wird?

von Sebastian (Gast)


Lesenswert?

> Dieses File habe ich auch auf der IAR Site gefunden.

Was? Wie? Wo? IAR stellt doch keinen Code bereit, erst recht keinen zum
Timer! Hast du mal den Link?

> Was ich noch nicht ganz begreife ist, was der Ausdruck
> _BIS_SR(LPM0_bits + GIE); genau macht. Einerseits schickt er mir den
> MSP in den low Power modus und das GIE habe ich keine Ahnung für was
> das ist.

Das GIE ist das General-Interrupt-Enable-Bit. Ohne dieses Bit
funktioniert überhaupt gar kein Interrupt.

> TBCTL |= 0x0144;  konfiguration des Timers
> TBCCTL0 = 0x0010; Interrupt enable
> TBCCR0 = 36863;   bis zu diesem Wert soll von 0 an gezählt werden
> TBCTL |= 0x0050;  Timer start

Och nö, komm! Wieso mache ich mir denn die Arbeit, den Code
hinzuschreiben, wenn du mich ignorierst? Verwende doch bitte, bitte die
defines. Ich habe keine Ahnung, was 0x0144 für eine Konfiguration ist,
und ich habe auch keine Lust, es rauszusuchen. Wofür sind wohl die
Header-Files da?! ;-)

Dein IR-Vektor ist richtig.

Aber was soll denn das ganze? Was möchtest du? Scheinbar eine Variable
toggeln und dir so eine Rechteckspannung erzeugen? Du weisst aber, dass
man sowas vieeeeel einfacher über PWM macht?! Dafür brauche ich genau
vier Zeilen.

Grüße, Sebastian

von Sebastian (Gast)


Lesenswert?

@Mike: Hab eben eine eMail an dich geschickt, die kam aber nicht an.
Check mal deinen Account. Ich habe eine Delivery Failure Message
bekommen. :-(

von Mike (Gast)


Lesenswert?

ok, server von mikrocontroller scheint nun wieder zu laufen.

Danke sebastian, glaube ich habe es nun hingekriegt. das GIE hat ist
scheinbar doch noch wichtig ;o)

ich will eben ein ventil für einige 1/100 sekunden öffnen. mit der
variabel testen soll die anzahl der 1/100 sekunden gewählt werden
können.

das wichtigste ist, dass es nun funktioniert.

Danke vielmal für deine hilfe.

PS: ach ja, die code examples habe ich von der TI Site....

von Mike (Gast)


Lesenswert?

habe mich glaube zu früh gefreut.
also code sieht nun folgendermassen aus:

volatile unsigned int testen=0;

#pragma vector=TIMERB1_VECTOR
__interrupt void Timer_B (void)
{
  testen++;
}


main
{
_BIS_SR(GIE);

TBCTL |= 0x0144;
TBCCTL0 = 0x0010;
TBCCR0 = 36863;
TBCTL |= 0x0050;

while (testen<200)
{
P4OUT=0x01;
}
P4OUT=0x00;


nun sollte der ausgang von p4.0 ja eingentlich für 2s auf high sein und
danach wieder auf low gehen.
jedoch ist er bei mir immer 1/100 sekunde high und danach wieder low,
egal welchen wert man im ausdruck while (testen<200) eingibt.
Ideen?

von Mike (Gast)


Lesenswert?

ok, meine schuld.
habe fehler gefunden. falschen ir vektor verwendet

danke für eure hilfe. ihr habt mir einen grossen stein vom herzen
genommen

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]
  • [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.