-         

Ergebnis 1 bis 6 von 6

Thema: Bacom und Datenfeld-Problem.

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    04.08.2006
    Beiträge
    21

    Bacom und Datenfeld-Problem.

    Anzeige

    Hallo Forum.

    Ich will mit Bascom (in verbindung mit Mega ein Datenfeld von Länge 64 Byte mit Datenwerten (Words) auffüllen. Jeweils 2 Datensätze sollen gleichzeitig in das Datenfeld geschrieben werden. Aber schon beim ersten Datensatz stelle ich einen Fehler fest, wenn ich die beiden Datenwerte über Hyperterminal ausgebe.
    Ich habe den Fehler so weit eingegrenzt, dass nur der wesentliche Code übriggeblieben ist.
    Mir fällt nichts mehr ein, wo mein Fehler liegt.
    Vielleicht könnt ihr mir weiterhelfen!
    Dazu müsste ich den Code hier posten.
    Aber vorher möchte ich mich vergewissern, ob dies erwünscht ist.
    Keine Sorge, es ist keine meterlange Listing.
    Nur das wesentliche.

    Gruss

    Ali

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    04.08.2006
    Beiträge
    21
    Bei dem folgenden Code übergebe ich 2 Worte (1001 und 2002) an Sub.
    Wenn Sub beendet ist, schaue ich mir die ersten 4 Bytes des Datenfeldes mit Hyperteminal:
    ADR1= 233
    ADR2= 3
    ADR3= 100
    ADR4= 0

    Der erste Wert stimmt: 256 * 3 + 233 = 1001
    Der zweite Wert stimmt aber nicht: 256 * 0 + 100 = 100
    Für den zweitenwert hätten es sein müssen:
    ADR3= 210
    ADR4= 7
    So dass, 256 *7 + 210 = 2002

    Wo ist denn mein Fehler?


    Code:
    $regfile = "m8def.dat"
    $crystal = 11059200
    $baud = 19200
    
    Declare Sub Datensatzsichern_i2c(byval Datenwort_1 As Word , Byval Datenwort_2 As Word , Adrese_byte_write As Word)
    
    Dim Dw1 As Word
    Dim Dw2 As Word
    Dim Naechste_puffer_adresse As Word
    Dim Write_puffer(64) As Byte
    Dim Temp_d As Byte
    
    
       Naechste_puffer_adresse = 0
    
    For Temp_d = 1 To 1
    
       Dw1 = 1001
       Dw2 = 2002
    
       Call Datensatzsichern_i2c(dw1 , Dw2 , Naechste_puffer_adresse )
    
    Next
    
    Print "DW1= " ; Dw1
    Print "DW2= " ; Dw2
    Print "ADR1= " ; Write_puffer(1)
    Print "ADR2= " ; Write_puffer(2)
    Print "ADR3= " ; Write_puffer(3)
    Print "ADR4= " ; Write_puffer(4)
    Print "ADRN= " ; Naechste_puffer_adresse
    Print " "
    
    
    Do
    
    Loop
    
    
    Sub Datensatzsichern_i2c(byval Datenwort_1 As Word , Byval Datenwort_2 As Word , Adrese_byte_write As Word)
    'Es wird ein Datenwort byte-richtig in ein Write_Puffer hineingeschrieben:
    'Niederwertiges Byte des Datenwortes in niederwertige Write-Puffer-Adresse
    'Write_Puffer fasst 64 Byte auf. Das erste Element des Write_Puffers wird mit 1 indexiert.
    
       Incr Adrese_byte_write
       Write_puffer(adrese_byte_write) = Low(datenwort_1)
       Incr Adrese_byte_write
       Write_puffer(adrese_byte_write) = High(datenwort_1)
    
       Incr Adrese_byte_write
       Write_puffer(adrese_byte_write) = Low(datenwort_2)
       Incr Adrese_byte_write
       Write_puffer(adrese_byte_write) = High(datenwort_2)
    
    
    End Sub
    Gruss

    Ali

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    04.08.2006
    Beiträge
    21
    Dasselbe Proramm, allerdings ohne Sub, bringt korrekte Ergebnisse.

    Auszug aus dem Hyperteminal:
    ADR1= 233
    ADR2= 3
    ADR3= 210
    ADR4= 7

    Der erste Wert stimmt: 256 * 3 + 233 = 1001
    Wie es sein soll.
    Der zweite Wert stimmt auch: 256 * 7 + 210 = 2002
    Eben. Wie es sein soll.

    Merkwürdig merkwürdig.

    Hat jemand Ahnung?
    Darf ich bei Bascom kein Sub verwenden?
    Oder übersehe ich bei der Verwendung von Sub etwas Wichtiges?
    Oder... Um zu vergleichen, ob wirklich von mir angegeben Werte rauskommen: Kann bitte jemad bei sich die erste Listing Mal testen.

    Code:
    regfile = "m8def.dat"
    $crystal = 11059200
    $baud = 19200
    
    
    Dim datenwort_1 As Word
    Dim Datenwort_2 As Word
    Dim Naechste_puffer_adresse As Word
    Dim Write_puffer(64) As Byte
    Dim Temp_d As Byte
    
    
       Naechste_puffer_adresse = 0
    
    For Temp_d = 1 To 1
    
       Datenwort_1 = 1001
       Datenwort_2 = 2002
    
       Incr Naechste_puffer_adresse
       Write_puffer(naechste_puffer_adresse) = Low(datenwort_1)
       Incr Naechste_puffer_adresse
       Write_puffer(naechste_puffer_adresse) = High(datenwort_1)
    
       Incr Naechste_puffer_adresse
       Write_puffer(naechste_puffer_adresse) = Low(datenwort_2)
       Incr Naechste_puffer_adresse
       Write_puffer(naechste_puffer_adresse) = High(datenwort_2)
    
    
    Next
    
    Print "DW1= " ; Datenwort_1
    Print "DW2= " ; Datenwort_2
    Print "ADR1= " ; Write_puffer(1)
    Print "ADR2= " ; Write_puffer(2)
    Print "ADR3= " ; Write_puffer(3)
    Print "ADR4= " ; Write_puffer(4)
    Print "ADRN= " ; Naechste_puffer_adresse
    Print " "
    
    
    Do
    
    Loop

    Gruss

    Ali

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Hallo,

    ich glaub Du musst Dir mal näheres zu diesem anschauen:
    Code:
    $framesize = 32
    $swstack = 32
    $hwstack = 32
    Standardmässig hat der swstack nur 8 Byte, und da hier mehr Bytes übergeben werden reicht dieser wohl nicht mehr. Mit 32 sollte es erstmal wieder gehen.

    zu finden hier im Wiki
    http://www.roboternetz.de/wissen/ind.../Bascom_Inside

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    04.08.2006
    Beiträge
    21
    Danke für die Antwort linux_80.
    Das schaue ich mir gleich an.

    Gruss

    Ali

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    04.08.2006
    Beiträge
    21
    Ja!
    Es war zu klein eingestellte swstack.
    Nach Erhöhung auf den Wert 32 klappt es prima.

    Vielen herzlichen Dank noch ein Mal linux_80.


    Gruss

    Ali

Berechtigungen

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