Forum: Mikrocontroller und Digitale Elektronik Timerschwankungen beim 8051


von Mike (Gast)


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
}

von peter dannegger (Gast)


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

von dds5 (Gast)


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

von Mike (Gast)


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

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.