Скачиваний:
32
Добавлен:
03.06.2014
Размер:
3.24 Mб
Скачать

4. Оценка характеристик работы системы.

Время выполнения отдельных частей кода приведено в таблице:

Подпрограмма

Время

Подготовка, инициализация

29 мкс

Чтение клавиатуры

59 мкс

Выполнение символа с клавиатуры

7 мкс

Запуск АЦП

34 мкс

Обработка датчиков ДД

12 мкс

Обработка аналоговых датчиков

27 мкс

Управление двигателем

12 мкс

Обработка значений температуры

29 мкс

Всего

207 мкс

Полный текст программы с комментариями приведен в листинге 4.

Листинг 1.

$Mod812

JMP START

ORG 30H

Y BIT P0.4

START: MOV A, P0 ; load data

RRC A ; put X4 into C

JNC CHK_X3 ; if X4 == 0, check X3

RRC A

CHK_X2: RRC A ; else put X2 into C

JNC CHK_X1 ; if X2 == 0, check X1

SET_Y0: CLR Y ; else output 0

JMP START

CHK_X1: RRC A ; get X1

JC SET_Y1 ; if X1 == 1 output 1

JMP SET_Y0 ; else output 0

CHK_X3: RRC A ; get X3

JNC SET_Y1 ; if X3 == 0 output 1

JMP CHK_X2 ; else check X2

SET_Y1: SETB Y

JMP START

END

Листинг 2.

$Mod812

JMP START

ORG 30H

X1 BIT ACC.3

X2 BIT ACC.2

X3 BIT ACC.1

X4 BIT ACC.0

Y BIT P0.4

START: MOV A, P0

MOV C, X1

ANL C, /X2

MOV F0, C

MOV C, X3 ; "MOV C, /X3" do not work

CPL C ; so use inversion...

ANL C, /X4

ORL C, F0

MOV Y, C

JMP START

END

Листинг 3.

$Mod812

JMP START

ORG 30H

Y BIT P0.4

START: MOV R0, #20H

MOV @R0, #1H

INC R0

MOV @R0, #0H

INC R0

MOV @R0, #0H

INC R0

MOV @R0, #0H

INC R0

MOV @R0, #1H

INC R0

MOV @R0, #0H

INC R0

MOV @R0, #0H

INC R0

MOV @R0, #0H

INC R0

MOV @R0, #1H

INC R0

MOV @R0, #1H

INC R0

MOV @R0, #1H

INC R0

MOV @R0, #1H

INC R0

MOV @R0, #1H

INC R0

MOV @R0, #0H

INC R0

MOV @R0, #0H

INC R0

MOV @R0, #0H

MOV R0, #20H

MOV R2, #0FH

FIND: MOV A, P0

ANL A, R2

ADD A, R0

MOV R1, A

MOV A, @R1

JNB ACC.0, SET_Y1

SETB Y

JMP FIND

SET_Y1: CLR Y

JMP FIND

END

Листинг 4.

$Mod812

; _________________________________________________________

; DEFINES

; memory defines

keypressed data 20h

isnewkey data 21h

inputvalue data 22h

adcK data 23h

U1 data 24h

U2 data 25h

Temp1 data 26h

Temp2 data 27h

Temp3 data 28h

Tm0_code data 29h

prev_y1 data 2Ah

Q data 2Bh

engine_disabled data 2Ch

Tmin data 2Dh

Tmax data 2Eh

Tcp data 2Fh

Nasos1_time data 30h

Nasos2_time data 31h

nasos_prev_state data 32h

LED_period data 33h

; keyboard defines

line0 bit P0.0

line1 bit P0.1

line2 bit P0.2

line3 bit P0.3

col0 bit P1.0

col1 bit P1.1

col2 bit P1.2

col3 bit P1.3

col4 bit P1.4

; X inputs

X1 bit P0.7

X2 bit P0.6

X3 bit P0.5

X4 bit P0.4

; Other inputs

L1 bit P1.6

L2 bit P1.7

Ueng bit P1.5

DTR bit P3.6

; Y outputs

Y1 bit P2.0

Y23 bit P2.1

Y4 bit P2.2

Y5 bit P2.3

Y6 bit P2.4

Yeng bit P2.5

Ysignal bit P2.6

; Other outputs

DSR bit P3.5

MuxSel bit P3.4

Nasos1 bit P3.7

Nasos2 bit P2.7

; _________________________________________________________

; INSTRUCTION MEMORY

jmp init

org 03h

jmp int0_handler

org 0Bh ; Timer 0 overflow

jmp timer0_int

org 13h

jmp int1_handler

org 50h ; Program start

; _________________________________________________________

; INIT ROUTINE

init:

; Interrupts config

mov IE, #0FFh ; enable all interrupts

clr IE.6 ; disable ADC interrupt

mov TCON, #05h ; enable int0 and int1 by edge

; PIO

mov P1, #0 ; all P0 are inputs

mov P2, #0 ; clear P2

mov P3, #0 ; clear P3

; ADC

mov ADCCON1, #50h ; set normal mode, 1/8 clk

mov ADCCON2, #10h ; select channel 0

; Move stack pointer

mov SP, #80h

; Init timers

mov TMOD, #00h

; Set constants

mov Q, #55h

mov Tmin, #41h

mov Tmax, #80h

; UART

mov SCON, #50h ; mode2, receive enable

; _________________________________________________________

; MAIN APPLICATION

start:

call readkey

call process_key

call run_adc

call process_ddd

call process_analog

call process_engine

call process_temperature

call process_nasos

jmp start

; _________________________________________________________

; SEND HEX VALUE BY UART

send_hex:

mov A, R0

swap A

anl A, #0Fh

add A, #30h

mov R1, A

subb A, #3Ah

mov A, R1

jc no_add_7_1

add A, #7h

no_add_7_1:

mov SBUF, A

mov A, R0

anl A, #0Fh

add A, #30h

mov R1, A

subb A, #3Ah

mov A, R1

jc no_add_7_2

add A, #7h

no_add_7_2:

mov SBUF, A

mov SBUF, #68h

mov SBUF, #20h

ret

; _________________________________________________________

; SEND BIN VALUE BY UART

send_bin:

jc send_1bin

mov SBUF, #30h

jmp send_bin_exit

send_1bin:

mov SBUF, #31h

send_bin_exit:

mov SBUF, #62h

mov SBUF, #20h

ret

; _________________________________________________________

; INT 1 HANDLER

int1_handler:

; start LED indication

setb IP.1 ; increase timer 0 priority

mov TMOD, #01h ; set mode1 on timer 0

mov TL0, #00h

mov TH0, #00h

mov Tm0_code, #03h ; handler parameter

mov LED_period, #0h

setb TCON.4 ; start timer (65k cycles)

; send data to UART

mov SBUF, #20h

mov SBUF, #20h

mov C, X1

call send_bin

mov C, X2

call send_bin

mov C, X3

call send_bin

mov C, X4

call send_bin

mov R0, Tcp

call send_hex

mov R0, adcK

call send_hex

mov R0, Q

call send_hex

mov C, L1

call send_bin

mov C, L2

call send_bin

; go in endless loop

jmp finish

reti

; _________________________________________________________

; PROCESS NASOS

process_nasos:

; Increment nasos1 timer if enabled

jnb Nasos1, no_n1_inc

inc Nasos1_time

no_n1_inc:

; Increment nasos2 timer if enabled

jnb Nasos2, no_n2_inc

inc Nasos2_time

no_n2_inc:

; Enable or disable nasos 1 and 2

mov C, L1

mov B.0, C

mov C, L2

mov B.1, C

mov A, B

cjne A, nasos_prev_state, nasos_change_state

jmp nasos_exit

nasos_change_state:

jnb L1, disable_all

jb L2, enable_all

; run one

mov A, Nasos1_time

subb A, Nasos2_time

jc run_nasos1

setb Nasos2

clr Nasos1

jmp nasos_save_state

run_nasos1:

setb Nasos1

clr Nasos2

jmp nasos_save_state

; disable all

disable_all:

clr Nasos1

clr Nasos2

jmp nasos_save_state

; enable all

enable_all:

setb Nasos1

setb Nasos2

jmp nasos_save_state

nasos_save_state:

mov C, L1

mov B.0, C

mov C, L2

mov B.1, C

mov nasos_prev_state, B

nasos_exit:

ret

; _________________________________________________________

; PROCESS TEMPERATURE

process_temperature:

mov A, Temp3

rrc A

clr C

rrc A

clr C

mov R0, A

mov A, Temp2

rrc A

clr C

rrc A

clr C

mov R1, A

mov A, Temp1

rrc A

clr C

add A, R0

add A, R1

mov Tcp, A ; save Tcp to memory

subb A, Tmin

jc temp_too_low

mov A, Tcp

subb A, Tmax

jnc temp_too_high

jmp temp_normal

temp_too_low:

setb Y4

clr Y5

jmp temp_exit

temp_too_high:

setb Y5

clr Y4

jmp temp_exit

temp_normal:

clr Y5

clr Y4

temp_exit:

ret

; _________________________________________________________

; PROCESS ENGINE

process_engine:

mov A, engine_disabled

jnb Ueng, stop_engine ; stop if no power

cjne A, #00h, stop_engine ; stop if disabled

; start engine

setb Yeng

jmp engine_exit

stop_engine:

clr Yeng

engine_exit:

ret

; _________________________________________________________

; PROCESS ANALOG DATA

process_analog:

mov A, U2

add A, adcK ; calc U2+K

subb A, U1 ; compare with U1

jc U1_is_greather

add A, U1 ; find U2+K, as it is greather

jmp compare_with_Q

U1_is_greather:

mov A, U1 ; or find U1

compare_with_Q:

subb A, Q

jc Q_is_greather

; Max(U1,U2+K) > Q

setb Y23

mov Tm0_code, #02h ; Send params to timer0 int handler

mov TH0, #0FCh ; launch for 120 us

setb TCON.4 ; start timer

jmp analog_exit

Q_is_greather:

; Max(U1,U2+K) < Q

setb Y23

call wait_10us ; wait by software

clr Y23

analog_exit:

ret

; _________________________________________________________

; WAIT 10 us

wait_10us: ; 2 us to jump here

nop ; 6 nops by 1 us each

nop

nop

nop

nop

nop

ret ; 2 us to jump back

; _________________________________________________________

; INTERRUPT 0 HANDLER

int0_handler:

setb Y6

call wait_10us

call wait_10us

call wait_10us

clr Y6

call wait_10us

call wait_10us

call wait_10us

setb Y6

call wait_10us

call wait_10us

call wait_10us

clr Y6

jmp finish

reti

; _________________________________________________________

; TIMER0 OVERFLOW HANDLER

timer0_int:

push ACC

push PSW

mov A, Tm0_code

; Remove Y1

cjne A, #1h, op_not_y1

clr Y1

jmp timer0_int_exit

; Remove Y23

op_not_y1:

cjne A, #2h, op_not_y23

clr Y23

jmp timer0_int_exit

; Blink LED

op_not_y23:

cjne A, #3h, op_not_LED

mov A, LED_period

inc A

cjne A, #08h, inc_led_period ; 8 * 65K ~ 500 ms

mov LED_period, #0h

mov C, Ysignal

cpl C

mov Ysignal, C

jmp timer0_int_exit

inc_led_period:

mov LED_period, A

jmp timer0_int_exit

; Others

op_not_LED:

jmp timer0_int_exit

timer0_int_exit:

pop PSW

pop ACC

reti

; _________________________________________________________

; PROCESS DISKRET. DATA

process_ddd:

; calculate function value

mov C, X1

anl C, /X2

mov F0, C

mov C, X3 ; "mov C, /X3" do not work

cpl C ;

anl C, /X4

orl C, F0

jnc no_output ; do not set if zero

; output data

mov Tm0_code, #1h ; send parameters to T0 handler

mov TH0, #0FDh ; launch for 100 us

mov Y1, C

setb TCON.4 ; start timer

jmp ddd_exit

no_output:

clr TCON.4

ddd_exit:

ret

; _________________________________________________________

; ADC START ROUTINE

run_adc:

clr MuxSel ; switch MUX

setb ADCCON2.4

nop ; wait for 5 clc to

nop ; make conversion

nop

nop

nop

; read data

mov A, ADCDATAH

anl A, #0Fh

mov R0, A

mov A, ADCDATAL

anl A, #0F0h

orl A, R0

swap A

mov R1, A

; select new channel

mov A, ADCDATAH

swap A

anl A, #0Fh

inc A

mov R0, A

subb A, #4h

jc set_next_chan

mov R0, #00h

set_next_chan:

mov ADCCON2, R0

; put result in memory

mov A, #U1

add A, R0

mov R0, A

mov A, R1

mov @R0, A

ret

; _________________________________________________________

; PROCESS PRESSED KEY

process_key:

mov A, isnewkey ; load current key status

cjne A, #01h, process_key_end ; quit, if status is 0 or 2

mov A, #0Fh

subb A, keypressed

jnc process_other

; process keys G, H, I, J

mov A, keypressed

cjne A, #10h, process_HIJ

; process G (Start engine)

mov engine_disabled, #0h

ret

process_HIJ:

cjne A, #11h, process_IJ

; process H (Stop engine)

mov engine_disabled, #1h

ret

process_IJ:

cjne A, #12h, process_J

; process I (Input K)

mov adcK, inputvalue

ret

process_J:

; process J (Stop execution)

jmp finish

ret

; process other (0 - F) keys

process_other:

mov A, inputvalue ; load current key sequince

swap A ; move low 4-bit to high

anl A, #0F0h ; clear low 4 bit

orl A, keypressed ; write low 4 bit with new key

mov inputvalue, A ; write back to memory

process_key_end:

ret

; _________________________________________________________

; READ CURRENT PRESSED KEY

readkey:

; switch MUX

setb MuxSel

; read line0

clr line0

setb line1

setb line2

setb line3

jnb col0, key1

jnb col1, key2

jnb col2, key3

jnb col3, keyC

jnb col4, keyD

; read line1

clr line1

setb line0

jnb col0, key4

jnb col1, key5

jnb col2, key6

jnb col3, keyE

jnb col4, keyF

; read line2

clr line2

setb line1

jnb col0, key7

jnb col1, key8

jnb col2, key9

jnb col3, keyG

jnb col4, keyH

; read line3

clr line3

setb line2

jnb col0, keyA

jnb col1, key0

jnb col2, keyB

jnb col3, keyI

jnb col4, keyJ

mov keypressed, #0FFh ; return FF

mov isnewkey, #0 ; and clear key status

ret ; if no key pressed

key1: mov keypressed, #01h

jmp readkey_end

key2: mov keypressed, #02h

jmp readkey_end

key3: mov keypressed, #03h

jmp readkey_end

keyC: mov keypressed, #0Ch

jmp readkey_end

keyD: mov keypressed, #0Dh

jmp readkey_end

key4: mov keypressed, #04h

jmp readkey_end

key5: mov keypressed, #05h

jmp readkey_end

key6: mov keypressed, #06h

jmp readkey_end

keyE: mov keypressed, #0Eh

jmp readkey_end

keyF: mov keypressed, #0Fh

jmp readkey_end

key7: mov keypressed, #07h

jmp readkey_end

key8: mov keypressed, #08h

jmp readkey_end

key9: mov keypressed, #09h

jmp readkey_end

keyG: mov keypressed, #10h

jmp readkey_end

keyH: mov keypressed, #11h

jmp readkey_end

keyA: mov keypressed, #0Ah

jmp readkey_end

key0: mov keypressed, #00h

jmp readkey_end

keyB: mov keypressed, #0Bh

jmp readkey_end

keyI: mov keypressed, #12h

jmp readkey_end

keyJ: mov keypressed, #13h

jmp readkey_end

readkey_end:

mov A, isnewkey

cjne A, #02, change_key_status

ret

change_key_status:

inc isnewkey

ret

; _________________________________________________________

; FINISH LOOP

finish:

jmp finish

end

3

Соседние файлы в папке MPRS_Varakin_3303