PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Assemblerprogramm zu groß



andyoo1
14.02.2004, 15:18
HI welche möglichkeiten habe ich ???

PORT .EQU $02 ;PortC
DIR .EQU $06 ;PortCdir
SDA .EQU 0 ;Port 9
SCL .EQU 1 ;Port 10
SDA1 .EQU 0 ;Port 1
SCL1 .EQU 1 ;Port 2

Start_9u10 BSET SDA,DIR ; SDA hi ausgeben
BSET SDA,PORT ; Vorbereiten der Startbed.
BSET SCL,PORT ; SCL hi falls lo
BCLR SDA,PORT ; SDA lo -> STARTBEDINGUNG
BCLR SCL,PORT ;
RTS

Start_1u2 BSET SDA1,DIR ; SDA hi ausgeben
BSET SDA1,PORT ; Vorbereiten der Startbed.
BSET SCL1,PORT ; SCL hi falls lo
BCLR SDA1,PORT ; SDA lo -> STARTBEDINGUNG
BCLR SCL1,PORT ;
RTS

Kann man das zusammenfassen ????

jörg
14.02.2004, 19:32
Kommt drauf an, was Du brauchst, aber nachdem ich mich auch grad mit dem Assembler beschäftige:
1. Routinen zusammenfassen: alle bits gleichzeitig mit OR setzen und mit AND rücksetzen
2. Vielleicht die BSET's auf das DDR in CBASIC erzwingen
3. Vieleicht die Routinen komplett in CBASIC nach $H91 übertragen und da ausführen (SYS &H91, ...)

andyoo1
15.02.2004, 11:18
Danke für deine Antwort

aber das ist nicht möglich.

Habe 6 PCF 8574 an Port 1 und 2.....diese muß ich lesen und schreiben....und 6 PCF 8574 an Port 9 und 10.
So das ich im Assembler alles 2x habe, da ja 4 Ports angesprochen werden.
Gibt es eine möglichkeit das man im Assembler die Abfrage nur 1x hat, und den Port nur ändert. Einmal Port 1 und aus Port1 dann Port 9 ????
Das geht sicher nicht...........ODER ??????

jörg
15.02.2004, 13:06
Aha.

Aber ich verstehe dann den Source nicht:
"BSET SDA,DIR" (etc) ist doch identisch
"BSET SDA1,DIR" (etc), oder nicht?
(SDA ist ja identisch SDA1 = 0 = SDA)

Müsste das also nicht heissen
"BSET SDA,DIR" (etc) und
"BSET SDA1,DIR1" (etc) ?
Und dieses DIR1 / PORT1 könntest Du ja dann per Param übergeben.

Falls doch nicht:
Den Bit-Wert vom BSET kann man m.E. nur per OpCode-Modifikation "parametrieren".
Oder halt den BSET / BCLR ersetzen durch OR / AND:
LDA Port
ORA param
STA Port

PS: (siehe Thread "255 Byte Assemblerprogramm zu lang?")
Mein Problem ist: Ich kann kein Assembler-Programm laden, das genau 255 Bytes lang ist; 254 Bytes gehen.
Kann Du 255 Bytes laden, oder ist das Limit tatsächlich 254 Bytes?

andyoo1
16.02.2004, 10:52
255 Byte Assemblerprogramm zu lang?

Ich kann auch kein Assembler-Programm laden, das genau 255 Byte
lang ist. Bei 254 Bytes ist schluß.

Bin am Ende .......komme einfach nicht weiter.
254 reicht nicht aus.

Das SDA steht doch für Port 9 und SCL für Port 10.
Habe ich nun Port 1 und 2 auch noch, so ist doch SDA1 und SCL1 notwendig.
SDA1 für Port 1 und SCL1 für Port 2. ODER ?????

krischan100
16.02.2004, 12:32
Dann nimm einen Controller der mehr kann. Sorry, aber 255 Byte für ein Assembler ist ja wohl lachhaft.

andyoo1
16.02.2004, 13:40
Das ist gut gesagt :::::

Aber für C-control konnte ich noch keinen andern finden, der in frage kommt.

Judgeman
16.02.2004, 13:52
Ich habe irgendwo im Forum mal eine Bemerkung gelesen, dass man einen größeren Speicher einbauen kann. Ihr müsst halt mal die ganzen Foren (C-Control und Robby) durchsuchen.

jörg
16.02.2004, 14:19
Hallo krischan100:
Klar: 255 Bytes sind xxx, aber eigentlich sollte man für die CC1 nix in Assembler programmieren (müssen), sondern in CBASIC; sonst sollte man wirklich einen andern Prozessor nehmen.

Hallo Judgeman:
Speichererweiterung geht (eigentlich) nicht für Assembler-Programme, sondern nur für Basic-Programme. Aber mit "Tricks" geht natürlich alles.

Hallo andyoo1:
Dass bei Dir auch nur 254 Bytes gehen, und 255 Bytes nicht, hilft mir zwar bisschen weiter (zum Verständnis), aber Dir nützt das natürlich nichts.
Ich tu mir aber schwer, das "Code verkürzen" so per Frage / Antwort zu verstehen, und es dauert auch. Nachdem ich mich eh grad mit I2C rumgeschlagen habe (zur LCD Ansteuerung): Stell doch Deinen Source mal hier rein - vielleicht fällt mir (oder jemand anderem) was dazu ein!

andyoo1
16.02.2004, 17:56
Das Assemblerprogramm ist zum lesen und schreiben von 6 PCF 8574.
An Port 1 und Port 2


PORT .EQU $02 ;PortC
DIR .EQU $06 ;PortCdir
SDA .EQU 0 ;Port 1
SCL .EQU 1 ;Port 2
SDA1 .EQU 0 ;Port 9
SCL1 .EQU 1 ;Port 10

.org $101
jsr start_1u2
lda $0A1 ;Adresse lesen
jsr schreiben_1u2
lda $0A2 ;Daten lesen
jsr schreiben_1u2
jsr I2C_Stop
jsr I2C_Ack
rts

.org $102
jsr start_9u10
lda $0A1 ;Adresse lesen
jsr schreiben_9u10
lda $0A2 ;Daten lesen
jsr schreiben_9u10
jsr I2C_Stop
jsr I2C_Ack
rts


start_1u2 BSET SDA,DIR ; SDA hi ausgeben
BSET SDA,PORT ; Vorbereiten der Startbed.
BSET SCL,PORT ; SCL hi falls lo
BCLR SDA,PORT ; SDA lo -> STARTBEDINGUNG
BCLR SCL,PORT ;
RTS
start_9u10 BSET SDA1,DIR ; SDA hi ausgeben
BSET SDA1,PORT ; Vorbereiten der Startbed.
BSET SCL1,PORT ; SCL hi falls lo
BCLR SDA1,PORT ; SDA lo -> STARTBEDINGUNG
BCLR SCL1,PORT ;
RTS


schreiben_1u2 BSET SDA,DIR ; SDA out
LDX #8 ; init loop
Nextbit ROLA
BCC Lobit ;
BSET SDA,PORT ; hi bit
BRA Clock
Lobit BCLR SDA,PORT ; lo bit
Clock BSET SCL,PORT ; scl hi
BCLR SCL,PORT ; scl lo
DEX
BNE Nextbit ; loop
BCLR SDA,DIR ; sda als Eingang
BSET SCL,PORT ; scl hi
BCLR SCL,PORT
RTS

schreiben_9u10 BSET SDA1,DIR ; SDA out
LDX #8 ; init loop
Nextbit1 ROLA
BCC Lobit1 ;
BSET SDA1,PORT ; hi bit
BRA Clock1
Lobit1 BCLR SDA1,PORT ; lo bit
Clock1 BSET SCL1,PORT ; scl hi
BCLR SCL1,PORT ; scl lo
DEX
BNE Nextbit1 ; loop
BCLR SDA1,DIR ; sda als Eingang
BSET SCL1,PORT ; scl hi
BCLR SCL1,PORT
RTS


'''''Mit lesen auch SDA,SCL einmal und mit SDA1,SCL1 einmal'''''' usw.

I2C_Read BCLR SDA,DIR ; sda als Eingang
CLRA
LDX PORT
RORX
ROLA
BSET SCL,PORT ; scl hi
BCLR SCL,PORT
LDX PORT
RORX
ROLA
BSET SCL,PORT ; scl hi
BCLR SCL,PORT
LDX PORT
RORX
ROLA
BSET SCL,PORT ; scl hi
BCLR SCL,PORT
LDX PORT
RORX
ROLA
BSET SCL,PORT ; scl hi
BCLR SCL,PORT
LDX PORT
RORX
ROLA
BSET SCL,PORT ; scl hi
BCLR SCL,PORT
LDX PORT
RORX
ROLA
BSET SCL,PORT ; scl hi
BCLR SCL,PORT
LDX PORT
RORX
ROLA
BSET SCL,PORT ; scl hi
BCLR SCL,PORT
LDX PORT
RORX
ROLA
BSET SCL,PORT ; scl hi
BCLR SCL,PORT
RTS

I2C_Ack
BSET SDA,DIR
BCLR SDA,PORT ; ACK
BSET SCL,PORT ; scl hi
BCLR SCL,PORT ; scl lo
RTS

I2C_NoAck
BSET SDA,DIR
BSET SDA,PORT ; NoACK
BSET SCL,PORT ; scl hi
BCLR SCL,PORT ; scl lo
RTS


I2C_Stop BSET SDA,DIR ; SDA out
BCLR SDA,PORT ; low
BSET SCL,PORT ; scl high
BSET SDA,PORT ; STOPBEDINGUNG
RTS

.end

diese PCF brauch ich zum Steuern meiner Rollos.
Nur brauch ich aber noch 6 PCF 8574 zum abfragen meiner Schalter.
Diese sind am Port 9 und Port 10.
Im Basic ist das ja auch alles möglich, aber das ist einfach zu langsam.
Ich muß Port 9 und 10 auch wie Port 1 und 2 ansprechen.
Aus diesem Grund ist halt alles 2x( Start,Stop,lesen,schreiben usw)
mit SCL1 und SDA1......und das ist halt zu lang.
Wenn man am Anfang aus SDA und SCL beim 2x mal SDA1 und SCL1 machen kann,dann ist alles 1x und nicht 2x vorhanden. Dann ist das
Assembler auch nicht so groß.

Judgeman
16.02.2004, 18:55
Es gibt doch auch noch die PCF8574A. Die haben nur eine andere Basisadresse, somit könntest du 16 PCF8574 an einem Bus betreiben.

Kann das dein Problem lösen?

jörg
16.02.2004, 19:19
Hallo Judgeman:
... doch das gute liegt so nah: Klar, das isses!
Ich hatte mir grad überlegt, was man alles umbauen müsste; angefangen vom PORT (ich denke, das muss PORT und PORT1 heissen)...

jörg
16.02.2004, 19:21
PS: Vielleicht kannst Du auch noch dabei helfen:

Ist das Limit für Assembler-Programme 255 Bytes, oder 254 Bytes?

andyoo1
16.02.2004, 19:45
Danke für Antwort....

An den PC F8574 A hatte ich auch schon gedacht...
Das ist ja nicht schlecht, habe aber leider schon Layout und Platte
fertig.
Dachte ja auch das Basic schneller ist.
Gibt es denn keine möglichkeit einen neuen Speicher einzusetzen, oder einen zweiten über I2C Bus anzusteuern.

jörg
16.02.2004, 19:52
Du brauchst an Layout / Platine nix ändern, nur die PCF austauschen.
Im Assembler: die duplizierten Routinen löschen.
Im Basic: für die PCF-A nur andere Basis-Adresse angeben.
Das muss auf Anhieb gehen (wenn's vorher mit der Hälfte der Bausteine schon ging).
Und die PCF's kriegst Du bei cctools auch ziemlich schnell.

andyoo1
16.02.2004, 20:14
Bin schon dabei, habe noch PCF 8574 AP


werde es heute Abend noch testen.

Judgeman
16.02.2004, 20:41
Sorry, keine Ahnung von C-Control. Habe mich nur durch meine Diplomarbeit mit dem I2C-Bus vertraut gemacht. Kann also über Speichergrößen nicht viel mitreden.