-         

Ergebnis 1 bis 3 von 3

Thema: Wie <= oder >= in Assembler???

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    15.02.2007
    Alter
    28
    Beiträge
    14

    Wie <= oder >= in Assembler???

    Anzeige

    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

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    19.01.2006
    Ort
    Mönchengladbach
    Beiträge
    544
    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:

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

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    31.12.2006
    Beiträge
    61
    Code:
    ;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.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •