Forum: Mikrocontroller und Digitale Elektronik MSP430F133 input capture


von Frank B. (frank13)


Angehängte Dateien:

Lesenswert?

Hallo allerseits!

Ich stehe momentan komplett auf dem Schlauch bzw. finde meinen Fehler 
einfach nicht. Ich beschäftige mich auch erst seit Kurzem mit dem 
MSP430.
Ich möchte mit dem MSP430F133 die input capture Funktion des Timer A 
nutzen. Nur leider tut sich in meinem Testprogramm (siehe Anhang) 
nichts. Kann da mal jemand drübersehen, wo der Fehler steckt?
Ich wollte Pin 1.1 dafür nutzen, andere sind aber ebenfalls möglich.

Gruß

Frank13

von Johnny Maxwell (Gast)


Lesenswert?

Muss man nicht P1SEL und P1DIR entsprechend setzen?

PS: Grade beim MSP430 der für C ideal geeignet ist sollte man sich 
überlegen ob man wirklich den ganzen Kram in Assembler machen will. 
Alles was man in Assembler machen kann geht in C auch aber es ist 
tausendmal übersichtlicher :)

von Michael S. (michaels)


Lesenswert?

Hallo Frank13,

auf den ersten Blick fallen mir auf,
 dass Du vergessen hast, den Pin 1.1 als Modulpin zu initialisieren:

   mov.b   #0x02,&P1SEL    ;mache Pin 1.1 zum Modulpin

 dass Du dem Interruptvektor für den TimerA0-Vektor eine falsche Adresse 
zugewiesen hast. Der richtige Vektor hat die Adresse 0xFFEC. Die von Dir 
verwendete Adresse in den SFRs enthält den Offset auf die 
Interruptquellen TA1, TA2 und TAOVL, die alle auf den gleichen 
Interruptvektor gelenkt werden. Details siehe Datenblatt oder "Das 
grosse MSP430 Praxisbuch".

Falls ein Ereignis eintreten sollte, das einen TA2-Interrupt auslöst, 
hängt sich der Controller auf, weil Du keinen InterruptVektor dafür 
eingetragen hast.

Gruss Michael

von Frank B. (frank13)


Lesenswert?

Hi!

P1SEL war der Fehler. Danke!
Das Problem an C ist, dass ich die IAR Workbench verwende und keine 
brauchbaren Beispielquellcodes finde. Es hapert da einfach an der 
primitiven Syntax für Interrupts und ähnliches. Wenn jemand den kurzen 
Quelltext von oben in C übersetzen könnte, würde ich das dankbar 
annehmen!

Gruß

Frank13

von Christian R. (supachris)


Lesenswert?

Frank Bußmann wrote:
> Hi!
>
> P1SEL war der Fehler. Danke!
> Das Problem an C ist, dass ich die IAR Workbench verwende und keine
> brauchbaren Beispielquellcodes finde. Es hapert da einfach an der
> primitiven Syntax für Interrupts und ähnliches.

Hä? Gerade für den IAR gibts doch massenhaft Beispielcodes, direkt von 
TI und die funktionieren auch alle, schau doch mal hier:
http://focus.ti.com/mcu/docs/mcuflashtools.tsp?sectionId=95&tabId=1538&familyId=342

von Frank B. (frank13)


Lesenswert?

@ Michael S.:

Da haben sich die Posting überschnitten. Danke für die Infos! Ich werde 
mal weitertesten in der Hoffnung, dass es jetzt endlich alles klappt.

Gruß

Frank13


PS: Den Code in C für die IAR-Workbench wäre wirklich toll!

von Michael S. (michaels)


Lesenswert?

Hallo Frank13,

habe noch übersehen: Der Controller hängt sich auf jeden Fall auf, weil 
Du auch den TA-Overflow Interrupt eingeschaltet hast, für den ebenfalls 
kein Interruptvektor eingetragen ist. Spätestens, wenn TAR überläuft, 
ist Feierabend.

Gruss Michael

von Frank B. (frank13)


Lesenswert?

Örks.... ich sollte wohl besser ins Bett gehen... Ich habe das Netz mit 
Google auf den Kopf gestellt, ob ich irgendwo Beispiele finde. Auf TI 
direkt (eigentlich die logische Variante) bin ich nätürlich nicht 
gekommen...

Danke!!!

Gruß

Frank 13

von Gast (Gast)


Lesenswert?

Weil es gar so einfach ist, bitteschön. IAR hab ich nicht, aber der 
folgende Code compiliert zumindest unter mspgcc (ist natürlich 
ungetestet):
1
#include <msp430x13x.h>
2
#include <msp430/common.h>
3
#include <signal.h>
4
5
int main(void) {
6
        WDTCTL = WDTPW+WDTHOLD; /* Stop WDT */
7
8
        P6OUT = 0;
9
        P6DIR = 0xff;
10
11
        P1SEL = 0x02;
12
13
        TACTL = TASSEL_0+TACLR+TAIE+MC_2;       /* clockselect, Clear TAR */
14
        TACCTL0 = CM_1+CAP+CCIE;                /* capture on rising edge */
15
        TACCTL2 = CM_1+CAP+CCIE;                /* capture on rising edge */
16
17
        /* Was auch immer hier bei IAR stehen muss */
18
        eint();
19
20
        while(1) {
21
                WDTCTL = WDTPW+WDTCNTCL;
22
        }
23
}
24
25
/***************************************
26
 ********** Empfangsinterrupt **********
27
 ***************************************/
28
29
/* Das ist die Syntax für mspgcc  *
30
 * Vector TIMERA0_VECTOR = 0xFFEC */
31
interrupt (TIMERA0_VECTOR) timera0_irq(void) {
32
        P6OUT = 0;
33
        nop();
34
        P6OUT = 0xff;
35
}

von Frank B. (frank13)


Lesenswert?

Moin moin,

Danke für den C-Code.
Genau das "Was auch immer hier bei IAR stehen muss" war bei mir das 
Problem. Ich habe es aber noch hinbekommen.

Nochmals danke an alle!

Gruß

Frank13

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.