- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 10 von 65

Thema: Bascom Inline-Assembler

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    32
    Beiträge
    1.578
    Ok, habs jetzt ohne Sichern des SREG. Danke!

    Nein, beim Noise-Filter-Code verwende ich die Overlays nicht, da hier die Schleife einfach einfacher ist
    Die Overlays werden nur im restlichen Programm verwendet, z.b. bei den darauffolgenden Zeilen:
    Code:
    If Tmp1 > 61 And Tmp1 < 139 Then                            'don't process values that can't be correct
      Stmp1 = Tmp1 - 61
      Stmp1 = Stmp1 * 3                                         '==> values ranging from 3 (stick at bottom) to 228 (full throttle)
    End If
    'Now nick, roll, yaw and idle up switch
    
    If Tmp3 > 61 And Tmp3 < 139 Then                            'don't process values that can't be correct
      Stmp3 = Tmp3 - 100                                        'convert to values ranging from -37 to +37
    End If
    If Tmp2 > 61 And Tmp2 < 139 Then                            'don't process values that can't be correct
      Stmp2 = Tmp2 - 100                                        'convert to values ranging from -37 to +37
    End If
    If Tmp4 > 61 And Tmp4 < 139 Then                            'don't process values that can't be correct
      Stmp4 = Tmp4 - 100                                        'convert to values ranging from -37 to +37
    End If
    If Tmp5 > 61 And Tmp5 < 139 Then                            'don't process values that can't be correct
      Stmp5 = Tmp5 - 100                                        'convert to values ranging from -37 to +37
    End If
    Hm, also der Code wird so schnell wie möglich aufgerufen:
    Code:
    Do
      Acc
      Gyro
      Mixer
      Send_mots
      Led
      Voltage
      Failsave
      Guiconnection
    Loop
    End
    Die Mixer-Sub beinhaltet den Noise-Filter Code. Meinst du den Filter-Code? Das werde ich gleich mal machen.

    Gruß
    Chris

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von Che Guevara Beitrag anzeigen
    Die Mixer-Sub beinhaltet den Noise-Filter Code. Meinst du den Filter-Code?
    Ja, weil man dann sieht, wo's sich lohnt zu optimieren und wo nicht.
    Mein Edit hast Du gelesen ?
    Ob Du über Array(1) oder über Overlay Array(1) adressierst bleibt sich gleich. Nur Array(Variable) = Array(Variable) + andere Variable macht einen deutlichen Unterschied.

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    32
    Beiträge
    1.578
    Das Edit habe ich gerade eben gelesen. Das leuchtet natürlich ein.
    Was meinst du mit
    Nur Array(Variable) = Array(Variable) + andere Variable macht einen deutlichen Unterschied.
    ?
    Meinst du, dass
    Code:
    Stmp1 = Stmp1 + Tmp1
    schneller als
    Code:
    Sempf(1) = Sempf(1) + Tmp1
    ist?

    Gruß
    Chris

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von Che Guevara Beitrag anzeigen
    Meinst du, dass
    Code:
    Stmp1 = Stmp1 + Tmp1
    schneller als
    Code:
    Sempf(1) = Sempf(1) + Tmp1
    ist?
    Nein, gleich schnell.
    Das ist langsamer:
    Code:
     Sempf(i) = Sempf(i) + Tmp1

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    32
    Beiträge
    1.578
    Oh, na klar! Du hast es ja vorher schon geschrieben...

    Werde jetzt mal das Programm durchforsten und mal schauen, wo noch was zu machen ist. Melde mich dann wieder.

    Gruß
    Chris

    EDIT:
    Hab jetzt mal den Noise-Filter durch den Simulator gejagt. Herausgekommen ist folgendes:
    Code:
    '(  1439
    For I = 1 To 5
      Meanrx(i) = Meanrx(i) * 3
      Meanrx(i) = Meanrx(i) + Empf(i)                           '"lowpass filter" of the RC signal
      Shift Meanrx(i) , Right , 2                               ' (=divide by 4)
      Aempfh(i) = Meanrx(i) + 17                                'upper acceptable fluctuation
      Aempfl(i) = Meanrx(i) - 17                                'lower acceptable fluctuation
      If Empf(i) > Aempfh(i) Or Empf(i) < Aempfl(i) Then        'compare allowed fluctuation with current rc reading
         Empf(i) = Meanrx(i)                                    'if fluctuation was too high -> replace with averaged value
      End If
    Next
    ')
    
    '(  635
    Meanrx(1) = Meanrx(1) * 3
    Meanrx(1) = Meanrx(1) + Empf(1)
    Shift Meanrx(1) , Right , 2
    Aempfh(1) = Meanrx(1) + 17
    Aempfl(1) = Meanrx(1) - 17
    If Empf(1) > Aempfh(1) Or Empf(1) < Aempfl(1) Then
       Empf(1) = Meanrx(1)
    End If
    
    Meanrx(2) = Meanrx(2) * 3
    Meanrx(2) = Meanrx(2) + Empf(2)
    Shift Meanrx(2) , Right , 2
    Aempfh(2) = Meanrx(2) + 17
    Aempfl(2) = Meanrx(2) - 17
    If Empf(2) > Aempfh(2) Or Empf(2) < Aempfl(2) Then
       Empf(2) = Meanrx(2)
    End If
    
    Meanrx(3) = Meanrx(3) * 3
    Meanrx(3) = Meanrx(3) + Empf(3)
    Shift Meanrx(3) , Right , 2
    Aempfh(3) = Meanrx(3) + 17
    Aempfl(3) = Meanrx(3) - 17
    If Empf(3) > Aempfh(3) Or Empf(3) < Aempfl(3) Then
       Empf(3) = Meanrx(3)
    End If
    
    Meanrx(4) = Meanrx(4) * 3
    Meanrx(4) = Meanrx(4) + Empf(4)
    Shift Meanrx(4) , Right , 2
    Aempfh(4) = Meanrx(4) + 17
    Aempfl(4) = Meanrx(4) - 17
    If Empf(4) > Aempfh(4) Or Empf(4) < Aempfl(4) Then
       Empf(4) = Meanrx(4)
    End If
    
    Meanrx(5) = Meanrx(5) * 3
    Meanrx(5) = Meanrx(5) + Empf(5)
    Shift Meanrx(5) , Right , 2
    Aempfh(5) = Meanrx(5) + 17
    Aempfl(5) = Meanrx(5) - 17
    If Empf(5) > Aempfh(5) Or Empf(5) < Aempfl(5) Then
       Empf(5) = Meanrx(5)
    End If
    ')
    Also 635 im Vergleich zu 1439 ist doch schon etwas
    Vielen Dank für den Tipp!

    Gruß
    Chris

    EDIT:
    Mit den Tmpx-Overlay Variablen von Empf(x) kann man ja, wenn ich jetzt keinen Mist erzähle, die ISR nochmal verkürzen?!
    Code:
    'in range: 33
    'out of range: 34
    
    !PUSH    R16
    !IN      R16,       SREG
    !PUSH    R16
    !PUSH    R18
    
    !in r18, tcnt0
    !lds r16, {channel}
    !cpi r16, 1
    !breq channel1
    !cpi r16, 2
    !breq channel2
    !cpi r16, 3
    !breq channel3
    !cpi r16, 4
    !breq channel4
    !cpi r16, 5
    !breq channel5
    !rjmp outofrange
    Channel1:
    !sts {tmp1}, r18
    !rjmp outofrange
    Channel2:
    !sts {tmp2}, r18
    !rjmp outofrange
    Channel3:
    !sts {tmp3}, r18
    !rjmp outofrange
    Channel4:
    !sts {tmp4}, r18
    !rjmp outofrange
    Channel5:
    !sts {tmp5}, r18
    Outofrange:
    !inc r16
    !sts {channel}, r16
    !LDI     R16,       6
    !OUT     TCNT0,     R16
    
    !POP     R18
    !POP     R16
    !OUT     SREG,      R16
    !POP     R16
    Stimmt das soweit oder fällt dir etwas auf?
    Geändert von Che Guevara (25.12.2011 um 00:06 Uhr)

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von Che Guevara Beitrag anzeigen
    Mit den Tmpx-Overlay Variablen von Empf(x) kann man ja, wenn ich jetzt keinen Mist erzähle, die ISR nochmal verkürzen?!
    Das was Du machst, nennt sich Code-Unrolling, hilft Dir hier aber nicht viel.

    Ich messe so, dass ich 'nen Haltepunkt auf die Gosub und dann auf dem Gosub nächsten Befehl setze, vorher die Zyklen auf 0 setze und dann beim zweiten Haltepunkt ablese, da kommt bei Deinem ungerollten Code raus:
    41, 36, 38, 40, 42, 42 Takte
    Bei einem out of range und 5 in range sind das Gesamt 239, mein letzter Code war 43 x 5 + 28 = 243. Viel hast Du nicht gewonnen, außer Erfahrung

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    32
    Beiträge
    1.578
    Hm, ok... Aber Erfahrung ist ja auch sehr viel Wert!
    Und meinen Code verstehe ich wenigstens zu 100%.

    Ich werde jetzt noch alle > durch >= austauschen, das bringt auch noch ein paar Takte
    Fällt dir sonst noch ein BASCOM-typischer Taktfresser ein, den ich vermeiden könnte?

    Gruß
    Chris

Ähnliche Themen

  1. Inline Assembler
    Von Che Guevara im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 16
    Letzter Beitrag: 01.02.2010, 19:25
  2. AVR GCC inline Assembler
    Von chientech im Forum Assembler-Programmierung
    Antworten: 1
    Letzter Beitrag: 26.09.2009, 16:39
  3. Inline Assembler für Anfänger
    Von 1udo1 im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 25.10.2007, 19:53
  4. Inline Assembler - Register
    Von s.o. im Forum C - Programmierung (GCC u.a.)
    Antworten: 5
    Letzter Beitrag: 02.08.2007, 20:26
  5. Parameterübergabe bei Inline-Assembler
    Von ogni42 im Forum C - Programmierung (GCC u.a.)
    Antworten: 21
    Letzter Beitrag: 30.03.2006, 13:32

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test