Klugscheissermodus ein:
Selbst das ist gerundet
Klugscheissermodus aus :cheesy::cheesy::cheesy:
Druckbare Version
ok, jetzt habe ich hier in Bascom:
Zahl = Atn2(y , X)
Jetzt bekomme ich einen Fehler: Integer or Long expected for ABS()
Dabei wurde "Zahl" weiter oben als Integer deklariert?
Y und X wurden als Word deklariert. Was ist jetzt hier falsch?
Ach du liebe Zeit . . . ich will jetzt nicht schreiben, wieviel absonderliche Modi eingeschaltet waren, als ich das gerechnet hatte. Das ist der Nachteil von mehrzeiligen Rechnerdisplays . . . Bitte um Entschuldigung
habe jetzt alles als Single.. Funktioniert :D
oh war wohl etwas voreilig. Jetzt findet Bascom im Code zwar keine Fehler mehr, das Ergebniss ist jedoch immer noch falsch.
Wie gesagt ich rechne es so aus:
Zahl = Atn2(y , X)
Aber auch wenn ich mit dem Taschenrechner (mein Ti 84 kennt irgendwie kein Atan) rechne kommt da das Ergebniss von vorhin raus. Kann mir jemand erläutern wie der Bascom-Code auszusehen hat, oder wie man in Visual Basic oder auf dem Taschenrechner diese Werte eingeben muss damit ich wenigstens mal ein richtiges Ergebniss rausbekomme :(
also mit dem Taschnrechner bekomme ichs jetzt auch hin. Nur Bascom macht Probleme :( Welchen Befehl brauche ich hier?
schön wäre wenn du mal dienen code zeigen würdest und dazu das was er ausrechnet...
hast du den auch mit rad2deg in grad umgerechnet?
wert = atn2(y,x)
wert = rad2deg(wert)
Hier mal mein Code (eigentlich nur der von http://www.mtahlers.de/index.php/ele...ren/mmc2120mg#)
Es wird jetzt auch ein Wert ausgegeben, aber egal wie rum ich den Sensor drehe, es kommt immer eine Zahl um die 45,000000000 heraus.Code:' beispielprogramm zum auslesen des MMC2120MG
' malte ahlers 2011
' weitere infos auf malteahlers.de
'
'
'
' compiler steuerung
$regfile = "m16def.dat"
$crystal = 16000000
$framesize = 64
$swstack = 64
$hwstack = 64
$baud = 19200
$lib "i2c_twi.lbx"
'
' - i2c
Config Twi = 400000
Config Scl = Portc.0
Config Sda = Portc.1
'
' konstanten
Const Cmp_w = &H60
Const Cmp_r = &H61
'
' variablen
Dim I As Byte
Dim Dat(5) As Byte
Dim X As Single
Dim Y As Single
Dim Zahl As Single
Dim K As Single
Config Portc.4 = Output
Portc.4 = 1
Config Portb.0 = Output
Beeper Alias Portb.0
Sound Beeper , 400 , 450
'
' hauptprog
I2cinit
'
Do
'
' * set/ reset coil *
I2cstart
'
' sensor adressieren (schreiben)
I2cwbyte Cmp_w
'
' register adressieren
I2cwbyte &H00
'
' register manipulieren -> set coil
I2cwbyte &B00000010
'
I2cstop
'
Waitms 1
'
I2cstart
'
' sensor adressieren (schreiben)
I2cwbyte Cmp_w
' register adressieren
I2cwbyte &H00
'
' register manipulieren -> reset coil
I2cwbyte &B00000100
'
I2cstop
'
Waitms 5
'
' * messung *
I2cstart
'
' sensor adressieren (schreiben)
I2cwbyte Cmp_w
'
' register adressieren
I2cwbyte &H00
'
' register manipulieren -> messung
I2cwbyte &H01
'
I2cstop
'
Waitms 5
'
I2cstart
I2cwbyte Cmp_w
' leseindex setzen
I2cwbyte &H00
'
I2cstart
'
' sensor adressieren (lesen)
I2cwbyte Cmp_r
'
For I = 1 To 4
' bytes 1-4 holen mit ack
I2crbyte Dat(i) , Ack
Next
'
' byte 5 holen mit nack
I2crbyte Dat(5) , Nack
'
I2cstop
'
' oberes nibble im high bytes löschen
Dat(2) = Dat(2) And &B0000_1111
Dat(4) = Dat(4) And &B0000_1111
'
' x-wert aus high- und lowbyte berechnen
X = Dat(2) * 256
X = X + Dat(3)
'
' y-wert aus high- und lowbyte berechnen
Y = Dat(4) * 256
Y = Y + Dat(5)
Zahl = Atn2(y , X)
Zahl = Rad2deg(zahl)
Print Zahl
Waitms 200
Loop
End
Kann es sein das der Sensor kaputt ist oder vom Steckbrett gestört wird?
Hallo,
also grundsätzlich ist die Berechnung so wie von Bammel empfohlen richtig, das kann also nicht das Problem sein. Die Eingangswerte in den atn2 müssen Singles sein, ich glaube das hast du ja acuh schon bemerkt. Die Bascom Fehlermeldung wenn man da einen anderen Typ nimmt ist natürlich extrem dämlich und verwirrend... Lass dir doch am besten auch mal die Eingangswerte mit ausgeben (also X und Y). Wenn du konstant 45° bekommst, müssten X und Y gleich groß sein. Dann bekommt man schonmal eine Idee wo es eventuell hakt.
Gruß
Malte
Wenn mich nicht alles täuscht ist das kein Kompass- sondern ein Beschleunigungssensor für 2 Achsen.
Damit wirst Du niemals einen Winkel (wie bei einem Magnetkompass) von 0-360° bekommen. :(
Der Winkel den Du damit berechnest bezieht sich auf den Erdmittelpunkt (in unbeschleunigtem Zustand / Ruhelage) !