PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Runden eine Stelle nach dem Komma



Stargate
27.02.2007, 16:14
Hallo Leute!

Also vielleicht kenni hir ja noch mein Projekt zum Einlesen von Sensorwerten mit dem MLX 90316.

Beim Einlesen der Werte hat nun alles geklappt! Nun habe ich versucht, die umgerechneten Gradwerte sinnvoll zu runden, da blieb leider aber bis jetzt ohne Erfolg.

Ich stelle hier mal minen Code rein, vielleicht könnt ihr ja einen Fehler erkennen.




Sensor = 0 'Initialisiert die Variablen Sensor, Grad
Grad = 0

Sensor = Getadc(2) 'Der AD Wert wird am Pin C2 abgelesen und
'in die Variable "Sensor" geschrieben

Grad = Sensor - 50 ' ((-50+Sensor)*360)/922
Grad = Grad * 360
Grad = Grad / 922


Grad = Grad * 100
Grad = Fix(grad)
Grad = Grad / 10
Grad = Round(grad)
Grad = Grad / 10

Print "Sensor (ADC) : " ; Sensor
Print "Grad: " ; Grad



Zum Code ist noch zu sagen, dass der Sensor die vollen 360 Grad über 4,5 V verteilt, d.h. 0° = 0,25V und 360° = 4,75V.




Falls ihr auch noch fragen zu dem Triaxis Hallsensor habt, kann ich euch gerne weiterhelfen, habe mich jetzt ausgiebig damit befasst.
Nochmal zur Information:
Dieser Sensor ist zum Kontaktlosen und sehr präzisen Einlesen von Winkelwerten geeignet und erfasst volle 360° über einen Magneten(vornehmlich leistungsfähiger Neodymmagnet) und gibt sie analog oder über ein SPI Protokoll aus.
Ich stehe ebenso gut in kontakt mit der Firma DACOM West in Verbindung und kann auch bei Bedarf kleinere Stückzahlen ordern.



Also, nun aber mal auf den falschen Code konzentriert und käftig Beiträge geschrieben. :-)

Viele Grüße Felix

magic33
27.02.2007, 17:39
wenn du genügend speicher hast versuchs mal mit
fushing(wert,#.##)

siehe bascom helpfile

Stargate
27.02.2007, 19:25
Hmm, schonmal vielen dank, funktioniert soweit :-) aber jetzt sind an anderen stellen wieder Probleme mit der neuen Funktion aufgetreten ;-)

gruß

HansHans
27.02.2007, 21:10
Dann erhöhe mal die Werte für:

$hwstack =
$swstack =
$framesize =

Ich hatte da auch schon Problemme beim benutzen von
fushing

Gruß HH

repi64
27.02.2007, 21:27
....Problemme beim benutzen von
fushing


Jo, oder heisst es "pfushing"? O:)

enterprise30
28.02.2007, 08:04
Wenn es jetzt geht heisst es "funzing" :-)

Stargate
28.02.2007, 15:44
Also das könnte schon möglich sein, dass ich dann die Stacks erhöhen muss, aber davon hab ich noch nicht so viel Ahnung! also ich hab von Anfang an
$hwstack = 32
$swstack = 32
$framesize = 32
gesetzt. Aber wenn das jetzt nicht mehr läuft, könnte es auch daran liegen. Aber ich bräuchte noch ne kleine Beschreibung zu den Stacks ;-) dann kann ich sie auch richtig berechnen und verwalten.

Schonmal vielen Dank für eure Antworten

Gruß Felix


P.S.: Ich glaub eher dass das "Fusing" heißt :-P

HansHans
28.02.2007, 17:40
Jo, oder heisst es "pfushing"? O:)

Ok, war ohne nachzudenken oben abgeschrieben ,
da steht es auch falsch ,
aber das hat ja nichts mit dem Problem zu tun
es dürfte wohl klar sein was gemeint war / ist . O:)


Aber ich bräuchte noch ne kleine Beschreibung zu den Stacks dann kann ich sie auch richtig berechnen und verwalten
Zu den Stacks:
wenn ich Probleme habe und die nicht zuordnen kann
dann erhöhe ich die Werte halt mal zum Test .
Aber es gibt extra Befehle ( $DBG) um den Stack zu Testen und die
Werte festzulegen , aber einfach mal erhöhen geht schneller ...

Gruß HH

Stargate
01.03.2007, 21:13
:-k

Also Leuts, ich komm nicht weiter :-/

will er hier nen string , erwartet er woanders ein single, und umgedreht... der weiß nicht was er noch an fehlermeldungen auf mein board schreiben soll, ich blaub ich hab sie schonmal alle draufstehen gehabt :-/

also nun ganz exklusiv und mit sicherheit vielen fehlern behaftet MEIN wunderbarer Quellcode \:D/





'Winkelmessung mit dem Sensor MLX 90316 und Ausgabe der Gradanzeige
'über den Controler RN-MiniControl von Robotikhardware auf das Display
'Wintek 27 * 4 von Pollin
'>>>Besondere Lernleistung von Felix König<<<


$regfile = "m168def.dat" 'Controller definieren
$crystal = 16000000 'Quarzfrequenz
$baud = 9600 'Übertragungsrate in Baud
$hwstack = 64
$framesize = 64
$swstack = 64

'Die üblichen Definitionen bei Standardprogrammen auf Miniboard


'Hier kommt die Ausgabe auf das Display

Config Lcd = 40 * 4 'Bascom kennt keine Displays mit 27 * 4 Zeichen,
'daher 40 * 4 verwenden

Config Lcdpin = Pin , Db4 = Portb.5 , Db5 = Portb.0 , Db6 = Portd.7 , Db7 = Portd.6 , E = Portb.3 , E2 = Portc.3 , Rs = Portd.3

'man achte auf die Ergänzung E2 für den 2. Steuerkontroller des Displays

Dim ___lcdno As Byte 'Systemvariable der LCD-Bibliothek



___lcdno = 0 'wählt den ersten Chip aus
Initlcd 'die beiden oberen Zeilen initialisieren
Cls 'die beiden oberen Zeilen löschen

___lcdno = 1 'auf Chip 2 schalten
Initlcd 'die beiden unteren Zeilen initialisieren
Cls 'die beiden unteren Zeilen löschen



___lcdno = 0 'wählt die obere Zeile aus

Locate 1 , 1 'schreibt in die erste Zeile an Position 1
Lcd " Besondere Lernleistung "; 'den Text in Anführungszeichen

Locate 2 , 1 'schreibt in die zweite Zeile an Position 1
Lcd " von Felix Koenig 13 BGD" 'den Text in Anführungszeichen


Cursor Off 'unterdrückt den Cursor



___lcdno = 1 'wählt die beiden unteren Zeilen aus

Locate 1 , 1 'Wiederholt die Displayausgabe auf den unteren
Lcd "Windrichtung : "; '2 Zeilen

Locate 2 , 1
Lcd "Grad : "

Cursor Off 'unterdrückt den Cursor

'Hier kommt die Sensorwerterfassung

Config Adc = Single , Prescaler = Auto , Reference = Avcc 'Konfiguriert den AD Wandler

Start Adc 'Startet den AD Wandler

Config Pinc.2 = Input 'ADC 2 an Ctrl

Dim Sensor As Long 'Deklariert "Sensor" als Long mit 4 Byte Zeichenvorrat
Dim Grad As Single 'Deklariert die Gradvariable "Grad" als Single
Dim Grad2 As String * 5

Do ' Beginnt die Abfrageschleife zur Werteerfassung

Sensor = 0 'Initialisiert die Variablen Sensor, Grad, Grad2
Grad = 0
Grad2 = 0.0

Sensor = Getadc(2) 'Der AD Wert wird am Pin C2 abgelesen und in die Variable "Sensor" geschrieben

Grad = Sensor - 50 ' ((-50+Sensor)*360)/922
Grad = Grad * 360
Grad = Grad / 922


'Grad = Grad * 100
'Grad = Fix(grad)
'Grad = Grad / 10
'Grad = Round(grad)
'Grad = Grad / 10

'Ausgelassen, weil es nicht funktioniert hat

Grad2 = Fusing(grad , "#.#")


Print "Sensor (ADC) : " ; Sensor
Print "Grad: " ; Grad
Print "Grad2: " ; Grad2

'Hierhin kommt die Anzeige der Ausgesprochenen Windrichtung (NOSW)

Select Case Grad2

___lcdno = 1

Case Is > 337.5 : Print "Nord" ;
Locate 1 , 16
Lcd "Nord"
Case 292.5 To 337.4 : Print "Nord/West" ;
Locate 1 , 16
Lcd "Nord/West"
Case 247.5 To 292.4 : Print "West" ;
Locate 1 , 16
Lcd "West"
Case 202.5 To 247.4 : Print "Sued/West" ;
Locate 1 , 16
Lcd "Sued/West"
Case 157.5 To 202.4 : Print "Sued" ;
Locate 1 , 16
Lcd "Sued"
Case 112.5 To 157.4 : Print "Sued/Ost" ;
Locate 1 , 16
Lcd "Sued/Ost"
Case 67.5 To 112.4 : Print "Ost" ;
Locate 1 , 16
Lcd "Ost"
Case 22.5 To 67.4 : Print "Nord/Ost" ;
Locate 1 , 16
Lcd "Nord/Ost"
Case Is < 22.4 : Print "Nord" ;
Locate 1 , 16
Lcd "Nord"

Case Else : Print "Error" ;
Locate 1 , 16
Lcd "Error"

End Select

Print " "

___lcdno = 1 'wählt die unteren 2 Zeilen aus

Locate 2 , 8
Lcd Grad2 ; "^"



Waitms 500 '500 ms Wartezeit zwischen der Abfragewiederholung

___lcdno = 1 'Löschen der vorherig angezeigten Werte auf dem Display

Locate 1 , 16
Lcd " "
Locate 2 , 8
Lcd " "

Loop 'Ende der Ausführungsschleife
'und Sprung zum Anfang der Schleife


End 'Programmende



Also das Erhöhen der stacks hat wahrlich NIX gebracht!
Die meisten Fehler hab ich bei der Fallunterscheidung, da er mir in fast jeder zeile sagt, "Single expected" *blablablabla*

Bin irgendwie gefrustet :-(

Bin dankbar über jeden konstruktiven Vorschlag

Gruß Felix

Stargate
03.03.2007, 11:40
WAS SOLL DAS???????


Sensor = 0 'Initialisiert die Variablen Sensor, Grad, Grad2
Grad = 0


Sensor = Getadc(2) 'Der AD Wert wird am Pin C2 abgelesen und in die Variable "Sensor" geschrieben

Grad = Sensor - 50 ' ((-50+Sensor)*360)/922
Grad = Grad * 360
Grad = Grad / 922 'Ergebnis als Gradwert mit Kommastellen


Grad = Grad * 100
A = Int(grad)

'Grad = Grad / 10
'Grad = Round(grad)

B = A / 100


'G = Fusing(grad , "#.#")


Print "Grad: " ; B
'Print "Grad2: " ; G


Was ein SCHROTT! Also, WErt einlesen, durch 100 teilen, dann mit int oder Fix die Kommazahl abscheiden, bis dahin alles verständlich und klar. macht er auch, und JETZT

B = A / 100

und ich hab wieder alle schönen BESCHEUERTEN Kommazahlen da.
Ich raff's nicht ?!! :-/

sagt mir mal wenigsten einer was ich falsch mach?

Fänd ich voll nett :-)

Gruß an alle

P.s. Also ich hab den code so reingestellt wie ich ihn programmiert hab(teilausschnitt) oben ist ja wie gesagt der ganze code. da ich am rumprobieren bin, ist oft auch code mit hochkomma ausgeschaltet (text)

also ist nicht alles aktiv

gpo
03.03.2007, 12:11
Hallo,


sagt mir mal wenigsten einer was ich falsch mach?
ja, Du postest nicht den ganzen Code, keiner weis was Du wie Dimensioniert hast, usw. :-k So kann halt keiner vernünftig helfen.

Gruß
Günter

Stargate
03.03.2007, 12:48
Hallo,


sagt mir mal wenigsten einer was ich falsch mach?
ja, Du postest nicht den ganzen Code, keiner weis was Du wie Dimensioniert hast, usw. :-k So kann halt keiner vernünftig helfen.

Gruß
Günter

ÄHM, ich hab doch oben geschrieben, dass das wieder nur ein teilausschnittist :-/ alles klar, dann nochmal den code für dich...




'Winkelmessung mit dem Sensor MLX 90316 und Ausgabe der Gradanzeige
'über den Controler RN-MiniControl von Robotikhardware auf das Display
'Wintek 27 * 4 von Pollin
'>>>Besondere Lernleistung von Felix König<<<


$regfile = "m168def.dat" 'Controller definieren
$crystal = 16000000 'Quarzfrequenz
$baud = 9600 'Übertragungsrate in Baud
$hwstack = 32
$framesize = 32
$swstack = 32

'Die üblichen Definitionen bei Standardprogrammen auf Miniboard


'Hier kommt die Ausgabe auf das Display

Config Lcd = 40 * 4 'Bascom kennt keine Displays mit 27 * 4 Zeichen,
'daher 40 * 4 verwenden

Config Lcdpin = Pin , Db4 = Portb.5 , Db5 = Portb.0 , Db6 = Portd.7 , Db7 = Portd.6 , E = Portb.3 , E2 = Portc.3 , Rs = Portd.3

'man achte auf die Ergänzung E2 für den 2. Steuerkontroller des Displays

Dim ___lcdno As Byte 'Systemvariable der LCD-Bibliothek



___lcdno = 0 'wählt den ersten Chip aus
Initlcd 'die beiden oberen Zeilen initialisieren
Cls 'die beiden oberen Zeilen löschen

___lcdno = 1 'auf Chip 2 schalten
Initlcd 'die beiden unteren Zeilen initialisieren
Cls 'die beiden unteren Zeilen löschen



___lcdno = 0 'wählt die obere Zeile aus

Locate 1 , 1 'schreibt in die erste Zeile an Position 1
Lcd " Besondere Lernleistung "; 'den Text in Anführungszeichen

Locate 2 , 1 'schreibt in die zweite Zeile an Position 1
Lcd " von Felix Koenig 13 BGD" 'den Text in Anführungszeichen


Cursor Off 'unterdrückt den Cursor



___lcdno = 1 'wählt die beiden unteren Zeilen aus

Locate 1 , 1 'Wiederholt die Displayausgabe auf den unteren
Lcd "Windrichtung : "; '2 Zeilen

Locate 2 , 1
Lcd "Grad : "

Cursor Off 'unterdrückt den Cursor

'Hier kommt die Sensorwerterfassung

Config Adc = Single , Prescaler = Auto , Reference = Avcc 'Konfiguriert den AD Wandler

Start Adc 'Startet den AD Wandler

Config Pinc.2 = Input 'ADC 2 an Ctrl

Dim Sensor As Long 'Deklariert "Sensor" als Long mit 4 Byte Zeichenvorrat
Dim Grad As Single 'Deklariert die Gradvariable "Grad" als Single
Dim A As Single
Dim B As Single


Do ' Beginnt die Abfrageschleife zur Werteerfassung

Sensor = 0 'Initialisiert die Variablen Sensor, Grad, Grad2
Grad = 0


Sensor = Getadc(2) 'Der AD Wert wird am Pin C2 abgelesen und in die Variable "Sensor" geschrieben

Grad = Sensor - 50 ' ((-50+Sensor)*360)/922
Grad = Grad * 360
Grad = Grad / 922 'Ergebnis als Gradwert mit Kommastellen


Grad = Grad * 100
A = Int(grad)

'Grad = Grad / 10
'Grad = Round(grad)

B = A / 100


'G = Fusing(grad , "#.#")


Print "Grad: " ; B
'Print "Grad2: " ; G

'Hierhin kommt die Anzeige der Ausgesprochenen Windrichtung (NOSW)

Select Case B

___lcdno = 1

Case Is > 337.5 : Print "Nord" ;
Locate 1 , 16
Lcd "Nord"
Case 292.5 To 337.4 : Print "Nord/West" ;
Locate 1 , 16
Lcd "Nord/West"
Case 247.5 To 292.4 : Print "West" ;
Locate 1 , 16
Lcd "West"
Case 202.5 To 247.4 : Print "Sued/West" ;
Locate 1 , 16
Lcd "Sued/West"
Case 157.5 To 202.4 : Print "Sued" ;
Locate 1 , 16
Lcd "Sued"
Case 112.5 To 157.4 : Print "Sued/Ost" ;
Locate 1 , 16
Lcd "Sued/Ost"
Case 67.5 To 112.4 : Print "Ost" ;
Locate 1 , 16
Lcd "Ost"
Case 22.5 To 67.4 : Print "Nord/Ost" ;
Locate 1 , 16
Lcd "Nord/Ost"
Case Is < 22.4 : Print "Nord" ;
Locate 1 , 16
Lcd "Nord"

Case Else : Print "Error" ;
Locate 1 , 16
Lcd "Error"

End Select

Print " "

___lcdno = 1 'wählt die unteren 2 Zeilen aus

Locate 2 , 8
Lcd B ; "^"



Waitms 500 '500 ms Wartezeit zwischen der Abfragewiederholung

___lcdno = 1 'Löschen der vorherig angezeigten Werte auf dem Display

Locate 1 , 16
Lcd " "
Locate 2 , 8
Lcd " "

Loop 'Ende der Ausführungsschleife
'und Sprung zum Anfang der Schleife


End 'Programmende

Gruß

gpo
03.03.2007, 16:53
Hallo,

so funktioniert es. Getestet mit Version 1.11.8.3 im Simulator.




'Winkelmessung mit dem Sensor MLX 90316 und Ausgabe der Gradanzeige
'über den Controler RN-MiniControl von Robotikhardware auf das Display
'Wintek 27 * 4 von Pollin
'>>>Besondere Lernleistung von Felix König<<<


$regfile = "m168def.dat" 'Controller definieren
$crystal = 16000000 'Quarzfrequenz
$baud = 9600 'Übertragungsrate in Baud
$hwstack = 32
$framesize = 32
$swstack = 32

'Die üblichen Definitionen bei Standardprogrammen auf Miniboard


'Hier kommt die Ausgabe auf das Display

Config Lcd = 40 * 4 'Bascom kennt keine Displays mit 27 * 4 Zeichen,
'daher 40 * 4 verwenden

Config Lcdpin = Pin , Db4 = Portb.5 , Db5 = Portb.0 , Db6 = Portd.7 , Db7 = Portd.6 , E = Portb.3 , E2 = Portc.3 , Rs = Portd.3

'man achte auf die Ergänzung E2 für den 2. Steuerkontroller des Displays

Dim ___lcdno As Byte 'Systemvariable der LCD-Bibliothek



___lcdno = 0 'wählt den ersten Chip aus
Initlcd 'die beiden oberen Zeilen initialisieren
Cls 'die beiden oberen Zeilen löschen

___lcdno = 1 'auf Chip 2 schalten
Initlcd 'die beiden unteren Zeilen initialisieren
Cls 'die beiden unteren Zeilen löschen



___lcdno = 0 'wählt die obere Zeile aus

Locate 1 , 1 'schreibt in die erste Zeile an Position 1
Lcd " Besondere Lernleistung "; 'den Text in Anführungszeichen

Locate 2 , 1 'schreibt in die zweite Zeile an Position 1
Lcd " von Felix Koenig 13 BGD" 'den Text in Anführungszeichen


Cursor Off 'unterdrückt den Cursor



___lcdno = 1 'wählt die beiden unteren Zeilen aus

Locate 1 , 1 'Wiederholt die Displayausgabe auf den unteren
Lcd "Windrichtung : "; '2 Zeilen

Locate 2 , 1
Lcd "Grad : "

Cursor Off 'unterdrückt den Cursor

'Hier kommt die Sensorwerterfassung

Config Adc = Single , Prescaler = Auto , Reference = Avcc 'Konfiguriert den AD Wandler

Start Adc 'Startet den AD Wandler

Config Pinc.2 = Input 'ADC 2 an Ctrl

Dim Sensor As Long 'Deklariert "Sensor" als Long mit 4 Byte Zeichenvorrat
Dim Grad As Single 'Deklariert die Gradvariable "Grad" als Single
Dim Grad_mit_einer_kommastelle As String * 5


Do ' Beginnt die Abfrageschleife zur Werteerfassung

Sensor = 0 'Initialisiert die Variablen Sensor, Grad, Grad2
Grad = 0


Sensor = Getadc(2) 'Der AD Wert wird am Pin C2 abgelesen und in die Variable "Sensor" geschrieben

Grad = Sensor - 50 ' ((-50+Sensor)*360)/922
Grad = Grad * 360
Grad = Grad / 922 'Ergebnis als Gradwert mit Kommastellen



Grad_mit_einer_kommastelle = Fusing(grad , "#.#")


Print "Grad: " ; Grad_mit_einer_kommastelle

'Hierhin kommt die Anzeige der Ausgesprochenen Windrichtung (NOSW)

Select Case Grad

___lcdno = 1

Case Is > 337.5 : Print "Nord" ;
Locate 1 , 16
Lcd "Nord"
Case 292.5 To 337.4 : Print "Nord/West" ;
Locate 1 , 16
Lcd "Nord/West"
Case 247.5 To 292.4 : Print "West" ;
Locate 1 , 16
Lcd "West"
Case 202.5 To 247.4 : Print "Sued/West" ;
Locate 1 , 16
Lcd "Sued/West"
Case 157.5 To 202.4 : Print "Sued" ;
Locate 1 , 16
Lcd "Sued"
Case 112.5 To 157.4 : Print "Sued/Ost" ;
Locate 1 , 16
Lcd "Sued/Ost"
Case 67.5 To 112.4 : Print "Ost" ;
Locate 1 , 16
Lcd "Ost"
Case 22.5 To 67.4 : Print "Nord/Ost" ;
Locate 1 , 16
Lcd "Nord/Ost"
Case Is < 22.4 : Print "Nord" ;
Locate 1 , 16
Lcd "Nord"

Case Else : Print "Error" ;
Locate 1 , 16
Lcd "Error"

End Select

Print " "

___lcdno = 1 'wählt die unteren 2 Zeilen aus

Locate 2 , 8
Lcd Grad_mit_einer_kommastelle ; "^"



Waitms 500 '500 ms Wartezeit zwischen der Abfragewiederholung

___lcdno = 1 'Löschen der vorherig angezeigten Werte auf dem Display

Locate 1 , 16
Lcd " "
Locate 2 , 8
Lcd " "

Loop 'Ende der Ausführungsschleife
'und Sprung zum Anfang der Schleife


End 'Programmende
Gruß
Günter

Stargate
03.03.2007, 18:03
=D> =D> =D>

Vielen Vielen Dank :-)
Also ich werde mir in Zukunft angewöhnen immer den kompletten Code hier reinzustellen, damit man mir gleich besser helfen kann ;-)

Also deine Lösung hatte ich als Ansatz zwar schonmal, aber ich wollte dann immer mit der Variablen "Grad_mit_einer_Kommastelle" in die Caseuntersuchung rein und das Wollte er nicht, da ja ein string nur ne Zeichenfolge ist und keine Zahl. Deswegen wollte ich das mit allenmöglichen anderen Funktionen versuchen, das wieder möglich zu machen, hat aber nie Funktioniert.
Dass man das natürlich nicht braucht, sondern gleich mit den ungerunderten Werten in die Fallunterscheidung rein gehen sollte, dadran hab ich nicht mehr gedacht.

Vielen Dank nocheinmal für deine Lösung!

\:D/

Gruß Felix