hallo Forum,
anbei mein Bascom Code:
Was könnte man hier noch optimieren?
Was bewirkt der Befehl set sfior.adhsm? (nicht verwendet) Ist die A/D Wandlung schneller? Steigt der Strom?
Was ist mit Noise Reduktion Modus?
Kann ich was in Funktionen packen?
Es soll so schnell wie möglich aus 16 A/D Eingängen ein aktueller,ein maximaler und ein Minimaler Messwert gesucht werten. Zwecks Erhöhung der Genauigkeit wird aus dem aktuellen Wert ein Mittelwert gebildet ( / 199). soweit sogut.
Anfangs hatte ich den Code anders:
Eine Endlosschleife die ständig Daten einliest, und einen programmierten Timer der jede Sekunde die Daten via RS232 ausdruckt. Problem war nur das die Hauptschleife stehts IRGENDWO unterbrochen wurde und mein Mittelungswert nie passte da auch die Schleifen durchläufe um +- 1 schwankten.
Code:' RoboterNetz Board RN-Mega2560 ab Version 1.0 und ' 'Aufgabe: 'Sammelt Daten der A/D Wandler ein, bildet max und min für jeden Kanal 'und gibt Daten über USB Port 4 bzw RS232 aus ' '############################################################## 'Diese Anweisung setzt die Fusebits automatisch korrekt (Syntax $PROG LB, FB , FBH , FBX ) $prog , 255 , &B11011001 , 'Quarz an / Teiler aus / Jtag aus $regfile = "m2560def.dat" $hwstack = 82 '80 $framesize = 68 ' 64 $swstack = 68 '44 $crystal = 16000000 'Quarzfrequenz Config Pind.5 = Output Led Alias Portd.5 $baud = 57600 Const Tz = "," ' Trennzeiche ist ein Komma Dim Kanal As Byte 'Min Max Buffer Dim Adcmax(16) As Word 'Tabelle Maximum Werte Dim Adcmin(16) As Word 'Tabelle Minimum Werte Dim Adcakt(16) As Long 'Tabelle Aktueller Messwert Dim Index As Byte 'Zeiger auf Speicherplatz Dim Wert As Word Dim X As Single Dim Loop_counter As Long Declare Sub Printdata ' *** ADC *** Config Adc = Single , Prescaler = Auto , Reference = Internal_1.1 Start Adc '*** Hauptschleife *** Do For Loop_counter = 1 To 199 ' Anzahl der Messungen Led = 1 For Kanal = 0 To 15 If Kanal > 7 Then Kanal = Kanal + 24 ' Wegen Bascom 1.11.9.1 Bug notwendig Wert = Getadc(kanal) If Kanal > 7 Then Kanal = Kanal - 24 ' Wegen Bascom 1.11.9.1 Bug notwendig Kanal = Kanal + 1 ' Array ADCmax startet bei 1 und nicht bei 0 Adcakt(kanal) = Adcakt(kanal) + Wert If Adcmax(kanal) < Wert Then Adcmax(kanal) = Wert If Adcmin(kanal) > Wert Then Adcmin(kanal) = Wert If Adcmin(kanal) = 0 Then Adcmin(kanal) = Wert ' Wenn = 0 im Speicher (kleinster Wert) trotzdem überschreiben Kanal = Kanal - 1 Next Kanal Next Loop_counter Gosub Printdata Loop Printdata: Led = 0 For Index = 1 To 16 Print Adcmax(index) ; Tz; ' Maximum Werte Adcmax(index) = 0 Next Index Print "*" ; ' Trennzeichen For Index = 1 To 16 Print Adcmin(index) ; Tz; 'minimum Werte Adcmin(index) = 0 Next Index Print "A" ; ' Trennzeichen For Index = 1 To 16 X = Adcakt(index) \ 199 Print Fusing(x , "####.#") ; Tz; Adcakt(index) = 0 Next Index Loop_counter = 0 Print ' CR & LF Return
Lesezeichen