Hallöle,
ich habe das Timerproblem dahingehend "gelöst" das ich nun einen anderen
Ansatz verwende. Das funktioniert soweit recht gut. Die Funktion
delayus(parameter) wartet nun [parameter] µsek lang ab.
1 | void delayus(delay){
|
2 | TSC_TRST=1;
|
3 | TMOD=(delay*3);
|
4 | TSC_TSTOP=0;
|
5 | while (TSC_TOF == 0);
|
6 | TSC_TSTOP=1;
|
7 | TSC_TOF = 0;
|
8 | }
|
Nun wollte ich noch eine zweite Funktion schreiben, delayfrq(parameter).
Diese sollte anhand einer übergebenen Frequenz (Parameter) die
entsprechende Periodenlänge abwarten. Die Formel ist klar, t=1/f. Das
Problem ist, dass hierbei naturgemäß meißt eine Zahl mit Nachkommastelle
rauskommt. Ich bin nun ertsmal davon ausgegangen, das er beim Datentyp
int die Nachkommastelle einfach fallen lässt. Zumindest warnt der
Compiler davor C2705: Possible loss of data
1 | void delayfrq(frq){
|
2 | int time;
|
3 | time=(1/frq)*1000000;
|
4 |
|
5 | TSC_TRST=1;
|
6 | TMOD=(time*3);
|
7 | TSC_TSTOP=0;
|
8 | while (TSC_TOF == 0);
|
9 | TSC_TSTOP=1;
|
10 | TSC_TOF = 0;
|
11 | }
|
Allerdings stürzt der µC dann bei
stumpf ab (Ich habe probeweise einen statischen Wert verwendet (
), damit geht es, reagiert dann natürlich nicht auf den errechneten
Wert, jedoch der Timer arbeitet korrekt.
Letztlich wollte ich time dann als float deklarieren und per round()
runden. Ohne jetzt im Detail auf round() einzugehen habe ich bemerkt,
dass sobald ich in der Funktion irgendeine beliebige float Variable
definiere, das ganze versagt; der Timer anscheinend mit TMOD=1 abläuft,
selbst wenn ich wie zuvor
hart kodiert habe, und auch wenn die Variable nur deklariert, aber in
der Funktion garnicht weiter genutzt wird.
Also bei folgendem Beispiel dreht sich der Motor:
1 | void delayfrq(frq){
|
2 | int time;
|
3 | time=(1/frq)*1000000;
|
4 |
|
5 | TSC_TRST=1;
|
6 | TMOD=(3000*3);
|
7 | TSC_TSTOP=0;
|
8 | while (TSC_TOF == 0);
|
9 | TSC_TSTOP=1;
|
10 | TSC_TOF = 0;
|
11 | }
|
12 |
|
13 | for (test=0; test<1000; test++){
|
14 | delayfrq(440);
|
15 | MOTclk = !MOTclk;
|
16 | }
|
während er bei diesem Code nur einen Wimpernschlag lang summt:
1 | void delayfrq(frq){
|
2 | float time;
|
3 | time=(1/frq)*1000000;
|
4 |
|
5 | TSC_TRST=1;
|
6 | TMOD=(3000*3);
|
7 | TSC_TSTOP=0;
|
8 | while (TSC_TOF == 0);
|
9 | TSC_TSTOP=1;
|
10 | TSC_TOF = 0;
|
11 | }
|
12 |
|
13 | for (test=0; test<1000; test++){
|
14 | delayfrq(440);
|
15 | MOTclk = !MOTclk;
|
16 | }
|
obwohl ich in beiden fällen einen statischen, hardcodierten Wert in TMOD
lade, und nur die Deklaration von time eine andere ist.
Ich versteh's nicht?!