Hallo
Ich habe 3 LEDS an den Ports des Timer B hängen und man kann für diesen
Timer bis zu 7 Interrupts für unterschiedliche Compare-Werte auslösen
lassen.
Jetzt hab ich TB_0.1, TB_0.2 und TB_0.3 aber ich finde in der
MSP-Headerdatei nur diesen Eintrag:
Dein Freund ist Family User Guide.
In der ISR zum TIMER_B1_VECTOR wird über das TB0IV die Interrupt-Quelle
ermittelt. In der TIMER_B0_VECTOR ISR nur CC0.
Dazu steht bestimmt etwas in den Header-File Kommentaren.
Tipp:
Zur Auswertung kommt das __even_in_range ins Spiel.
Ok, sehr schön. Hatte dann auch überlegt, dass es evtl. mit ner
Switch-Case-Anweisung geht.
Das wäre jetzt mein Code:
1
#pragma vector=TIMERB1_VECTOR
2
__interruptvoidTB(void){
3
4
switch(__even_in_range(TBIV,3)){
5
case0x02:
6
TBCCR1+=100;
7
case0x04:
8
TBCCR2+=50;
9
case0x06:
10
TBCCR3+=10;
11
}
12
}
Kann das Programm grad noch nicht testen, da der Programmer anderweitig
im Einsatz ist, aber sieht das so korrekt aus. Die case-Werte hab ich
der Tabelle im User Guide auf Seite 394 entnommen.
Wenn ein Interrupt kommt, werden dann diese TBCCR1..6 CCIFG entsprechend
auf 1 gesetzt?
Ist meine Case-Abfrage dann richtig?
Uups natürlich....hehe
Aber meine Frage gilt eher dem
1
switch(__even_in_range(TBIV,3)){
Weil im User Guide steht , dass für NUM (in dem Fall hab ich 3
eingesetzt) eine Zahl ab 0 eingetragen werden muss.
Ist das dann die Anzahl der zu verarbeitenden Interrupts? Weil 0 würde
dann ja wenig Sinn ergeben...
So hab's jetzt mal angeworfen, aber es blinkt leider nix :(
Die ISR wird auch nie aufgerufen (LED leuchtet nicht).
Bitte um Feedback, ob der Timer richtig initialisiert ist.
Danke
Ach ja-
zum Thema __even_in_range-
NUM soll den möglichen Wert begrenzen(timer_B also 0x0A für den TBIFG.)
Das ist zur Sicherheit, wenn irgendetwas verbogen wird.
Alles > NUM wird ignoriert.
Johannes Hofmann schrieb:> Die ISR wird auch nie aufgerufen (LED leuchtet nicht).
Das ist deine Debug Strategie???
Johannes Hofmann schrieb:> __delay_cycles(1000000);
Was soll denn das in der ISR???
Da dir die noch Grundlagen fehlen, würde ich von der Try <> Error
Variante Abstand nehmen und einen Debugger einsetzen. Der µC hat
bestimmt das Spy By Wire Interface.
Leider gibst du den µC Typen nicht preis. Zum Verständnis habe ich darum
ein Beispiel fürs launchpad mit dem G2255 geschrieben:
Naja, mit der LED hab ich das bisher immer so gemacht. Aber ich könnte
mir im Debugmodus natürlich die einzelnen Register auch mal anschauen.
Hab mir ja ein paar Tutorials angeschaut und Beispiele zur
Timeransteuerung, aber eben noch keine Erfahrung, wo ich genau nach dem
Fehler suchen könnte.
Manche benutzen bei der Wertzuweisung eines Registers manchmal den '+'-
anstatt den '|'-Operator. Muss man dabei irgendwas beachten oder ist das
vom Effekt her deckungsgleich?
Johannes Hofmann schrieb:> ich könnte> mir im Debugmodus natürlich die einzelnen Register auch mal anschauen
Du bist soooo großzügig. >:->
Man kann aber auch Breakpoints setzen. ;-)
Schau dir zuerst die ISR an versuch dein Programm ans Laufen zu
bekommen. Das mit den Feinheiten kommt später. Ach, aber auf keinen Fall
reg += bit1 + bit7;
^^
schreiben!!!
Das Schlimme ist, 0b0001 + 0b0010 = 0b0011
und TI macht das in ihren Beispielen.
Der Effekt ist tatsächlich gleich.
Aber das ist Murks (schlechter Stil).
Ein ODER ist ein ODER - immer.
Ein + ist eine arithmetische Operation.
Gewöhne Dir bitte den Quatsch von TI nicht an.
Dann wäre es nett, wie schon geschrieben, wenn Du
Controllertyp und Umgebung nennen würdest ;-)
Meinen Hinweis von oben findest Du im Beispiel von who:
__enable_interrupt();
Schönen Abend noch!
Solange nur mit Flags gerechnet wird und eine Zuweisung erfolgt kommt
das gleiche raus. Aber bei Konstanten aus 2 oder mehr Bit oder bei
Einbeziehung des left value mit bereits gesetzten Bits f.... du dich ins
Knie.
Also nicht nur schlechter Stil, sondern oft falsch !
Es ist ein MSP430F5438A.
Arbeite mit der IAR Workbench.
Die ganzen Register für die Konfiguration sind doch von vorneherein alle
mit 0 initialisiert. Und nur wenn ich ne andere Konfiguration als die
Standardeinstellungen haben möchte, muss ich die entsprechenden Bits auf
1 setzen. Ist doch so?
Also im TBIV-Register wechseln die entsprechenden Interruptflags auch
ganz artig, aber es kommen auch Kombinationen vor, die gar nicht auf
meine 3 Interruptvektoren zutreffen.
Also die ISR funktioniert, aber ich sehe leider nichts an den LEDS
Das OUT-Signal müsste ja nun an den 3 Pins anliegen und somit die LEDs
schalten.
Habe auch nichts im User Guide gefunden, dass man da für die PWM noch
was konfigurieren müsste.
Der Timer zähl bis 0xFFFF und eine Manipulation des TBR-Wertes bringt
auch keinen Erfolg.
Langsam wird's unschön... :(
Johannes Hofmann schrieb:> Der Timer zähl bis 0xFFFF und eine Manipulation des TBR-Wertes bringt> auch keinen Erfolg
Welchen Erfolg erwartest du? Wenn es Änderungen der Ausgänge an P4 sein
sollen, musst du sie auch beeinflussen. Entweder setzt oder löscht du
die Ausgänge selbst, oder du nutzt die alternativen Pin-Funktionen. Und
woher weiss der µC was du willst? Natürlich, ein Konfigurationsregister:
PxSEL.
Jetzt geht es im Family User Guide weiter.
Hm, und warum ist dann nicht ein klitzekleiner Hinweis im User Guide
aufgeführt, dass man das P4SEL noch manipulieren muss.
Jetzt funktioniert es.
Gleich noch ne Frage:
Kann man aus irgeneinem Register den Maximalwert des Timers abrufen? Aus
TB0R kriegt man den aktuellen Zählwert.
Mit CNTL_0 bis CNTL_3 kann man den Wert ja nur einstellen.
Naja, wenn ich den Wert per Registereinstellung ändere, dann muss sich
der Controller den Wert ja irgendwo herholen.
Und das würd ich auch gern. Aus Gründen der Übersichtlichkeit des Codes.
Johannes Hofmann schrieb:> und warum ist dann nicht ein klitzekleiner Hinweis im User Guide> aufgeführt, dass man das P4SEL noch manipulieren muss.
Bei einem Blick auf das Bauteilsymbol fällt dir sicherlich auf, dass
verschiedene Pins mehrere Funktionen haben können. Kann der µC raten was
du möchtest? Warum muss man überhaupt programmieren? ;-)
Im Kapitel 12.2.6 finde ich einen "klitzekleinen Hinweis".
Aber lesen ist schwer, Englisch auch noch, aber ... im Datenblatt auf
Seite 72 gibt 's soagar ein Bildchen vom Port. ;-)
Keine Ausreden mehr: Lesen, Programmieren, Debuggen und Freuen!