Hallo brauche drinnend einen Profi für Timmer Interrupts beim MSP430. Wer hat eine Ahnung?? Gruss Mike
Hi, du musst schon dein Problem beschreiben (am besten so ausfuehrlich wie es geht) damit dir auch jemand helfen kann. Mfg Dirk
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.
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.
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???
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.
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?
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. :-)
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
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...
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
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)
Wie hast Du "testen" denn deklariert? Sie sollte global und volatile deklariert werden, in etwa so: volatile int testen; Gruß, Patrick...
ok, werde dies mal kurz testen, das volatile habe ich vergessen. du hörst von mir
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?
> 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
@Mike: Hab eben eine eMail an dich geschickt, die kam aber nicht an. Check mal deinen Account. Ich habe eine Delivery Failure Message bekommen. :-(
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....
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?
ok, meine schuld. habe fehler gefunden. falschen ir vektor verwendet danke für eure hilfe. ihr habt mir einen grossen stein vom herzen genommen
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.