MSP430F1611 Problem Timer_A interrupt

Gast #2571803
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!
Gast #2572186
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++;
}

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.