Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

Re: Messen der Tackte von Anweisungen, usw. Kategorie: Programmierung Basic (von Ernst H. - 29.10.2010 22:47)
Als Antwort auf Re: Messen der Tackte von Anweisungen, usw. von PeterS - 29.10.2010 9:42
Ich nutze:
CC-Pro 128 Application Board, Pro-Bot128

/*
Ich habe nochmals getestet, das Ergebnis eindeutig  ++Var (Byte)
benötigt 260 Takte. Auch mit Logik-Analyser  Test 3 und 4:  Impuls
mit ++Var 52us  ohne 36us  also ca. die  berechneten  17us.
Differenz Test3 und 4  exakt 260 Takte.

Weitere Bemerkung  PortWriteBit durch selbermachen
(DirAcc.. lesen,maskieren,ausgabe)ist um als 130 Takte langsamer - bei
gleichzeitig mehreren Bits - wieder effektiver.
if  /  Case  schon ein grosser Unterschied
Messwertausgabe


ab und zu kommen mehr Takte heraus, vermutlich interne
Interruptverarbeitungen. Weniger allerdings nie.
 Var=Var+1  hier 335 Takte habe ich mit anderen Programm schon
 mal 291 herausbekommen?

 ADC_Set(ADC_VREF_VCC,0)
      ADC_0 = ADC_Read()
 'Takte= 4008 271.742401us  Takte= 2397 162.516601us  Takte= 2382 161.499us
 'beim ersten Aufruf 4008, dann nurmehr ca 2380

Messwertausgabe
Mess1  ++Var (Byte)              Takte= 260   17.628000us  Takte= 260 17.628000us
Mess2 Var=Var+1 (Byte)        Takte= 335   22.712999us  Takte= 335 22.712999us
Mess3 2xPort_WriteBit           Takte= 1036   70.240798us  Takte= 1036 70.240798us
Mess4 2xPort_WriteBit ++Var Takte= 1296   87.868797us  Takte= 1296 87.868797us
Mess5 Port_Write                  Takte= 441   29.899799us  Takte= 441 29.899799us
Mess6 DirAcc_Write              Takte= 434   29.425199us  Takte= 434 29.425199us
Mess7  PortBit Eigenbau       Takte= 648   43.934398us  Takte= 648 43.934398us
Mess8 Port_WriteBit             Takte= 518   35.120399us  Takte= 518 35.120399us
Mess9 Schleife 10000          N128= 4520   39.233600ms  N128= 4519 39.224918ms
Mess10 ULong=Ulong+1       Takte= 484   32.815200us  Takte= 484 32.815200us
Mess11 ULong vergleich     Takte= 713   48.341400us  Takte= 713 48.341400us
Mess12 Byte Vergleich      Takte= 372   25.221599us  Takte= 372 25.221599us
Mess13 ADC abfrage         Takte= 4008   271.742401us  Takte= 2448 165.974395us
Mess14 Case   abfrage      Takte= 906   61.426799us  Takte= 906 61.426799us
Mess15 If  abfrage            Takte= 2380   161.363998us  Takte= 2380 161.363998us

Mess9 mit langsameren Takt - dh die 4520*128=578560 Takte daher in ms


Fertiges Programm zum Ausgeben von Messungen -einfach starten-
Ergebnis erscheint an Konsole
*/

Dim Zeitfloat As Single
Dim Timervar As Word
Dim Var As Byte         ' für Tests Nr1 ++Var, und Var=Var+1
Dim Var2 As Byte
Dim i As Integer        ' For Schleife
Dim Schleife As Integer
Dim Longvar As ULong
Dim Longvar2 As ULong
Dim Pausenzeit As Word
Dim ADC_0 As Word

#define Pausenzeit 2000    '2sec Pause zwischen den Messungen
#define Duchlaufe 3

Sub main()
 Do While (1)
  Port_DataDir(PortC,255 )    'PortC alles Output.. zum Messen

  Msg_WriteText("Mess1  ++Var (Byte)        " )
  For i = 1 To Duchlaufe             'für 3-malige Ausgabe in einer Zeile
    AbsDelay(2 ) ' unbedingt notwendig!!!  nur mit 2ms Pause konstante Werte
    Timer_T1Time(65000,1)  ' Startpunkt der Messung 67,8ns Takt Cnt1 = 0
                        'bei 65000 wird Int ausgelöst, hier nicht verwendet
         ++Var       'hier die Prüf - Anweisungen oder ganze Programmteile
                        'bis max 4,4ms  67,8ns Takt = 14,..MHz
    Msg_Laufzeit1() ' Aufruf der Sub (Cnt Auslesung und Korrektur)
  Next
    Msg_WriteChar(13)   'CR  ... Neue Zeile
    AbsDelay(Pausenzeit )  'Zeit zum ablesen

        'nun Test2:

  Msg_WriteText("Mess2 Var=Var+1 (Byte)     " )
  For i = 1 To Duchlaufe             'für 3-malige Ausgabe in einer Zeile
    AbsDelay(2 ) ' unbedingt notwendig!!!  nur mit 2ms Pause konstante Werte
    Timer_T1Time(65000,1)  ' Startpunkt der Messung 67,8ns Takt Cnt1 = 0
        Var=Var+1    'hier die Prüf - Anweisungen oder ganze Programmteile
                     'bis max 4,4ms  67,8ns Takt = 14,..MHz
    Msg_Laufzeit1()  ' Aufruf der Sub (Cnt Auslesung und Korrektur)
  Next
  Msg_WriteChar(13)   'CR  ... Neue Zeile
  AbsDelay(Pausenzeit )  'Zeit zum ablesen

        'nun Test3:


  Msg_WriteText("Mess3 2xPort_WriteBit      " )
  For i = 1 To Duchlaufe             'für 3-malige Ausgabe in einer Zeile
    AbsDelay(2 ) ' unbedingt notwendig!!!  nur mit 2ms Pause konstante Werte
    Timer_T1Time(65000,1)  ' Startpunkt der Messung 67,8ns Takt Cnt1 = 0
      Port_WriteBit(20,1) 'hier die Prüf - Anweisungen oder ganze Programmt.
      Port_WriteBit(20,0) 'PortC.4 auf 0
                          'bis max 4,4ms  67,8ns Takt = 14,..MHz
    Msg_Laufzeit1()   ' Aufruf der Sub (Cnt Auslesung und Korrektur)
  Next
  Msg_WriteChar(13)   'CR  ... Neue Zeile
  AbsDelay(Pausenzeit )  'Zeit zum ablesen

        'nun Test4:
  Msg_WriteText("Mess4 2xPort_WriteBit ++Var" )
  For i = 1 To Duchlaufe             'für 3-malige Ausgabe in einer Zeile
    AbsDelay(2 ) ' unbedingt notwendig!!!  nur mit 2ms Pause konstante Werte
    Timer_T1Time(65000,1)  ' Startpunkt der Messung 67,8ns Takt Cnt1 = 0
      Port_WriteBit(20,1) 'hier die Prüf - Anweisungen oder ganze Programmt.
        ++Var            'mit Logkanalyser können die zusätzlichen 260Takte..
      Port_WriteBit(20,0)
                        'bis max 4,4ms  67,8ns Takt = 14,..MHz
      Msg_Laufzeit1() ' Aufruf der Sub (Cnt Auslesung und Korrektur)
  Next
  Msg_WriteChar(13)   'CR  ... Neue Zeile
  AbsDelay(Pausenzeit )  'Zeit zum ablesen


       'nun Test5:
  Msg_WriteText("Mess5 Port_Write           " )
  For i = 1 To Duchlaufe             'für 3-malige Ausgabe in einer Zeile
    AbsDelay(2 ) ' unbedingt notwendig!!!  nur mit 2ms Pause konstante Werte
    Timer_T1Time(65000,1)  ' Startpunkt der Messung 67,8ns Takt Cnt1 = 0
    Port_Write(PortC,255 ) 'hier die Prüf - Anweisungen oder ganze Programmt.
                                 'bis max 4,4ms  67,8ns Takt = 14,7456MHz
    Msg_Laufzeit1() ' Aufruf der Sub (Cnt Auslesung und Korrektur)
  Next
  Msg_WriteChar(13)   'CR  ... Neue Zeile
  AbsDelay(Pausenzeit )  'Zeit zum ablesen

        'nun Test6:
  Msg_WriteText("Mess6 DirAcc_Write         " )
  For i = 1 To Duchlaufe             'für 3-malige Ausgabe in einer Zeile
    AbsDelay(2 ) ' unbedingt notwendig!!!  nur mit 2ms Pause konstante Werte
    Timer_T1Time(65000,1)   ' Startpunkt der Messung 67,8ns Takt Cnt1 = 0
    DirAcc_Write(0x35,255 ) 'hier die Prüf - Anweisungen oder ganze Progr.
                            'bis max 4,4ms  67,8ns Takt = 14,..MHz
    Msg_Laufzeit1()         ' Aufruf der Sub (Cnt Auslesung und Korrektur)
  Next
  Msg_WriteChar(13)   'CR  ... Neue Zeile
  AbsDelay(Pausenzeit )  'Zeit zum ablesen


      'nun Test7:
  Msg_WriteText("Mess7  PortBit Eigenbau    " )
  For i = 1 To Duchlaufe             'für 3-malige Ausgabe in einer Zeile
    AbsDelay(2 ) ' unbedingt notwendig!!!  nur mit 2ms Pause konstante Werte
    Timer_T1Time(65000,1)  ' Startpunkt der Messung 67,8ns Takt Cnt1 = 0
      DirAcc_Write(0x35,DirAcc_Read(0x35 Or 00010000 ) )
           'das PortC Register wird gelesen maskiert und damit Bit 4 gesetzt
                    'hier die Prüf - Anweisungen oder ganze Programmteile
                                 'bis max 4,4ms  67,8ns Takt = 14,..MHz
    Msg_Laufzeit1() ' Aufruf der Sub (Cnt Auslesung und Korrektur)
  Next
  Msg_WriteChar(13)   'CR  ... Neue Zeile
  AbsDelay(Pausenzeit )  'Zeit zum ablesen


    'nun Test8:
  Msg_WriteText("Mess8 Port_WriteBit        " )
  For i = 1 To Duchlaufe             'für 3-malige Ausgabe in einer Zeile
    AbsDelay(2 ) ' unbedingt notwendig!!!  nur mit 2ms Pause konstante Werte
    Timer_T1Time(65000,1)  ' Startpunkt der Messung 67,8ns Takt Cnt1 = 0
      Port_WriteBit(20,1) 'hier die Prüf - Anweisungen oder ganze Programmt.
                                'bis max 4,4ms  67,8ns Takt = 14,..MHz
    Msg_Laufzeit1() ' Aufruf der Sub (Cnt Auslesung und Korrektur)
  Next
  Msg_WriteChar(13)   'CR  ... Neue Zeile
  AbsDelay(Pausenzeit )  'Zeit zum ablesen


        'nun Test9:      hier langsamerer Takt: 8,68us
  Msg_WriteText("Mess9 Schleife 10000       " )
  For i = 1 To Duchlaufe             'für 3-malige Ausgabe in einer Zeile
    AbsDelay(2 ) ' unbedingt notwendig!!!  nur mit 2ms Pause konstante Werte
    Timer_T1Time(65000,5)   ' Startpunkt der Messung mit 8,68usTakt
      For Schleife = 1 To 10000'hier die Prüf - Anweisungen oder ganze Progr.
             ++Var
      Next                      'bis zu 0,56sec
    Msg_Laufzeit128T() ' Aufruf der Sub (Cnt Auslesung und Korrektur)
  Next
  Msg_WriteChar(13)   'CR  ... Neue Zeile
  AbsDelay(Pausenzeit )  'Zeit zum ablesen


    'nun Test10:
  Msg_WriteText("Mess10 ULong=Ulong+1      " )
  Longvar = 4294967294     ' damit in 2. Durchlauf ein Ã?berlauf entsteht
  For i = 1 To Duchlaufe             'für 3-malige Ausgabe in einer Zeile
    AbsDelay(2 ) ' unbedingt notwendig!!!  nur mit 2ms Pause konstante Werte
    Timer_T1Time(65000,1)  ' Startpunkt der Messung 67,8ns Takt Cnt1 = 0
            'hier die Prüf - Anweisungen oder ganze Programmteile
    Longvar = Longvar + 1       'bis max 4,4ms  67,8ns Takt = 14,..MHz
    Msg_Laufzeit1() ' Aufruf der Sub (Cnt Auslesung und Korrektur)
  Next
  Msg_WriteChar(13)   'CR  ... Neue Zeile
  AbsDelay(Pausenzeit )  'Zeit zum ablesen


  'nun Test11:
  Msg_WriteText("Mess11 ULong vergleich    " )
  Longvar = 4294967000     '
  Longvar = 4294967010     'eine hohe Zahl - es müssen alle 32 Bits vergl.
  For i = 1 To Duchlaufe             'für 3-malige Ausgabe in einer Zeile
    AbsDelay(2 ) ' unbedingt notwendig!!!  nur mit 2ms Pause konstante Werte
    Timer_T1Time(65000,1)  ' Startpunkt der Messung 67,8ns Takt Cnt1 = 0
          'hier die Prüf - Anweisungen oder ganze Programmteile
    If Longvar2 < Longvar Then      'bis max 4,4ms  67,8ns Takt = 14,..MHz
        ++Var     ' hier vergleich nicht erfüllt, Var bleibt gleich
    End If
    Msg_Laufzeit1() ' Aufruf der Sub (Cnt Auslesung und Korrektur)
  Next
  Msg_WriteChar(13)   'CR  ... Neue Zeile
  AbsDelay(Pausenzeit )  'Zeit zum ablesen




  'nun Test12:
  Msg_WriteText("Mess12 Byte Vergleich     " )
  Var = 222     '
  Var2 = 243     '
  For i = 1 To Duchlaufe             'für 3-malige Ausgabe in einer Zeile
    AbsDelay(2 ) ' unbedingt notwendig!!!  nur mit 2ms Pause konstante Werte
    Timer_T1Time(65000,1)  ' Startpunkt der Messung 67,8ns Takt Cnt1 = 0
          'hier die Prüf - Anweisungen oder ganze Programmteile
    If Var2 < Var Then      'bis max 4,4ms  67,8ns Takt = 14,..MHz
        ++Var     ' hier vergleich nicht erfüllt, Var bleibt gleich
    End If
    Msg_Laufzeit1() ' Aufruf der Sub (Cnt Auslesung und Korrektur)
  Next
  Msg_WriteChar(13)   'CR  ... Neue Zeile
  AbsDelay(Pausenzeit )  'Zeit zum ablesen



 'nun Test13:
  Msg_WriteText("Mess13 ADC abfrage        " )    '
  For i = 1 To Duchlaufe             'für 3-malige Ausgabe in einer Zeile
    AbsDelay(2 ) ' unbedingt notwendig!!!  nur mit 2ms Pause konstante Werte
    Timer_T1Time(65000,1)  ' Startpunkt der Messung 67,8ns Takt Cnt1 = 0
          'hier die Prüf - Anweisungen oder ganze Programmteile
      ADC_Set(ADC_VREF_VCC,0)
      ADC_0 = ADC_Read()

 'Takte= 4008 271.742401us  Takte= 2397 162.516601us  Takte= 2382 161.49..
 'beim ersten Aufruf 4008, dann nurmehr ca 2380

    Msg_Laufzeit1() ' Aufruf der Sub (Cnt Auslesung und Korrektur)
  Next
  Msg_WriteChar(13)   'CR  ... Neue Zeile
  AbsDelay(Pausenzeit )  'Zeit zum ablesen

     'nun Test14:
  Msg_WriteText("Mess14 Case   abfrage     " )     '
  Var=5
  For i = 1 To Duchlaufe             'für 3-malige Ausgabe in einer Zeile
    AbsDelay(2 ) ' unbedingt notwendig!!!  nur mit 2ms Pause konstante Werte
    Timer_T1Time(65000,1)  ' Startpunkt der Messung 67,8ns Takt Cnt1 = 0
          'hier die Prüf - Anweisungen oder ganze Programmteile
      Select Case Var
        Case 1
            ++Var2
        Case 2
            ++Var2
        Case 3
            ++Var2
        Case 4
            ++Var2
        Case 5
            ++Var2
        Case 6
            ++Var2
      End Select

    Msg_Laufzeit1() ' Aufruf der Sub (Cnt Auslesung und Korrektur)
  Next
  Msg_WriteChar(13)   'CR  ... Neue Zeile
  AbsDelay(Pausenzeit )  'Zeit zum ablesen



   'nun Test15:
  Msg_WriteText("Mess15 If  abfrage        " )     '
  Var=5
  For i = 1 To Duchlaufe             'für 3-malige Ausgabe in einer Zeile
    AbsDelay(2 ) ' unbedingt notwendig!!!  nur mit 2ms Pause konstante Werte
    Timer_T1Time(65000,1)  ' Startpunkt der Messung 67,8ns Takt Cnt1 = 0
          'hier die Prüf - Anweisungen oder ganze Programmteile
      If Var = 1 Then
            ++Var2
      End If
      If Var = 2 Then
            ++Var2
      End If
      If Var = 3 Then
            ++Var2
      End If
      If Var = 4 Then
            ++Var2
      End If
      If Var = 5 Then
            ++Var2
      End If
      If Var = 6 Then
            ++Var2
      End If
      'ist nicht exakt mit obiger Case vergleichbar, aber ähnlich

  Msg_Laufzeit1() ' Aufruf der Sub (Cnt Auslesung und Korrektur)
  Next
  Msg_WriteChar(13)   'CR  ... Neue Zeile
  AbsDelay(Pausenzeit )  'Zeit zum ablesen

  Msg_WriteChar(13)   'CR  ... Neue Zeile  letzte Zusatzzeile
 End While
End Sub  'main  ************************************



Sub Msg_Laufzeit1 ()                      ' Sub für Messung und Ausgabe
    Timervar = Timer_T1GetCNT() - 455     ' Korr-Wert wenn kein Befehle
    Msg_WriteText(" Takte= ")
    Msg_WriteWord(Timervar )              ' Takte 67,8ns ... 14,..MHz
    Msg_WriteChar(32 )
    Zeitfloat = Timervar * 0.0678         ' Wert in us
    Msg_WriteFloat(Zeitfloat )
    Msg_WriteText("us" )
    Msg_WriteChar(32 )
End Sub

    /*
    AbsDelay(2 )                          ' unbedingt notwendig!!!
    Timer_T1Time(65000,1)                 ' Startpunkt der Messung
    Msg_Laufzeit2()                       ' Aufruf der Sub
    */
Sub Msg_Laufzeit2 ()                      ' nur mit 2ms Pause konstante
    Timervar = Timer_T1GetCNT() - 455     ' Werte sonst 30-64us
    Msg_WriteText(" Nr2= ")
    Msg_WriteWord(Timervar )              ' Takte 67,8ns ... 14,..MHz
    Msg_WriteChar(32 )
    Zeitfloat = Timervar * 0.0678         ' Wert in us
    Msg_WriteFloat(Zeitfloat )
    Msg_WriteChar(32 )
End Sub

    /*
    AbsDelay(2 )                          ' unbedingt notwendig!!!
    Timer_T1Time(65000,1)                 ' Startpunkt der Messung
    Msg_Laufzeit1()                       ' Aufruf der Sub
    */
Sub Msg_Laufzeit3 ()                       ' nur mit 2ms Pause konstante
    Timervar = Timer_T1GetCNT() - 455     ' Werte sonst 30-64us
    Msg_WriteText(" Nr3= ")
    Msg_WriteWord(Timervar )              ' Takte 67,8ns ... 14,..MHz
    Msg_WriteChar(32 )
    Zeitfloat = Timervar * 0.0678         ' Wert in us
    Msg_WriteFloat(Zeitfloat )
    Msg_WriteChar(32 )
End Sub

    /*
    AbsDelay(2 )                          ' unbedingt notwendig!!!
    Timer_T1Time(65000,1)                 ' Startpunkt der Messung
    Msg_Laufzeit4()                       ' Aufruf der Sub
    */
Sub Msg_Laufzeit4 ()                      ' nur mit 2ms Pause konstante
    Timervar = Timer_T1GetCNT() - 455     ' Werte sonst 30-64us
    Msg_WriteText(" Nr4= ")
    Msg_WriteWord(Timervar )              ' Takte 67,8ns ... 14,..MHz
    Msg_WriteChar(32)
    Zeitfloat = Timervar * 0.0678         ' Wert in us
    Msg_WriteFloat(Zeitfloat )
    Msg_WriteChar(32)
    'Msg_WriteChar(13)                     ' CR  Zeilenvorschub
End Sub


    /*
    AbsDelay(2 )                    ' unbedingt notwendig!!!
    Timer_T1Time(65000,5)           ' Startpunkt der Messung mit 8,68usTakt
    Msg_Laufzeit128T()              ' Aufruf der Sub
    */
Sub Msg_Laufzeit128T ()    ' nur mit 2ms Pause am Beginn konstante Werte !!
    Schleife = Schleife + 1 - 1  ' Zeitverbrauch damit wenige Takte abgezogen
    Timervar = Timer_T1GetCNT() - 1       ' Korrektur -1
    Msg_WriteText(" N128= ")              ' bis zu 0,56sec
    Msg_WriteWord(Timervar )              ' 128 Takte 8,68us ...
    Msg_WriteChar(32)
    Zeitfloat = Timervar * 0.00868         ' Wert in ms!
    Msg_WriteFloat(Zeitfloat )
    Msg_WriteText("ms")
    Msg_WriteChar(32)
    'Msg_WriteChar(13)                     ' CR  Zeilenvorschub
End Sub

/*
    AbsDelay(2 )                  ' unbedingt notwendig!!!
    Timer_T1Time(65000,7)         ' Startpunkt der Messung mit 69,44usTakt

    *************   Achtung Vor-Teiler 6 und 7 geht nicht!

    Msg_Laufzeit1024T()                   ' Aufruf der Sub
    */
Sub Msg_Laufzeit1024T ()             ' nur mit 2ms Pause konstante Werte!!
    Timervar = Timer_T1GetCNT() '- 455    '
    Msg_WriteText(" N1024= ")             ' bis zu 4,485sec
    Msg_WriteWord(Timervar )              ' 1024 Takte 69,44us ...
    Msg_WriteChar(32)
    Zeitfloat = Timervar * 0.06944         ' Wert in ms!
    Msg_WriteFloat(Zeitfloat )
    Msg_WriteText("ms")
    Msg_WriteChar(32)
    Msg_WriteChar(13)                     ' CR  Zeilenvorschub
End Sub









> Hallo Ernst,
>
> Deine gemessenen Takte sind zu hoch, allerdings verbrauchen Bytecodes  Instruktionen
> je nach Komplexität tatsächlich 30+ Taktzyklen. Das liegt an der Harvard Architektur
> der Atmel Megas, die den Zugriff auf das Flash limitieren. Hat man im Zugriff auf das RAM
> mehrere Adressmodi und kann indiziert über X,Y,Z zugreifen, so kennt der Flashzugriff
> leider nur eine Zugriffsart. Deshalb braucht alleine der Fetch Bytecode, Lookup + Sprung
> in die Bytecode Routine ca. 30 Taktzyklen.
>
> Wenn ich dazu komme, werde ich noch ausführlicher vorstellen, was ein "Var++" oder "Var=Var+1"
> an Bytecodes benötigt. Veröffentliche doch mal das komplette Programm, wo Du die Taktzyklen
> miÃ?t.
>
> Die neue Beta hat auch in der Geschwindigkeit Optimierungen, ich schätze das die Version ca.
> 5-10% schneller geworden ist.
>
> Der Atmel AVR32 hat Spezialbefehle für den Table Einsprung, dort wird die Bytecodeabarbeitung
> vorraussichtlich ca. 8x-10x schneller werden.
>
> Gruss Peter
>
> > Unten ein kurzes Programm zum messen von Laufzeiten - Anweisungen, Programmteile
> > Verwendet wird der 16-Bit Timer 1
> > Ergebnis: sehr enttäuschend!
> > Var = Var + 1     (Byte) benötigt  291 Takte!!!
> > ++Var                                       260 Takte !!!
> >
> > Sinus von einer single     etwa 3000   - ist ok, aber die einfachsten Anweisungen brauchen extrem
> > lange.      Das increment einer Bytevariable immer noch 260 Tackte wofür ????
> >
> > Portausgabe eines Bytes  um die 400,  mit DirAcc_Write  direkt das Register beschreiben - denkste -
> > dauert genauso lange.
> > Entweder ich mache da einen ordentlichen Ã?berlegungsfehler (wird der Tackt intern geteilt?) oder das
> > Basic ist wirklich so langsam - vorallem bei einfachsten Befehlen?
> > Ã?brigens PortWriteByte soll wesentlich schneller sein als PortWriteBit -   etwa 400 zu etwa 550
> > macht man das "Ausmaskieren" des Bits händisch so kommt man sicher auf wesentlich mehr, da
> > jeder einfachste Befehl unsummen an Tackten friÃ?t.
> >
> > Dim Zeitfloat As Single
> > Dim Timervar As Word
> >
> >
> >     AbsDelay(2 )                          ' unbedingt notwendig!!!
> >                                           ' nur mit 2ms Pause konstante
> >                                           ' Werte sonst 30-64us
> >    
> >     Timer_T1Time(65000,1)                 ' Startpunkt der Messung mit 67,8ns
> >    
> >             'hier die Prüf - Anweisungen oder ganze Programmteile
> >             'bis max 4,4ms
> >    
> >     Msg_Laufzeit1()                       ' Aufruf der Sub
> >     */
> > Sub Msg_Laufzeit1 ()                      ' Sub für Messung und Ausgabe
> >     Timervar = Timer_T1GetCNT() - 455     ' Korr-Wert wenn kein Befehle
> >     Msg_WriteText(" Nr1= ")
> >     Msg_WriteWord(Timervar )              ' Takte 67,8ns ... 14,..MHz
> >     Msg_WriteChar(32 )
> >     Zeitfloat = Timervar * 0.0678         ' Wert in us
> >     Msg_WriteFloat(Zeitfloat )
> >     Msg_WriteChar(32 )
> > End Sub
> >
> >
> >
> >
> >
> >
> >
> >  AbsDelay(2 )                          ' unbedingt notwendig!!!
> >     Timer_T1Time(65000,5)                 ' Startpunkt der Messung mit 8,68usTakt
> >     Msg_Laufzeit128T()                    ' Aufruf der Sub
> >     */
> > Sub Msg_Laufzeit128T ()                   ' nur mit 2ms Pause konstante Werte !!
> >     Schleife = Schleife + 1 - 1           ' Zeitverbrauch damit wenige Takte abgezogen werden
> >     Timervar = Timer_T1GetCNT() - 1       ' Korrektur -1
> >     Msg_WriteText(" N128= ")              ' ******************bis zu 0,56sec  *********************************
> >     Msg_WriteWord(Timervar )              ' 128 Takte 8,68us ...
> >     Msg_WriteChar(32)
> >     Zeitfloat = Timervar * 0.00868         ' Wert in ms!
> >     Msg_WriteFloat(Zeitfloat )
> >     Msg_WriteText("ms")
> >     Msg_WriteChar(32)
> >     'Msg_WriteChar(13)                     ' CR  Zeilenvorschub
> > End Sub


    Antwort schreiben


Antworten: