- Akku Tests und Balkonkraftwerk Speicher         
Seite 3 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 21 bis 30 von 36

Thema: Ausführungsgeschwindigkeit: Grundlegende Frage zu Bascom

  1. #21
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.05.2004
    Beiträge
    209
    Anzeige

    Powerstation Test
    naja, der timer ist auf 0,001 eingestellt und setzt ein flag. Ist dieses gesetzt, dann wird im Main-Teil eine if-Schleife durchlaufen und ein paar Zeitzähler erhöht.

    und anhand dieser Zähler wird dann sowohl der ADC (alle 10ms) als auch die Display-Ausgabe (alle 500ms) durchgeführt - so zumindest die Theorie. In der Praxis kommt halt ein zigfaches an Ausführungszeit herraus.


    Da Timer1 mit Icp1 und Ovf1, sowie RS232 (9600) bestens funktionieren, habe ich die Hoffnung noch nicht aufgegeben, daß ich den Rest auch irgendwie noch gerade gebogen bekomme.

    Hier mal das Grundgerüst
    Code:
    Do 
    
    If H_flag = 1 Then            'alle 0,001Sek ausführen 
       Incr H                          'Zeitzähler Displayanzeige 
       Incr H1                        ' Zeitzähler für ADC-Auswertung
       Incr Rr                         'Zeitzähler allgemein 
       H_flag = 0 
     End If 
    
    
    
    If H1 = 10 Then                        'die Getadc-Anweisungen fressen Zeit
          Ad0 = 0
          For X = 1 To 16                                      
             Mtemp = Getadc(0)
             Ad0 = Ad0 + Mtemp
          Next X
          Shift Ad0 , Right , 4 
    
          Ad0 = 1
          For X = 1 To 16                                     
             Mtemp = Getadc(1)
             Ad1 = Ad1 + Mtemp
          Next X
          Shift Ad1 , Right , 4
    
    
          Ad0 = 2
          For X = 1 To 16                                       
             Mtemp = Getadc(2)
             Ad2 = Ad2 + Mtemp
          Next X
          Shift Ad2 , Right , 4
    
          Ad3 = 0
          For X = 1 To 16                                       
             Mtemp = Getadc(3)
             Ad3 = Ad3 + Mtemp
          Next X
          Shift Ad3 , Right , 4
    
    
           Bissel Ganzzahlrechnungungen mit AD0-AD3
    
           H1 = 0
    End If
    
    
    
    
    If H = 500 Then                              'alle 0,5Sek anzeigen 
        Locate 1, 1 
        Lcd Rr
    
        Zeige noch einiges an auf dem Display
     
        H = 0 
    End If                                                    
    
    Loop 
    
    End 
    
    
    Timer0_isr: 
       Load Timer0 , Ticks0 
         H_flag = 1 'alle 0,001 flag setzen 
    Return
    RR müßte ja vom Start ab innerhalb einer Minute 60000 groß sein (rr wird alle 0,001 Sek um 1 erhöht), ist aber bei vollem code 18000, also nicht einmal ein 3tel.

    Wenn ich die Schleifen für die 16Messungen weglasse auf 4 erniedriege, ist RR 34500, also fast 50%.

    Lasse ich die Getadc-Anweisungen komplett weg, komme ich auf RR 50000

    Lasse ich alles weg, nur die Zählerhochzähler und eine einfache Display ausgabe ohne Rechnen etc komme ich gerade mal auf 59000.
    Sobald aber Code hinzukommt, sinkt die Zahl.

    Und das finde ich schon arg krass, das kann es nicht sein, oder?



    aber irgendwas sollte man wirklich auslagern, sonst wartet sich der µC dumm
    Was meinst du damit genau?
    Ich dachte der MC ist im "Leerlauf" und wenn der gewünschte Zeitpunkt erreicht wird, dann macht er mal schnell ein paar Befehle - oder ist der Ansatz von mir da Falsch?

    Wie soll zb sonst programmiert werden, daß nach xxZeit YYY ausgeführt wird?

  2. #22
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Ich dachte der MC ist im "Leerlauf" und wenn der gewünschte Zeitpunkt erreicht wird, dann macht er mal schnell ein paar Befehle - oder ist der Ansatz von mir da Falsch?
    Ich bin zwar kein Bascomer, aber ich versuche mal das Programm zu beschreiben(aus meiner Sicht)

    Die Haupftschleife wartet solange bis Die Variable H1 10 beträgt, und die wird mit hilfe von Timer Overflow Interrupt inkrementiert.
    Wenn dann die magische 10 kommt startest Du Deine messungen und zwar in einer Riesenschleife 4 mal 16 Messungen.
    So eine Getadc Funktion macht nichts anderes, als die Messung zu starten und
    abzuwarten, bis sie beendet ist(laut Assembler Code von Picknick).
    Du machst dann 64 mal nichts anderes als "Starte die Messung und tue nichts bis sie beendet ist".
    Klar kommt zwischendurch noch der Timer und setzt da Deinen Flag, ich denke sogar mehrmals, das kriegst Du aber nicht mit weil Du noch auf Dein ADC wartest .

    Sollte ich da falsch liegen, wird man mich hier sicher darauf hinweisen, vielleicht sehe ich das falsch, wie gesagt ich bin kein Bascomer

    Besser wäre natürlich den ADC in Freilaufmodus zu starten und in einen ADC_Ready Interrupt Deine Muxkanäle umzuschalten und natürlich die 16 Messungen addieren und dividieren.
    Die Ergebnise dann schön in Ram geschrieben, dann kann sich Deine Hauptschleife wirklich langweilen.

    Gruß Sebastian

  3. #23
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.05.2004
    Beiträge
    209
    So ungefähr, bzw richtig.

    Die Hauptschleife wartet solange bis h1=10 (0,01Sek vergangen) ist und bildet dann aus 16 adc-Messungen den Mittelwert. Und dies für 5 ADC-Kanäle.

    Also alle 10ms das 16mal-Messen und Mittelwertbilden von 5 ADC-Kanälen. Da kommt dann noch mit den ermittelten Variablen ein paar Rechnungen hinzu, aber das ist zu vernachläßigen was die Geschwindigkeitsprobleme angeht.

    Knackpunkt ist einfach Getadc(x). Dieser Funktionsaufruf bremst alles extrem runter.

    Somit scheint mir diese Funktion entweder vollkommen falsch von mir benutzt zu werden, oder aber sie ist nicht die Bits wert, die sie belegt..

    Besser wäre natürlich den ADC in Freilaufmodus zu starten und in einen ADC_Ready Interrupt Deine Muxkanäle umzuschalten und natürlich die 16 Messungen addieren und dividieren.
    Und da habe ich Angst, daß der ADC-Interrupt so oft aufgerufen wird, daß alle anderen Interrupts darunter leiden.
    Bzw besteht die Möglichkeit mit Start/Stop ADC (Bascom-Befehl) das irgendwie zu bremsen, daß andere Interrupts (Timer0, Timer1, Icp1 und Ovf1) nicht darunter leiden?

  4. #24
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Also alle 10ms das 16mal-Messen und Mittelwertbilden von 5 ADC-Kanälen
    Es ist nur die Frage, ob Du weniger als 10 ms für die 64 Messungen brauchst.

    Und was Deine bedenken mit dem ADC-Interrupt angeht glaube ich nicht, daß sie berechtigt sind denn der Controller hat da nicht viel zu tun, überprüfen ob schon 16 Messungen abgeschlossen sind, den Mux umschalten und Ergebnisse speichern, da ist er schnell raus aus dem Interrupt glaub es mir.
    Es ist zumindest einen Versuch wert.

    Gruß Sebastian

  5. #25
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.05.2004
    Beiträge
    209
    naja, also wenn der ADC mit Systemtakt/Prescaler arbeiter, also mit 4000000/128, dann hatte ich gedacht, daß er schnell genug ist 5x16 Messungen innerhalb von 10ms zu machen.
    Oder habe ich da einen Denkfehler?

  6. #26
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    hmmmm, also nach meinem Verstand ist es so:
    Prescaller 128 ergibt ADC Freq. von 31,25kHz ein Takt Dauert also 32µs
    Eine Wandlung dauert laut Dattenblatt 13 ADC Zyklen also 416 µs.
    Und das ganze mal 64 -> 26,6 ms

    Hab ich jetzt richtig gerechnet, oder ist da ein Denkfehler drin?

    Gruß Sebastian

    P.S. wieso nimmst Du nicht prescaller 32 ?

  7. #27
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.05.2004
    Beiträge
    209
    verdammt, ich wußte da war ein haken *g

    128 deswegen, weil ich ihn so langsam und damit so genau wie möglich haben wollte....

    aber selbst eine ADC-Wandlung bringt den mc in die knie..

  8. #28
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    ups, noch ein nachtrag :
    Code:
    GETADC()
    ----------------------------------------------
    L_0x00F6:
       SBI   ADCSR,ADSC
    L_0x00F8:
       SBIC   ADCSR,ADSC
       RJMP   L_0x00F8        wait bit clear
       SBI   ADCSR,ADSC   set bit
    L_0x00FE:
       SBIC   ADCSR,ADSC   
       RJMP   L_0x00FE        wait bit clear
    Nochmal ein Ausschnitt aus dem Assembler, per GetAdc macht er 2 Messungen, um sich wohl "warmzulaufen" dann mußt Du die Zeit wohl noch mal mit 2 Multiplzieren

  9. #29
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Musst du denn alle Messungen in der gleichen 1/100 Sekunde machen ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  10. #30
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.05.2004
    Beiträge
    209
    nein, muß ich nich, da kann schon 3-10/Sekunde abstand sein. Ich kann auch die 100/Sekunde-Schleife (also If h1=10 then ...) auch gut auf 100mS oder 150ms ausdehnen

Seite 3 von 4 ErsteErste 1234 LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress