Помогите переписать простую прогу с ассемблера на Си. С ассемблером мягко говоря не на "ты" , а тут лаба...Огромное спасибо тому кто поможет переписать
Код:
.nolist
.include "2313def.inc"
.list
.def result_h = r16
.def result_l = r17
.def temp1 = r18
.def temp2 = r19
.def Delay1 = r21
.def Delay2 = r22
.def Delay3 = r23
.equ #CS = PB2
.equ SCLK = PB1
.equ DOUT = PB3
.equ #SHDN = PB0
.equ PORT_ADC = PORTB
.equ DDR_ADC = DDRB
.equ PIN_ADC = PINB
.equ Led = PD3
.equ PORT_Led = PORTD
.equ DDR_Led = DDRD
.equ PIN_Led = PIND
.equ VTR_P = 2442
.equ VTR_N = 1653
.equ T_300ms = 5000 - 1 ; N = (FT * TADC / DIV) - 1
.equ T_5s = (4000000*1.5 - 15)/5
.equ T_3s = (4000000*20 - 15)/5
.MACRO BIT_READ
sbi PORTB, SCLK
nop
cbi PORTB, SCLK
nop
DOUT
in temp1, PIN_ADC
sbrc temp1, DOUT
ori @0, @1
.ENDMACRO
.MACRO Wait_4us
rjmp PC+1
rjmp PC+1
rjmp PC+1
rjmp PC+1
rjmp PC+1
rjmp PC+1
rjmp PC+1
rjmp PC+1
.ENDMACRO
;//////////////////////////////////////////////////////////////////////////
.listmac
.cseg
.org 0
rjmp RESET
.org 0x04
rjmp TIM_COMP1
.org 0x0B
RESET:
ldi temp1, low(RAMEND)
out SPL, temp1
ldi temp1, (1<<#CS)
out PORT_ADC, temp1
ldi temp1, (1<<#CS) | (1<<SCLK) | (1<<#SHDN)
out DDR_ADC, temp1
ldi temp1, (1<<Led)
out PORT_Led, temp1
out DDR_Led, temp1
ldi temp1, 13.3
Next_1:
; Задати затримку 5 сек
ldi Delay1, low(T_5s)
ldi Delay2, high(T_5s)
ldi Delay3, byte3(T_5s)
; Виклик підпрограми часової затримки (1.5 сек)
rcall Delay
dec temp1 ; Зменшити лічильник на 1
brne Next_1
ldi temp1, (1<<SE)
out MCUCR, temp1
T_300ms
ldi temp1, high(T_300ms)
out OCR1AH, temp1
ldi temp1, low(T_300ms)
out OCR1AL, temp1
ldi temp1, (1<<OCIE1A)
out TIMSK, temp1
ldi temp1, (1<<CTC1) | (1<<CS11) | (1<<CS10)
out TCCR1B, temp1
sei
Wait_Loop:
sleep
rjmp Wait_Loop
;*********************************************************************
TIM_COMP1:
rcall ADC_CONV
ldi temp1, low(VTR_P)
ldi temp2, high(VTR_P)
sub temp1, result_l
sbc temp2, result_h
; Якщо результат < 0, то сигнал АЦП перевищив верхній поріг і треба включити тривогу
brlo Alarm ; Якщо VTR_P < RESULT перейти на мітку Alarm
; Якщо сигнал АЦП < VTR+ треба перевірити чи він не виходить за межі нижнього порогу
; Обчислити |VTR- - RESULT|
; Занести в temp2-temp1 значення нижнього порогу
ldi temp1, low(VTR_N)
ldi temp2, high(VTR_N)
; Відняти від нижнього порогу поточне значення АЦП (VTR- - RESULT)
sub temp1, result_l
sbc temp2, result_h
; Якщо результат >= 0, то сигнал АЦП менший нижнього порогу і треба включити тривогу
brsh Alarm ; Якщо VTR_N > RESULT перейти на мітку Alarm
; Якщо сигнал не вийшов за межі порогів - виключити світлодіод і перейти в кінець п/п
LL1:
sbi PORT_LED, LED ; Виключити світлодіод
rjmp End ; Перейти на мітку End
; Якщо виявлено порушника
Alarm:
clr temp1 ; temp1 = 0
out TCCR1B, temp1 ; Зупинити таймер Т1
ldi Delay1, low(T_5s)
ldi Delay2, high(T_5s)
ldi Delay3, byte3(T_5s)
cbi PORT_LED, LED
rcall Delay
sbi PORT_LED, LED
ldi temp1, (1<<CTC1) | (1<<CS11) | (1<<CS10)
out TCCR1B, temp1
End:
reti
;*********************************************************************
ADC_CONV:
sbi PORT_ADC, #SHDN
Wait_4us
Wait_4us
Wait_4us
clr result_h
clr result_l
cbi PORT_ADC, #CS
nop
EOC: sbis PIN_ADC, DOUT
rjmp EOC ;
BIT_READ result_h, 0b00001000 ; Розряд D11
BIT_READ result_h, 0b00000100 ; Розряд D10
BIT_READ result_h, 0b00000010 ; Розряд D9
BIT_READ result_h, 0b00000001 ; Розряд D8
; Молодші 8 біт результату - в регістр result_l
BIT_READ result_l, 0b10000000 ; Розряд D7
BIT_READ result_l, 0b01000000 ; Розряд D6
BIT_READ result_l, 0b00100000 ; Розряд D5
BIT_READ result_l, 0b00010000 ; Розряд D4
BIT_READ result_l, 0b00001000 ; Розряд D3
BIT_READ result_l, 0b00000100 ; Розряд D2
BIT_READ result_l, 0b00000010 ; Розряд D1
BIT_READ result_l, 0b00000001 ; Розряд D0
sbi PORTB, #CS
cbi PORT_ADC, #SHDN
ret
;*********************************************************************
Delay:
subi Delay1, 1
sbci Delay2, 0
sbci Delay3, 0
brcc Delay
nop
ret
;*********************************************************************