Forum: PC-Programmierung Sprungbefehl am µC Wichtig & Eilig


von Tobias Gläser (Gast)


Lesenswert?

Hi! Bin grad über Google auf das Forum gestoßen, weil ich dringend
Hilfe
brauche...

Ich Programmiere eben auf der Arbeit (Azubi) ne kleine Steuerung am
80C535 von Infineon

Mein Problem:

In der Initialisierungsphase meines Programmes werden mit
Zeitabständen
auf 17 Adressen eingelesene Analogwerte abgespeichert.
Soweit so gut, das habe ich mit

mov dptr,#05160h
movx @dptr,a

gemacht. Im Akku war der Wert vom AD-Wandler jeweils temporär.

Mein Problem nun ist, dass ich nun im Hauptprogramm, was danach
anläuft, wieder AD-Messungen mache und diese nun mit den gespeicherten
werten vergleichen muss.

so wie: "CJNE A,#012h,m1"

also bei mir: "CJNE A,[gespeicherter Wert],m1"

Wie bekomme ich meinen Gespeicherten Wert dorthin??? oder gibts ne
andere möglichkeit das Carry zu setzen? Hier das Beispiel wie es sein
sollte:

mov DPTR,#05160h  ; Speicheradresse in Datenpointer schreiben
movx a,@DPTR    ; Adressierter RAM-Inhalt im Akku speichern
mov r1,a    ; Akku in Register sichern
call ADmess    ; Akku wird mit AD-Wert geladen
cjne a,r1,m1    ; Setzt Carry wenn Akku größer als r1
m1: jc m50    ; Springt wenn Carry gesetzt zu m50
mov P4,#11111111b  ; Läd den Port mit einer 8-Bit-Konstanten
mov P5,#11111111b  ; Läd den Port mit einer 8-Bit-Konstanten
jnc m18      ; Springt wenn Carry nicht gesetzt zu m18


Bitte dringendst um Hilfe.

Ach Ps: noch ne kleine Frage... Was ist ein "dadr"?? Wie beim Befehl
CJNE A,dadr,rel

Danke MfG Tobias Gläser

von Stephan H. (stephan-)


Lesenswert?

@Tobias

Quelle: Google

Der Befehl 'CJNE OP1, OP2, rel' erhöht zunächst den Befehlszähler PC
um 3. Somit zeigt dieser auf den nach CJNE folgenden Befehl.
Jetzt findet ein Vergleich der beiden angegebenen Operanden statt.
(Vergleich = Subtraktion OP1 - OP2 bei der das Ergebnis nicht
aufgehoben wird. Bei Gleichheit ist das Ergebnis 0)
Sind beide Operanden gleich, wird der nach CJNE folgende Befehl
ausgeführt. Das CarryFlag C = 0.
Sind die Operanden ungleich, wird zum Befehlszähler PC die angegebene
Sprungweite rel hinzuaddiert. Die Sprungweite rel wird dabei als
vorzeichenbehaftete Zahl interpretiert. So sind Sprünge von -128 Bytes
(zurück) bzw. 127 Bytes (nach vorne) möglich.
Das CarryFlag gibt nach dem Sprung Auskunft darüber, welcher der
Operanden größer bzw. kleiner ist. Ist das Carryflag ...
C = 0 dann war OP1 größer als OP2 oder (OP1 gleich OP2)
C = 1 dann war OP1 kleiner als OP2

So das zur Theorie.

dadr ist eine "direkte Adresse" im RAM oder SFR !!!
zB. liegen dort Deine Werte herum.
CJNE a,33h,m1  vergleicht den Akku mit "Inhalt von Adresse 33h".
CJNE a,#33h,m1 vergleicht mit dem wert 33h !!!
reicht das ??

Stephan

von Tobias Gläser (Gast)


Lesenswert?

Wow dad is genial^^ Keine Fehler mehr damit!

Danke

aber Noch ne Kleinigkeit... Ich hab alle daten auf einem externen RAM
abgelegt also zb en byte auf 5000h (m1 is nur meine sprungmarke)

cjne a,5000h,m1

Da kommt ne Warnung wegen den 8bit überschritten, aber ist das dennoch
möglich, oder sollte ich alle daten dann im internen RAM vorher
ablegen?
also mit

MOV dadr,#const8
und dann
cjne a,dadr,m1

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
Noch kein Account? Hier anmelden.