- Akku Tests und Balkonkraftwerk Speicher         
Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 36

Thema: Ausführungsgeschwindigkeit: Grundlegende Frage zu Bascom

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.05.2004
    Beiträge
    209

    Ausführungsgeschwindigkeit: Grundlegende Frage zu Bascom

    Hallo Leute,

    wie schon neulich geschrieben, habe ich ein paar Probleme mit der Zeit beim ausführen.

    Nun hat sich herrausgestellt, daß das Zeitproblem ( https://www.roboternetz.de/phpBB2/viewtopic.php?t=16671), nicht auf die Hardware, sondern einzig auf die Software zurückzuführen ist.


    Mit jeder Löschung von Quelltext steigt die Geschwindigkeit wieder an.


    1. Habe einen Timer0 so eingerichtet, daß ich alle 0,001 sek einen
    Zähler erhöhe.
    2. Alle 0,01sek werden dann die 5adc-werte abgefragt und ein paar
    Ganzahl-operationen durchgeführt.
    3. alle 0,5sek Sollen dann die Ergebnisse, teilweise durch SUBS
    formartiert, angezeigt werden.


    Alles funktioniert auch soweit richtig, richtige Daten werden angezeigt, keine Abstürze/Hänger, keine Schleife wird ausgelassen und und und.

    Nur das nicht alle 0,01. Sek der ADC ausgelesen wird, sondern alle 0,03Sek....das nicht alle 0,5Sek Daten angezeigt werden, sondern alle 1,5Sek
    Die Zeit verdreifacht sich also.....


    Lösche ich nun alles weg, daß nur noch

    Code:
    Do
    
    If H_flag = 1 Then            'alle 0,001Sek ausführen
       Incr H                          'Zeitzähler Displayanzeige
       Incr Rr                         'Zeitzähler allgemein
       H_flag = 0
     End If
    
    
    If H = 500 Then                              'alle 0,5Sek anzeigen
        Locate 1, 1
        Lcd Rr
        H = 0
    End If                                                   
    Loop
    
    End
    
    
    Timer0_isr:
       Load Timer0 , Ticks0
         H_flag = 1 'alle 0,001 flag setzen
    Return
    EDIT: war so frei und habe Code-Tags spendiert PicNick

    dasteht, funktioniert alles genau.
    Sobald aber nur eine schleife mit alle 0,01Sek die 5 ADC werte ausgelesen werden eingeschoben wird, war es das. Die Zeit verdoppelt sich...


    Das stellt mich vor die Frage, ob Bascom überhaupt für zeitgenaue Sachen geeignet ist, oder ob ich einen Gedankenfehler habe.

    Ist sehr ungünstig erst das Programm fertig schreiben zu müssen, um dann mit der Stop-Uhr den Zeitfehler zu messen und dann die Werte anzupassen....Oder reicht ein Quarzwechsel von 4 auf 8 MHZ aus und der Chip ist kräftig genug?[/code]

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    naja, der getadc braucht halt n bissl,
    das hat aber wenig mit dem Bascom zu tun,
    sondern mit dem AVR.
    die Wandlung braucht 65µs je 10Bit Sample.
    du verwendest davon 5, macht 325µs oder 0,325ms.
    das bremst die geschichte gewaltig aus.
    der AVR hat ja nicht 6 bzw. 8 separate adc sondern
    einen, der per multiplexer auf den jeweiligen kanal
    durchgeschaltet wird. daher muß man die zeit für die
    wandlung adieren.
    abhilfe wäre z.b. durch einen externen schnelleren ad-wandler
    zu schaffen.
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    11.11.2005
    Beiträge
    321
    ...naja, der getadc braucht halt n bissl,
    das hat aber wenig mit dem Bascom zu tun,
    sondern mit dem AVR...


    stimmt nicht, ich habe die routinen als selbstgeschriebenen asm-routinen eingebunden und sind fast 6x schneller.


    ....Das stellt mich vor die Frage, ob Bascom überhaupt für zeitgenaue Sachen geeignet ist, oder ob ich einen Gedankenfehler habe. ...

    nein, du machst kein gedankenfehler.


    Castle

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.05.2004
    Beiträge
    209
    es kann doch nicht sein, daß Bascom so extrem mies ist, daß jede kleine anweisung sie so extrem auf die Laufzeit auswirkt, oder?

    wenn ich mit einer for to-schleife 16mal den adc0 auslese um dann
    einen mittelwert mit shift-operation zu bilden, daß dann alles einbricht?

    if h1= 10 then '0,01sek

    Ad0 = 0

    For X = 1 To 16
    Mtemp = Getadc(5)
    Ad0 = Ad0 + Mtemp
    Next X
    Shift Ad0 , Right , 4



    Ad0 = 0

    For X = 1 To 16
    Mtemp = Getadc(3)
    Ad0 = Ad0 + Mtemp
    Next X
    Shift Ad0 , Right , 4

    h1=0
    end if


    sorgt zb um einen Einbruch um 30 %. Also 1Sek=1,3Sek

    Das kann es doch nicht sein, oder?

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.09.2004
    Ort
    Düsseldorf
    Beiträge
    3.948
    Es ist vom Code abhängig wie weit die Zeiten abweichen.

    Wenn du das LCD nutzt dann dauert das.
    Wenn du den ADC nutzt dann dauert das auch.
    Da gibt es feste Minimale Wartezeiten.
    Jeder Befehl hat eine bestimmte Zahl an Taktzyklen.

    Wenn du unbedingt genau Timen willst dann bist du gezwungen auch die Ausführungszeiten zu berücksichtigen.
    Das gilt für Bascom genauso wie für Assembler oder C.

    Wenn du die Ausführung optimieren willst dann kannst du zb. beim LCD direkt ansteuern anstatt die Eingebauten Routinen zu nehmen.
    Das ist schneller weil die Eingebauten auf Nummer Sicher gehen da nicht alle Displays gleich langsam sind.
    Beim AD-Wandler das gleiche.

    Ja und bei den anderen Befehlen gibt es große Unterschiede wie man es macht.

    For Next geht schneller wenn man es per Do Loop until macht.

    Fließkommaoperationen kosten ebenfalls Zeit (Auch beim Mega wenn auch nicht soviel).
    Aus einem A=A/1.78 macht man lieber
    A=A*50
    A=A/89

    Das ist schneller und kostet weniger Platz.

    usw.

    Probier einfach mal Alternativen für die Routinen.
    wirst sehen wie die Codegröße und die Zeiten schwanken.

    Absolute Kontrolle hats du nur wenn du alles berücksichtigst.
    Naturgegeben biste da bei Assembler besser aufgehoben wenn es um genaue Timings geht denn du kannst jeden Befehl sofort nachrechnen (Takte/Ausführungszeit).
    Bei Bascom ist das etwas schwieriger da der Code je nach Konstellation anders ausfällt.
    Gruß
    Ratber

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.05.2004
    Beiträge
    209
    ja, so ungefähr kenne ich das auch, aber die 3fache zeit??
    da kann etwas nicht stimmen.
    Ich bin, zumindest beim lesen, recht aktiv hier und auch in anderen foren, und von solchen extremen abweichungen habe ich noch nie gehört...

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.09.2004
    Ort
    Düsseldorf
    Beiträge
    3.948
    Ich auch nicht.

    Kann sein das dein Prog irgendwo noch ne Extrarunde dreht kann aber auch sein das Bascom da seine Probleme hat.

    Ich meine das seit der 81/82 Timingprobleme bei einigen Befehlen da sind. (zb. Servo. Läuft unter 4 Mhz garnicht mehr)

    Ich muß das mal mit ner alten 78er überprüfen
    Gruß
    Ratber

  8. #8
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    In 0,01 sekunden macht der AVR mit 4MHZ 40000 cyclen, damit kann auch Bascom einiges tun.
    Aber:
    Wenn du in einer ISR eine Zähler erhöhst und in der DO-Schleife auf
    "ist gleich" abfragst, wirst du den Wert öfter nicht erwischen
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.05.2004
    Beiträge
    209
    @Picknick nein, den fehler hab ich früher gemacht, bevor du mir gezeigt hat,wie es anders geht

    Code:
    If H_flag = 1 Then
       Incr H
       Incr H1
       Incr Rr
       H_flag = 0
     End If
    
    Timer0_isr:
       Load Timer0 , Ticks0
         H_flag = 1
    
    Return
    so mache ich es jetzt und funzt super.


    so, fehler eingekreist. hier ist der anker, der alles nach unten zieht:

    Code:
     Ad0 = 0
          For X = 1 To 16                                      
             Mtemp = Getadc(0)
             Ad0 = Ad0 + Mtemp
          Next X
          Shift Ad0 , Right , 4
    sobald ich die for-schleife weglasse flutscht es. wo ist der fehler, daß
    Bascom bei einer kleinen zählschleife soextrem einstürzt?

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.09.2004
    Ort
    Düsseldorf
    Beiträge
    3.948
    Das ist Logisch.

    Du fragst 16x den ADC ab.
    Du änderst 16x den Mux
    Du rechnest alles 16x

    Der Shift am Ende ist da schon nebensächlich.
    Wenn man beachtet das der ADC max nur ca. 16ks/s schafft dann kommt man bei 16Mhz schnell auf 1/1000 Sekunde allein für die Abfrage.
    Dh deine 0.001s fallen genau in das Raster.

    Aber die anderen Befehle stehen hinten drann und verlängern die Zeit entsprechend iherer Laufzeit.

    Das dürfte im groben gesagt der Fehler sein wenn ich mich jetzt nicht völlig vergallopiert habe.


    Bascom läst ja sehr schön Inlinecode zu.
    Versuchs mal mit ner Assemblerroutine für die Abfrage
    Gruß
    Ratber

Seite 1 von 4 123 ... LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test