Ja,dann sollte das Problem gelöst sein.
Ja,dann sollte das Problem gelöst sein.
Gruß
Ratber
Ich würde eben versuchen, einfach jede 1/1000 Sekunde EINE einzelne Meßung zu machen und wär dann in 64 mS wohl fertig. da bliebe immer Zeit dazwischen für irgendwelches Nebenzeugs.
Ich find', diese spezielle 1/100 Sekunde ist einfach überladen. (IMHO)
Da eine Meßung ~ 100 µS fertig wäre, könnte man vielleicht auch flotter ticken, aber eben die Last immer schön verteilen.
(Wenn das von der Aufgabe her eben geht)
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
scheinbar nicht, habe mal h1=10 in h1=80 geändert, aber keine Besserung....Ja,dann sollte das Problem gelöst sein.
ich bin für jede Lösung (am besten mit code-ansätzenIch find', diese spezielle 1/100 Sekunde ist einfach überladen. (IMHO)) dankbar:
mindestens 10 mal in der sekunde 5 adc-kanäle mit mittelwertbildung (8 Messungen gingen auch) auswerten, ohne das andere Interrupts gestört werden.
Hätte nie gedacht, daß es so kompliziert ist mit getadc(x) zu arbeiten....
Wenn die anderen Int nicht zu häufig kommen gibts auch kein Terror.
Ich rechne nochmal.
Eine Einzelwandlung dauert komplett 25 Taktzyklen (Lt. Datenblatt) und der Takt darf bei 10 Bit Auflösung max. 200 Khz betragen.
(Geht man höher dann leidet die auflösung aber es geht flotter.)
Das sind nach Adam Riese 125µs pro Wandlung wenn man streng nach Datenblatt geht)
Bei 5x10 bzw 5x8 Wandlungen am Block sind das 6.25 bzw. 5ms für alles.
Bei 100 Messungen/s wird also alle 10ms ein messzyklus gestartet.
Dh. du hast mit der einfachen Methode 5ms für dich alleine um was anderes zu machen.
Bei nem Systemtakt von 16Mhz also 80000 Taktzyklen für was anderseres.
Wenn du den ADC mit IRQ betreibst dann sogar wesentlich mehr da der ja die größte Zeit alleine läuft.
So und nun zum Praktischen Problemchen.
Und das Problem ist ja das Bascom den einfachsten Weg geht und nach dem Starten der Abfrage einfach wie nen Engländer am Busstop steht bis die Wandlung beendet ist.
Dazwischen passiert rein garnichts.
Für den Normalfall wenn einer alle Sekunde mal nen Kanal abfragt fällt das garnicht auf.
Auch einen Kanal 10x oder alle 8 jeweils 1x die Sekunde ist gut zu managen aber bei deinen 5000 bzw. 4000 Messungen/s ist dann schnell ende.
Das ist in Assembler schon nicht mehr so unbeachtet zu erledigen.(Weißt schon was ich meine)
Vieleicht wäre hier ein Mix aus Bascom und Assembler ne gute Idee.
Verleg einfach die AD-Wandlung manuell aus dann kannste den ADC-Int nutzen.
Einige µs Zeit sollten dabei schon rausspringen und der Code wird nur auf dem Papier größer.(Müßte eher kleiner werden denn du gibst ja schon genau vor)
Rein in Bascom gehts natürlich auch.
Äh,ja.
Ich hoff du kannst jetzt mit dem geschreibsel da oben was anfangen.
Is etwas wirr geworden.
Gruß
Ratber
nicht ganz. selbst bei 100 getadc(x) /Sek (alle 10ms nur eine Messung) bricht alles ein...also ist getadc nicht zu gebrauchen...aber bei deinen 5000 bzw. 4000 Messungen/s ist dann schnell ende
Werde nun versuche das mit dem ADC-Interrupt zu lösen und hoffen, daß es da keine Behinderungen gibt....
Ja,das meinte ich ja damit.nicht ganz. selbst bei 100 getadc(x) /Sek (alle 10ms nur eine Messung) bricht alles ein...also ist getadc nicht zu gebrauchen...
Bascom übersetzt ja nicht so optimal wie man das in Assembler machen würde.
Das ist eine Sache die bei allen Hochsprachen mehr oder weniger auftritt.
Bascom ist insgesammt schon recht gut und realtiv effizient in Punkto Codegröße aber auch das hat logischerweise Grenzen.
Wenn es absolut kritisch wird dann ist C oder Assembler die bessere Wahl.
Gruß
Ratber
Lesezeichen