ich bin grad dabei ein ganz einfaches Programm zu schreiben dabei will ich nun den Wert der von r1 indiziert wird (@r1) mit dem der in r0 direkt steht vergleichen falls sie nicht übereinstimmen, will ich zu einem bestimmten Label springen eigentlich wollte ich dazu cjne benutzen, der kann ein Register aber nur mit einer Konstante vergleichen also hab ich mir ne Befehlsreferenz durchgelesen, allerdings kann ich keinen anderen Vergleichsbefehl außer cjne finden wie soll man denn ohne andere Vergleiche Programme schreiben? bei PCs gibt es normalerweise Befehle wie "cmp" der setzt dann die Statusbits entsprechend und dahinter macht man einen Statusbit bedingten Sprung so was ähnliches wie diese Statusbit bedingten Sprünge gibt es bei den 8051ern ja auch: - JB - JC - JZ usw. aber die dazu passenden Vergleichsbefehle kann ich nicht finden, die dann beispielweise das Carry-Flag setzen (wo wird das eigentlich gespeichert?) wie soll man denn dann den o.g. Vergleich machen, oder überhaupt triviale Vergleiche?
bei jc und jz wird das statusregister ausgewertet z ist z.B. immer 1 wenn der akku 0 ist glaube ich.
CJNE ist ein Kombibefehl, Du kannst aber auch SUBB oder XRL nehmen und dann entsprechend springen. Achtung, der 8051 hat kein Zero-Bit, er wertet immer den Accu direkt aus. D.h. man kann JZ/JNZ auch nach einen "MOV A,x" machen (MOV-Befehle ändern grundsätzlich keine Flags). Peter
P.S.: Das Zero- und das Parity-Bit gibt es zwar, aber sie sind read-only, ein Setzen hat keinen Effekt und wird sofort entsprechend dem Inhalt des Accu überschrieben. Man braucht sie deshalb auch in Interrupts nicht zu sichern, da sie mit Sicherung des Accu wieder ihren alten Stand haben. Peter
>>Ist a-b=0 dann springen ich versteh nicht wirklich was du mir damit sagen willst wie springen? >>bei jc und jz wird das statusregister ausgewertet z ist z.B. immer 1 >>wenn der akku 0 ist glaube ich wie die Jumps funktionieren weis ich ja aber ich hab ja keine Vergleichsfunktion, die die Flags entsprechend setzt >>Du kannst aber auch SUBB oder XRL nehmen kannst du das genauer erklären? ich weis nicht wie mir subb oder xrl da helfen sollen, oder wie man damit cjne nachstellen sollte also mein Problem ist nicht dass ich nicht wüsste wie man nun die Flags auswertet, sondern wie ich einen Vergleich anstelle, der die Flags irgendwie so setzt, dass ich zwischen größer, kleiner, gleich, nicht gleich, usw. unterscheiden kann wie bei PC-Assembler: cmp ax, bx je gleich ;jump if equal, springe falls gleich oder in C: if(a == b){} else{} aber eben diesen cmp Befehl den man dazu braucht, kennen die 8051er ja nicht, also muss es da einen anderen Weg geben
also nochmal ganz einfach: angenommen ich hab die Adresse des einen Wertes in r0 (also mit @r0 anzusprechen) und den zweiten Wert direkt in a gespeichert, mein Programm hat 3 Label: - groser - kleiner - gleich nun will ich an einer bestimmten Stelle im Programm, falls die beiden Werte gleich sind an das Label "gleich", wenn Wert 1 größer ist an "groser", und wenn Wert 1 kleiner ist an "kleiner" springen könnte mir jemand einen Code zeigen der einfach nur das macht?
8051 Instruction Set??? Register R0 enthält Adresse von Wert 1 Register ACC enthält direkt Wert 2 clr c ; lösche Übertragsbit (notwendig!) mov @r0, #wert1 ; [r0] = Wert 1 mov a, #wert2 ; ACC = Wert 2 subb a, @r0 ; ACC = ACC - [R0] jc groesser ; Borger (Carry): [r0] kleiner als ACC jz gleich ; gleich: dann gleich jmp kleiner ; nicht kleiner oder gleich: dann größer kleiner: ; hier geht es weiter wenn wert1 kleiner als wert2 gleich: ; hier geht es weiter wenn wert1 = wert2 groesser: ; hier geht es weiter wenn wert1 größer als wert2 Gruß Dietmar
Sorry, hier war der Dreckfuhlerteufel: 8051 Instruction Set??? Register R0 enthält Adresse von Wert 1 Register ACC enthält direkt Wert 2 clr c ; lösche Übertragsbit (notwendig!) mov @r0, #wert1 ; [r0] = Wert 1 mov a, #wert2 ; ACC = Wert 2 subb a, @r0 ; ACC = ACC - [R0] jc groesser ; Borger (Carry): [r0] größer als ACC jz gleich ; [r0] gleich ACC ; hier geht es weiter wenn wert1 kleiner als wert2 gleich: ; hier geht es weiter wenn wert1 = wert2 groesser: ; hier geht es weiter wenn wert1 größer als wert2
ah danke, genau so etwas hab ich gesucht wusste gar nicht das subb die Flags einstellt was ist denn ein Dreckfühlerteufel?
Dreckfuhlerteufel = Druckfehlerteufel :-) Um das Carry-Flag richtig zu verwenden, d.h. als Übertrag bzw. auch als Borrow-Flag (Borger) bei Subtraktion, muß es vor einer Rechnung immer gelöscht sein, es sei denn, man macht eine fortlaufende Subtraktion über mehrere Bytes, da darf man es während der gesamten Rechnung natürlich nicht mehr beeinflussen. Beim 8051 stehen die Flags im PSW. Die werden bei arithmetischen Operationen automatisch gesetzt, da muß man keine Optionen angeben oder spezielle Befehle wie TST oder CMP verwenden wie bei manch anderen Prozessoren oder Controllern. Nun, beim 8051 gibt es allerdings kein Zero-Flag: Nach einer Operation, die Null ergibt, muß man sofort die darauf abgestimmten Befehle wie z.B. JZ oder JNZ (Jump if Zero, Jump if not Zero) anwenden, bevor der nächste Befehl kommt, der Flags beeinflussen kann. Ich konnte damit bisher gut leben. Freut mich daß das Beispiel geholfen hat! Wie wäre es denn, wenn du dir zur Abwechslung mal eine bessere (detailliertere) Beschreibung des Befehlssatzes zulegst? Gruß Dietmar
In der Befehlsreferenz (z.B. Atmel Webseite) ist gleich zu Anfang eine Tabelle, welche Befehle die Flags beeinflussen. Es sind erfreulich wenige, so daß oft in Interupts das PSW nicht gesichert werden muß. "Nach einer Operation, die Null ergibt, muß man sofort die darauf abgestimmten Befehle wie z.B. JZ oder JNZ (Jump if Zero, Jump if not Zero) anwenden, bevor der nächste Befehl kommt, der Flags beeinflussen kann." Nein ! Solange der Accu nicht geändert wird, kann man ein JZ/JNZ beliebig weiter hinten ausführen. Wie gesagt, das Z-Bit wird nicht durch einen Befehl geändert sondern einzig allein durch das, was im Accu drinsteht: "XRL A,B" ändert das Z-Bit "XRL B,A" ändert das Z-Bit nicht ! Peter
@peter dannegger: "Nein ! Solange der Accu nicht geändert wird, kann man ein JZ/JNZ beliebig weiter hinten ausführen." Klar, hatte ich doch beschrieben: Bedingung gilt, bis der nächste Befehl ausgeführt wird, der Flags verändert. Allerdings: Ob die Zero-Bedingung immer funktioniert, wenn in ACC Null drinsteht, müßte ich noch testen. Gruß Dietmar
ich hab mir auch die Befehlsreferenz angeschaut, allerdings bringt es mir ziemlich wenig wenn dort steht welche Flags von welchem Befehl geändert werden, wenn ich nicht weis wie sie geändert werden
Wo genau ist da das Problem? Ist deine Befehlsreferenz vielleicht zu kompakt gefasst und hat keine detailliertere Beschreibung? Ich habe z.B. das Mikrocontroller Kochbuch vom IWT-Verlag, aber auch Handbücher von Siemens (8051, 80515, 80517), allerdings aus den Anfang 1990-er Jahren. Weiß nicht, was es da heutzutage noch gibt. Dort ist wirklich jedes noch so kleine Detail aufgeführt. Über den 8051 gibt es wirklich Unmengen an Literatur, sicher auch im Internet. Google doch mal nach "8051 Instruction Set" o.ä. Infineon führte die alten 8051-Derivate nach Siemens weiter, und auf deren Homepage gibt es auch noch Handbücher dazu zum Download. Wenn die so gut sind wie meine papierenen Bücher, wärst du bestens bedient. Gruß Dietmar
kannst du mir die ISBNs von deinen üchern sagen? da gibts mehrere die so ähnlich heißen
1.) Roth, Andreas: Das Mikrocontroller-Kochbuch / Andreas Roth - 2. Auflage IWT-Verlag 1990 ISBN 3-88322-225-9 Davon gibt es noch neuere Auflagen. 2.) Feger, Otmar: Die 8051-Mikrocontroller-Familie Teil1 Einführung in die Software 1991 Siemens Aktiengesellschaft Abteilung Verlag ISBN 3-8009-4113-9 Mit Software (Assembler ASM51 von Ashling Microsystems) für 8051, 80515, 80C517 auf Diskette 3.) Feger, Otmar: Die 8051-Mikrocontroller-Familie Teil2 Bausteine und Applikationen 1991 Siemens Aktiengesellschaft Abteilung Verlag ISBN 3-8009-4123-6 4.) R. Johannis / N. Papadopoulos: Handbuch des 80(C)515 und 80C515A Architektur und Programmierung ISBN 3-8009-4145-7 5.) Johannis, Reiner: Handbuch des 80C517 und 80C517A - 2. Auflage Traunreut: Feger, 1995 ISBN 3-928434-07-1 6.) Graf, Rudolf: Simula5x: Simulator für die 8051-Mikrocontroller-Familie - 2. Auflage 1993 Siemens Aktiengesellschaft Abteilung Verlag ISBN 3-8009-4157-0 Mit Simulator und Disassembler für 8051, 80515, 80C517 auf Diskette. Der Simulator läuft im DOS-Fenster, sehr übersichtlich und gut, d.h., du brauchst für solche Tests wie kleiner, größer, gleich, nicht mal reale Hardware! Alles aus den 1990-er Jahren, weiß nicht, was es davon noch gibt. Die Materie ist nicht mehr ganz Up-To-Date für Neuentwicklungen, beschreibt aber die 8051-er hervorragend. Dazu sind die Bücher alle deutschsprachig. Wie schon gesagt: Die Handbücher (ehemals Siemens) kannst du auch noch bei Infineon downloaden, jedoch englischsprachig (kostet dafür aber nichts!). Ich favorisiere das Mikrocontroller-Handbuch von Andreas Roth. Damit fing ich 1992 an, überhaupt in die Mikrocontroller einzusteigen. Darin befindet sich detailliert die Befehlsreferenz und viele Erklärungen. Assembler, Compiler, Simulator, etc, da hast du sicher schon was moderneres, oder? Übrigens, hast du gute Chancen, alte 8051-Handbücher gegenwärtig noch in FH- und UNI- Bibliotheken zu finden. Die halten sich da noch eine ganze Weile. Gruß Dietmar
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.