This is not a register problem. I get this problem, if the name of the variable in the brackets {} is wrong.
In your case, do you dimmed a variable with name valaue as shown in the error message, or is there a typing error of valaue instead of value
Druckbare Version
This is not a register problem. I get this problem, if the name of the variable in the brackets {} is wrong.
In your case, do you dimmed a variable with name valaue as shown in the error message, or is there a typing error of valaue instead of value
HI!
Hm. The variable I use is a byval-Variable of a function.
It is just like that:
The error message (spelling-corrected... :D ):Code:Function Laybus(byval Value As Byte)
'Variable In Register Kopieren:
$asm
lds R32, {Value}
CBI PORTC, 3
SBRC R1, 0
SBI PORTC, 3
$end Asm
End Function
Error: 5 Line: 884 No more space for BIT [VALUE] , in File.....
Isn't ist possible, that there is no farther space?
VLG Tobi
Hi,
there is no register r32 (r0 to r31).
You can not use the syntax
lds r31, {value}
for a function/sub parameter or local variable. The address of a parameter or local variable is not known at compile time, so no SRAM address can be generated for {value}. Only the addresses of global variables are known at compile time and can be used with this syntax.
You can work with following way:
loadadr value, X
ld r24, X
loadadr can get the address of parameter/locals from the soft-stack, where the addresses of parameters and local variables are stored at runtime
AH!
Yes thanks! Now it works!
Thank you!
best regards,
Tobi
Hi!
I have one more question about that...
How can I load a register (R16) to my Value-Variable?
ld X, r16??
I don't think...
VLG Tobi
Hallo Tobi,
ich habe gerade eben gemerkt, dass ich da in einem Post auf Englisch geantwortet habe. Das ist wahrscheinlich passiert, als ich auch gleichzeitig das Forum auf http://www.mcselec.com/forum offen hatte in Kombination mit der englischen Fehlermeldung in Deinem Post. Ich bitte um Vergebung, falls sich da jemand daran gestört hat.
Der Umkehrbefehl ist:
st X, r16
Wenn Du Dich etwas weiter in ASM-Programmierung vertiefen willst, empfehle ich Dir, die ASM-Befehlsbeschreibung von ATMEL http://www.atmel.com/dyn/resources/p...ts/DOC0856.PDF herunterzuladen und Dir mal die möglichen Befehle anzuschauen.
Weiters ist in jedem Datenblatt zu den AVR ziemlich hinten eine Auflistung der Befehle, welche dieser Prozessor beherrscht mit einem Hinweis, was dieser macht. Damit hast schon die Grundlagen für die ASM-Programmierung.
HI!
Ich hab mir schon überlegt, ob ich dich fragen soll, ob es da vllt. Login-Probleme gibt...
ah.. st store.. danke ;D
danke für den Tip, mein ASM reicht gerade mal zum Ports ein und ausschalten... :D
Englisch stört mich generell nie, da muss man mal den Grips anstrengen!
Danke dann nochmal!
VLG Tobi
Hi!
Da das mit dem Schreiben so gut klappt, habe ich das gleich mal auch mit dem Lesen versucht.
Folgender Code...:
Compiler schluckt's, liefert aber nur Datenmüll.Code:Function Readbus() 'Den Wert vom Bus lesen
Dim Value As Byte
Ddrb = &B00000000 'Alles Eingänge
Ddrc = &B11111100 'Umschaltung, dass es keine Crashes gibt.
$asm
in R17, pinc
CBR R16, 0b00000001
SBRC R17, 1
SBR R16, 0b00000001
CBR R16, 0b00000010
SBRC R17,0
SBR R16, 0b00000010
in R17, pinb
CBR R16, 0b00000100
SBRC R17, 5
SBR R16, 0b00000100
CBR R16, 0b00001000
SBRC R17, 4
SBR R16, 0b00001000
CBR R16, 0b00010000
SBRC R17, 3
SBR R16, 0b00010000
CBR R16, 0b00100000
SBRC R17, 2
SBR R16, 0b00100000
CBR R16, 0b01000000
SBRC R17, 1
SBR R16, 0b01000000
CBR R16, 0b10000000
SBRC R17, 0
SBR R16, 0b10000000
Loadadr Value , X
st X, r16
$end Asm
Readbus = Value
End Function
Ich habe ja den verdacht, dass ich vlaue diesmal mit einer lds(nur andersherum) ähnlcihen funktion laden muss, oder?
Nochmal Danke!
VLG Tobi
hallo tobi, warum nimmst du die langsame "funktion".
nimm eine "sub" die ist etwas schneller. nimm ein "goto" und das ist noch schneller. wenn du mit ein varptr die sram-adresse einer variable erfragst, bekommst du die variable am schnellsten über die direkte adressenanfrage.
habe ich mit fastavr-basic herausbekommen, wo ich mir den asm-source-code
angeschaut habe.
mfg pebisoft
Ich nehme mal an, dass diese Funktion irgendwo mit
Declare Function ReadBus () as Byte
deklariert ist.
Warum Du das B-Port mitauf Input stellst, ist nicht ersichtlich. Das C-Port wird mitZitat:
Ddrb = &B00000000
für die Pins 2-7 auf Output und die Pins 0-1 auf Input gestellt.Zitat:
Ddrc = &B11111100
Im nachfolgenden Code scheinst aber alle 8 vom Port C eingelesenen Bits auszuwerten.
Und nun zu Deiner eigentlichen Fragestellung.
Einen Funktionswert kann Du auf folgende Weise:
loadadr readbus, X
st X, r16
zurückgeben. Das obige Beispiel ist für den Fall, dass ReadBus einen Rückgabewert vom Type BYTE hat.
Du kannst den Funktionsnamen wie einen Variablennamen mit loadadr verwenden.
Ich gehe mal davon aus, dass diese Funktion primär einen experimentellen Charakter hat, um diverse Möglichkeiten zu testen. Befasse Dich mal mit dem BASCOM Simulator, damit kannst Du Schritt für Schritt verfolgen, was in den einzelnen Registern und Speicherstellen passiert. Damit kannst Du nach herzenslust experimentieren, weil Du auch während der Simulation die Input-Pins im Pegel verändern kannst.