kaktus
07.07.2008, 22:39
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.
' 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
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.
' 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