- LiTime Speicher und Akkus         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Port oder Alias an Funktion als Parameter?

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    31.01.2006
    Beiträge
    23

    Port oder Alias an Funktion als Parameter?

    Anzeige

    Powerstation Test
    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 ^^

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    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.

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    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.

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    31.01.2006
    Beiträge
    23
    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.

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    41
    Beiträge
    2.009
    Könnte man nicht irgendwie einfach die I/O-Adresse des Port-Registers als Parameter übergeben? In C gehts, aber in Bascom?
    #ifndef MfG
    #define MfG

  6. #6
    Erfahrener Benutzer Roboter Genie Avatar von Bammel
    Registriert seit
    11.12.2004
    Ort
    Bremen
    Alter
    36
    Beiträge
    1.400
    ich würd in nen sub machen:

    Code:
    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

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    31.01.2006
    Beiträge
    23
    @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?

  8. #8
    Erfahrener Benutzer Roboter Genie Avatar von Bammel
    Registriert seit
    11.12.2004
    Ort
    Bremen
    Alter
    36
    Beiträge
    1.400
    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!

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    31.01.2006
    Beiträge
    23
    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?
    Code:
    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 :>

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Zitat Zitat von luvat
    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.

    Zitat Zitat von Bammel
    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.


    Zitat Zitat von luvat
    Code:
    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.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiTime Speicher und Akkus