PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Adresse von Basic aus weitergeben ???



andyoo1
28.02.2004, 12:10
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

Frank
28.02.2004, 12:26
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

jörg
28.02.2004, 12:42
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).

28.02.2004, 14:23
Die erste Methode ist immer dann sinnvoll, wenn auch von Assembler an Basic übergeben werden müssen.

28.02.2004, 14:29
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.

jörg
28.02.2004, 14:30
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

jörg
28.02.2004, 14:44
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

andyoo1
28.02.2004, 15:04
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.

jörg
28.02.2004, 15:16
Hast Du das Basic DEFINE für "ausgabe" schon angepasst?

andyoo1
28.02.2004, 15:25
Ja hab ich

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

andyoo1
28.02.2004, 15:29
Meine Ausgabe ist immer 0

Bei 0 müssen aber alle Relais an sein. Also stimmt Ausgabe nicht .

Frank
28.02.2004, 15:35
Hallo
Ja, der erste PCF 8574 AP hat Hex 70
Wie gesagt, ich würde einfach Basic Variablen nehmen wie anfangs beschrieben. Ist viel übersichtlicher. Definiere einfach ganz am Anfang in Basic die Variablen die du für Basic und Assembler brauchst - das war´s!

Gruß Frank

jörg
28.02.2004, 15:36
Ja, die A - Version des PCF8574 hat Basis-Adresse &H70, wenn seine drei Adresspins auf Gnd liegen.

Wenn Du vom PCF lesen willst, MUSST Du VORHER &HFF auf den PCF schreiben -- nur dann werden die Signale, die an den PCF Ports anliegen, auch gelesen.