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!
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?
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?
woody schrieb: > GIE Interrupts freigeben woody schrieb: > Muss ich den Pin, an > dem ich das Signal eingebe speziell konfigurieren? Normal ;-)
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++;
}
Das ganze scheint doch auf einem Beispiel von TI zu basieren, oder? Ist das Beispiel exakt für deinen Prozessor?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.