PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Parameterübergabe



tobimc
02.11.2004, 16:27
HI

Wie kann ich in BASCOM an eine Funktion 2 Byte Parameter übergeben?

So funzt's nicht...

Declare Function Funktion(byval byte1 as Byte, byval byte2 as Byte) as Byte
'...
A = Funktion(1, 2)
'...
End

Function Funktion(byte1 as Byte, byte2 as Byte)
'...
End Function

Was ist da falsch?
Kann ich nur einen Parameter vom gleichen Typ übergeben?

Wenn ich das so mache, ist bei mir byte2 immer 0.
Danke schonmal!

Tobi

x-ryder
02.11.2004, 17:10
Was issn ich hab die bei mir laufn lassen und es ging hast du A gedimmt?

Martin

02.11.2004, 18:40
Hi!

Ja, a ist als Byte gedimt.
Es gibt auch keine Fehler oder so, aber byte2 ist immer 0.

Ich habe inzwischen bei den Beispielen gekuckt, und da haben die das mit einem Sub gemacht. aber ich muss jetzt statt den zweiten Parameter einfach als Zahl zu schreiben, ihn in einer extra variable speichern;
sonst geht's auch nicht.

*ARGH*

Danke, vor allem für's testen!!
Tobi

x-ryder
02.11.2004, 18:51
1. poste mal bitte deinen ganzen quellcode

2. kannste auch nen word dimmen das hat 2 bytes und du kannst da die beiden bytes wieder rauslesen mit high und low.

Martin

tobimc
02.11.2004, 19:11
:D
Das sind 300 Zeilen ungekürzt...

x-ryder
02.11.2004, 19:14
iss egal machs als anhang ich werds mir mal ansehen :-)

Frank
02.11.2004, 23:12
Erhöhe mal die Werte für Soft - und Hardware Stack und Frame unter Optionen. Die voreingestellten Werte sind so niedrig, das es oft nicht mit den Parametern klappt.

tobimc
02.11.2004, 23:28
... :D Scheint ja ein mittelgroßes Problem zu sein :D...

Ich habe das jetzt soweit hingekriegt, dass es mir halbwegs gefällt.
Danke an alle beteiligten. :!:

Ich glaube BASCOM hat noch ein paar Tücken.
Wieso funktioniert das mit der simplen Funktion nicht??

Viele liebe Grüße und DANKE nochmal!
Tobi

02.11.2004, 23:47
Poste ganze Funktion dann kann man es mal testen. Im Grunde geht eigentlich fast alles in Bascom, man muss nur raus bekommen wie

tobimc
03.11.2004, 08:49
Hi,

Ja, das ist in Bascom das Problem. Es geht eigentlich, aber bis man weis wie ist man vor Wut schon fast geplatzt.

'+++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++
'| _MEECH_ HAUPRPROGRAMM |
'| Copyright: Tobias Schlegel |
'| Version 0.5 |
'| |
'| www.drschlegel.de/tobias |
'| Compiled for ATMEGA16, 16Mhz (ext.)Crystal |
'+++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++

'===CONFIGURATIONS===
$regfile = "m16def.dat"
$baud = 9600
$crystal = 16000000
$lib "i2c.lib"


Declare Sub S_servo(byval Number As Byte , Countt As Byte)

Dim A As Byte
Dim B As Byte


B = 80
Call S_servo(1 , B)

End

Sub S_servo(byval Number As Byte , Byval Countt As Byte)

lcdlowline = str(number) + str(Countt)
A = lcdprint()

End Sub

'Andere Funktionen


Das ist die stark gekürzte Version. Sonst würde das ganze etwas umübersichtlich... :D


lcdlowline = str(number) + str(Countt)
A = lcdprint()
Ist eine Anweisung, einen Text über den I²C zum LCD zu schicken.

Wenn ich dtatt dem B im Funktionsaufruf einfach 80 eintrage, kommt der Fehler "byval should be defined" oder so ähnlich.

Ich fahre jetzt nur leider Nach Sinsheim ins Museum; Familienausflug, da kann man sich schlecht drum drücken... :D

Danke, schonmal,
Tobi

Frank
03.11.2004, 09:23
Ich weiß nicht was in dem Beispiel "lcdlowline" darstellt. Soll das eine Stringvariable sein? Wenn ja, musst die z.B. so definieren:

Dim Lcdlowline As String * 10

dann gehts!

03.11.2004, 09:54
Hallo

Declare Sub S_servo(byval Number As Byte , Countt As Byte)

sub S_servo(byval Number As Byte , Byval Countt As Byte)


Bei Deklaration fehlt vor Countt das byval. Danach sollte es gehen.

MFG
Dieter

tobimc
04.11.2004, 10:29
Hi!

Ich habe's mit dem byval in Define getestet.
Aber dann ist countt in der Funktion = 1

Weis der Geier warum.

lcdlowline ist eine Stringvariable; ich habe sie vergessen...
Einfach weggekürzt.
In ihr wird die untere Zeile des I²C-LCDs gespeichert.
mit lcdprint() wird die ganze Sache dann ans LCD übermittelt.

Viele Grüße,
Tobi

04.11.2004, 11:10
Nimm byval und denk an oben gesagtes:


Erhöhe mal die Werte für Soft - und Hardware Stack und Frame unter Optionen. Die voreingestellten Werte sind so niedrig, das es oft nicht mit den Parametern klappt.

04.11.2004, 11:10
Hallo

Mit diesem kleine Test sieht aber doch, das die Parameter Übergabe geht.
Woher weißt du denn, das Count 1 ist ?

MFG
Dieter


'===CONFIGURATIONS===
$regfile = "m16def.dat"
$baud = 9600
$crystal = 16000000
$lib "i2c.lib"


Declare Sub S_servo(byval Number As Byte ,Byval Countt As Byte)

Dim A As Byte
Dim B As Byte

Dim Test As Word


Call S_servo(3 , 80)

End

Sub S_servo(byval Number As Byte , Byval Countt As Byte)

Test = Number + Countt

End Sub

tobimc
04.11.2004, 11:34
Hi!

Da geht das Servo an Anschlag.

Ich habe aber gerade ein ganz neues Problem:
anstatt von 0 als Parameter wird 170 übertragen.

Eine .bas Datei ist im Anhang.

Wie kann man sich das erklären?

ich habe der Variable auch einen komischen namen gegeben, um Verwechselungen auszuschließen.

Warscheinlcih sitz' ich auf der Leitung, aber ich komm nicht drauf... :-s

Wär' lieb, wenn du dir das auch anschauen könntest.
Das wichtige habe ich kommentiert.

Es ist möglich, dass nicht alle Zeichen exakt übertragen wurden, ich weis auch nicht wieso. Gerade Mal- und Geteiltzeichen fehlen ganz.

Danke schonmal!

Tobi

tobimc
04.11.2004, 12:15
HI

Ich habe den Stack erhöht... und es geht!
Das eine, wie das andere!!
Ich benutze ja den Mega 16, und da wollte ich die absoluten Maximalwerte wissen.

Ich habe jetzt
HW Stack 64
und
Soft Stack 16

Wieviel kann ich noch weiter gehen?

Aber was soll das? Kann das Bscom nicht selber?

Noch eine Frage:
Kann ich diese Werte irgendwo nachlesen?
und: Kann ich sie im Quellcode festlegen?

DANKE, an alle!!
Besonders an Frank, der das Problem ja schon anno dazumal erkannt hat.

Ich dreh nur nicht so gerne an so Einstellungen rum, da ich immer befürchte der Chip ist hinterher schrott, und das wäre bei einem SMD-Mega nicht so gut... :D

Nochmal DANKE an alle :!: :!:
Viele Grüße,
Tobi

Frank
04.11.2004, 16:19
Bitte! Ich hatte das Problem auch mal ne Weile. Wenn man es erst mal weiß dann findet man auch in der Hilfe einiges dazu. Man kann es auch im Quellcode festlegen, ich weiss nur gerade nicht die Befehle.
Die Standard-Einstellungen reichen oft nur aus, wenn man keine Funktionen und Interrupts nutzt, ansonsten muß man es erhöhen. Die Grenze kenn ich nicht, wird wohl nur duch verfügbaren Speicher begrenzt. Solange der nicht knapp ist, kannst zu z.B. überall 64 eintragen - so halte ich es. Welche Einstellung für was ist, steht aber wie gesagt irgendwo in der Hilfe und dem Kühnel Buch

tobimc
04.11.2004, 18:39
HI Frank!

OK, alles klar.
Wo muss ich im Kühnel-Buch gucken? Ich habe das alte.
Ich habe in dieser Befehls-Erklärung nix gefunden...

Kann es da keine Overflows geben?

Danke nochmal!

Viele liebe Grüße,
Tobi

Frank
04.11.2004, 20:11
Irgendwo auf den ersten Seiten hab ich dazu was gelesen, aber viel war´s auch nicht.
Die Bedeutung sieht man ja auch wenn man mit der Maus in der Dialogbox über die Felder geht (Tooltip).
Die passenden Quellcodebefehle hab ich nu garnicht mehr gefunden, hoffentlich hab ich da kein Mist erzählt. Ich meine es aber mal irgendwo gelesen zu haben.
Overflows gibts bei den paar Bytes noch nicht

tobimc
04.11.2004, 20:22
Hi Frank

Ok. Sonst kann man denen mal ne Mail schicken.
Du hast irgendwo mal geschrieben, dass das zweite beser ist.
Loht es sich wirklich das zweite zu kaufen?

Liebe Grüße,
Tobi

Frank
06.11.2004, 10:15
Hi,

ist Ansichtssache! Wenn du das erste Buch für ein paar Euro bei Ebay oder Amazon los bekommst, dann würde ich mir zweite kaufen. Ansonsten lohnt es sich vielleicht weniger, obwohl es schon erheblich erweitert ist.

tobimc
06.11.2004, 10:22
Hi Frank!

OK. Danke!!
ich werd' mal schauen; sonst kaufe ich das Buch von Roland Walter
(www.rowalt.de kennst du ja.)
Gibt's das bei Roboter-Teile.de?

Liebe Grüße, Tobi

06.11.2004, 10:33
Nö, bei http://www.robotikhardware.de/

tobimc
06.11.2004, 10:57
Hi

Oops... Das habe ich eigentlich gemeint... sorry. :oops:

Frank: Coolse neues Design! Gefällt mir!!

Ok... Vielleicht ordere ich es mal...

Liebe Grüße,
Tobi

edgar
26.01.2005, 21:29
ist jetzt inzwischen schon irgendwas rausgekommen wie man die werte am besten berechnet/einstellt
gruß werner...

x-ryder
26.01.2005, 21:38
Declare Function Funktion(byval byte1 as Byte, byte2 as Byte) as Byte
'...
A = Funktion(1, 2)
'...
End

Function Funktion(byte1 as Byte, byte2 as Byte) as byte
'...
End Function

sollte funzen

26.01.2005, 23:15
ich dachte jetzt eher an die compilerwerte für stack und framesize...

RCO
27.01.2005, 08:00
Declare Sub S_servo(byval Number As Byte , Countt As Byte)
Dim A As Byte
Dim B As Byte

B = 80
Call S_servo(1 , B)
End

Sub S_servo(byval Number As Byte , Byval Countt As Byte)

lcdlowline = str(number) + str(Countt)
A = lcdprint()

End Sub

Versuch doch mal Number und Countt mit Print auszugeben und lass lcdlowline erstmal weg, dann kannst du wenigstens sicher sein, dass es wirklich an der Übergabe liegt. Ich hatte mal ei ähnliches Problem, wo ich die ganze Zeit dachte, dass es an der Übergabe läge, tatsächlich lag es dann an einer unlogischen Macke von Bascsom dahinter.

MFG Moritz

MFg Moritz

PicNick
27.01.2005, 13:22
Hi, Männer. Für die Stackberechnung gibts gute Hilfe bei
Bascom HELP--> Index --> STCHECK
mfg robert