Чт апр 26, 2018 01:11:17
list p=16F54 ; list directive to define processor
#include <p16f54.inc> ; processor specific variable definitions
__CONFIG _CP_OFF & _WDT_OFF & _RC_OSC
;***** VARIABLE DEFINITIONS
;temp EQU 0x07 ;example variable definition
pause EQU 0x07 ; for delays
pause2 EQU 0x08
pause3 EQU 0x09
port_a_temp EQU 0x0a ; PORTA
time EQU 0x0b ;used for define pause
Ch_Float_Count EQU 0x0c ;counters for float normalise
Ch_Float_Osm EQU 0x0d
Ch_Float_1 EQU 0x0e
Ch_Float_2 EQU 0x0f ;_____________
Port_b_tmp EQU 0x10 ;for any case
diag_led EQU 0x11 ;debug var not used now
Float_stat EQU 0x12 ;Float flags bit0 - osmos, bit1 first float bit2...
Float_tmp EQU 0x13 ; used while pump workong
My_flag EQU 0x14; 0-bit - error, 1 - 1_float_flag
;**********************************************************************
ORG 0x1FF ; processor reset vector
goto start
ORG 0x000
;**********************************************************************
;Variable pause
pr_pause MOVLW time
MOVWF pause
MOVLW b'11111111'
MOVWF pause2
MOVWF pause3
timer decfsz pause3,1
GOTO timer
decfsz pause2,1
GOTO timer
decfsz pause,1
GOTO timer
RETURN
;end of pr_pause
;**********************************************************************
;**********************************************************************
; Check float status
Check_float
MOVLW b'00001111'
MOVWF Ch_Float_Count ;set normalise counter
MOVLW b'00000000' ;----------
MOVWF Float_stat
MOVWF Ch_Float_Osm ;reset counters
MOVWF Ch_Float_1
MOVWF Ch_Float_2 ;_____
Loop DECFSZ Ch_Float_Count ; Wile Ch_Float_Count>0
GOTO contin ;show must go on
;Set float status reg
MOVLW b'00001000' ;constant for normalise
;Osmos level
BCF STATUS,0
SUBWF Ch_Float_Osm,1 ; if float counter more b1000
BTFSC STATUS,0 ; we got STATUS0 =1
BSF Float_stat,0 ; and set bit for osm_float to 1
;first float level
BCF STATUS,0 ;same as Osm_float only for float_1
SUBWF Ch_Float_1,1
BTFSC STATUS,0
BSF Float_stat,1
;second float level
BCF STATUS,0 ;same as Osm_float only for float_2
SUBWF Ch_Float_2,1
BTFSC STATUS,0
BSF Float_stat,2
RETURN
contin MOVF PORTB ;check ports
BTFSC PORTB, 4
INCF Ch_Float_Osm ;incrase counters for each float if need
BTFSC PORTB, 5
INCF Ch_Float_1
BTFSC PORTB, 6
INCF Ch_Float_2
goto Loop
;end of Check_float
;**********************************************************************
;**********************************************************************
;No_osmos
No_osmos BCF port_a_temp,1 ;stop pump
BSF port_a_temp,2 ;raise alarm led
MOVF port_a_temp,0
MOVWF PORTA
Wait_water MOVLW b'11111111'
MOVWF time
call pr_pause
call Check_float
BTFSC Float_stat,0 ;wait wile Osm_float swim up
GOTO Wait_water
BCF port_a_temp,2 ;swich off alarm led
MOVF port_a_temp,0
MOVWF PORTA
RETURN
;end No_osmos
;**********************************************************************
;**********************************************************************
;One_float (switch on RA3 led - green indicator)
One_float
BSF port_a_temp,3
MOVF port_a_temp,0
MOVWF PORTA
RETURN
;end One_float
;**********************************************************************
;**********************************************************************
fulling BSF port_a_temp,1 ;----------
MOVF port_a_temp,0 ;switch on pump
MOVWF PORTA ;___________
;TODO set timer for ovewer_level
fulling_lp MOVLW b'00000001' ;-----
MOVWF time ;Pause
call pr_pause ;______
BCF port_a_temp,3 ;----------
MOVF port_a_temp,0 ;switch off RA3 blink
MOVWF PORTA ;___________________
MOVLW b'00000001' ;-----
MOVWF time ;Pause
call pr_pause ;______
call Check_float
BTFSC Float_stat,0
call No_osmos;
;BCF port_a_temp,2 ;osmos level control
;
BSF port_a_temp,3 ;switch on RA3 blink
BSF port_a_temp,1 ;SW_on pump after No_osmos
MOVF port_a_temp,0 ; This part used for restore
MOVWF PORTA ;pump if No_osmos called
call Check_float
MOVLW b'00000000' ;----------
MOVWF Float_tmp ;used only 2 bits
BTFSC Float_stat,1 ; if one float switched on
INCF Float_tmp ; first bit set only
BTFSC Float_stat,2 ; If two float
INCF Float_tmp ;second bit set only
MOVLW b'00000001' ;
BSF STATUS,0 ; STATUS 0 RESET
SUBWF Float_tmp,1 ; Float_tmp - 1 -- If both float off
; 0-1 =-1 STATUS 0 get 0
;_____
BTFSS STATUS,0 ; if STATUS 0 get 0
GOTO fulling_lp_end ; stop procedure
;BSF port_a_temp,2
BSF port_a_temp,3 ;switch off RA3 blink
MOVF port_a_temp,0
MOVWF PORTA
GOTO fulling_lp ;loop.
fulling_lp_end
BCF port_a_temp,1 ;pump off
;BCF port_a_temp,2
BCF port_a_temp,3 ;indicator off
MOVF port_a_temp,0
MOVWF PORTA
RETURN
;end fulling
;**********************************************************************
;**********************************************************************
;func
;end func
;**********************************************************************
INIT
MOVLW b'00000000'
tris PORTA
MOVLW b'11111111'
tris PORTB
clrf port_a_temp
MOVLW b'00000000'
MOVWF port_a_temp
MOVWF PORTA
MOVWF My_flag
; MOVWF port_a_temp
RETURN
; remaining code goes here
;**********************************************************************
start
CALL INIT
main
;________________swich on heartbeat LED _____
MOVLW b'00000001'
MOVWF time
call pr_pause
BCF port_a_temp,0
MOVF port_a_temp,0
MOVWF PORTA
;________________swich on heartbeat LED end _____
call Check_float ; Check_float :-)
BTFSC Float_stat,0 ; if no_osmos
call No_osmos ;No_osmos :-)
BCF port_a_temp,2 ;reset all
BCF port_a_temp,3 ;reset all
MOVLW b'00000000' ;reset all
MOVWF Float_tmp ;reset all
BTFSC Float_stat,1 ; if first float dropped
INCF Float_tmp ;inc Float_tmp
BTFSC Float_stat,2 ;same for second one
INCF Float_tmp
BTFSC Float_tmp,0 ;if only one float dropped - bit0 will set
call One_float
BTFSC Float_tmp,1 ;if both float dropped bit1 will set
call fulling ;start pump & control level
;sleep
;________________swich off heartbeat LED _____
MOVLW b'00000001'
MOVWF time
call pr_pause
BSF port_a_temp,0
MOVF port_a_temp, 0
MOVWF PORTA
;________________swich off heartbeat LED end____________________________________
Goto main
END
Чт апр 26, 2018 07:12:24
ORG 0x1FF ; processor reset vector
goto start
ORG 0x000
pr_pause
................
................
return
Чт апр 26, 2018 12:33:16
Чт апр 26, 2018 15:30:11
Чт апр 26, 2018 17:31:45
Пт апр 27, 2018 00:05:11
КРАМ",url="/forum/viewtopic.php?p=3363163#p3363163 писал(а):И почему с нуля размещен какой то вызов заканчивающийся return ?
Вы понимаете смысл того, что пишите?
dosikus писал(а):КРАМ, ты не застал что ли сию древность? У него вектор сброса там...
Пт апр 27, 2018 04:05:21
ORG 0x000 ; это вектор сброса
nop
goto Start
ORG 0x004 ; это вектор прерываний
<код обработчика прерываний>
..............
..............
..............
Start
<начало программы>
Пт апр 27, 2018 07:00:15
list p=16F54 ; list directive to define processor
#include <p16F5x.inc> ; processor specific variable definitions
__CONFIG _CP_OFF & _WDT_OFF & _RC_OSC
; '__CONFIG' directive is used to embed configuration word within .asm file.
; The lables following the directive are located in the respective .inc file.
; See respective data sheet for additional information on configuration word.
;***** VARIABLE DEFINITIONS
TEMP_VAR UDATA
temp RES 1 ;example variable definition
;**********************************************************************
RESET_VECTOR CODE 0x1FF ; processor reset vector
goto start
MAIN CODE 0x000
start
nop ; example code
movlw 0xFF ; example code
movwf temp ; example code
; remaining code goes here
Пт апр 27, 2018 12:47:15
Пт апр 27, 2018 12:54:41
Пт апр 27, 2018 17:19:26
КРАМ писал(а):Странно, что Вы не увидели, что стартовая позиция симулятора - адрес НОЛЬ.
Все программы для PIC10...PIC16 имеют стандартный код начала программного флеша:
- Код:
ORG 0x000 ; это вектор сброса
ORG 0x004 ; это вектор прерываний
Start
dosikus писал(а):КРАМ, здесь шаблон 16F54TMPO.ASM с мЫпЫАСМ ...
Увы, для меня совершенно непонятно -на кой товарищу нужно сношаться с этим г. мамонта...
Пт апр 27, 2018 17:53:18
Пт апр 27, 2018 18:02:50
Пт апр 27, 2018 18:44:41
Пт апр 27, 2018 18:47:16
Пт апр 27, 2018 18:58:24
Пт апр 27, 2018 19:05:53
Пт апр 27, 2018 22:22:25
Сб апр 28, 2018 03:43:11
Сб апр 28, 2018 10:45:52