Der RJMP ist ein einfacher Sprung, ohne Rückkehr.
RCall ist dagegen der Aufruf eines Unterprogramms, so dass man per RET auch wieder zurückkommt.
Das enspricht ziehmlich 1:1 den Basic Befehlen Goto und Gosub.
Druckbare Version
Der RJMP ist ein einfacher Sprung, ohne Rückkehr.
RCall ist dagegen der Aufruf eines Unterprogramms, so dass man per RET auch wieder zurückkommt.
Das enspricht ziehmlich 1:1 den Basic Befehlen Goto und Gosub.
Hm war mir gar nicht aufgefallen. Natürlich musst Du ein RCALL einsetzen. Da wird ja dann die Adresse auf dem Stack abgelegt, wo nach dem RET wieder zurückgesprungen werden soll. Ein relativer Sprung springt ja nur und merkt sich, lapidar gesagt, nicht, wo er her kommt. Trotz dem meine ich, dass Du in R16 eine 255 schreibst und im nächsten Schritt mit 0 vergleichst. Oder sollte ich mich da irren.
Allerdings finde ich, dass Deine Fragen eher Off Topic sind und in den ASM Bereich sollten. Da kennen sich bestimmt mehr Leute mit aus als hier. Ich selbst progge hauptsächlich in Hochsprachen und nutze nur für Zeitkritisches oder Platzkritisches Inline ASM. Habe also eher wenig Erfahrung und sehe so gut wie jedesmal neu im Datenblatt nach, wie die Befehle zu nutzen sind...
So... jetzt hab ich das nächste Problem, welches diesmal wirklich mit Bascom zu tun hat ;-)
Ich habe die Demoversion (V: 1.11.9.5). Wenn ich folgenden Code compilieren möchte, dann kommt eine Fehlermeldung.
Folgende Meldung kommt dann:Code:$regfile = "m32def.dat"
$crystal = 16000000
$framesize = 30
$hwstack = 30
$swstack = 30
$asm
.def Temp = R16
.def A = R17
.org $000 Rjmp Main
.org $002 Rjmp Int0_handler
Main:
ldi temp, &b11111111
Out Ddrc , Temp
ldi temp, &b00000000
Out Ddrd , Temp
ldi temp, &b11111110
Out Portc , Temp
ldi temp, &b11111111
Out Portd , Temp
ldi a,&b00000011
Out Mcucr , A
ldi a,&b01000000
Out Gimsk , A
sei 'interrupts allgemein aktivieren (enable interrupts)
Lop:
nop
rjmp lop
Int0_handler:
sbi portc , 0
reti
$end Asm
End
Wenn ich allerdings dasCode:Access violation at address 0024572E in module 'BASC-AVR.DLL'. Write of address 05BF1000.
rausnehme, dann kommt die Meldung nicht.Code:.org $000 RJMP Main
An was liegt das?
Und stimmt mein Programm ansonsten (also INT0 auf fallende Flanke)??
Gruß
Chris
Hallo,
ich Progge viel mit Bascom und verwende auch viel den Inline-Assembler.
Bei deinem Code fällt mir auf, dass du alles in Assembler schreiben willst, auch die Interrupt-Vector Tabelle.
Bascom ist eigentlich ausgelegt um in Basic zu proggen. Natürlich kann man auch vieles in Assembler machen, aber Interrupt-Vectortabelle erstellen geht nicht.
Auch Befehle wie .org .data .eep etc geht nicht.
Wenn du in reinem Assembler Proggen willst, dann nimm besser AVR-Studio.
Das Assembler in Basom ist als Inline-Assembler gedacht.
Interrupts sollten deshalb besser mit Bascom-Statements configuriert werden. Das Spart Zeit und man behält die Übersicht. Korzer wird der Code nicht in Assembler.
Wenn du mit Bascom Assembler lernen willst, dann versuche dich anfangs auf einzelne Routinen zu konzentrieren. Deine versuchte Initialisierung sieht sehr nach AVR-Studio aus. In Bascom wird das nur bedingt compiliert und vermutlich nicht funktionieren.
Wenn du trotzdem in dieser Richtung experimentieren willst, dann schau dir mal die Befehle der Bascom Hilfe an. Z.B. $NoInit, $NoRam, $Initmicro, $Loader, $Loadersize, NoRamclear, $RomStart und so weiter an. Da findest du viele Hinweise. Dann wird für dich bestimmt vieles klarer.
Hallo Mitch64,
erstmal danke für deine Antwort.
An AVR-Studio hab ich auch schon gedacht, jedoch hab ich keine Seite gefunden, auf der man das downloaden kann (bzw. ich weiß nicht, welche Datei ich brauche, weil teils französisch). Außerdem bin ich mir nicht sicher, ob das auch mit dem USB-ISP (von robotikhardware) funzt??
Gruß
Chris
Hallo,
das AVR-Studio gibts kostenlos direkt bei www.atmel.com. Das ist der Hersteller dieser Controller. Ob das mit deinem USB-Programmer funktioniert kann ich dir nicht sagen. Muste in der Doku schauen von Studio.
Alternativ brennste das hex eben mit Bascom, das geht auch.
lies das hier :
http://www.rn-wissen.de/index.php/Bascom_Inside-Code