Forum: Mikrocontroller und Digitale Elektronik MSP430F1611 Problem Timer_A interrupt


von woody (Gast)


Lesenswert?

Hallo zusammen,

Ich muss für mein Geschäft ein Programm schreiben zur Erkennung der 
Windgeschwindigkeit eines Sensors.
Ich hab mir gedacht, ich mach das mithilfe des Timers_A und dessen 
interrupts. Mein Problem:
Ich komme zwar in die interrupt-routine rein aber nicht mit der pos. 
Flanke des Windsensorsignals, so wie vorgesehen.
Eigentlich sollte mit der pos. Flanke der interrupt stattfinden um die 
Zeit zwischen zwei solchen interrupts zu zählen und später umzuwandeln 
in eine m/s Anzeige auf einem LCD-display (hab ich noch nicht 
programmiert).

Vielleicht sieht jemand von euch, was ich falsch gemacht habe?

//initialize Timer_A for SMCLK
    TACTL = TASSEL_2 | ID_3 | TAIE | MC_1;      //SMCLK ; div. by 8 ; 
intrpt enable ; up-mode
    TACCTL0 = CCIE | SCCI | SCS;                //intrpt. enable ; 
sync'd capture
    TACCR0 = 12500;                             //with 125kHz CCR0 is 
filled once
                                                //every 100ms
//capture rising etch | input CCIxA | sync capture | sync input | 
capture mode | intrpt enable
    TACCTL1 = CM_1 | CCIS_0 | CAP | CCIE;

interrupt (TIMERA1_VECTOR) time_measure(void)            //intrp 
(measuring time betw intrpts)
{
    time_betw_intrpt = TACCR1 + overflow_counter * 12500;
}

interrupt (TIMERA0_VECTOR) overflows(void) 
//intrpt(counting overflows)
{
    overflow_counter++;
}

Er scheint die Einstellung zur Flankenerkennung im capture mode zu 
ignorieren, da es kein Unterschied macht, ob ich am CCIxA-Pin ein Signal 
habe oder nicht.

Vielen Dank für eure Hilfe!

von Jörg S. (joerg-s)


Lesenswert?

woody schrieb:
> Ich komme zwar in die interrupt-routine rein aber nicht mit der pos.
> Flanke des Windsensorsignals, so wie vorgesehen.
Sondern?

Portpin Einstellungen und GIE ist beachtet?

von woody (Gast)


Lesenswert?

Hm was ist GIE (Entschuldigung bin noch ganz neu im programmieren :))
Und was genau meinst du mit portpineinstellungen? Muss ich den Pin, an 
dem ich das Signal eingebe speziell konfigurieren?

von fettsau (Gast)


Lesenswert?

woody schrieb:
> GIE

Interrupts freigeben

woody schrieb:
> Muss ich den Pin, an
> dem ich das Signal eingebe speziell konfigurieren?

Normal ;-)

von woody (Gast)


Lesenswert?

Oke Danke, ich versuche nochmals mein Glück :)

von woody (Gast)


Lesenswert?

So habe die Vorschläge umgesetzt aber es will noch nicht richtig...
Er geht immer noch von Timer_A aus in die erste interrupt routine rein, 
obwohl ich ihm den eingangsport definiert habe und dort meine steigende 
flanke drauf gebe, die den interrupt auslösen sollte...
Hilfe? Bin langsam ein wenig verzweifelt xD
Fehlermeldungen o.ä. krieg ich auch nicht rein....^^

Danke nochmals für die Hilfe!

#include <io.h>
#include <signal.h>
#include <stdio.h>
#include "hardware.h"

//prototypes
interrupt (TIMERA0_VECTOR) overflows(void);
interrupt (TIMERA1_VECTOR) time_measure(void);

//variables
int time_betw_intrpt = 0;                   //time-counter betw. intrpt.
int overflow_counter = 0;                   //overflow-counter
float windspeed = 0;                        //converted wind speed

int main(void)
{

    //define inputs / outputs
    _BIS_SR(GIE);                           //general intrpt enable
    P4DIR = 0xFF;
    P1DIR = 0x00;                           //define as input
    P1SEL = BIT2;

    //initialize watchdog (set to OFF)
    WDTCTL = WDTCTL_INIT;

//------------------------------------------------------------BASIC 
CLOCK MODULE

/* We can have both settings for basic clock module active, since they 
don't
   overwrite each other */

    //Basic clock module settings for 8MHz (XT2 oscillator)
    BCSCTL2 = DIVS_3 | SELS | SELM_2 | DIVM_3;  //SMCLK/8 = 1MHz(XT2) ; 
source: XT2

    //Basic clock module settings for 32768Hz (LFXT1 oscillator)
    BCSCTL1 = DIVA_3;                           //ACLK/8 = 4096Hz

//-----------------------------TIMER_A SETTINGS (EITHER ACLK OR SMCLK AS 
SOURCE)

/* Now we can chose betw. ACLK (4096Hz) or SMCLK (1MHz) as source for 
Timer_A.
   In order to do so, one of the following 2 settings needs to be 
commented
   out. Otherwise the first one will just be overwritten. */

//---------------------------------------------------------------------- 
--------

    //initialize Timer_A for SMCLK
    TACTL = TASSEL_2 | ID_3 | TAIE | MC_1;      //SMCLK ; div. by 8 ; 
intrpt enable ; up
    TACCTL0 = CCIE | SCCI | SCS;                //intrpt. enable ; 
sync'd capture
    TACCR0 = 12500;                             //with 125kHz CCR0 is 
filled once
                                                //every 100ms
    //capture rising etch | input CCIxA | sync capture | sync input | 
capture mode | intrpt enable
    TACCTL1 = CM_1 | CCIS_0 | CAP | CCIE;

//---------------------------------------------------------------------- 
--------

    //initialize Timer_A for ACLK
    //~ TACTL = TASSEL_1 | ID_0 | MC_1 | TAIE;  //ACLK ; div. by 1 ; 
up-mode ;
                                            //~ //intrpt enable (ACLK = 
4096Hz)
    //~ TACCTL0 = CCIE | SCCI | SCS;            //pos. edge ; capture ; 
intrpt-enable
    //~ TACCR0 = 4096;                          //with 4096Hz CCR0 is 
filled once
                                                //every 1s

//---------------------------------------------------------------------- 
--------

    //activate intrpts
    _EINT();

    while(1)
    {
        P4OUT = time_betw_intrpt;                       //unwichtig im 
mom
    }
    return 0;
}
//HIER EVTL FALSCHER VEKTOR??
interrupt (TIMERA1_VECTOR) time_measure(void)            //intrpt 
(measuring time betw intrpts)
{
    time_betw_intrpt = TACCR1 + overflow_counter * 12500;
}

interrupt (TIMERA0_VECTOR) overflows(void) 
//intrpt(counting overflows)
{
    overflow_counter++;
}

von Jörg S. (joerg-s)


Lesenswert?

Das ganze scheint doch auf einem Beispiel von TI zu basieren, oder? Ist 
das Beispiel exakt für deinen Prozessor?

von woody (Gast)


Lesenswert?

Ja eigentlich schon....^^

von woody (Gast)


Lesenswert?

Nein, den hab ich selber geschrieben. Entschuldige irgendein witzbold 
hat für mich kommentiert als ich kurz weg war xD Aber vielleicht finde 
ich ja Hilfe dort wenn die Beispiele machen, danke :)

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.