www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik wie 2 Werte vergleichen?


Autor: Scales O.j. (scales)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: .................... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist a-b=0 dann springen
carry flag ist im staus register.

Autor: .................... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bei jc und jz wird das statusregister ausgewertet z ist z.B. immer 1
wenn der akku 0 ist glaube ich.

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Scales O.j. (scales)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>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

Autor: Scales O.j. (scales)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Dietmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Dietmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Scales O.j. (scales)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ah danke, genau so etwas hab ich gesucht
wusste gar nicht das subb die Flags einstellt

was ist denn ein Dreckfühlerteufel?

Autor: Dietmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Dietmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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

Autor: Scales O.j. (scales)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Dietmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Scales O.j. (scales)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kannst du mir die ISBNs von deinen üchern sagen?
da gibts mehrere die so ähnlich heißen

Autor: Dietmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.