PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Port oder Alias an Funktion als Parameter?



luvat
29.12.2009, 21:09
Hallo zusammen,...

ich zweifle langsam an meinem Verstand. ... Ich teste hier nun schon 3 Stunden rum und habe unzählige Sachen ausprobiert, komme jedoch zu keinem Ergebnis.

Ist es in irgendeiner Art und Weiter möglich einen Port bzw. Pin bzw. Alias an eine Funktion zu übergeben?

Anwendungsbeispiel: Ich habe 3 LEDS an einen mc angeschlossen und möchte eine Funktion bauen, welche dann eine LED anmacht. Angenommen ich habe:

Red Alias Portd.5
Green Alias Portd.6
Blue Alias Portb.1

und möchte nun eine Funktion aufrufen:

call mach_an_dat_ding(Red)

wie kann ich das realisieren?

Ich kann mir wirklich nicht vorstellen, dass es keine Lösung hierfür gibt. ... Wahrscheinlich ist sie so simpel, dass ich sie die ganze zeit übersehen habe ^^

linux_80
29.12.2009, 22:10
Hallo,

ich glaub, Du musst das aufteilen, also Port und PinNr getrennt übergeben.

Oder Du musst es komplett anders aufbauen.
ZB. nur eine LfdNr übergeben, und in der Funktion dann je nach LfdNr in einer If-Abfrage (bzw. Select) die entsprechende LED ansprechen.

stefan_Z
30.12.2009, 04:23
Ports/Hardwareregister als "Variablen" nutzen geht in Bascom öfters mal daneben...
Welche genau gehen und welche nicht müsste man einzeln testen, aber ein paar Kandidaten fallen mir ein:
PortB = PortB * 2 - Würde mich wundern wenn ers macht
OCR1 = OCR1 + Variable - Ging glaubich nicht, man muss in ne Variable buffern
Richtig gut sind auch die µC mit fehlenden Pins an nem Port. Die Tage jemandem geholfen (einfacher Knightrider Effekt über nen Port per ROTATE) und dann am Ende festgestellt, dass beim Tiny2313 Bits die man in PortD.7 schreibt einfach verloren gehen! Und auch die, die reingeschoben werden haben nicht unbedingt die erwarteten Werte (z.B. Bit 7 -> Bit 6).

Übergebe wie oben gesagt Port und Pin getrennt als variablen. Bascom beherrscht auf jeden Fall die Schreibweise:
Variable_Port.X = 1
Also kannste due den Pint/das Bit in ner Variable angeben.

luvat
30.12.2009, 08:15
vielen Dank für die Antworten.


Also müsste die funktion so aussehen?


mach_an_dat_ding(byval port1In as byte, byval pin1In as byte)

port1In.pin1In = 1

end sub


?



Das würde heißen, dass man hier nicht mit den alias namen arbeiten kann ... irgendwie inkonsequent.

Jaecko
30.12.2009, 08:45
Könnte man nicht irgendwie einfach die I/O-Adresse des Port-Registers als Parameter übergeben? In C gehts, aber in Bascom?

Bammel
30.12.2009, 10:16
ich würd in nen sub machen:



Declare Sub Anmachen(byval Color As String * 10 , Byval Status As String * 4)




Call Anmachen("red", "an")




sub anmachen(byval color as string * 10 , byval status as string * 4)

Select Case color

Case "red"

if status = "an" then
portb.1 = 1
else
portb.1 = 0
end if

Case "blue"

if status = "an" then
portb.2 = 1
else
portb.2 = 0
end if

End Select

end sub

könnte kleinere fehler beinhalten habs nur eben "hingewurschtelt"

gruß bammel

luvat
30.12.2009, 10:34
@Bammel

Vielen Dank erstmal.

Jedoch wird die funktion etwas komplizierter ;)
ich müsste dann ellenlange if statements bauen.

Letztendlich soll die funktion das gegeneinander dimmen von 2 leds erledigen.

Was hat es sich mit den *10 und *4 auf sich?

Bammel
30.12.2009, 10:58
hmm.. ne funktion gibt doch eigentlich immer einen wert zurück. ich denke du meinst schon eher eine sub. also ein unterprogramm.

das mit den *10 und *4 bestimtm die stringlänge. *10 sind 9 zeichen in dem string. warum nur 9?! weil da am anfang oder ende (weis nicht mehr so genau) eine 0 alls "trennzeichen" angefügt wird.

aber vllt kann amn dir besser helfen wnen du mal deine vorhaben genau beschreibst!

luvat
30.12.2009, 12:33
jo soll ne sub sein keine funktion. sorry.
Das mit der 0 kann ich dir sogar erklären ;) Das hat damit zu tun, dass ein String nichts anders als ein char array ist. und diese fangen mit 0 an zu zählen.

Also zum topic: ich möchte einen RGB Fader proggen. Dafür brauche ich eine SUB, an welche ich die beiden LEDs bzw. ports übergeben kann, welche gedimmt werden sollen.

wenn ich es so machen kann, dass port und pin jeweils als string übergeben werden kann, müsste die sub folgendermaßen aussehen?!:


Könnte ich dann in der sub als beispiel so die leds schalten?


Sub Dimmen(byval port1in As String, Byval pin1in As String, byval port2in As String, Byval pin2in As String)
For X = 0 To 500
For Y = 1 To 500
If X > Y Then
port1in.pin1in = Onoff1
port2in.pin2in = Onoff2
Else
port1in.pin1in = Not Onoff1
port2in.pin2in = Not Onoff2
End If
Next
Next
port1in.pin1in = Onoff1
port2in.pin2in = Onoff2
Waitms 1000
end sub

Falls ja, wäre das ja die Lösung. ... muss ich dann heute abend ma testen :>

for_ro
30.12.2009, 13:15
Das mit der 0 kann ich dir sogar erklären ;) Das hat damit zu tun, dass ein String nichts anders als ein char array ist. und diese fangen mit 0 an zu zählen.
Klar kann man Strings als Char Array betrachten. Aber: Die Zählweise in Bascom fängt - leider - immer mit 1 an, wenn du eine der String-Funktionen benutzt. Ein Byte-Wert 0 (also nicht der ASCII Wert der Zahl 0) zeigt das Ende des Strings an. Dies ist nötig, da ein String nicht unbedingt die volle reservierte Länge haben muss. Daher kann der Byte Wert 0 auch nicht in einem String enthalten sein.


das mit den *10 und *4 bestimtm die stringlänge. *10 sind 9 zeichen in dem string.
Das stimmt so nicht. Wenn du *10 angibst, hast du 10 Zeichen im String zur Verfügung. Bascom reserviert dann automatisch ein elftes Byte um Platz für das Ende Zeichen zu haben, falls der String 10 Zeichen lang wird.

In der Deklaration und der Definition der Sub gibst man übrigens keine Länge der Strings an. Declare Sub Anmachen(byval Color As String, Byval Status As String) reicht also.





Sub Dimmen(byval port1in As String, Byval pin1in As String, byval port2in As String, Byval pin2in As String)
For X = 0 To 500
For Y = 1 To 500
If X > Y Then
port1in.pin1in = Onoff1
port2in.pin2in = Onoff2
Else
port1in.pin1in = Not Onoff1
port2in.pin2in = Not Onoff2
End If
Next
Next
port1in.pin1in = Onoff1
port2in.pin2in = Onoff2
Waitms 1000
end sub

Falls ja, wäre das ja die Lösung. ... muss ich dann heute abend ma testen :>
Auch das wird so nicht funktionieren, da du weder einen Port noch einen Portpin übergeben kannst. Schon gar nicht als String.

Aber der Vorschlag von Jaecko funktioniert auch in Bascom.
Du kannst die Adresse des Ports übergeben und musst dann in der Sub die Out-Funktion benutzen, um in das Port-register zu schreiben. Allerdings kannst du da nicht so schön ein einzelnes Bit ansprechen, zumindest wüsste ich nicht wie. Und damit wäre der Vorteil wieder hin, weil es dann ziemlich kompliziert wird. Wenn du wirklich nur 2 LEDs schalten willst, ist es mit ein paar IFs oder einem Select bestimmt einfacher.

Bammel
30.12.2009, 18:15
das mit den *10 und *4 bestimtm die stringlänge. *10 sind 9 zeichen in dem string.
Das stimmt so nicht. Wenn du *10 angibst, hast du 10 Zeichen im String zur Verfügung. Bascom reserviert dann automatisch ein elftes Byte um Platz für das Ende Zeichen zu haben, falls der String 10 Zeichen lang wird.

In der Deklaration und der Definition der Sub gibst man übrigens keine Länge der Strings an. Declare Sub Anmachen(byval Color As String, Byval Status As String) reicht also.


dann habe ich das mit den längen vertauscht. hatte die mal mit nen array überlagert daher kam das.

mit der deklaraion is mir auch neu.

man lernt halt nie aus.