Sida 1 av 2

behöver ett "okänt" komando! (ASM)

Postat: 20 januari 2007, 17:47:27
av squiz3r
hej igen :D
Jag behöver läsa av en variabel, på tre olika sätt (ASM) :

om variabel1 inte är 0h så hoppa över nästa instruction

---------

om variabel1 inte är 1h så hoppa över nästa instruktion

---------

om variabel1 inte är 2h så hoppa över nästa instruktion


vad ska jag anväda för komandon?

Tacksam för snabba svar!

//Daniel A

Postat: 20 januari 2007, 17:53:45
av peter555
Så länge processortypen är okänd så är det svårt att svara på.

Postat: 20 januari 2007, 17:54:38
av squiz3r
Oj :oops: pinsamt, det är en PIC16F628A :oops:

Postat: 20 januari 2007, 17:58:48
av bearing
Vet inte riktigt vad du menar. Såhär?

Kod: Markera allt

movf	variabel1,F
btfsc	STATUS, Z
goto	label0

movf	variabel1,W
sublw	1
btfsc	STATUS, Z
goto	label1

movf	variabel1,W
sublw	2
btfsc STATUS, Z
goto	label2

Postat: 20 januari 2007, 18:05:03
av squiz3r
jag blir förvirrad utav den koden :oops:

jag kan beskriva lite bättre, jag har en variabel med namnet variabel1. den kan vara antingen 0, 1 eller 2. jag vill att om den är noll så ska den gå till en label tex, label1, är den 1 ska den gå till label2, är den 2 ska den gå till label3.

hoppas att ni förstog nu! :)

Postat: 20 januari 2007, 18:35:53
av bearing
Ok ändrade koden så att den gör som du vill. (Om jag tänkt rätt.)

Vissa instruktioner gör att processorns statusbitar uppdateras. Det är statusbiten Z som jag tittar på. Den biten sätts om aktuellt register blir 0.

Postat: 20 januari 2007, 18:47:34
av squiz3r
så, jag tror att jag börjar fatta :D

men på översa raden står det;movf, det ska väll vara movfw (eller)? och vad betyder "F" efter variabel, "variabel1"?

så då tar man talet från variabel1 och flyttar till STATUS, Z så att man kan se om det var en nolla eller en etta? sublw, betyder det att man tar minus talet som står efter?, är det i w registret eller är det i variablen, för att iså fall borde väll man lägga till det igen, innan man gör nästa test?(eftersom variablen är ett mindre då?

Tack!
//Daniel A

Postat: 20 januari 2007, 18:51:30
av sodjan
> och vad betyder "F" efter variabel, "variabel1"?

Har du kollat MOVF instruktionen ?
Man flyttar bara värdet i variabel1 tillbaka till sig själv.
Enbart för att sätta Z-flaggan korrekt.

> sublw, betyder det att man tar minus talet som står efter?,

Samma sak, har du kollat SUBLW i databladet ?

> för att iså fall borde väll man lägga till det igen,

Nej, det ligger ju kvar i variabel1.
Variabel1 ändras aldrig av den koden.

Postat: 20 januari 2007, 18:53:38
av bearing
Så bra =)

Det går nog med movfw också, fast om du ville att värdet i W skulle vara oförändrat får du använda "movf variabel1,F". Detta betyder att den hämtar värdet i variabel1 och sätter det variabel1 (igen).

Nja, så funkar det inte riktigt. När vissa instruktioner resulterar i värdet 0 i aktuellt register så sätts Z-flaggan automatiskt. Läs kapitlet om instruktionerna i databladet för svar på alla din frågor, jag orkar faktiskt inte förklara allt!

Postat: 20 januari 2007, 18:53:40
av idiotdea
Kanske borde påpeka att det inte finns någon sådan instruktion som movfw. Det man egentligen (antar jag) vill skriva är: movf variabel1, w.

Sedan betyder "movf variabel1, f" endast att variabel1 kopieras till sig själv. Det kan ju verka dumt, men orsaken till att du gör det är att om variabel1 är lika med 0 kommer Z (zero flag) att sättas i STATUS.

Postat: 20 januari 2007, 18:54:34
av bearing
Jo fast MPLAB gör om "movfw variabelnamn" till movf "variabelnamn,W" automatiskt.

Postat: 20 januari 2007, 18:56:11
av squiz3r
ok, Tack så mycket! då får jag läsa det kappitlet.

Postat: 20 januari 2007, 19:13:21
av sodjan
> Jo fast MPLAB gör om "movfw variabelnamn" till movf "variabelnamn,W" automatiskt.

Sant, men eftersom det *inte* finns med i instruktionsuppsättningen
i databladen (det finns gömt långt in i manualen till MPASM), så är det
*inte* lämpligt i kod till nybörjare... :-)

Postat: 20 januari 2007, 19:19:52
av bearing
Jo, det har du rätt i, jag insåg det senare.

Postat: 20 januari 2007, 20:46:40
av squiz3r
hej igen, nu har jag laggt ihop ett helt program (ett spel, "först till kvarn") , när jag kör det i MPSIM funkar det utmärkt. Men när jag kör det på PIC.en så händer ingenting :cry: den kommer inte ens så långt att den börjar pipa. jag har kopplat en LED (via ett motstånd) på IO "play1_LED" och en på "play2_LED", på "play1" och "play2" har jag kopplat en switch till 5volt, med ett pulldown motstånd på 10kΩ och på "beep" har jag kopplat en summer via en transistor (BC547c) någon som kan se något fel, eller haft liknande problem?

(Förlåt sodjan för EQU på variablerna.... :oops: )

Kod: Markera allt

; Assign your microcontroller
        LIST P=16F628A

; This include file makes programming more understandeble
        include <P16F628A.INC>
        
        
    __CONFIG _CP_OFF & _DATA_CP_OFF & _BODEN_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _LVP_OFF

; save on free ram in bank0

delay_var1       equ	20h
delay_var2       equ	21h  
delay_var3       equ	22h  

repeat_var       equ	23h

play1_overtramp  equ    24h
play2_overtramp  equ    25h

win1             equ    26h
win2             equ    27h

;define pinouts

#define   play1       PORTB,3  
#define   play1_LED   PORTA,3 
#define   play2       PORTA,6
#define   play2_LED   PORTA,0 
#define   beep        PORTA,7 


;startadres of the controller
	 org 0x0000


; For using A0-A3 as digital I/O 
    	movlw	D'7' 		    ; 
        movwf	CMCON		; Comparators off, all pins digital I/O 

; Reset Port values
        clrf	PORTA	
        clrf	PORTB
        
; define your pin direction (input/output)

    bsf	STATUS, RP0	          ; Switch to bank 1
		movlw	b'01000000'	  ;
		movwf	TRISA		  ; PORTA = 1,2,3,4,5 & 7 out, 6 in

        movlw	b'00001000'	  ; 
        movwf	TRISB	      ; PORTB = all outputs
	bcf	    play1_LED		  ; led Off
    bcf	    play2_LED		  ; led Off


; main loop

main
    call reset                ;sett all variables to 0

    movlw	0xA			      ;sett repeat_var to 10
	movwf	repeat_var 

    call    pause			  ;pause 5seconds
    
    call    read_buttom1      ;check for overtramp

    call    beeep              
    
    goto    read_buttom2	  ;Check ho press first
middle_main
    goto    show_LED          ;show status on led

under_middle_main

    movlw	0xA			      ;sett repeat_var to 10
	movwf	repeat_var 

    call    pause	          ;pause 5seconds

    bsf   	play1_LED		  ; LED On

    goto main
    




reset:
   movlw	0h   			  ;sett play1_overtramp to 0
   movwf	play1_overtramp

   movlw	0h  			  ;sett play2_overtramp to 0
   movwf	play2_overtramp

   movlw	0h  			  ;sett win1 to 0
   movwf	win1

   movlw	0h	     		  ;sett win2 to 0
   movwf	win2  
   return

    
pause                         ;call delay 10times
    call    delay			  ;(pause 5seconds)
    decfsz  repeat_var,1
    goto    pause
    return

read_buttom1
    BTFSC   play1          ;If player1 press the buttom
    call    overtramp1     ;call overtramp1 subroutin
    BTFSC   play2          ;If player2 press the buttom
    call    overtramp2     ;call overtramp2 subroutin
    return

overtramp1
    movlw	1h			   ;sett play1_overtramp to 1 
	movwf	play1_overtramp
    return

overtramp2
    movlw	1h			   ;sett play2_overtramp to 1 
	movwf	play2_overtramp
    return  

beeep
 	bsf   	beep		   ; beep, on
    call    delay  
    bcf	    beep		   ; beep, off
    return

read_buttom2
   BTFSC   play1           ;If player1 press the buttom
   goto    first1          ;call first1 subroutin
   BTFSC   play2           ;If player2 press the buttom
   goto    first2          ;call first2 subroutin
   goto  read_buttom2         ;loop for ever if not buttom is pressed 

first1
   movlw	2h			   ;sett win1 to 2 
   movwf	win1
   goto middle_main

first2
   movlw	2h			   ;sett win1 to 2 
   movwf	win2
   goto middle_main

show_LED
    
;--------------------------------------
;-  player 1 win                     -----
;--------------------------------------
  
    movfw   win1
    sublw   2 
    btfsc   STATUS, Z 
    goto    play1_win

;--------------------------------------
;-  player 2 win                     -----
;--------------------------------------
    
    movfw   win2
    sublw   2 
    btfsc   STATUS, Z 
    goto    play2_win


    goto show_LED
;-------------------------------------
;turn on status LED                ------
;------------------------------------


play1_win
    bsf   	play1_LED		; LED On
    goto under_middle_main

play2_win
	bsf   	play2_LED		; LED On

    goto under_middle_main



 

; Delay routine 
; This code uses about 5 x 99975 instructions. At 4Mhz this is approx 500 milliseconds.


delay   movlw	D'5'
	    movwf	delay_var3
delay1  movlw	0x82
	    movwf	delay_var2
delay2  movlw	0xFF
	    movwf	delay_var1
delay3	decfsz	delay_var1, f 
	    goto	delay3
	    decfsz	delay_var2, f
        goto	delay2
     	decfsz	delay_var3, f
        goto	delay1
    	return

        END