- LiTime Speicher und Akkus         
Ergebnis 1 bis 5 von 5

Thema: Wurzel ziehen?

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    28.03.2004
    Beiträge
    56

    Wurzel ziehen?

    Anzeige

    Praxistest und DIY Projekte
    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

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.11.2004
    Ort
    Hard, Vorarlberg
    Beiträge
    155
    Folgendes Testprogramm

    Code:
    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.
    Viele Grüße
    Josef
    -------------------------------------------------------------------------------------
    DOS-File System für BASCOM-AVR auf http://members.aon.at/voegel

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    28.03.2004
    Beiträge
    56

    Versteh ich nicht...

    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:
    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:
    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
    Angehängte Dateien Angehängte Dateien

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    28.03.2004
    Beiträge
    56

    2. Versuch

    Noch mal heute:

    Also ich hab mal ein Testprogramm geschrieben um das Wurzeln mal konkret zu versuchen:
    Code:
    '------------------------------------------------------------
    '                 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 = 812
    Das heißt dass das Word (was ich sonst immer benutzt habe [s.o.]) nicht richtig funktioniert .[/list:u:c8a82e988a]

    mfG, Ringelkrat
    Angehängte Dateien Angehängte Dateien

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.11.2004
    Ort
    Hard, Vorarlberg
    Beiträge
    155
    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/in.../Bascom_Inside
    Viele Grüße
    Josef
    -------------------------------------------------------------------------------------
    DOS-File System für BASCOM-AVR auf http://members.aon.at/voegel

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiTime Speicher und Akkus