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.