PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bacom und Datenfeld-Problem.



Alicik
06.08.2006, 22:15
Hallo Forum.

Ich will mit Bascom (in verbindung mit Mega8) 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

Alicik
06.08.2006, 22:48
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?



$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

Alicik
06.08.2006, 23:39
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.


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

linux_80
06.08.2006, 23:39
Hallo,

ich glaub Du musst Dir mal näheres zu diesem anschauen:

$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
https://www.roboternetz.de/wissen/index.php/Bascom_Inside

Alicik
06.08.2006, 23:44
Danke für die Antwort linux_80.
Das schaue ich mir gleich an.

Gruss

Ali

Alicik
07.08.2006, 00:07
Ja!
Es war zu klein eingestellte swstack.
Nach Erhöhung auf den Wert 32 klappt es prima.
=P~
Vielen herzlichen Dank noch ein Mal linux_80.
=P~

Gruss

Ali