Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie <= oder >= in Assembler???



Peter_Holzer
08.03.2007, 09:51
Hallo an Alle hier!

Ich hätte da eine Frage:

Wie kann ich in Microchip Assembler eine Variable mit einer größer-gleich oder kleiner-gleich vergleichen???

Ich möchte eine Pumpe ab 40,5°C einschalten und unter 39,5°C wieder ausschalten. Die Temperatur bekomme ich von einem DS18S20. Programm ist soweit fertig, dass ich die Temperatur in einer Variable speichern kann.

Wie kann ich das angehen?

Lg Peter Holzer

SIGINT
08.03.2007, 11:22
Hallo Peter,
wie hast du die Werte den vorliegen? Als BCD, Binär, Fließkomma, etc....
Aber im Prinzip geht das halt über die Flags... du hast ja das Carry,Zero und DigitCarry (ist wohl für BCD da).
Du musst halt möglichst geschickt rechnungen durchführen und kannst dann anhand der FLAGS Rückschlüsse ziehen...

Gruß,
SIGINT

P.S.: Ein Beispiel ist vielleicht doch angebracht:

angenommen du hast eine Zahl in W stehen und möchtest bestimmen, ob diese kleiner (oder größer gleich) 120 ist, dann kannst du das so machen:



movf Zahl,W
sublw 120
btfsc STATUS,C
goto ist_grösser_gleich
goto ist_kleiner

cipoint
15.03.2007, 19:10
;Zweiter Versuch mit dem Drehimpulsencoder

include REG8252.INC

;Zuweisungen
SIG_A EQU P3.3 ;0
SIG_B EQU P3.2 ;1
LAST_STATE EQU R6
TEMP EQU R2

;Resets
MOV P2, #0
MOV LAST_STATE, #0

;************************************************* **************************************************

;Die Hauptschleife
LOOP: ACALL CHECK_DIG_STATE
SJMP LOOP

;************************************************* **************************************************

CHECK_DIG_STATE: ACALL READOUT_DIG ;Zustand auslesen und
MOV A, LAST_STATE ;im Accu an der Stelle
MOV B, #04h ;X X X X - - X X platzieren
MUL AB

ACALL READOUT_DIG ;Zustand auslesen, an der
ORL A, LAST_STATE ;Stelle X X X X X X - - platzieren
ANL A, #0Fh

MOV P2, A

MOV DPTR, #TABLE
JMP @A+DPTR

;************************************************* **************************************************

;Liest den Drehimpulsgeber aus und speichert den Zustand im Register LAST_STATE

READOUT_DIG: JB SIG_A, A_TRUE
SJMP A_FALSE

A_TRUE: JB SIG_B, STATE_2
SJMP STATE_1

A_FALSE: JB SIG_B, STATE_3
SJMP STATE_0

STATE_0: MOV LAST_STATE, #0 ;SIG_A=0 and SIG_B=0
RET

STATE_1: MOV LAST_STATE, #1 ;SIG_A=1 and SIG_B=0
RET

STATE_2: MOV LAST_STATE, #2 ;SIG_A=1 and SIG_B=1
RET

STATE_3: MOV LAST_STATE, #3 ;SIG_A=0 and SIG_B=1
RET

;************************************************* **************************************************

TABLE: SJMP NOA
SJMP CW
SJMP ERR
SJMP CCW
SJMP CCW
SJMP NOA
SJMP CW
SJMP ERR
SJMP ERR
SJMP CCW
SJMP NOA
SJMP CW
SJMP CW
SJMP ERR
SJMP CCW
SJMP NOA

;************************************************* **************************************************

NOA: NOP
RET

ERR: NOP
RET

CW: SETB P2.7
RET

CCW: CLR P2.7
RET

END

Der uC hängt sich auf, wenn SIG_A=0 und SIG_B=1 ist. Sobald der Debugger an die Zeile JMP @A+DPTR kommt, gibt er "Out of Code" aus. Ich kann mir das aber nicht erklären. Der ACCU enthält zu diesem Zeitpunkt 00001010 und springt sogar zu der Adresse in der Tabelle unten. Dann führt der NOP aus und gibt eben den Fehler aus.

Vielleicht überschreibe ich versehentliche wichtige Register?

edit: Oops, falscher thread.