Timerschwankungen beim 8051

Gast #275127
Lesenswert?

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
}
Gast #275128
Lesenswert?

Wie machst Du es, bei 1ms noch 1µs auf dem Oszi zu sehen ?

Sind max 0,1% Abweichung wirklich so schlimm ?


Die Interruptlatenz steht im Datenblatt und auch, durch welche Faktoren
sie differiert, das ist also voll normal.

Wenn Du wirklich zyklusgenaue Pinumschaltung haben willst, geht das nur
mit dem Toggle-Pin von T2 oder mit den Compare-Outputs des PCA.

Die erfolgen von der Latenzzeit unabhängig per Hardware.


Peter
Gast #275129
Lesenswert?

Da kein auto-reload timer verwendet wird, tippe ich auf ein Problem mit
der Interrupt latency.
Je nach Befehl (1 oder 2 Byte), der gerade abgearbeitet wird dauert es
unteschiedlich lang bis der Int ausgeführt wird und damit ändert sich
auch die Länge des Impulses.

Dieter
Gast #275130
Lesenswert?

@Peter: Da es ein Digitales Oszi ist, verschiebe ich einfach den
Triggerpunkt nach links bis ich die entsprechende Flanke auf dem Schirm
habe.

Den entsprechenden Abschnitt habe ich im Datenblatt zwar noch nicht
gefunden, aber gedacht habe ich mir schon. Vor allem da 1µs genau ein
Maschinentakt ist. Und jetzt habe ich ja von euch die Bestätigung.

Viel Dank für die schnellen Infos.

Mike

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren