Kod: Markera allt
movfw time
sublw 35
btfsc STATUS, Z
goto label1
Hur gör jag då?
Tack på förhand!
//Daniel A
Kod: Markera allt
movfw time
sublw 35
btfsc STATUS, Z
goto label1
Kod: Markera allt
movfw time ;W = time - 35
sublw 35
btfsc STATUS, Z ; om W = 0 gå till label1
goto label1
btfsc STATUS, C ; om W är mindre än 0 gå till label 1
goto label1
........ ; förtsätt här....
........
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
pause_var1 equ 23h
time equ 24h
;define pinouts
#define alarm PORTA,2
#define sw1 PORTB,2
#define sw2 PORTB,3
#define G_LED PORTA,1
#define R_LED PORTA,0
#define sens1 PORTB,5
#define sens1_off PORTB,4
#define keypad PORTB,0
;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)
portb5_out
bsf STATUS, RP0 ; Switch to bank 1
movlw b'00000000' ;
movwf TRISA ; PORTA = 0,1,2,3,4,5,6,7 out,
movlw b'00000000' ;
movwf TRISB ; PORTB = b5 out
bcf STATUS, RP0 ; Switch to bank 0
goto step_1
portb5_in
bsf STATUS, RP0 ; Switch to bank 1
movlw b'00000000' ;
movwf TRISA ; PORTA = 0,1,2,3,4,5,6,7 out,
movlw b'00100000' ;
movwf TRISB ; PORTB = b5 in
bcf STATUS, RP0 ; Switch to bank 0
goto step_2
; main loop
watch_resistans
goto portb5_out
step_1
bsf sens1
call delay
bcf sens1
movlw 0h
movwf time
movlw 1h
goto portb5_in
step_2
addwf time,f
bsf G_LED
call pause
bcf G_LED
call pause
btfsc sens1
goto step_2
goto step_3
step_3
bsf R_LED
call pause
bcf R_LED
call pause
decfsz time,1h
goto step_3
goto portb5_out
button1
bsf R_LED
call delay
goto watch_resistans
; Delay routine
; This code uses about 5 x 99975 instructions. At 4Mhz this is approx 500 milliseconds.
pause movlw 0xFF
movwf pause_var1
pause2 decfsz pause_var1,1 ; is placed in the file
goto pause2
return
delay movlw 0x5
movwf delay_var3
delay1 movlw 0x5
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
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
pause_var1 equ 23h
time equ 24h
;define pinouts
#define alarm PORTA,2
#define sw1 PORTB,2
#define sw2 PORTB,3
#define G_LED PORTA,1
#define R_LED PORTA,0
#define sens1 PORTB,5
#define sens1_off PORTB,4
#define keypad PORTB,0
;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)
portb5_out
bsf STATUS, RP0 ; Switch to bank 1
movlw b'00000000' ;
movwf TRISA ; PORTA = 0,1,2,3,4,5,6,7 out,
movlw b'00000000' ;
movwf TRISB ; PORTB = b5 out
bcf STATUS, RP0 ; Switch to bank 0
goto step_1
portb5_in
bsf STATUS, RP0 ; Switch to bank 1
movlw b'00000000' ;
movwf TRISA ; PORTA = 0,1,2,3,4,5,6,7 out,
movlw b'00100000' ;
movwf TRISB ; PORTB = b5 in
bcf STATUS, RP0 ; Switch to bank 0
goto step_2
; main loop
watch_resistans
goto portb5_out ;gör sens1 (portb5) till utgång
step_1
bsf sens1 ;ladda upp kondensatorn
call delay
bcf sens1
movlw 0h ;nollställ "time"
movwf time
movlw 1h ;lägg 1hex i W registret
goto portb5_in ;ändra sens1 (portb5) till ingång
step_2
addwf time,f ;time = time + 1 (lägg till 1h till "time")
bsf G_LED ;tändgul status LED
call pause ;pausa
bcf G_LED ;släck den igen
call pause ;pausa
btfsc sens1 ;kolla om kondensatorn fortfarande är uppladdad.
goto step_2 ;om den är det gå till step_2 o lägg till 1 till i variablen m.m.
goto step_3 ;annars gå till step_3
step_3 ;visa hur många gånger den loopade i "step_2" loopen.
bsf R_LED ;tänd röd LED
call pause ;pausa
bcf R_LED ;släck den igen
call pause ;pause igen
decfsz time,1h ;visa hur stor variablen är genom att köra denna loopen lika många gånger
goto step_3 ;om variablen fortfarande innehåller något gå till baks till "step_3"
goto portb5_out ;annars kör hela processen igen....
button1 ;********************************************
bsf R_LED
call delay ;Detta används inte nu....
goto watch_resistans ;*********************************************
pause movlw 0xFF ;*************************************
movwf pause_var1 ;gör en kort pause
pause2 decfsz pause_var1,1 ;
goto pause2 ;
return ;*************************************
delay movlw 0x5 ;*************************************
movwf delay_var3 ;
delay1 movlw 0x5 ;
movwf delay_var2 ;gör en lång pause
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
Jo, för oktalt finns det ju det, nämligen "0".sodjan skrev:En liten "side-note" om att ange radix i koden...
Man ser ofta ett HEX-värde skrivet som t.ex 0x3B.
Detta format är i och för sig OK i MPASM, men personligen
föredrar jag formatet h'3B'. Anledningen är att detta format
kan användas till alla radix :
a'A' : ASCII tecken.
d'98' : decimalt.
h'3B' : hexadecimalt.
o'26' : oktalt.
b'00010000' : binärt.
Det finns ingen motsvarighet till "0x" formatet i de andra radix'en...
Kod: Markera allt
$ perl -we "print 011"
9
$ perl -we "print 11"
11
$ perl -we "print 0x11"
17