Gast
#1977332
Hallo! Bei der Programmierung meines Controllers für die Ansteuerung von Thyristoren bin ich auf ein Problem mit meinem Timer gestoßen. Mein genutztes System: -MSP430FG4618 -32kHz Quarz für ACLK -IAR Embedded Workbench Version 5.10.1 -Programmierung in C Zur besseren Fehlersuche habe ich mein Programm möglichst weit gekürzt. Da ich quasi keine Erfahrung mit C habe und es sich um mein erstes Projekt mit einem Mikrocontroller handelt, hoffe ich das nicht zuviele grundsätzliche Fehler vorhanden sind. Was im Programm eigentlich passieren soll: An Pin 0 von Port 1 ist das Ausgangssignal eines Schmitt-Triggers angeschlossen, dieser liefert mir alle 20ms eine steigende Flanke. Der durch die Flanke ausgelöste Interrupt testet von welchem Pin der Interrupt kommt (später sollen 3 Schmitt-Trigger angeschlossen werden) und legt dann in den Variablen thyristorA1 und thyristorA2 ab welche Ausgangspins später auf High gesetzt werden sollen. Danach wird TimerA im up-mode gestartet. TACCR0 wird auf einen Wert in Abhängigkeit von alpha gesetzt. In dem Programm im Anhang ist alpha zwar konstant, im ungekürzten Programm wird es aber verändert.. Im Timer Interrupt werden dann die Pins an Port 4 entsprechend thyrsitorA1 auf High gesetzt und der Timer wieder gestartet, diesmal mit TACCR0 = alphaT[2]; was TACCR0 = 560 entsprechen sollte. Beim zweiten Timer Interrupt werden die Pins von Port 4 wieder auf Low gesetzt und der Timer mit einem größeren Überlaufwert TACCR0 = alphaT[10]; (TACCR0=2778) gestartet. Der dritte Timer Interrupt setzt die Pins entsprechend thyristorA2 auf High und startet den Timer mit TACCR0 = 560. Beim letzten Timer Interrupt werden die Pins wieder auf Low gesetzt und der Timer nicht wieder gestartet. Dieser Teil des Programms funktioniert soweit auch (falls man den Basic Timer nicht starten würde). Wenn jetzt zusätzlich noch der Basictimer genutzt wird, auch wenn er nur eine Varible hochzählt die mit dem Rest nichts zu tun hat, kommt es zu Problemen. Wenn ich mir das Signal der Ausgangspins auf dem Oszi anschaue, ist manchmal alles wie es sein soll, manchmal werden die Pins aber auch im falschen Moment auf High gesetzt. Die beiden Fälle in denen der Timer nur bis TACCR0 = alphaT[10] laufen soll sind in Ordnung, aber wenn der Timer Interrupt erst bei dem höheren Wert TACCR0 = alphaT[10] kommen sollte, wird direkt die ISR aufgerufen. D.h. die Phase zwischen den Zeitabschnitten in denen die Pins auf High liegen ist fast nicht mehr vorhanden. Ich glaube ich habe irgendetwas grundsätzliches bei der Nutzung von mehreren Interruptquellen falsch gemacht und wäre froh über jeden Tipp! Im Moment sind alle Variablen als volatile deklariert, wobei ich eigentlich dachte es wäre nicht bei allen nötig...dadurch tritt der Fehler aber seltener auf. Wenn ich das Programm Schritt für Schritt debugge funktiert es wie es soll. Soweit ich den Assembler Code (habe so gut wie garkeine Ahnung von Assembler) nachvollziehen kann, konnte ich auch keinen Fehler finden.... Danke schonmal für alle Antworten! Gruß