Forum: Mikrocontroller und Digitale Elektronik PIC32MX Timer 45 Problem


von Daniel P. (peini7)


Lesenswert?

Hallo

ich bastle gerade an der Firmware für meine Schrittmotorsteuerung und 
habe ein kleines Problem, an dem ich jetzt schon einige Zeit sitze und 
einfach nicht weiterkomme.

Für den Takt meines Schrittmotorcontrollers (TMC261) verwende ich die 
Timerkombi 4&5 als 32bit Timer eines PIC32MX575F512H.

Den Timer initialisiere ich wie folgt:
1
T4CONbits.TON  = 0;
2
T4CON          = 0x00;
3
T5CON          = 0x00;
4
TMR4           = 0;
5
TMR5           = 0;
6
T5IE_bit       = 1;
7
T5IF_bit       = 0;
8
T5IP0_bit      = 1;
9
T5IP1_bit      = 1;
10
T5IP2_bit      = 1;
11
PR5            = 0;
12
PR4            = 8000; // 80 = 1us
13
T4CONbits.TON  = 0;
14
T4CONbits.T32  = 1;

Des weiteren hab ich dann eine Methode TMC_SetSpeed, die mir eine 
Geschwindigkeit in rpm in den Wert für das PR Register umrechnet und 
dieses dann setzt.

Das passiert im wesentlichen so:
1
timer = (unsigned long)ceil( ( 1.0f / rpm ) * 125000.0f );
2
PR5 = 0;
3
PR4 = timer;

Zum Problem: Wenn ich die Geschwindigkeit festlege funktioniert das mal 
einwandfrei. Setz ich aber später eine neue Geschwindigkeit, dann bleibt 
mein Timer irgendwie stehen. Er ist zwar weiter aktiv, aber gibt keinen 
Takt mehr aus. Ich kann den Wert dann auch auf den alten zurücksetzen, 
aber der Timer bleibt trotzdem stehen.

Ich hab schon alles mögliche versucht, zB. Interrupts während dem Ändern 
der PR Register auszuschalten, aber bringt alles nichts.
Wahrscheinlich ists nur ne Kleinigkeit die ich übersehe.
Habt ihr vielleicht eine Idee?

Falls jemand den Quellcode sehen möchte, um was zu überprüfen, bitte 
melden.
Kompiliert wird mit mikroe mikroCPro for PIC32

Danke.

Lg. Daniel

von Peter C. (peter_c49)


Lesenswert?

Hallo Daniel,

schau doch mal in das Reference Manual section 14 Timer.
dort steht das die PRx nicht neu beschrieben werden sollten wenn der 
Timer ON ist -> undefiniertes verhalten.

ev timer aus, PRx aendern , timer wieder an.

--
Peter

von Daniel P. (peini7)


Lesenswert?

Danke Peter.
Das mit dem Ausschalten des Timers hatte ich schon versucht. Brachte 
aber leider nichts. Ich bin aber einen halben Tag später und nach langem 
grübeln selber auf das Problem draufgekommen.

Mein Timer läuft von 0 bis 2^32 - 1.
Das PR Register sagt ja jetzt nichts anderes, als einen Wert dazwischen, 
an dem der Timer einen Interrupts auslösen soll und wieder bei 0 
beginnt.

Da das Problem jetzt nur hin und wieder auftauchte kam mir irgendwann 
die Lösung.
Wenn ich es zufällig so erwischt habe, dass ich zB den Wert 20000 auf 
das PR Register geschrieben habe und der aktuelle Timerwert schon 
darüber war, dann läuft der Timer natürlich nach oben weiter, also bis 
2^32 und das dauert dann halt ein bisschen, und ich dachte, der Timer 
reagiert gar nicht mehr.

Jetzt setz ich einfach beim ändern von PR4 auch TMR4 und TMR5 auf 0.
Damit klappts wunderbar.

Trotzdem danke für deine schnelle Hilfe Peter.

Lg. Daniel

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.