Forum: Mikrocontroller und Digitale Elektronik MSP430- TimerA0 soll TimerB0 wiederholt starten


von Wolfgang-G (Gast)


Angehängte Dateien:

Lesenswert?

Der TimerA0 soll in Abständen von 1s den TimerB0 starten. TimerB0 soll 
später mal mit 8 kHz laufen und sich nach 8 Durchläufen abschalten.
Nach dem im Anhang entworfenen Programm wird der TimerB0 nach dem 
Rücksetzen des µC immer nur einmal aktiviert (LED rot blinkt) aber dann 
nie wieder, obwohl mit TBCTL = MC_1 der TimerB0 neu gestartet wird. 
(denk ich mir)
Was könnte ich falsch machen? Muss evtl. noch etwas zurückgesetzt 
werden?
MfG
Wolfgang

von Stefan (Gast)


Lesenswert?

>void STOP_B0 (void)
>{
>TBCTL = MC_0;      // Timer Stop
>}

mit TBCTL = MC_0 setzt Du auch die Clocksource auf TBCLK zurück!
Besser: TBCTL &= ~MC_0;

von szimmi (Gast)


Lesenswert?

Hiho,
du machst bei Stop folgendes:
void STOP_B0 (void)
{
TBCTL = MC_0;      // Timer Stop
}

Du setzt TBCTL knallhart auf MC_0 und löscht damit alle anderen Bits in 
dem Register (die Du mit TBCTL = TBSSEL_1 + TBCLR gesetzt hast).
Das TBCLR ist denke ich nicht notwendig beim Restart. Aber das TBSSEL_1 
sollte stehenbleiben, damit der Timer den ACLK als Eingangsclock nimmt.
Probiere mal:
void STOP_B0 (void)
{
TBCTL &= ~MC_0;      // Timer Stop
}

von szimmi (Gast)


Lesenswert?

Oerks.
Wieder mal zu langsam. Zwei "Schlaue", ein Gedanke :-)

von Stefan (Gast)


Lesenswert?

Ja, zwei "Schlaue" und der gleiche falsche Gedanke ;-)

TBCTL &= ~MC_3; ist wohl angesagt

~MC_0 würde das TBCTL-Register gar nicht ändern!

von szimmi (Gast)


Lesenswert?

Jo. Wo Du Recht hast, hast Du recht. Aber auch
TBCTL &= ~MC_1;
sollte reichen. (Muss je wenigstens noch ein bissl rumnoergeln um nicht 
voll als Depp dazustehen :-)

von Stefan (Gast)


Lesenswert?

Ja, ist mir auch echt peinlich :-)
Aber die einfachsten Dinge scheinen manchmal die schwierigsten zu 
sein...

von Stefan (Gast)


Lesenswert?

@Wolfgang:
Vor lauter Bit-Schubserei hab ich ganz vergessen noch was anzumerken!
Ich weiss jetzt nicht, ob Dein Code-Bsp vollständig ist, aber Du benutzt 
Deine globale Variable 'g' uninitialisiert!
Du hast wahrscheinlich Glück, dass Dein Compiler/Linker für Dich ein 
Stückchen Init-Code im MSP platziert, der alle Variablen zu Beginn Null 
setzt. Aber darauf würde ich mich nicht unbedingt verlassen.
Also: Variablen besser immer initialisieren, bevor sie benutzt werden!

von Wolfgang-G (Gast)


Lesenswert?

Dank an alle,
mit TBCTL &= ~MC_1  voller Erfolg

>Deine globale Variable 'g' uninitialisiert!
>Du hast wahrscheinlich Glück, dass Dein Compiler/Linker für Dich ein
>Stückchen Init-Code im MSP platziert, der alle Variablen zu Beginn Null
bisher hatte ich damit keine Probleme, aber bei der Deklaration der 
globalen Variablen diese auf 0 zu setzen, ist wohl ein besserer Stil

noch eine Frage:
während

#define MC1                 (0x0020)  /* Timer A mode control 1 */
#define MC0                 (0x0010)  /* Timer A mode control 0 */

im Register TBCTL    MC1 das Bit 5 bzw. MC0 das Bit 4 zuordnet,
kann ich die folgenden Definitionen nicht deuten
insbesondere, was bedeutet das kleine u?

#define MC_0     (0*0x10u)  /* Timer A mode control: 0 - Stop */
#define MC_1     (1*0x10u)  /* Timer A mode control: 1 - Up to CCR0 */
#define MC_2     (2*0x10u)  /* Timer A mode control: 2 - Continous up */
#define MC_3     (3*0x10u)  /* Timer A mode control: 3 - Up/Down */
MfG
Wolfgang

von Stefan (Gast)


Lesenswert?

MC_0 bis MC_3 sind einfach die möglichen Kombinationen
aus den Bits MC0 und MC1.
z.B.: MC_3 = MC0 + MC1 = 0x10 + 0x20 = 0x30
Das 'u' steht vermutlich für 'unsigned' also vorzeichenlos

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.