Debugverhalten MSP

Gast #2261330
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
Gast #2261600
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;
Persönliche Seite #2262972
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

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.