PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Funktionen in bascom deklarieren?



Lunarman
06.06.2007, 13:46
Hallo,
mein problem ist, dass ich C aufgrund der Möglichkeit der Funktionen geil finde, aber mit dem ganzen Bitgeschubse (rofl) nicht klar komme. Bascom wiederum hat das problem, dass man schwierig Funktionen reinbringen kann.

Meine Frage: Kann mir jemand vielleicht zwei Codeschnipsel zum verständnis schreiben (und kommentieren), indem a) in einer eigenen Datei ne Funktion deklariert wird, die die übergebenen Werte x und y multipliziert und b) im Programm selbst die Funktion aufgerufen wird, die Werte übergeben werden und z (das produkt von x und y) abgerufen wird?

Ich hab mir das zwar in der Bascomhilfe angeguckt, blick das aber nicht.

Wichtig wäre für mich, dass alles in Basic (also kein Assembler) geproggt wird, da ich nicht sehr viel Lust hätte, dafür jetzt noch extra Assembler zu lernen. Wenn das jemand für mich machen könnte, wäre das supernett!

PicNick
06.06.2007, 14:35
'--------------------------- deklaration ------------------
Declare Function Multiplizieren(x As Byte , Y As Byte) As Word


Dim Wert1 As Byte
Dim Wert2 As Byte
Dim Ergebnis As Word

DO
wert1 = 125
wert2 = 48
ergebnis = multiplizieren(wert1, wert2) ' Aufruf
print ergebnis
LOOP

END


'--------------------------- die funktion selbst------------------
Function Multiplizieren(x As Byte , Y As Byte) As Word
Multiplizieren = X * Y
end function

Lunarman
06.06.2007, 18:44
Danke. Diese

Declare Function Multiplizieren(x As Byte , Y As Byte) As Word

muss das mit in mein Hauptprogramm oder kann ich das auch in der externen Datei hinschreiben?

goara
06.06.2007, 20:25
danke fuer die antwort.. das wollte ich auch grade fragen .. :)

und noch ne frage... wie kann ich eine funktion declarieren, die nur aufgerufen wird,und dann ein paar ports setzt oder aehnliches, ohne irgendwelche werte zuruckzugeben.... also ohne dieses As Integer oder sowas in der art...

Gento
06.06.2007, 21:53
Als
Sub Ohneworte()
Gento

Netbird
07.06.2007, 15:07
Hallo,

eine "Funktion", die etwas tut, aber keinen Wert zurückgibt, heißt Prozedur oder Unterprogramm, in Bascom mit SUB ... ENDSUB realisiert.
Prozeduren können wie Funktionen auch Parameter besitzen, die an die Prozedur übergeben werden (und ggf. von der Prozedur verändert werden können).

Das Verständnis von Prozeduren mit oder ohne Parametern ist wichtig, wenn man ein Programm modular aufbauen möchte (oder arbeitsteilig vorgeht). Es lohnt sich also, darüber nachzudenken, viele Programme und Algorithmen werden dadurch erst gut realisierbar und verständlich.
Prozeduren und Funktionen gibt es in jeder besseren (Hoch-)Sprache!

MfG

goara
08.06.2007, 00:07
ok. das mit den subs hab ich jetz verstanden.. allerdings hab ich da noch irgednwie syntaxprobleme... folgendes beispiel:

Declare Sub Greifer_auf()
Sub Greifer_auf()
M_5_v = 1
M_5_e = 1
M_5_r = 0
End Sub
'################################################# ######################
Do
B = Waitkey(#4) 'Motor 6'
Select Case B
Case "a" :
Greifer_auf
Case "d"
......

wenn ich das so schriebe wird die sub immer ausgeführt auch wenn kein "a" eingegeben wird....
der ursprüngliche code war so:

Do
B = Waitkey(#4) 'Motor 6'
Select Case B
Case "a" :
M_5_v = 1
M_5_e = 1
M_5_r = 0
Case "d" :
.....

im prinzip is das doch das gleiche oder was hab ich falsch gemacht...
beim ursprünglichen beisiel werden die ports nur gesetzt wenn man die taste drückt, bei der variante mit sub tut er es sobald man das programm auf den controller ueberspielt... wo is mein denkfehler ?? danke shcon mal...

PicNick
08.06.2007, 06:11
Holla !

De Sub selbst muß irgendwo hinten (nach "END") stehen.

declare sub subfunc()


DO
subfunc() ' AUFRUF sub
LOOP
END

sub subfunc()
.. tu was
end sub

Lunarman
08.06.2007, 13:46
Genau genommen kann man mit ner SUB durchaus Werte zurückerhalten. Ich kann die Sub ja einfach ne Variable verändern lassen und die danach mit dem Hauptprogramm oder ner anderen Sub aufrufen. Aber was ich noch nicht ganz verstanden habe, kann ich den Code



Sub Greifer_auf()
M_5_v = 1
M_5_e = 1
M_5_r = 0
End Sub
, also die eigentliche Funktionsanweisung (was macht meine Funktion) auch in eine externe Datei (lib oder bas???) reinschreiben wie in c?

PicNick
08.06.2007, 13:58
Beides geht. Nur LIB bzw. LBX ist Assembler. das wirst du nicht wollen.

Schreib am besten 2 externe Dateien:
EIne mit der Declare .......,
und eine mit der Sub selbst.
#----------------------------------------
'das steht ganz vorne im Hauptprogramm
$include "Meine_deklarationen.bas"

' und das dann irgendwo hinten, nach "END"
$include "Meine_funktionen.bas"

Netbird
08.06.2007, 14:40
> Genau genommen kann man mit ner SUB durchaus Werte zurückerhalten. Ich kann die Sub ja einfach ne Variable verändern lassen

Ja. Bei einer Funktion kannst Du aber an eine Variable zuweisen, bei einer Prozedur (SUB) nicht. Daher haben beide ihre Berechtigung ..

a= f(x) geht, wenn man eine Funktion f(x) definiert hat (wie in Mathe ..)

Lunarman
08.06.2007, 15:28
@Netbird: Stimmt ,ist mir gar nicht aufgefallen, dass das sogar die gleiche Syntax ist.

@PicNick: Das wäre dann ja original wie in C, mit der header (declares) und der x.c (mit den Funktionen)

PicNick
08.06.2007, 16:19
..original wie in C,
Ja, ist so. An der Stelle, wo "$include" steht, fügen Bascom und C diese File direkt ein, wo auch immer.
Zusatz: die "DIM" Anweisungen kannst du auch machen, wo du willst. Hauptsache, BEVOR du sie ansprichst.

Und beim Include sind auch File-Pfadangaben möglich, d.h. du kannst dir in irgendeinem Directory sowas wie eine allgemeine Library einrichten.

Lunarman
08.06.2007, 16:29
Also ist Bascom doch gar nicht so doof! Cool! Danke!

Das wird jetzt offtopic, aber zumindest bascomspezifisch - könntest du mir bitte deine I2C lib n bisschen idiotenfreundlich erklären? meinetwegen auch per pn. Ich steig durch deinen wiki-artikel gar nicht durch. Es ist das erstemal, dass ich I2C benutze, und ich möchte einen Atmega8 (Sklave) mit der RN-Control (der meister) verbinden. Eigentlich ist i2c dafür vielleicht oversized, denn ich möchte nur strings versenden, und das sogar nur einseitig. Vielleicht könntest du mir da ein kleines Programm für beide Seiten schreiben oder mir dein I2C erklären, was man damit machen kann und was nicht.

Hinweis: der atmega8 schleicht mit einem mhz durch die weltgeschichte. geht das damit dann überhaupt mit ner akzeptablen Geschwindigkeit?

Netbird
08.06.2007, 17:18
Hallo,
ja, Bascom wird gerne unterschätzt ...

Beispiele mit Erklärungen findest du im Bascom-Kursus von P.Dams, z.B.
- Ansteuerung eines PCF8574 (8Bit IO- Erweiterung)
- Ansteuerung eines DS1621 Temperaturbausteins
Ist zwar in Niederländisch, aber mit Schaltung+ Programmtext und für Deutsche auch zu verstehen ...

Quelle: www.mcselec.com, dann Application Notes, dort AN110; ist eine PDF-Datei + Anhangsatei mit BAS- Progs.

Weiteres Beispiel: Ansteuerung eines I2C- EEPROM- Speichers bei C.Kühnel, AVR RISC .. mit BASCOM .., 2. Auflage mit Programm + Erklärungen.

MfG

Netbird
08.06.2007, 17:20
P.S.: ... Erklärungen zu I2C sind natürlich gemeint ...
ist zwar nicht das, was Du machen möchtest, aber vielleicht hilft es zum Verständnis ..

Lunarman
08.06.2007, 18:25
Gucks mir gleich mal an, aber was ich halt vor allem brauche ist Code fürn Sklaven.

goara
27.06.2007, 17:01
will einer sub nen wert uebergeben: was ist hierdran falsch: ?
habs hcon die hilfe gelesn...


Declare Sub Hand_drehen_links(v As Byte)

Do
Call Hand_drehen_links(40)
Loop
End

Sub Hand_drehen_links(v As Byte)
M_5_v = 1
Compare1b = V
M_5_r = 0
Led = 1
End Sub


der meckert irgednwas wegen byval ?? was soll das sein?

Lunarman
27.06.2007, 18:04
welche Zeile denn?

goara
27.06.2007, 18:13
die:
Call Hand_drehen_links(40)
ohne call gehts auch net...
fehler:
byval should be used in declaration...

Lunarman
27.06.2007, 18:41
kann ne Sub keine variablen übernehmen??? Wär mir ja ganz neu!

PicNick
27.06.2007, 18:51
Du gibts beim call ja das "40" als literal an, daher das "byval"
bei "byref" (also so wie bei deinem declare) muß das argument in einer variablen stehen
anders:


Declare Sub Hand_drehen_links(v As Byte)
dim varia as byte

Do
varia = 40
Call Hand_drehen_links(varia)
Loop
End
Sub Hand_drehen_links(v As Byte)
M_5_v = 1
Compare1b = V
M_5_r = 0
Led = 1
End Sub


Konkret heißt das, bei "byval" übergibt er der sub eine KOPIE des wertes, daher kann sie auch im Porgrammspeicher stehen.

Bei "byref" (oder nix) übergibt er die (SRAM-) adresse der Variablen

Klaro ? :-)

Lunarman
27.06.2007, 19:44
Heißt also, er meckert gar nicht über die Zeile, sondern eigentlich darüber, dass in der Deklaration ix angegeben wird?

Netbird
27.06.2007, 20:42
Hallo, hier ein praktisches Beispiel:

Ich möchte für einen Schrittmotor die Prozedur Vorwärts1(Schritte) haben, der Wert für die Schrittzahl soll im im Kopf übergeben werden. Ich deklariere die Prozedur Vw1 so:

1. Declare Sub Vw1(byval Schritte As Word)

2. Am Ende des Programms (nach END!) steht die Definition der Prozedur, damit Bascom weiß was abzuarbeiten ist:

Sub Vw1(by Val Schritte As Byte) 'Schrittmotor links drehen
For J = 1 To Schritte
Portb.4 = 1 : Portb.5 = 1 : Waitms 3
Portb.5 = 0 : Waitms 5
Next
End Sub

3. Im Programm rufe ich die Prozedur z.B. auf mit

Call Vw1(50)

Dann dreht der Motor 50 Schritte weit.

goara
27.06.2007, 21:37
jipp klappt danke fuer die hilfe...

PicNick
28.06.2007, 09:14
@lunarman: bingo, genau
Guck mal da
https://www.roboternetz.de/wissen/index.php/Bascom_Inside#Call_Sub_.26_Function

Tip: "byval" ist püraktisch, weil man variable UND Festwerte gemischt übergeben kann
aaaaaaber:
Das Kopieren kommt bei jedem "Call"-Argument dann dazu, das frißt FRAMESIZE + Programmspeicher + Code
(bei einem String ist das ganzschön)