PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wurzel ziehen?



Ringelkrat
12.02.2006, 20:06
Hallo,

Also ich habe mal versucht mir BASCOM-AVR eine Wurzel zu ziehen mit der Funktion SQR().
In der Hilfe steht so was, dass man eigentlich keine zusätzliche library hinzufügen muss, solange man nicht mit single rechnet.
Als das versucht hab, hat er mir nur 0 ausgegeben (auf LCD). Als ich mir die Zahl 'ungewurzelt' hab ausgeben lassen, lag die so zwischen 400 bis 600 (also nicht negativ, womit ich den Fehler verstanden hätte).

Ich habe dann versucht die library doch einzubinden (mit $LIB). Dann hat er mir aber eine Fehlermeldung beim Kompilieren ausgegeben. Er meinte, die library ist nicht unter dem Pfad zu finden. Die Datei ist aber unter dem Pfad wohl vorhanden!

Hat mal jemand bessere oder ähnliche Erfahrung gemacht?

mfG Ringelkrat

oe9vfj
13.02.2006, 07:26
Folgendes Testprogramm


Dim b1 as Byte , b2 as Byte
Dim w1 as Word , w2 as WOrd
Dim i1 as Integer , i2 as Integer
Dim l1 as Long , l2 as Long
Dim s1 As Single , s2 as Single
Dim d1 as Double , d2 as Double

b1 = 66 : b2 = sqr(b1) : print b2
w1 = 6600 : w2 = sqr(w1) : print w2
i1 = 6600 : i2 = sqr(i1) : print i2
l1 = 660000 : l2 = sqr(l1) : print l2
s1 = 660000 : s2 = sqr(s1) : print s2
d1 = 660000 : d2 = sqr(d1) : Print d2

end

brachte folgendes Ergebnis im Simulator:

8
81
81
812
812.403808593
812.403840463596
was bei DOUBLE als vergleichbaren Datentyp in EXCEL bis zur letzten Kommastelle exakt übereinstimmt.

Das Problem liegt möglicherweise in Deinem Programmcode.
Wenn Du diesen hier posten könntest, wäre vielleicht eine weitere Hilfestellung möglich.

Ringelkrat
18.02.2006, 13:08
Hallo,

also ich hab mal meinen ganzen Programmcode durchforstet und nichts gefunden. Deswegen poste ich hier den code noch mal. Einmal in voller Version und einmal nur den Teil den ich für relevant halte.
Der gesammte Code:
'------------------------------------------------------------
' ATTINY26 D.H. 2006-02
'------------------------------------------------------------

$regfile = "at26def.dat"
' default the internal osc runs at 1 MHz
$crystal = 1000000

Const A = 30 'Die x-Achsenverschiebung des 2. Empfängers

Dim Zeitus As Byte
Dim S As Word
Dim E As Bit

Dim R As Word 'Radius des 1. Empfängers
Dim Q As Word 'Radius des 1. Empfängers
Dim X As Word 'Position auf der x-Achse
Dim Y As Word 'Position auf der y-Achse
Dim Z As Word
Dim Temp As Word 'temporäre Variable zur Berrechnung von Zwischenschritten

Config Lcdpin = Pin , Db4 = Porta.3 , Db5 = Porta.2 , Db6 = Porta.1 , Db7 = Porta.0 , Rs = Porta.4 , E = Porta.5
Config Lcd = 16 * 2
Config Pinb.4 = Input 'US1
Config Pinb.5 = Input 'US2
Config Pina.6 = Input 'sofort

Zeitus = 0
E = 0
X = 0
Y = 0

Do

If E = 1 Then
E = 0
Else
E = 1
End If

Cls
Locate 1 , 1
Lcd "R=" ; R ; " | Q=" ; Q
Locate 2 , 1
Lcd "[" ; X ; "|" ; Y ; "] Z= " ; Z ; "|"
Zeitus = 0
S = 0
'Zuerst auf Startsignal warten
While Pina.6 = 0
'nichts
Wend

If E = 0 Then
'Nun zählen
While Pinb.4 = 0
Zeitus = Zeitus + 1 'Zählt 1 mehr
Wend
Else
'Nun zählen
While Pinb.5 = 0
Zeitus = Zeitus + 1 'Zählt 1 mehr
Wend
End If

'Nun Ausgabe
While Pina.6 = 1 'warte bis signal weg
'nichts
Wend

'Streckenberrechnung
S = 50 * Zeitus
S = S - 177
S = S / 81

If E = 0 Then
R = S
Else
Q = S
End If

'Lateration
X = A * A
Temp = R * R
X = X + Temp
Temp = Q * Q
X = X - Temp
Temp = 2 * A
X = X / Temp

Temp = R * R
Y = Temp
Temp = X * X
Y = Y - Temp

Z = Y
Y = Sqr(z)


Loop


End
Der scheinbar relevante Code:
$regfile = "at26def.dat"
$crystal = 1000000

Dim Y As Word 'Position auf der y-Achse
Dim Z As Word

[...]

Z = Y
Y = Sqr(z)

[...]

End
Und das ist die Ausgabe auf dem LCD-Display:
R=21 | Q=13
[18|0] Z=180|
Heißt also so viel wie Y=0 und Z=180.

@oe9vfj: Irgendwie sieht dein Code merkwürdig aus, da bei dir die Variablennamen klein bleiben, während sie bei mir immer mit Großbuchstaben geschrieben werden (automatische Änderung). Benutzt du vieleicht eine andere Version (BASCOM-AVR 1.11.7.4)?

Ein anderes Zeichen dafür dass es nicht funktioniert ist dass die Variable in der Funktion klein bleibt, wo BASCOM bei mit üblicherweise alle Variablennamen groß anfängt (Sqr(z) anstatt Sqr(Z) wie erwartet)...

Naja, ich werde entweder das Wurzeln lassen oder aber die Wurzel mit einem eigenen Algorythmus ausrechnen.

mfG, Ringelkrat

Ringelkrat
18.02.2006, 17:11
Noch mal heute:

Also ich hab mal ein Testprogramm geschrieben um das Wurzeln mal konkret zu versuchen:
'------------------------------------------------------------
' ATTINY26 Wurzel Test D.H. 2006-02
'------------------------------------------------------------
$regfile = "at26def.dat" 'ATTiny Definitionen
$crystal = 1000000 ' default the internal osc runs at 1 MHz

Config Lcdpin = Pin , Db4 = Porta.3 , Db5 = Porta.2 , Db6 = Porta.1 , Db7 = Porta.0 , Rs = Porta.4 , E = Porta.5
Config Lcd = 16 * 2

Dim B1 As Byte
Dim B2 As Byte

Dim W1 As Word
Dim W2 As Word

Dim I1 As Integer
Dim I2 As Integer

Dim L1 As Long
Dim L2 As Long

'Problem: Dim S1 As Single 'nicht genügend Speicherplatz
'Problem: Dim S2 As Single 'nicht genügend Speicherplatz

'Problem: Dim D1 As Double 'Unknown DATA TYPE (DOUBLE)
'Problem: Dim D2 As Double 'Unknown DATA TYPE (DOUBLE)

B1 = 66
B2 = Sqr(b1)

W1 = 6600
W2 = Sqr(w1)

I1 = 6600
I2 = Sqr(i1)

L1 = 660000
L2 = Sqr(l1)

'Problem : S1 = 660000 'nicht genügend Speicherplatz
'Problem : S2 = Sqr(s1) 'nicht genügend Speicherplatz

'Problem : D1 = 660000 'Unknown DATA TYPE (DOUBLE)
'Problem : D2 = Sqr(d1) 'Unknown DATA TYPE (DOUBLE)

Cls 'LCD-Display leeren
Locate 1 , 1 'Am Anfang der ersten Zeile positionieren
Lcd "b" ; B2 ; "w" ; W2 ; "i" ; I2 ; "l" ; L2 'Das sollte ergeben: 'b8w81i81l812'
'Ausgabe ist wirklich: 'b8w0i81l812'
Locate 2 , 1 'Am Anfang der zweiten Zeile positionieren
Lcd "" 'Das sollte ergeben: '' ; (Double und Single wurde entfernt)

End
Leider konnte ich schon mal kein Double benutzen, da er den Datentyp nicht kennt. Er steht auch nicht unter den 'Elementary Data Types' der Hilfe.
Dann hatte ich eine Speicherplatzbelegung von 110% deswegen hab ich den Single herrausgenommen. Damit hatte ich nur noch 54%.
Nun auch als ich diese Probleme beseitigt hatte gab er mir nicht das Richtige Ergebniss:
b8w0i81l812 Das heißt so viel wie:[list:c8a82e988a]Byte = 8
Word = 0
Integer = 81
Long = 812Das heißt dass das Word (was ich sonst immer benutzt habe [s.o.]) nicht richtig funktioniert :cry: .
[/list:u:c8a82e988a]

mfG, Ringelkrat

oe9vfj
19.02.2006, 08:38
Ich würde Dir empfehlen, auf die neueste Version upzudaten. Zwischen 1.1.7.4 und 1.11.8.2 hat sich doch einiges getan. Möglich auch, dass in der Wurzelfunktion für Word in der damaligen Version ein Bug war. Dein Programm funktioniert in der Version 1.11.8.2.
Weiters muss auch auf die Stack-Einstellungen geachtet werden, da hier zu kleine Werte oft die Urache für unerklärlicher Fehler sind. Für Dein Beispiel habe ich jeweils 16 genommen.
Sofern Du in Deiner Applikation dann noch mit SUB und FUNCTION arbeitest, welche byval übergebene Parameter bzw. LOCAL Variable enthalten, musst du den Framesize entsprechend erhöhen. Siehe dazu auch $HWSTACK, $SWSTACK und $FRAMESIZE in der Hilfe. Weiters gibt es dazu auch einen Artikel in https://www.roboternetz.de/wissen/index.php/Bascom_Inside