-
        
+ Antworten
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: Adresse von Basic aus weitergeben ???

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    23.02.2004
    Beiträge
    9

    Adresse von Basic aus weitergeben ???

    Hi leute

    Möchte Adresse von PCF 8574 AP aus Basic weitergeben in Assembler.
    Wie kann ich mir sicher sein, das diese Adresse unter $96 im Assembler
    auftaucht.

    Danke

  2. #2
    Administrator Robotik Einstein Avatar von Frank
    Registriert seit
    30.10.2003
    Beiträge
    4.943
    Blog-Einträge
    1
    Du kannst in Assembler auf alle Basic Variablen zugreifen. Du mußt nur daran denken das die Basic Variablen immer bei $0A1 anfangen. Es ist also wichtig in welcher Reihenfolge du welche Variablentypen in Basic definierst.

    Zum Beispiel hab ich als erstes imme rfolgendes in Basic definiert:

    define Adresse byte 'Bytevar $0A1 für I2C Bus
    define Daten byte 'Bytevar $0A2 für I2C Bus

    Dann konnte ich auch in Assembler über $a1 auf Adresse und $a2 auf Daten zugreifen. Genauso geht es mit nachfolgenden Variablen. Du mußt nur bedenken das Variablen vom Typ Word beispielsweise 2 Bytes benötigen. Also aufpassen beim weiterzählen. Am besten wie ich immer die Adresse dahinterschreiben

    Übrigens beim AVR-Basic (Bascom-Compiler) ist das alles etwas einfacher, zudem braucht man da Assembler kaum. Also wenn man beginnt viel in Assembler zu machen und an die Grenzen von 250 Byte kommt, dann ist das ne tolle Alternative.


    Gruß Frank

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    07.01.2004
    Ort
    München
    Alter
    66
    Beiträge
    214
    CCBASIC pusht die Parameter des SYS Aufrufs als WORDs auf den Stack; der Stack begint ab $91(HI)/$92(LO); durch den PUSH wrden die WORDs "von hinten nach vorne" gepusht.
    Also:

    SYS ADDR DREI, ZWEI, EINS

    pusht die drei WORDs
    "EINS" nach 91/92,
    "ZWEI" nach 93/94
    "DREI" nach 95/96
    und startet das Assembler-Prog auf ADDR.

    Wenn in DREI die PCF-Adresse steht (z. B. DREI = &H70),
    dann steht in $96 der LO-Teil davon ($70), und in $95 der HI-Teil (0).

  4. #4
    Gast
    Die erste Methode ist immer dann sinnvoll, wenn auch von Assembler an Basic übergeben werden müssen.

  5. #5
    Gast
    Hi....Danke für Antwort.

    Ich komme aber nicht weiter......es geht einfach nicht.
    Ihr mal kurz das Basic.

    define adresse byte
    define wert byte
    define richtung byte
    define ausgabe byte
    define nummer byte

    nummer = 0
    #loop
    adresse = &H70 ;PCF 8574 AP
    richtung = &H00000001
    wert = nummer
    sys &H0101 adresse,wert,richtung
    Pause 50
    nummer = nummer + 1
    print ausgabe
    print nummer
    goto loop
    syscode "I2CASM.S19"

    im Assembler sieht das so aus:

    cport equ $02 ;Digitalport 9-16
    cpdir equ $06 ;Richtung Port c
    daten equ 0 ;Port(9)
    clock equ 1 ;Port(10)
    richtung equ $92 ;Schreiben(1),Lesen(0)
    i2cwert equ $94 ;Stackwert(Uebergabe
    adresse equ $96 ;aus Basic
    ausgabe equ $A1 ;Basic Useradresse
    merker equ $91 ;RAM - Variable
    wert equ $93 ;RAM - Variable

    Es ist bestimmt nur eine sache der Variablen.
    Denn der Assembler läft, sehe ich an den Pausenzeiten.
    Es muß ja nur ein Zeichen kommen, dann weiß ich auch wo ich ansetzen muß.
    Aber es geht ja gernicht.

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    07.01.2004
    Ort
    München
    Alter
    66
    Beiträge
    214
    Wenn nur ein einziges WORD von Assembler an Basic übergeben werden muss ("return value"), dann geht auch die zweite Methode:
    Man schreibt das Ergebnis-WORD im Assembler nach $91/$92, und kann es dann nach dem SYS Aufruf in Basic lesen:

    result = assembler

    mit

    #assembler
    SYS ADDR...
    RETURN

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    07.01.2004
    Ort
    München
    Alter
    66
    Beiträge
    214
    Ich hab Dein Basic / Assembler - Programm so verstanden:

    In Assembler schreibst Du ein Ergebnis nach "ausgabe"; das ist $A1.

    In Basic printest Du "ausgabe".
    Das liegt aber nach Deinen DEFINEs (wegen automatischer Vergabe der Adressen durch den Compiler) nicht auf $A1, sondern auf $A4; auf $A1 liegt "adresse".

    Also z. B.
    In Basic als erstes DEFINE die "ausgabe" hinschreiben

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    23.02.2004
    Beiträge
    9
    Ich möchte im Basic die Adresse für den Pcf angeben und dies in Assembler übernehmen.
    Danach muß ich im Basic angeben, ob er schreiben oder lesen soll.
    Das erfolgt duch die Angabe der Richtung. (&H00000001)
    Nun muß der Wert übergeben werden, den er dann im Assembler schreiben soll.
    Habe auch eine Relaiskarte angeschlossen um den Erfolg zu sehen.
    Der wert soll bei 0 beginnen und um +1 add. werden.
    Nach jedem schreiben müsste ein Relais schalten.
    Es stimmt entweder die adresse für PCF nicht oder der wert wirt nicht übergeben.

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    07.01.2004
    Ort
    München
    Alter
    66
    Beiträge
    214
    Hast Du das Basic DEFINE für "ausgabe" schon angepasst?

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    23.02.2004
    Beiträge
    9
    Ja hab ich

    Hat den der PCF 8574 AP denn überhaupt die Adresse &H70 ??
    ist &h70 = &H01110000 ?

+ Antworten
Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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