PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anfängerfehler? Call mit parameterübergabe



patteb
14.12.2010, 20:03
Hallo!

ich bin ziemlich neu in bascom und dies ist auch mein erstes komplett selbst aufgebautes projekt mit einem µC, und anscheinend brauche ich hilfe:

die parameterübergabe bei call funktioniert irgendwie nicht, bzw gibt je nachdem wie ich den variablentyp wähle IMMER 0 (bei integer) oder IMMER 254 (bei byte... wie kommt man da auf so was "krummes" btw?)

ich filter mal kurz die wichtigen codezeilen raus, und häng auch nochmal den kompletten source an.

Das ganze passiert im ATmega16



Const Pos0 = 200
Const Pos1 = 400
Const Pos2 = 600
Const Pos3 = 800
Const Pos4 = 1000
Const Pos5 = 1200

Dim Slt As Integer
Declare Sub Pour(byval Slt As Integer)

[...]

Select Case Makedrink

Case 0:
Call Pour(pos0)

Case 1:
Call Pour(pos1)

[...]

Case 7:
Call Pour(pos2)
Call Pour(pos3)

End Select

[...]

Sub Pour(byval Slt As Integer)
Local I As Integer

For I = 0 To Slt
Toggle Clk1
Toggle Clk2
Waitms 7
Next I

Return
End Sub

also soweit ich das richtig gelesen habe und die helpfile mir das sagt muss das doch stimmen oder?

Im Prinzip sind das ja die code-beispiele, bei denen ich die variablennamen und -typen geändert habe. Ich hatte mich aber gewundert warum in allen beispielen immer nur byte verwendet wird und hab es auch mal so versucht.
aber wie gesagt, selbst wenn ich den datentyp ändere und die auswahl der richtigen PosX innerhalb der sub mache passiert nichts, weil einfach anstatt 0 immer 254 angenommen wird.


und wenn mich das schon vor probleme stellt, stellt euch mal vor wie ich geflucht hab bis ich gemerkt hab, dass ich an den fusebits rumfummeln muss um portc zu verwenden! xD

achja, falls es so ein ähnlicvhes thema schon gab entschuldigt bitte, aber irgendwie hat die suchoption mehrmals gebuggt

Netzman
14.12.2010, 20:38
Hallo,

du hast den Parameter der Funktion gleich benannt wie eine globale Variable, da wird wohl das Problem liegen. Lösch mal Zeile 72 aus deinem Programm.
Statt dem Integer solltest du ein Word nehmen (siehe Wertebereiche in der Hilfe), geht aber auch so.

mfg

patteb
22.12.2010, 07:51
Tut mir leid dass ich so spät antwortete, aber ich hatte die letzte Woche Berufsschule und die Hardware steht auf der Arbeit, sodass ich vorher noch nicht weitermachen konnte.

Das hat leider nicht weitergeholfen. Wenn ich in der Schleife Slt mit einer Zahl ersetze, klappt das wunderbar!

PicNick
22.12.2010, 10:12
Dein Werte sind nicht ausreichend. Probier' mal:

$swstack = 128 ' Größe des Software Stacks
$hwstack = 80 ' Größe des Hardware Stacks


http://www.rn-wissen.de/index.php/Bascom_Inside#Bascom_Inside

patteb
22.12.2010, 12:16
Ok, das hab ich jetzt probiert, funktioniert aber immernoch nicht. In dem arbeitsgang hab ich auch noch die framesize nach oben korrigiert. Jetzt müsste das doch masse genug sein?
nun habe ich folgende werte:

Frame 128
Swstack 128
hwstack 100

PicNick
22.12.2010, 13:34
Sei so gut und stell' die allerletzte/neuste Version deines Progs da rein.
Das sollten wir doch rauskriegen

patteb
22.12.2010, 16:49
so, hier nochmal die aktuelle version des quelltextes.
ich hab hier zuhause allerdings keine möglichkeit etwaige vorschläge zu testen, weil ich die hardware nur auf der arbeit hab. also geduld mit mir ^^°

Netzman
22.12.2010, 20:16
Eine Sub/Function braucht kein Return, ohne habe ich in der Simulation im Sub den Parameter den ich übergebe.

mfg

patteb
23.12.2010, 08:44
Das hat leider auch nichts gebracht, aber danke für den tipp. Hätte mich allerdings auch gewundert, da es ja funktioniert wenn ich anstatt slt ne feste zahl angebe. Das problem liegt ja anscheinend nur in der parameterübergabe.

PicNick
23.12.2010, 09:51
Ich hatte leider Probleme, das Programm als Ganzes im Simulator anzusehen. Ich muss da wohl erstmal ein Extrakt machen.

Ich vermute ja, dass Bascom ein Problem hat im Zusammenhang mit der "CONST" und "BYVAL" Angabe.

Das wollt ich einkreisen durch eine Temporär-Variable:

DIM temp AS INTEGER

und dann, beim CALL:

temp = Par0
Call Pour(temp)

temp = Par1
Call Pour(temp)

etc.

in dieser Form gibt's keine Ausreden.

Richard
23.12.2010, 10:47
Habe das Programm auch einmal simuliert verstehe allerdings nicht genau die Fragestellung?

Was genau geht nicht, im Simulator scheint das zu laufen. Zumindenst die Auswahl im LCD.

Gruß Richard

patteb
23.12.2010, 13:05
Mit den Konstanten hat das nichts zu tun, es funktioniert auch nicht wenn ich Zahlen bei Call angebe (zb Call Pour(200) ). Ich hab es trotzdem mal mit der Variable probiert, wie PicNick vorgeschlagen hat. Immernoch keine Verbesserung.
Die Hardware läuft. Wenn ich in der Schleife Slt mit eine der Konstanten oder einer Zahl ersetzte, läuft es. Das kann ja aber nicht Ziel des Spiels sein.

@Richard: Das LCD und die Auswahl läuft auch auf der Hardware. Das Einzige was im Moment nicht richtig spielen will ist der Aufruf der Sub Pour(Slt as Integer). Die übergibt ihren Parameter nämlich nicht.

Zur Sicherheit hier nochmal die Fuses, vll hab ich da ja was verdreht: (externer 4Mhz Quarz und jtag aus weil ich ja portc benutzen will)

(X = programmed = 0 ; O = unprogrammed = 1 )

OCDEN O
JTAGEN O
SPIEN X
CKOPT O
EESAVE O
BOOTSZ1 X
BOOTSZ0 X
BOOTRST O
BODLEVEL O
BODEN O
SUT1 O
SUT0 X
CKSEL3 O
CKSEL2 O
CKSEL1 O
CKSEL0 O

PicNick
23.12.2010, 13:55
Hab das jetzt mit dem Simulator probiert, (allerdings eingeschränkt auf den Aufruf und die Durchführung der Sub.

Das klappt tadellos, d.h. wenn fehler, dann irgendwo anders.

btw: Pins werden über PINx.n gesteuert . Muss also heissen:


Config Pinc.0 = Output
Config Pinc.1 = Output
Config Pinc.2 = Output
Config Pinc.3 = Output
Config Pinc.4 = Output


Denke nicht, dass da die Fuses irgendwie mitspielen können.

Richard
23.12.2010, 17:01
Die Call Routine wird nicht angesprungen, nicht ausgeführt. Jedenfalls hält ein Breakpoint auf der Zeile das Programm nicht an.

Aber wo bitte wird die Variable "Slt" Gesetzt und mit welchem Wert? Irgendwarum wird die Case Anweisung call (x) nicht ausgeführt. Aber den Einzelstepp im Simulator kannst Du elber durch tickern...:-)

Gruß Richard

Richard
24.12.2010, 14:12
die parameterübergabe bei call funktioniert irgendwie nicht,

Nur als Anregung.....:-)

http://www.iai-robot.co.jp/tvcm/index.html

Gruß Richard