mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430F149 Interrupt


Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
brauche drinnend einen Profi für Timmer Interrupts beim MSP430.

Wer hat eine Ahnung??

Gruss Mike

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

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


Mfg

Dirk

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo

wo sind den hier die Profis???

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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???

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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. :-)

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie hast Du "testen" denn deklariert?

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

volatile int testen;

Gruß,
Patrick...

Autor: Mike (Gast)
Datum:

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

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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. :-(

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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....

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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]
  • [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.