hallo, bin auf der suche nach jmd der mir beim msp430F149 helfen kann. habe eigentlich nur vorgehabt den timer_A und die verschiedene modis(up, cont. ...) auszuprobieren. das programm sollte insgesamt 2 interrupts auslösen. beim 1. interrupt wird eine led( an Port6.1) eingeschaltet, beim 2. interrupt ausgeschaltet. verwendet wird der continuous mode. dabei wird der erste wert in TACCR0 hinterlegt, der andere in TACCR1. das problem, das ich habe ist, das der inetrrupt nicht ausgelöst wird. verwendet wird der compiler ICC7 und der debugger NOICE vielleicht kann sich ja jmd das ma anschaun..... :) #include <msp430x14x.h> #include <msp430def.h> #pragma interrupt_handler timer_a_isr1: TIMERA0_VECTOR timer_a_isr2: TIMERA1_VECTOR void main(void) { _STOP_WATCHDOG(); // der Watchdog Timer wird gestoppt // (enthalten in msp430def.h) P6SEL = 0x00; //alle Pin an Port6 als STD. I/O P6DIR = 0xFD; // bis auf 6.1, sind alles Ausgänge //Timer_A // TACTL |= TACLR; // TAR Inhalt löschen timera_init(); // Initialisierung des Timers aufrufen TACTL = MC_2; // Timer_A starten //MC_1 --> Up Mode //MC_2 --> Continuous Mode //MC_3 --> Up/Down Mode _BIS_SR(GIE); //GIE = 1, globale Interruptfreigabe while(1) //es wird auf Interrupts gewartet -- Endlosschleife!! { } } //main void timera_init() { TACTL = TASSEL_2 + ID_3 + TAIE ; //ID_3 --> Clock/8 //TASSEL_2 --> SMCLK // TAIE --> Interrutp Freigabe TACCTL0 = CCIE; //Interrutp Freigabe TACCTL1 = CCIE; //TACTL |= TAIE; //freigeben TACCR0= 800; TACCR1= 100; } void timer_a_isr1() //für TACCR0 zuständig --> LED an! { TACCR0+= 800; P6OUT ^= 0x00; //LED an } void timer_a_isr2() //für TACCR1 zuständig --> LED aus! { TACCR1+=100; P6OUT ^= 0x01; //LED aus }
Ohne jetzt alles durchzulesen...
1 | TACTL = MC_2; // Timer_A starten |
setzt Deine ganze TMR_A Konfiguration, inkl. Interrupts zurück! Es muss verodert werden:
1 | TACTL |= MC_2; // Timer_A starten |
Das Hauptproblem ist, dass Du mit
1 | TACTL = MC_2; // Timer_A starten |
den Clock auf TACLK setzt, der aber vermutlich nicht vorhanden ist, d.h. Dein Timer bleibt schlicht und ergreifend stehen!
danke, das ging ja fix! da hat wirklich nur das "bitweise oder" gefehlt... allerdings mußte ich zusätzlich noch in der ISr jeweils noch das GIE-Bit setzen....--sonst hing der da drin fest... jetz geht aber alles. DANKE!
>allerdings mußte ich zusätzlich noch in der ISr jeweils noch das GIE-Bit >setzen....--sonst hing der da drin fest... Du hast drei IRQ's freigegeben: Timer-Overflow (TAIE), CCR0 und CCR1. Vermutlich wolltest Du aber nur die beiden letzten haben... ... der TAIE und CCR1 (und CCR2) teilen sich einen IRQ-Vektor, d.h. Deine timer_a_isr2() wird sowohl durch CCR1 als auch durch Timer-Overflow angesprungen. Da sich mehrere Quellen einen IRQ-Vektor teilen, musst Du hier das jeweilige IFG-Flag in der ISR selbst zurücksetzen oder das das TAIV-Register auslesen. Ansonsten bleibt das IFG gesetzt und führt zum sofortigen Wieder-Ausführen der ISR!!! User-Guide: Timer_A Interrupts lesen!!!
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.