Moin,
ich muß euch noch einmal um Hilfe bitten. Ich habe die unten stehende
Timerroutine um untzerschiedlich lange Gates zu erzeugen (von 1ms bis
zu 10sek).
Nur wenn ich mir das Ausgangssignal auf dem Oszilloscop ansehe, dann
schwankt die Länge des Gates immer um 1µs und ich weiß nicht wiso.
Wenn ich das Hautpprogramm nach dem Starten des Timers in eine
Endlosschleife schicke, dann tritt das schwanken nicht auf. Wenn er
aber das normale Hauptprogramm abarbeitet dann schon.
Ich frage mich langsam, ob das an einem ungünstig liegenden Befehl oder
einer Unterfunktion liegt, die atomar abgearbeitet wird. Weiß da jemand
etwas genaueres?
Der Compiler ist übrigens µVision von Keil
MfG Mike
1 | void v_Timer0(void) interrupt 1
|
2 | {
|
3 | static unsigned int bursttime = 0;
|
4 | static unsigned int offTime = 0;
|
5 |
|
6 | TR0 = 0; // Timer0:STOP (Timer zum neu laden anhalten)
|
7 |
|
8 | TL0 = (unsigned char) (64569 & 0x00FF);
|
9 | TH0 = (unsigned char) ((64569 & 0xFF00) >> 8);
|
10 |
|
11 | TR0 = 1; // Timer0:START
|
12 |
|
13 | timer0_tick++;
|
14 |
|
15 | if (qfpc.gate == true)
|
16 | {
|
17 |
|
18 | if (bursttime == timer0_tick)
|
19 | {
|
20 | bursttime = 0;
|
21 | _nop_();
|
22 | _nop_();
|
23 | puls_Port = 0;
|
24 | }
|
25 | else
|
26 | {
|
27 | if (bursttime ==0 && offTime == 0)
|
28 | {
|
29 | puls_Port = 1;
|
30 | bursttime= timer0_tick + qfpc.GateTime;
|
31 | if (qfpc.offTime == 49)
|
32 | offTime = bursttime + 1;
|
33 | else
|
34 | offTime = bursttime + qfpc.offTime-1;
|
35 | }
|
36 | if ( offTime == timer0_tick)
|
37 | {
|
38 | offTime= 0;
|
39 | }
|
40 | }
|
41 | }
|
42 | else
|
43 | {
|
44 | bursttime = 0;
|
45 | offTime = 0;
|
46 | }
|
47 | }
|