Sida 1 av 2
behöver ett "okänt" komando! (ASM)
Postat: 20 januari 2007, 17:47:27
av squiz3r
hej igen
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

pinsamt, det är en PIC16F628A

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
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
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

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....

)
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