PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Bascom Lib und Assembler



albundy
18.09.2005, 19:23
Hallo,
ich bin dabei eine Lib für Bascom zu schreiben. Dabei habe ich sicher ein Problem mit dem Pointer ?!

Das Bascom Programm

$regfile = "m8535.dat"
$crystal = 8000000
$lib "Test.lib"
$external Grtxt

Config Porta = Output
Porta = $ff

Declare Sub Grtxt

Call Grtxt

Do
Loop

Und die Test.Lib dazu

[grtxt]
Grtxt:
ldi zh,High(Daten)
ldi zl,Low(Daten)
ld r22,z
* out Porta,r22
ret
;
Daten:
.db &H14,&H7F,&H14,&H7F,&H14,&H00
[end]


Alles noch sehr übersichtlich und trotzdem irgendwo fehlerhaft ?
R22 bzw. der Porta zeigen $17 anstatt $14 ?
Wenn ich in der Lib "ld r22,z+1" schreibe, ist R22 / Porta = 0 ?
Kann mir das jemand erklären ?

Wie ist das eigendlich mit Push und Pop ? Muß ich vor dem Aufruf der Lib, irgendwelche Register sichern ?

pebisoft
18.09.2005, 22:49
weist du, wenn so umständlich die lib geschrieben wird ist es doch besser du machst asm in einer sub oder funktion. diese lib in bascom dauern in der ausführung immer länger als wenn man den code in asm einbinden tut.
diese lib sind der grösste unfug in bascom seit menschgedenken. ich hatte damals die lib die ich brauchte direkt in asm-routinen in einer sub oder funktion eingepackt. war übersichtlich und erfolgreich.
mfg pebisoft
ps: schau dir von bascom mal eine grössere lib an, dann kriegst du das schaudern und denkst, was wollen die eigentlich da machen.

albundy
19.09.2005, 14:34
Hallo,


weist du, wenn so umständlich die lib geschrieben wird ist es doch besser du machst asm in einer sub oder funktion. diese lib in bascom dauern in der ausführung immer länger als wenn man den code in asm einbinden tut.


das war eigendlich nicht meine Frage. :-k
Wenn es eine andere Möglichkeit gäbe, um mehrere Subroutinen mit Parameterübergabe extern auszulagern, würde ich mich auch nicht mit einer Library rumquälen.

Ich habe inzwischen herausgefunden, dass die Datenbytes in meiner Lib gar nicht mit Assembliert werden ?

PicNick
19.09.2005, 14:48
Bei Push/Pop kann ich dir helfen: Für BasCom solltest du YH,YL, R4, R5 und R6 sichern. Aber nur dann, wenn du sie auch veränderst.
Das andere müßt ich mir erst anschauen/nachlesen.

Kjion
19.09.2005, 15:03
Moin,

probier mal:

[grtxt]
Grtxt:
ldi zh,High(2*Daten)
ldi zl,Low(2*Daten)
lpm r22,z
* out Porta,r22
ret
;
Daten:
.db &H14,&H7F,&H14,&H7F,&H14,&H00
[end]

In Assembler muss man so immer zwischen Word und Byteadressen umrechnen. Kann gut sein, dass es in Bascom genauso ist.

Außerdem sollte es doch ein "lpm" anstatt des "lp" sein, oder ?? Immerhin liest du die Daten aus dem Flashspeicher und nicht aus dem RAM.

MfG Kjion

albundy
19.09.2005, 17:10
Hallo Kjion,


In Assembler muss man so immer zwischen Word und Byteadressen umrechnen. Kann gut sein, dass es in Bascom genauso ist.


du hast natürlich Recht, das habe ich jetzt geändert.


Außerdem sollte es doch ein "lpm" anstatt des "lp" sein, oder ??

ich lese jetzt mit LPM. Aber das gelesene Byte steht doch dann automatisch in R0 ?!
Also habe ich auch das geändert auf "out Porta , R0".
Leider funktioniert es trotzdem nicht. Das gelesene Byte ist "0" ???

pebisoft
19.09.2005, 17:17
es gibt eine viel einfachere lösung um solche dateien fexibel auszulagern und einzubinden du schlaumeier. na denn mach mal weiter...
mfg pebisoft

Kjion
19.09.2005, 17:50
ich lese jetzt mit LPM. Aber das gelesene Byte steht doch dann automatisch in R0 ?!

Nein.

lpm r16, Z
Würde den den Inhalt der Speicherzelle auf die der Z Pointer zeigt ins Register r16 laden.

MfG Kjion

albundy
19.09.2005, 18:01
Hallo,

es gibt eine viel einfachere lösung um solche dateien fexibel auszulagern und einzubinden du schlaumeier. na denn mach mal weiter...
mfg pebisoft

das ist deine Meinung !
Ich erinnere mich noch an das Thema Videoausgabe ...
Ich habe es damals in den Griff bekommen und du ?
Und wenn man nicht weiterkommt, wechselt man einfach die Programmiersprache, oder ?

Ich jedenfalls werde auch die Library mit Assembler in den Griff bekommen !!!

PS: Das nächste Mal bitte "Sie Schlaumeier", soviel Zeit muß sein :^o

albundy
19.09.2005, 18:14
Hallo Kjion,


lpm r16, Z

Auch das habe ich gerade ausprobiert. Das Ergebnis ist ebenfalls "0".
Kann es sein, das die Daten nicht automatisch eingebunden werden, sondern erst irgendwie initialisiert werden müssen ?
Im Assemblerlisting (AVR Studio) wird der Platz für die Daten zwar freigehalten, es sind aber alle "0" ?

PicNick
19.09.2005, 19:19
Im Assemblerlisting (AVR Studio) wird der Platz für die Daten zwar freigehalten, es sind aber alle "0" ?


Die Befehlsfolge muß definitiv richtig sein, so steht's auch im Help:
LDI ZL, Low(lbl * 2)
LDI ZH , High(lbl * 2)
LPM ; get data into R0

Lbl:

Jetzt geht's noch darum, daß er die Daten auch anlegt. Ich schau noch, ob ich was find'.

albundy
19.09.2005, 19:28
Hallo Robert,


Jetzt geht's noch darum, daß er die Daten auch anlegt. Ich schau noch, ob ich was find'.

Das ist genau das Problem. Leider habe ich noch nichts entscheidendes in der Hilfe von Bascom gefunden.

PicNick
19.09.2005, 19:32
Blöder geht's nicht: Versuch mal, statt ".DB" --> "Data" zu schreiben.

albundy
19.09.2005, 20:21
Blöder geht's nicht: Versuch mal, statt ".DB" --> "Data" zu schreiben.

hast du das ausprobiert, oder nur geraten ?

beim Kompilieren der Lib kommt "Error found"
in der Err steht dann "Unknow ASM mnemonik [Data 0x14,0x7F ...

PicNick
19.09.2005, 20:37
Gemischt Sache, beim inline-Assembler $ASM--->$END ASM kennt er das .DB dafür nicht, dafür akzeptiert er das "data"
*murmelmurmel*
woher weißt du, daß er wirklich Platz für DB reserviert ? Kommt hinten noch was nach ?
Will nix behaupten, könnt' auch ein Bug sein, daß er Platz freimacht, aber nix reinschreibt.
Mach vielleicht wieder ".DB" rein und übersetz den ganzen Kram und poste dann das Hex-File, ich möcht das mal genau sehen.

albundy
19.09.2005, 22:31
Hallo Robert,
hier das Hex (als Txt) mit 60 eingebundenen Datenbytes.

PicNick
20.09.2005, 08:49
Schau, schau. Der Kerl reserviert (hinten) die 60 Bytes, schreibt aber keinen Pieps rein. (anbei der Assembler dazu).
d.h. er erkennt ".DB" eigentlich richtig als das, was es sein soll, vergißt aber auf den Inhalt. Oder es ist ein "hidden feature" bzw "non-documented restriction", wie man so sagt.

Das müßte man reklamieren, allerdings dürfte das die 1.11.7.4 BasCom Version gewesen sein, da werden die keine Support bieten.
Poste vielleicht prog.bas und prog.lib (im aktuellen Status), dann kann ich es mit der neueren Version probieren, mal sehen.

pebisoft
20.09.2005, 10:46
"Und wenn man nicht weiterkommt, wechselt man einfach die Programmiersprache, oder ? "

erst nach dem kauf von bascom merkt man, das man hinters licht gführt wurde und falsche versprechungen in der beschreibung gemacht werden.
aber es gibt immer wieder unseriöse artikelangebote die im angebot verschönt werden. dahe habe ich bascom wieder verkauft. man muss auch im roboterprojekt weiterkommen und sich nicht mit einer unvollkommenden sprache herumschlagen, dafür ist das geld zu viel.
man muss den mut haben konsequenzen zu ziehen und nicht feige sein. das machen ausser mir sehr wenige im forum und auch zu fehlern stehen bzw einzugestehen. dei anbieter von schlechten artikeln müssen das zu spüren bekommen.
mfg pebisoft

albundy
20.09.2005, 11:18
Hallo Robert,

danke für deine Unterstützung, ich habe das Problem heute gefunden.
Der Compiler für die Lib, ignoriert einfach die sonst für Assembler übliche Schreibweise ".db 0x14, 0x7E ...".
Wenn man stattdessen ".db $14, $7E ..." schreibt wird alles wie gewünscht umgesetzt. O:)
Ich habe das mit Version 1.11.7.4 und 1.11.7.9 getestet.
Leider kommt dabei keinerlei Fehlermeldung, was die Suche nicht gerade vereinfacht hat.

PicNick
20.09.2005, 11:22
@Pebi, du gehst mir absolut auf den Geist. Deine Rum-Motzerei ist absolut überflüssig und interessiert hier niemanden. Wolltest du nicht spazierengehen, massig Kohle verprassen und deine Frührente geniessen ? Warum tust du das nicht ? In Timbuktu ist eh grad' Frühling !

@Frank: Ich bitte um Verwarnung.

*räusper*
@Albundy:
Seltsames Phänomen: Ich konnte erst den ganzen Library-Zinnober garnicht nachvollziehen, weil er sich geweigert hat "GRTXT" als Label zu finden. Zusammengefaßt: rumgewurstelt--> Namen geändert, sieh da: es geht.
Und, vielleicht liegt's an der Version, das kannst du ja dann vergleichen, er hat auch die "DB" richtig befüllt.
Anbei .bas, .lib und .asm



$regfile = "m8535.dat"
$crystal = 8000000
$lib "Test.lib"

$external Bauch
Declare Sub Bauch


Config Porta = Output
Porta = $ff

Call Bauch

Do
Loop

End




[bauch]
bauch:
ldi zh,High(Da_ * 2)
ldi zl,Low(Da_ * 2)
ld r22,z
*out Porta,r22
ret
Da_:
.db &H14,&H7F,&H14,&H7F,&H14,&H00
[end]




.NOLIST
.INCLUDE "M8535DEF.INC"
.LIST
INIT:
RJMP L_0x002A
INT0ADDR_:
RETI
INT1ADDR_:
RETI
OC2ADDR_:
RETI
OVF2ADDR_:
RETI
ICP1ADDR_:
RETI
OC1AADDR_:
RETI
OC1BADDR_:
RETI
OVF1ADDR_:
RETI
OVF0ADDR_:
RETI
SPIADDR_:
RETI
URXCADDR_:
RETI
UDREADDR_:
RETI
UTXCADDR_:
RETI
ADCCADDR_:
RETI
ERDYADDR_:
RETI
ACIADDR_:
RETI
TWIADDR_:
RETI
INT2ADDR_:
RETI
OC0ADDR_:
RETI
SPMRADDR_:
RETI
L_0x002A:
LDI r24,0x5F
OUT SPL,r24
LDI YL,0x40
LDI ZL,0x30
MOV r4,ZL
LDI r24,0x02
OUT SPH,r24
LDI YH,0x02
LDI ZH,0x02
MOV r5,ZH
LDI ZL,0xFE
LDI ZH,0x01
LDI XL,0x60
LDI XH,0x00
CLR r24
L_0x0048:
ST X+,r24
SBIW ZL,0x0001
BRNE L_0x0048
CLR r6
LDI r24,0xFF
OUT DDRA,r24
LDI r24,0xFF
OUT PORTA,r24
RCALL L_0x0072
L_0x005A:
RJMP L_0x005A
.DB 0xF8, 0x94 ;..
L_0x005E:
RJMP L_0x005E
L_0x0060:
SBIW ZL,0x0001
BRNE L_0x0060
RET
.DB 0x68, 0x94, 0x62, 0xF8, 0x08, 0x95, 0xE8, 0x94 ;h.b.....
.DB 0x62, 0xF8, 0x08, 0x95 ;b...
L_0x0072:
LDI ZH,0x00
LDI ZL,0x7C
LDD r22,Z + 0
OUT PORTA,r22
RET
.DB 0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00 ;....


Zwecks Erklärung bitte den Wahrsager deiner Wahl zu bemühen

PicNick
20.09.2005, 11:43
Schreibweise ".db 0x14, 0x7E ...".....
stattdessen ".db $14, $7E ..." schreibt ...

In deinem Beispiel war das doch garnicht so ?

Na egal, wenn's jetzt geht, geht's

Frank
20.09.2005, 12:32
@Pebi, du gehst mir absolut auf den Geist. Deine Rum-Motzerei ist absolut überflüssig und interessiert hier niemanden. Wolltest du nicht spazierengehen, massig Kohle verprassen und deine Frührente geniessen ? Warum tust du das nicht ? In Timbuktu ist eh grad' Frühling !

@Frank: Ich bitte um Verwarnung.



Tja das "0x" ist ja auch mehr C-Compiler Schreibweise.
Pepi hatte ich kürzlich schon per PM informiert das bald 2. Warnung ansteht wenn er so weiter macht. Ist bald fällig wenn sich nix ändert.

albundy
20.09.2005, 17:16
Schreibweise ".db 0x14, 0x7E ...".....
stattdessen ".db $14, $7E ..." schreibt ...


In deinem Beispiel war das doch garnicht so ?


Mmmm... :-s
Das stimmt allerdings, bei meinen vielen Versuchen habe ich mehrere Varianten ausprobiert.
Zuletzt eben ".db 0x14, 0x7E...".
Das hab ich aus einem anderen ASM Listing mit Copy und Paste übernommen.

PicNick
20.09.2005, 17:24
Na egal, wenn's jetzt geht, geht's

hauptsache, es funzt

pebisoft
23.09.2005, 08:40
"@Pebi, du gehst mir absolut auf den Geist. Deine Rum-Motzerei ist absolut überflüssig und interessiert hier niemanden..."

geht nocht nicht, mache gerade wieder mit den palm 100m versuche auf dem küchenbrettroboter. geile sache , funktioniert hervorragend, kann ich nur empfehlen. dann braucht man sich nicht mit den lcd rumärgern das es so wenig zeilen hat usw..
auflösung des palm m100 hat 160x160pixel. sogar das gameboycambild
kann man darstellen auf den palm m100 und auch die hindernisse auswerten. also ein selbstständiges system auf dem robby. habe dann weitere 2x palm m100 im zimmer verteilt, wo der robby dann seine daten abladen tut über die eingebaute irda und diese funken mir dann die daten zum arbeitstisch. pro fahrt kann ich auch ca 110 gameboycambilder speichern. ein schöner bastelspass für den herbst.
mfg pebisoft

PicNick
23.09.2005, 09:22
@Pebi:Weiß nicht ob klar ist, daß das zwei Paar Schuh sind.
Wenn du über deine Erfahrungen mit Palmtop <> Robby berichtest, ist das erstens ok und zweitens auch der Sinn eines solchen Forums. Da wird wohl keiner was sagen
"Rum-motzen" ist deine Anti-BasCom-Kampagne. Einmal schimpfen ist auch gut, aber du hast das Ganze bei 99 Gelegenheiten passend und unpassend zum Thema wiederholt, und das nervt.
Also sei friedlich, und kein Mensch wird dich anfliegen