Forum: Mikrocontroller und Digitale Elektronik Debugverhalten MSP


von Basti (Gast)


Lesenswert?

Morgens allerseits

Ich hab da ein Problem, welches mir ziemlich Kopfzerbrechen bereitet...

Ich möchte bei einem MSP430F149 die beiden Timer gleichzeitig benutzen. 
Der TimerA wird für den 'Systemtakt' (500us) genutzt, der TimerB wird 
dazu genutzt, digitale Sensoren einzulesen. Die Sensoren lösen einen 
Interrupt aus, wann sie ausgelesen werden wollen (T:~3.5ms) der Timer 
wird für das Protokoll-Timing benötigt.

Ich weiss, dass die Prio des TimerB höher ist als diejenige von TimerA. 
Kann aber leider nicht mehr getauscht werden, da HW schon besteht.

Mein Problem:
Die ISR von TimerA wird nur dann korrekt ausgeführt, wenn ich TimerB 
Registereinstellungen auskomentiert habe.
Wenn ich einen Breakpoint in der TimerA-ISR setze, wird dieser nie 
ausgeführt. Ausser ich pausiere das Programm zuerst und fahre dann fort. 
Ab diesem Zeitpunkt wird der Breakpoint regelmässig ausgelöst.

Entwicklungsumgebung ist Code Composer Essentials v2

Vielen Dank für eure Hilfe.

Basti

von Basti (Gast)


Lesenswert?

Niemand ne Idee?

Das wären noch die Initialisierungen:

Init TimerA:
1
TACTL   = 0x0110;                   // ACLK = 32786 Hz
2
TAR     = 0x0000;                   
3
TACCTL0 = CCIE;                     
4
TACCR0  = 16;

Init TimerB:
1
TBCTL   = 0x1924;                
2
TBCCTL0 = 0x5110;                   
3
TBCCTL1 = 0x5110;                   
4
TBCCTL2 = 0x5110;

von Max G. (l0wside) Benutzerseite


Lesenswert?

Mal ein paar Schüsse ins Blaue:
- Hast Du alle Interruptroutinen für Timer A und Timer B definiert und 
löschst den TxxIV dort? Wenn das IE-Bit gesetzt ist, aber eine ISR nicht 
existiert, rennt der MSP ins Nirvana und verbrät seine Rechenzeit in der 
nicht existenten ISR. Und die Timer haben jeweils zwei ISRs.

Testen kannst Du das, indem Du schaust, ob ein while(1) in der main() 
tatsächlich noch Rechenzeit abkriegt (Pin toggeln lassen und Oszi 
dranhalten).


- Die Interrupts unterbrechen sich gegenseitig nicht. Wenn Du das 
GIE-Bit in einer ISR setzt, tun sie das aber doch, d.h. ein neuer 
Interrupt während einer ISR ruft die andere ISR auf (mit allen 
Konsequenzen für den Stack, also aufpassen!).
Wenn der erste Ansatz nicht weiterhilft, kannst Du an dieser Stelle auch 
noch weiterarbeiten. Sollte aber nicht nötig sein.

Viel Erfolg!

Max

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.